text/javascript

const previewUrl = "";
const imageRendering = "auto";
const renderSize = {
  width: 1000,
  height: 1000,
};

class PreviewImageData {
  constructor(name, url, position, rotation, size) {
    this.name = name;
    this.url = url;
    this.position = position;
    this.rotation = rotation;
    this.size = size;
  }
}

async function loadImage(url) {
  return new Promise((resolve, reject) => {
    const image = document.createElement("img");
    image.src = url;
    image.crossOrigin = "anonymous";
    image.onload = () => {
      resolve(image);
    };
    image.onerror = () => {
      // Some display fallbacks for when the image fails to load
      if (!image.src.startsWith("https://")) {
        image.src = "https://ordinals.com" + url;
      } else if (image.src.startsWith("https://ordinals.com")) {
        image.src = "https://ord-mirror.magiceden.dev" + url;
      }
    };
  });
}

//check Attribute Existed
function CheckExisted(category, attribute) {
  if (!category) {
    return false;
  }
  const sheet = category.getAttribute(attribute);
  if (sheet != null) {
    return true;
  }
  return false;
}

//check Attribute if is true or false
function CheckBool(category, attribute) {
  if (!category) {
    return false;
  }
  const sheet = category.getAttribute(attribute);
  if (sheet != null) {
    if (JSON.parse(sheet)) {
      return true;
    }
    return false;
  }
  return false;
}

function renderImageWithTranslate(
  canvasContext,
  canvas,
  image,
  position = [0.5, 0.5],
  scale = [1, 1],
  angle = 0
) {
  const imageAspectRatio = image.width / image.height;
  const canvasAspectRatio = canvas.width / canvas.height;

  let drawWidth, drawHeight;
  if (imageAspectRatio > canvasAspectRatio) {
    drawWidth = canvas.width;
    drawHeight = canvas.width / imageAspectRatio;
  } else {
    drawHeight = canvas.height;
    drawWidth = canvas.height * imageAspectRatio;
  }

  const scaledWidth = drawWidth * scale[0];
  const scaledHeight = drawHeight * scale[1];
  const rotationAngle = angle;
  const offsetX = canvas.width * position[0] - scaledWidth / 2;
  const offsetY = canvas.height * position[1] - scaledHeight / 2;

  canvasContext.save();
  canvasContext.translate(
    offsetX + scaledWidth / 2,
    offsetY + scaledHeight / 2
  );
  canvasContext.rotate((rotationAngle * Math.PI) / 180);
  canvasContext.drawImage(
    image,
    -scaledWidth / 2,
    -scaledHeight / 2,
    scaledWidth,
    scaledHeight
  );
  canvasContext.restore();
}

function renderSheetImage(
  altasImg,
  sheetlayout,
  canvasContext,
  canvas,
  index = 0,
  position = [0.5, 0.5],
  scale = [1, 1],
  angle = 0
) {
  const tempCanvas = document.createElement("canvas");
  const atlasCols = sheetlayout[0];
  const atlasRows = sheetlayout[1];
  const imageIndex = index;
  const imageWidth = altasImg.width / atlasCols;
  const imageHeight = altasImg.height / atlasRows;
  tempCanvas.width = imageWidth;
  tempCanvas.height = imageHeight;
  const tempCtx = tempCanvas.getContext("2d");
  const col = imageIndex % atlasCols;
  const row = Math.floor(imageIndex / atlasCols);
  tempCtx.drawImage(
    altasImg,
    col * imageWidth,
    row * imageHeight,
    imageWidth,
    imageHeight,
    0,
    0,
    imageWidth,
    imageHeight
  );
  renderImageWithTranslate(
    canvasContext,
    canvas,
    tempCanvas,
    position,
    scale,
    angle
  );
}

function renderAtlasImage(
  canvasContext,
  canvas,
  image,
  atlasrange,
  position = [0.5, 0.5],
  scale = [1, 1],
  angle = 0
) {
  const tempCanvas = document.createElement("canvas");
  tempCanvas.width = atlasrange[2];
  tempCanvas.height = atlasrange[3];
  const tempCtx = tempCanvas.getContext("2d");
  tempCtx.drawImage(
    image,
    atlasrange[0],
    image.height - atlasrange[1] - atlasrange[3],
    atlasrange[2],
    atlasrange[3],
    0,
    0,
    atlasrange[2],
    atlasrange[3]
  );
  renderImageWithTranslate(
    canvasContext,
    canvas,
    tempCanvas,
    position,
    scale,
    angle
  );
}

function GetPreviewImg(metaversepreviewElement) {
  const previewImages = [];
  getAllPreviewData(metaversepreviewElement, previewImages);
  return previewImages;
}

function getAllPreviewData(metaversepreviewElement, imagesArray) {
  var previewImgElements =
    metaversepreviewElement.querySelectorAll("previewimg");
  if (previewImgElements) {
    previewImgElements.forEach((Element, index) => {
      element_url = Element.getAttribute("src");
      element_size = Element.getAttribute("size");
      element_position = Element.getAttribute("position");
      element_rotation = Element.getAttribute("rotation");
      if (element_url) {
        num = index;
        url = element_url;
        size = [1.0, 1.0];
        position = [0.5, 0.5];
        rotation = 0;
        if (element_size) {
          size = JSON.parse(element_size);
        }
        if (element_position) {
          position = JSON.parse(element_position);
        }
        if (element_rotation) {
          rotation = JSON.parse(element_rotation);
        }
        const previewImage = new PreviewImageData(
          num,
          url,
          position,
          rotation,
          size
        );

        imagesArray.push(previewImage);
      }
    });
  }
}

