{"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.\r\nexport function toArrayBuffer(view: ArrayBufferView): ArrayBuffer {\r\n  const { buffer, byteOffset, byteLength } = view;\r\n  if (buffer instanceof ArrayBuffer) {\r\n    return buffer.slice(byteOffset, byteOffset + byteLength);\r\n  }\r\n  // SharedArrayBuffer (or unknown) → copy once\r\n  const ab = new ArrayBuffer(byteLength);\r\n  new Uint8Array(ab).set(new Uint8Array(buffer as ArrayBufferLike, byteOffset, byteLength));\r\n  return ab;\r\n}\r\n\r\n// Ensures ImageData gets a Uint8ClampedArray backed by a real ArrayBuffer.\r\nexport function toClampedRGBA(\r\n  data: ArrayBufferView | Uint8Array | Uint8ClampedArray,\r\n): Uint8ClampedArray {\r\n  if (data instanceof Uint8ClampedArray && data.buffer instanceof ArrayBuffer) return data;\r\n  return new Uint8ClampedArray(toArrayBuffer(data as ArrayBufferView));\r\n}\r\n","import { PdfImage } from '@elhalawany/models';\r\nimport { toArrayBuffer } from '../utils';\r\nimport { ImageDataConverter, ImageConversionTypes, LazyImageData } from './types';\r\n\r\n/**\r\n * Node.js implementation using Sharp\r\n * This requires the 'sharp' package to be installed\r\n *\r\n * @example\r\n * ```typescript\r\n * import sharp from 'sharp';\r\n * import { createNodeImageDataToBufferConverter } from '@elhalawany/engines/pdfium/image-converters';\r\n *\r\n * const imageDataConverter = createNodeImageDataToBufferConverter(sharp);\r\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\r\n * ```\r\n */\r\nexport function createNodeImageDataToBufferConverter(\r\n  sharp: any, // Using 'any' to avoid requiring sharp as a dependency\r\n): ImageDataConverter<Buffer> {\r\n  return async (\r\n    getImageData: LazyImageData,\r\n    imageType: ImageConversionTypes = 'image/webp',\r\n    imageQuality?: number,\r\n  ): Promise<Buffer> => {\r\n    const imageData = getImageData();\r\n    const { width, height, data } = imageData;\r\n\r\n    // Convert ImageData to Sharp format\r\n    // ImageData uses RGBA format, Sharp expects the same\r\n    let sharpInstance = sharp(Buffer.from(data), {\r\n      raw: {\r\n        width,\r\n        height,\r\n        channels: 4, // RGBA\r\n      },\r\n    });\r\n\r\n    // Apply the appropriate format conversion based on imageType\r\n    let buffer: Buffer;\r\n    switch (imageType) {\r\n      case 'image/webp':\r\n        buffer = await sharpInstance\r\n          .webp({\r\n            quality: imageQuality,\r\n          })\r\n          .toBuffer();\r\n        break;\r\n      case 'image/png':\r\n        buffer = await sharpInstance.png().toBuffer();\r\n        break;\r\n      case 'image/jpeg':\r\n        // JPEG doesn't support transparency, so we need to composite onto a white background\r\n        buffer = await sharpInstance\r\n          .flatten({ background: { r: 255, g: 255, b: 255 } }) // Remove alpha channel with white background\r\n          .jpeg({\r\n            quality: imageQuality,\r\n          })\r\n          .toBuffer();\r\n        break;\r\n      default:\r\n        throw new Error(`Unsupported image type: ${imageType}`);\r\n    }\r\n\r\n    return buffer;\r\n  };\r\n}\r\n\r\n/**\r\n * Alternative Node.js implementation using canvas (node-canvas)\r\n * This requires the 'canvas' package to be installed\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createCanvas } from 'canvas';\r\n * import { createNodeCanvasImageDataToBlobConverter } from '@elhalawany/engines/pdfium/image-converters';\r\n *\r\n * const imageDataConverter = createNodeCanvasImageDataToBlobConverter(createCanvas);\r\n * const engine = new PdfiumEngine(pdfiumModule, { logger, imageDataConverter });\r\n * ```\r\n */\r\nexport function createNodeCanvasImageDataToBlobConverter(\r\n  createCanvas: any, // Using 'any' to avoid requiring canvas as a dependency\r\n): ImageDataConverter<Buffer> {\r\n  return async (\r\n    getImageData: LazyImageData,\r\n    imageType: ImageConversionTypes = 'image/webp',\r\n    _imageQuality?: number,\r\n  ): Promise<Buffer> => {\r\n    const imageData = getImageData();\r\n    const { width, height } = imageData;\r\n\r\n    // Create a canvas and put the image data\r\n    const canvas = createCanvas(width, height);\r\n    const ctx = canvas.getContext('2d');\r\n    ctx.putImageData(imageData, 0, 0);\r\n\r\n    // Convert to buffer and create blob based on the requested type\r\n    let buffer: Buffer;\r\n    switch (imageType) {\r\n      case 'image/webp':\r\n        buffer = canvas.toBuffer('image/webp');\r\n        break;\r\n      case 'image/png':\r\n        buffer = canvas.toBuffer('image/png');\r\n        break;\r\n      case 'image/jpeg':\r\n        buffer = canvas.toBuffer('image/jpeg');\r\n        break;\r\n      default:\r\n        throw new Error(`Unsupported image type: ${imageType}`);\r\n    }\r\n\r\n    return buffer;\r\n  };\r\n}\r\n\r\n/**\r\n * Generic Node.js implementation that works with any image processing library\r\n * that can handle raw RGBA data\r\n *\r\n * @example\r\n * ```typescript\r\n * const converter = createCustomImageDataToBlobConverter(async (imageData) => {\r\n *   // Your custom image processing logic here\r\n *   // Return a Buffer that will be wrapped in a Blob\r\n *   return processImageWithYourLibrary(imageData);\r\n * });\r\n * ```\r\n */\r\nexport function createCustomImageDataToBlobConverter(\r\n  processor: (\r\n    imageData: PdfImage,\r\n    imageType?: ImageConversionTypes,\r\n    imageQuality?: number,\r\n  ) => Promise<Buffer>,\r\n): ImageDataConverter {\r\n  return async (\r\n    getImageData: LazyImageData,\r\n    imageType: ImageConversionTypes = 'image/webp',\r\n    imageQuality?: number,\r\n  ) => {\r\n    const imageData = getImageData();\r\n    const bytes = await processor(imageData, imageType, imageQuality);\r\n    return new Blob([toArrayBuffer(bytes)], { type: imageType });\r\n  };\r\n}\r\n\r\n/**\r\n * Create a custom converter that returns a Buffer\r\n * @param processor - function to process the image data\r\n * @param imageType - image type\r\n * @returns ImageDataToBlobConverter<Buffer>\r\n */\r\nexport function createCustomImageDataToBufferConverter(\r\n  processor: (\r\n    imageData: PdfImage,\r\n    imageType: ImageConversionTypes,\r\n    imageQuality?: number,\r\n  ) => Promise<Buffer>,\r\n): ImageDataConverter<Buffer> {\r\n  return async (\r\n    getImageData: LazyImageData,\r\n    imageType: ImageConversionTypes = 'image/webp',\r\n    imageQuality?: number,\r\n  ): Promise<Buffer> => {\r\n    const imageData = getImageData();\r\n    return await processor(imageData, imageType, imageQuality);\r\n  };\r\n}\r\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,EAAYC,WAAAA,GAAeH,EAC3C,GAAIC,aAAkBG,YACpB,OAAOH,EAAOI,MAAMH,EAAYA,EAAaC,GAGzC,MAAAG,EAAK,IAAIF,YAAYD,GAEpB,OADH,IAAAI,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,GAC7C,OAAA,IAAIG,KAAK,CAACjB,EAAcgB,IAAS,CAAEE,KAAML,GAAW,CAE/D,iDAQO,SACLH,GAMA,OAAOC,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,IAClB,aAAaF,EAAUK,EAAWF,EAAWC,EAAY,CAE7D,mDAxFO,SACLK,GAEA,OAAOR,MACLC,EACAC,EAAkC,aAClCO,KAEA,MAAML,EAAYH,KACZS,MAAEA,EAAOC,OAAAA,GAAWP,EAGpBQ,EAASJ,EAAaE,EAAOC,GAK/B,IAAApB,EACJ,OALYqB,EAAOC,WAAW,MAC1BC,aAAaV,EAAW,EAAG,GAIvBF,GACN,IAAK,aACMX,EAAAqB,EAAOG,SAAS,cACzB,MACF,IAAK,YACMxB,EAAAqB,EAAOG,SAAS,aACzB,MACF,IAAK,aACMxB,EAAAqB,EAAOG,SAAS,cACzB,MACF,QACE,MAAM,IAAIC,MAAM,2BAA2Bd,KAGxC,OAAAX,CAAA,CAEX,+CAlGO,SACL0B,GAEA,OAAOjB,MACLC,EACAC,EAAkC,aAClCC,KAEA,MAAMC,EAAYH,KACZS,MAAEA,EAAAC,OAAOA,EAAQO,KAAAA,GAASd,EAIhC,IASIb,EATA4B,EAAgBF,EAAMG,OAAOC,KAAKH,GAAO,CAC3CI,IAAK,CACHZ,QACAC,SACAY,SAAU,KAMd,OAAQrB,GACN,IAAK,aACMX,QAAM4B,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,KAGxC,OAAAX,CAAA,CAEX"}