{"version":3,"file":"index.cjs","sources":["../../../src/lib/utils.ts","../../../src/lib/converters/index.ts"],"sourcesContent":["// Returns a plain ArrayBuffer (no SharedArrayBuffer), sliced to the view’s region.\nexport function toArrayBuffer(view: ArrayBufferView): ArrayBuffer {\n  const { buffer, byteOffset, byteLength } = view;\n  if (buffer instanceof ArrayBuffer) {\n    return buffer.slice(byteOffset, byteOffset + byteLength);\n  }\n  // SharedArrayBuffer (or unknown) → copy once\n  const ab = new ArrayBuffer(byteLength);\n  new Uint8Array(ab).set(new Uint8Array(buffer as ArrayBufferLike, byteOffset, byteLength));\n  return ab;\n}\n\n// Ensures ImageData gets a Uint8ClampedArray backed by a real ArrayBuffer.\nexport function toClampedRGBA(\n  data: ArrayBufferView | Uint8Array | Uint8ClampedArray,\n): Uint8ClampedArray {\n  if (data instanceof Uint8ClampedArray && data.buffer instanceof ArrayBuffer) return data;\n  return new Uint8ClampedArray(toArrayBuffer(data as ArrayBufferView));\n}\n","import { PdfImage } from '@kopjra/embedpdf-models';\nimport { toArrayBuffer } from '../utils';\nimport { ImageDataConverter, ImageConversionTypes, LazyImageData } from './types';\n\n/**\n * Node.js implementation using Sharp\n * This requires the 'sharp' package to be installed\n *\n * @example\n * ```typescript\n * import sharp from 'sharp';\n * import { createNodeImageDataToBufferConverter } from '@kopjra/embedpdf-engines/pdfium/image-converters';\n *\n * const imageDataConverter = createNodeImageDataToBufferConverter(sharp);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeImageDataToBufferConverter(\n  sharp: any, // Using 'any' to avoid requiring sharp as a dependency\n): ImageDataConverter<Buffer> {\n  return async (\n    getImageData: LazyImageData,\n    imageType: ImageConversionTypes = 'image/webp',\n    imageQuality?: number,\n  ): Promise<Buffer> => {\n    const imageData = getImageData();\n    const { width, height, data } = imageData;\n\n    // Convert ImageData to Sharp format\n    // ImageData uses RGBA format, Sharp expects the same\n    let sharpInstance = sharp(Buffer.from(data), {\n      raw: {\n        width,\n        height,\n        channels: 4, // RGBA\n      },\n    });\n\n    // Apply the appropriate format conversion based on imageType\n    let buffer: Buffer;\n    switch (imageType) {\n      case 'image/webp':\n        buffer = await sharpInstance\n          .webp({\n            quality: imageQuality,\n          })\n          .toBuffer();\n        break;\n      case 'image/png':\n        buffer = await sharpInstance.png().toBuffer();\n        break;\n      case 'image/jpeg':\n        // JPEG doesn't support transparency, so we need to composite onto a white background\n        buffer = await sharpInstance\n          .flatten({ background: { r: 255, g: 255, b: 255 } }) // Remove alpha channel with white background\n          .jpeg({\n            quality: imageQuality,\n          })\n          .toBuffer();\n        break;\n      default:\n        throw new Error(`Unsupported image type: ${imageType}`);\n    }\n\n    return buffer;\n  };\n}\n\n/**\n * Alternative Node.js implementation using canvas (node-canvas)\n * This requires the 'canvas' package to be installed\n *\n * @example\n * ```typescript\n * import { createCanvas } from 'canvas';\n * import { createNodeCanvasImageDataToBlobConverter } from '@kopjra/embedpdf-engines/pdfium/image-converters';\n *\n * const imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\n * ```\n */\nexport function createNodeCanvasImageDataToBlobConverter(\n  createCanvas: any, // Using 'any' to avoid requiring canvas as a dependency\n): ImageDataConverter<Buffer> {\n  return async (\n    getImageData: LazyImageData,\n    imageType: ImageConversionTypes = 'image/webp',\n    _imageQuality?: number,\n  ): Promise<Buffer> => {\n    const imageData = getImageData();\n    const { width, height } = imageData;\n\n    // Create a canvas and put the image data\n    const canvas = createCanvas(width, height);\n    const ctx = canvas.getContext('2d');\n    ctx.putImageData(imageData, 0, 0);\n\n    // Convert to buffer and create blob based on the requested type\n    let buffer: Buffer;\n    switch (imageType) {\n      case 'image/webp':\n        buffer = canvas.toBuffer('image/webp');\n        break;\n      case 'image/png':\n        buffer = canvas.toBuffer('image/png');\n        break;\n      case 'image/jpeg':\n        buffer = canvas.toBuffer('image/jpeg');\n        break;\n      default:\n        throw new Error(`Unsupported image type: ${imageType}`);\n    }\n\n    return buffer;\n  };\n}\n\n/**\n * Generic Node.js implementation that works with any image processing library\n * that can handle raw RGBA data\n *\n * @example\n * ```typescript\n * const converter = createCustomImageDataToBlobConverter(async (imageData) => {\n *   // Your custom image processing logic here\n *   // Return a Buffer that will be wrapped in a Blob\n *   return processImageWithYourLibrary(imageData);\n * });\n * ```\n */\nexport function createCustomImageDataToBlobConverter(\n  processor: (\n    imageData: PdfImage,\n    imageType?: ImageConversionTypes,\n    imageQuality?: number,\n  ) => Promise<Buffer>,\n): ImageDataConverter {\n  return async (\n    getImageData: LazyImageData,\n    imageType: ImageConversionTypes = 'image/webp',\n    imageQuality?: number,\n  ) => {\n    const imageData = getImageData();\n    const bytes = await processor(imageData, imageType, imageQuality);\n    return new Blob([toArrayBuffer(bytes)], { type: imageType });\n  };\n}\n\n/**\n * Create a custom converter that returns a Buffer\n * @param processor - function to process the image data\n * @param imageType - image type\n * @returns ImageDataToBlobConverter<Buffer>\n */\nexport function createCustomImageDataToBufferConverter(\n  processor: (\n    imageData: PdfImage,\n    imageType: ImageConversionTypes,\n    imageQuality?: number,\n  ) => Promise<Buffer>,\n): ImageDataConverter<Buffer> {\n  return async (\n    getImageData: LazyImageData,\n    imageType: ImageConversionTypes = 'image/webp',\n    imageQuality?: number,\n  ): Promise<Buffer> => {\n    const imageData = getImageData();\n    return await processor(imageData, imageType, imageQuality);\n  };\n}\n"],"names":["toArrayBuffer","view","buffer","byteOffset","byteLength","ArrayBuffer","slice","ab","Uint8Array","set","processor","async","getImageData","imageType","imageQuality","imageData","bytes","Blob","type","createCanvas","_imageQuality","width","height","canvas","getContext","putImageData","toBuffer","Error","sharp","data","sharpInstance","Buffer","from","raw","channels","webp","quality","png","flatten","background","r","g","b","jpeg"],"mappings":"aACO,SAASA,EAAcC,GAC5B,MAAMC,OAAEA,EAAAC,WAAQA,EAAAC,WAAYA,GAAeH,EAC3C,GAAIC,aAAkBG,YACpB,OAAOH,EAAOI,MAAMH,EAAYA,EAAaC,GAG/C,MAAMG,EAAK,IAAIF,YAAYD,GAE3B,OADA,IAAII,WAAWD,GAAIE,IAAI,IAAID,WAAWN,EAA2BC,EAAYC,IACtEG,CACT,iHCwHO,SACLG,GAMA,OAAOC,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,IACZI,QAAcN,EAAUK,EAAWF,EAAWC,GACpD,OAAO,IAAIG,KAAK,CAACjB,EAAcgB,IAAS,CAAEE,KAAML,IAEpD,iDAQO,SACLH,GAMA,OAAOC,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,IAClB,aAAaF,EAAUK,EAAWF,EAAWC,GAEjD,mDAxFO,SACLK,GAEA,OAAOR,MACLC,EACAC,EAAkC,aAClCO,KAEA,MAAML,EAAYH,KACZS,MAAEA,EAAAC,OAAOA,GAAWP,EAGpBQ,EAASJ,EAAaE,EAAOC,GAKnC,IAAIpB,EACJ,OALYqB,EAAOC,WAAW,MAC1BC,aAAaV,EAAW,EAAG,GAIvBF,GACN,IAAK,aACHX,EAASqB,EAAOG,SAAS,cACzB,MACF,IAAK,YACHxB,EAASqB,EAAOG,SAAS,aACzB,MACF,IAAK,aACHxB,EAASqB,EAAOG,SAAS,cACzB,MACF,QACE,MAAM,IAAIC,MAAM,2BAA2Bd,KAG/C,OAAOX,EAEX,+CAlGO,SACL0B,GAEA,OAAOjB,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,KACZS,MAAEA,EAAAC,OAAOA,EAAAO,KAAQA,GAASd,EAIhC,IASIb,EATA4B,EAAgBF,EAAMG,OAAOC,KAAKH,GAAO,CAC3CI,IAAK,CACHZ,QACAC,SACAY,SAAU,KAMd,OAAQrB,GACN,IAAK,aACHX,QAAe4B,EACZK,KAAK,CACJC,QAAStB,IAEVY,WACH,MACF,IAAK,YACHxB,QAAe4B,EAAcO,MAAMX,WACnC,MACF,IAAK,aAEHxB,QAAe4B,EACZQ,QAAQ,CAAEC,WAAY,CAAEC,EAAG,IAAKC,EAAG,IAAKC,EAAG,OAC3CC,KAAK,CACJP,QAAStB,IAEVY,WACH,MACF,QACE,MAAM,IAAIC,MAAM,2BAA2Bd,KAG/C,OAAOX,EAEX"}