async function renderImage(imageEl) {
  const canvas = document.createElement("canvas");
  const metaverse = "metaverse";
  const metaversepreview = "metaversepreview";
  const metaversedlc = "metaversedlc";
  const sheetlayout = "sheetlayout";
  const sheetindex = "sheetindex";
  canvas.width = renderSize.width;
  canvas.height = renderSize.height;

  const ctx = canvas.getContext("2d");
  ctx.imageSmoothingEnabled = false;
  const frontimg = "frontimg";
  const metaverseElement = document.querySelector(metaverse);
  const metaverseDlc = document.querySelector(metaversedlc);
  const metaversepreviewElement = document.querySelector(metaversepreview);
  var baseimgurl = null;
  var baseimg = null;

  if (metaverseElement) {
    baseimgurl = metaverseElement.getAttribute("src");
    baseimg = await loadImage(baseimgurl);
  }
  const dlcimgurl =
    "/content/9929aa1b54538e0c57a8821ed1ab131a9940c74d735d5564f16861873556005fi0";
  const dlcimg = await loadImage(dlcimgurl);

  var previewImgs = [];
  var previewimgurls = [];
  var previewimages = [];

  if (metaversepreviewElement) {
    const backgroundcolor =
      metaversepreviewElement.getAttribute("backgroundcolor");
    if (backgroundcolor) {
      document.body.style.backgroundColor = backgroundcolor;
    }
    previewImgs = GetPreviewImg(metaversepreviewElement);
    previewimgurls = previewImgs.map((image) => image.url);
    previewimages = await Promise.all(previewimgurls.map(loadImage));
  }

  if (previewImgs.length == 0 && previewimages == 0) {
    if (metaverseElement) {
      if (
        CheckBool(metaverseElement, "issheetanimate") &&
        CheckExisted(metaverseElement, sheetlayout)
      ) {
        const sheet = JSON.parse(metaverseElement.getAttribute(sheetlayout));
        renderSheetImage(baseimg, sheet, ctx, canvas);
      } else if (
        CheckBool(metaverseElement, "isatlas") &&
        CheckExisted(metaverseElement, "atlasrange")
      ) {
        const imgatlasrange = JSON.parse(
          metaverseElement.getAttribute("atlasrange")
        );
        renderAtlasImage(ctx, canvas, baseimg, imgatlasrange);
      } else {
        renderImageWithTranslate(ctx, canvas, baseimg);
      }
    } else if (metaverseDlc) {
      renderImageWithTranslate(ctx, canvas, dlcimg);
      document.body.style.backgroundColor = "55deff";
    } else {
    }
  }

  if (previewimages.length > 0) {
    var previewElements =
      metaversepreviewElement.querySelectorAll("previewimg");
    previewimages.forEach((element, index) => {
      var previewchildElement = previewElements[index];
      if (!CheckExisted(previewchildElement, "src")) {
        return;
      }
      if (
        CheckBool(previewchildElement, "issheetanimate") &&
        CheckExisted(previewchildElement, sheetlayout)
      ) {
        const sheet = JSON.parse(previewchildElement.getAttribute(sheetlayout));
        const stindex = previewchildElement.getAttribute(sheetindex);
        if (stindex) {
          const sheetindex = JSON.parse(stindex);
          renderSheetImage(
            element,
            sheet,
            ctx,
            canvas,
            stindex,
            previewImgs[index].position,
            previewImgs[index].size,
            previewImgs[index].rotation
          );
        } else {
          renderSheetImage(
            element,
            sheet,
            ctx,
            canvas,
            0,
            previewImgs[index].position,
            previewImgs[index].size,
            previewImgs[index].rotation
          );
        }
      } else if (
        CheckBool(previewchildElement, "isatlas") &&
        CheckExisted(previewchildElement, "atlasrange")
      ) {
        const imgatlasrange = JSON.parse(
          previewchildElement.getAttribute("atlasrange")
        );
        renderAtlasImage(
          ctx,
          canvas,
          element,
          imgatlasrange,
          previewImgs[index].position,
          previewImgs[index].size,
          previewImgs[index].rotation
        );
      } else {
        renderImageWithTranslate(
          ctx,
          canvas,
          element,
          previewImgs[index].position,
          previewImgs[index].size,
          previewImgs[index].rotation
        );
      }
    });
  }

  imageEl.src = canvas.toDataURL("image/png");
}

function createInitialImage() {
  document.body.style.margin = "0px";
  document.body.style.padding = "0px";
  document.body.style.backgroundColor = "ffffff";

  const img = document.createElement("img");
  img.id = "img";
  img.style.height = "100%";
  img.style.width = "100%";
  img.style.objectFit = "contain";
  img.style.imageRendering = imageRendering;

  return img;
}

async function createInscriptionHtml() {
  const imageEl = createInitialImage();
  try {
    await renderImage(imageEl);
  } catch (e) {
    console.error(e);
  } finally {
    // Append the <img> tag to the <body>
    document.body.appendChild(imageEl);
  }
}

window.onload = function () {
  createInscriptionHtml();
};

Share this inscription:

Inscription #36,516,561



9.72 kB


Oct 30, 2023, 8:05 AM(1 year ago)

5d1bc794...61334192

814,499

Recursive modules

Activity

TypeFromToTxDate
Inscribed
bc1qr03m...etuzluh75d1bc794...61334192Oct 30, 2023, 8:05 AM