png-palette 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/PNGPaletteImage.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var P=Object.create;var
|
|
1
|
+
"use strict";var P=Object.create;var m=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var R=(a,t)=>{for(var e in t)m(a,e,{get:t[e],enumerable:!0})},U=(a,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of k(t))!E.call(a,n)&&n!==e&&m(a,n,{get:()=>t[n],enumerable:!(r=I(t,n))||r.enumerable});return a};var C=(a,t,e)=>(e=a!=null?P(v(a)):{},U(t||!a||!a.__esModule?m(e,"default",{value:a,enumerable:!0}):e,a)),T=a=>U(m({},"__esModule",{value:!0}),a);var N={};R(N,{PNGPaletteImage:()=>A});module.exports=T(N);var y=C(require("pako"),1),D=C(require("crc-32"),1),A=class a{constructor(t,e,r=256){this.width=t;this.height=e;this.maxColors=r;this.pixels=new Uint8Array(t*e)}palette=[];transparency=[];pixels;getImageData(){let t=new Uint8Array(this.width*this.height*4);for(let e=0;e<this.pixels.length;e++)t[e*4]=this.palette[this.pixels[e]].r,t[e*4+1]=this.palette[this.pixels[e]].g,t[e*4+2]=this.palette[this.pixels[e]].b,t[e*4+3]=this.transparency[e];return t}getPixels(){return this.pixels}static fromPngBytes(t){let e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t[0]!==137||t[1]!==80||t[2]!==78||t[3]!==71)throw new Error("Not a PNG file");let r=0,n=0,o=[],u=[],w=[],l=8;for(;l<t.length;){let s=e.getUint32(l,!1),f=String.fromCharCode(t[l+4],t[l+5],t[l+6],t[l+7]),b=t.subarray(l+8,l+8+s);if(f==="IHDR")r=e.getUint32(l+8,!1),n=e.getUint32(l+12,!1);else if(f==="PLTE")for(let c=0;c<s/3;c++)o[c]={r:b[c*3],g:b[c*3+1],b:b[c*3+2]};else if(f==="tRNS")for(let c=0;c<s;c++)u[c]=b[c];else if(f==="IDAT")w.push(b);else if(f==="IEND")break;l+=12+s}if(r===0||n===0)throw new Error("Invalid PNG: Missing IHDR");let p=new a(r,n,256);p.palette=o,p.transparency=u;let x=w.reduce((s,f)=>s+f.length,0),d=new Uint8Array(x),g=0;for(let s of w)d.set(s,g),g+=s.length;let i=y.default.inflate(d),h=r+1;for(let s=0;s<n;s++){let f=i[s*h],b=i.subarray(s*h+1,s*h+1+r);p.pixels.set(b,s*r)}return p}setPaletteColor(t,e,r,n){if(t<0||t>=this.maxColors)throw new Error(`Palette index ${t} out of bounds`);this.palette[t]={r:e,g:r,b:n}}getPaletteColor(t){return this.palette[t]}setTransparency(t,e){if(t<0||t>=this.maxColors)throw new Error(`Transparency index ${t} out of bounds`);this.transparency[t]=e}getTransparency(t){return this.transparency[t]}setPixelPaletteIndex(t,e,r){t<0||t>=this.width||e<0||e>=this.height||(this.pixels[e*this.width+t]=r)}getPixelPaletteIndex(t,e){return t<0||t>=this.width||e<0||e>=this.height?0:this.pixels[e*this.width+t]}encodeToPngBytes(){let t=new Uint8Array([137,80,78,71,13,10,26,10]),e=new Uint8Array(13),r=new DataView(e.buffer);r.setUint32(0,this.width,!1),r.setUint32(4,this.height,!1),e[8]=8,e[9]=3;let n=this.createChunk("IHDR",e),o=new Uint8Array(this.maxColors*3);for(let i=0;i<this.maxColors;i++){let h=this.palette[i]||{r:0,g:0,b:0};o[i*3]=h.r,o[i*3+1]=h.g,o[i*3+2]=h.b}let u=this.createChunk("PLTE",o),w=null;if(this.transparency.length>0){let i=new Uint8Array(this.maxColors);i.fill(255);for(let h=0;h<this.maxColors;h++)this.transparency[h]!==void 0&&(i[h]=this.transparency[h]);w=this.createChunk("tRNS",i)}let l=this.width+1,p=new Uint8Array(this.height*l);for(let i=0;i<this.height;i++)p[i*l]=0,p.set(this.pixels.subarray(i*this.width,(i+1)*this.width),i*l+1);let x=this.createChunk("IDAT",y.default.deflate(p)),d=this.createChunk("IEND",new Uint8Array(0)),g=[t,n,u];return w&&g.push(w),g.push(x,d),this.concat(g)}createChunk(t,e){let r=new Uint8Array(12+e.length),n=new DataView(r.buffer);n.setUint32(0,e.length,!1);for(let u=0;u<4;u++)r[4+u]=t.charCodeAt(u);r.set(e,8);let o=D.default.buf(r.subarray(4,8+e.length));return n.setInt32(8+e.length,o,!1),r}concat(t){let e=new Uint8Array(t.reduce((n,o)=>n+o.length,0)),r=0;for(let n of t)e.set(n,r),r+=n.length;return e}};0&&(module.exports={PNGPaletteImage});
|
|
2
2
|
//# sourceMappingURL=PNGPaletteImage.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PNGPaletteImage.ts"],"sourcesContent":["import pako from 'pako';\nimport CRC32 from 'crc-32';\n\nexport interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport class PNGPaletteImage {\n private palette: RGB[] = [];\n private transparency: number[] = [];\n private pixels: Uint8Array;\n\n constructor(\n public readonly width: number,\n public readonly height: number,\n public readonly maxColors: number = 256\n ) {\n this.pixels = new Uint8Array(width * height);\n }\n\n /**\n * Creates a PNGPaletteImage from a PNG file byte array.\n */\n public static fromPngBytes(bytes: Uint8Array): PNGPaletteImage {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4E || bytes[3] !== 0x47) {\n throw new Error('Not a PNG file');\n }\n\n let width = 0;\n let height = 0;\n let rawPalette: RGB[] = [];\n let rawTransparency: number[] = [];\n let idatChunks: Uint8Array[] = [];\n\n let pos = 8;\n while (pos < bytes.length) {\n const length = view.getUint32(pos, false);\n const type = String.fromCharCode(bytes[pos + 4]!, bytes[pos + 5]!, bytes[pos + 6]!, bytes[pos + 7]!);\n const data = bytes.subarray(pos + 8, pos + 8 + length);\n\n if (type === 'IHDR') {\n width = view.getUint32(pos + 8, false);\n height = view.getUint32(pos + 12, false);\n } else if (type === 'PLTE') {\n for (let i = 0; i < length / 3; i++) {\n rawPalette[i] = { r: data[i * 3]!, g: data[i * 3 + 1]!, b: data[i * 3 + 2]! };\n }\n } else if (type === 'tRNS') {\n for (let i = 0; i < length; i++) {\n rawTransparency[i] = data[i]!;\n }\n } else if (type === 'IDAT') {\n idatChunks.push(data);\n } else if (type === 'IEND') {\n break;\n }\n\n pos += 12 + length;\n }\n\n if (width === 0 || height === 0) throw new Error('Invalid PNG: Missing IHDR');\n\n const img = new PNGPaletteImage(width, height, 256);\n img.palette = rawPalette;\n img.transparency = rawTransparency;\n\n const totalIdatLen = idatChunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const combinedIdat = new Uint8Array(totalIdatLen);\n let idatPos = 0;\n for (const chunk of idatChunks) {\n combinedIdat.set(chunk, idatPos);\n idatPos += chunk.length;\n }\n\n const inflated = pako.inflate(combinedIdat);\n const stride = width + 1;\n for (let y = 0; y < height; y++) {\n // Internal parser unfiltering (Manual Logic)\n // Since we use Filter Type 0 in our encoder, we skip unfiltering complexity for now.\n // But we MUST support Filter 0 correctly by skipping the first byte of each row.\n const filterType = inflated[y * stride];\n const rowData = inflated.subarray(y * stride + 1, y * stride + 1 + width);\n if (filterType === 0) {\n img.pixels.set(rowData, y * width);\n } else {\n // Warning: other filter types not yet robustly supported for external files.\n img.pixels.set(rowData, y * width);\n }\n }\n\n return img;\n }\n\n public setPaletteColor(index: number, r: number, g: number, b: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Palette index ${index} out of bounds`);\n this.palette[index] = { r, g, b };\n }\n\n public getPaletteColor(index: number): RGB | undefined {\n return this.palette[index];\n }\n\n public setTransparency(index: number, alpha: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Transparency index ${index} out of bounds`);\n this.transparency[index] = alpha;\n }\n\n public getTransparency(index: number): number | undefined {\n return this.transparency[index];\n }\n\n public setPixelPaletteIndex(x: number, y: number, colorIndex: number): void {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return;\n this.pixels[y * this.width + x] = colorIndex;\n }\n\n public getPixelPaletteIndex(x: number, y: number): number {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return 0;\n return this.pixels[y * this.width + x]!;\n }\n\n public encodeToPngBytes(): Uint8Array {\n const signature = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);\n const ihdrData = new Uint8Array(13);\n const ihdrView = new DataView(ihdrData.buffer);\n ihdrView.setUint32(0, this.width, false);\n ihdrView.setUint32(4, this.height, false);\n ihdrData[8] = 8; ihdrData[9] = 3;\n const ihdr = this.createChunk('IHDR', ihdrData);\n\n const plteData = new Uint8Array(this.maxColors * 3);\n for (let i = 0; i < this.maxColors; i++) {\n const color = this.palette[i] || { r: 0, g: 0, b: 0 };\n plteData[i * 3] = color.r;\n plteData[i * 3 + 1] = color.g;\n plteData[i * 3 + 2] = color.b;\n }\n const plte = this.createChunk('PLTE', plteData);\n\n let trns: Uint8Array | null = null;\n if (this.transparency.length > 0) {\n const trnsData = new Uint8Array(this.maxColors);\n trnsData.fill(255);\n for (let i = 0; i < this.maxColors; i++) {\n if (this.transparency[i] !== undefined) trnsData[i] = this.transparency[i]!;\n }\n trns = this.createChunk('tRNS', trnsData);\n }\n\n const stride = this.width + 1;\n const idatData = new Uint8Array(this.height * stride);\n for (let y = 0; y < this.height; y++) {\n idatData[y * stride] = 0;\n idatData.set(this.pixels.subarray(y * this.width, (y + 1) * this.width), y * stride + 1);\n }\n const idat = this.createChunk('IDAT', pako.deflate(idatData));\n const iend = this.createChunk('IEND', new Uint8Array(0));\n\n const chunks = [signature, ihdr, plte];\n if (trns) chunks.push(trns);\n chunks.push(idat, iend);\n return this.concat(chunks);\n }\n\n private createChunk(type: string, data: Uint8Array): Uint8Array {\n const chunk = new Uint8Array(12 + data.length);\n const view = new DataView(chunk.buffer);\n view.setUint32(0, data.length, false);\n for (let i = 0; i < 4; i++) chunk[4 + i] = type.charCodeAt(i);\n chunk.set(data, 8);\n const crc = CRC32.buf(chunk.subarray(4, 8 + data.length));\n view.setInt32(8 + data.length, crc, false);\n return chunk;\n }\n\n private concat(arrays: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(arrays.reduce((a, b) => a + b.length, 0));\n let off = 0;\n for (const a of arrays) { out.set(a, off); off += a.length; }\n return out;\n }\n}\n"],"mappings":"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","names":["PNGPaletteImage_exports","__export","PNGPaletteImage","__toCommonJS","import_pako","import_crc_32","_PNGPaletteImage","width","height","maxColors","bytes","view","rawPalette","rawTransparency","idatChunks","pos","length","type","data","i","img","totalIdatLen","acc","chunk","combinedIdat","idatPos","inflated","pako","stride","y","filterType","rowData","index","r","g","b","alpha","x","colorIndex","signature","ihdrData","ihdrView","ihdr","plteData","color","plte","trns","trnsData","idatData","idat","iend","chunks","crc","CRC32","arrays","out","a","off"]}
|
|
1
|
+
{"version":3,"sources":["../src/PNGPaletteImage.ts"],"sourcesContent":["import pako from 'pako';\nimport CRC32 from 'crc-32';\n\nexport interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport class PNGPaletteImage {\n private palette: RGB[] = [];\n private transparency: number[] = [];\n private pixels: Uint8Array;\n\n constructor(\n public readonly width: number,\n public readonly height: number,\n public readonly maxColors: number = 256\n ) {\n this.pixels = new Uint8Array(width * height);\n }\n\n /**\n * Get RGBA image data\n */\n public getImageData() {\n const imageData = new Uint8Array(this.width * this.height * 4);\n\n for (let index = 0; index < this.pixels.length; index++) {\n imageData[index * 4] = this.palette[this.pixels[index]].r;\n imageData[index * 4 + 1] = this.palette[this.pixels[index]].g;\n imageData[index * 4 + 2] = this.palette[this.pixels[index]].b;\n imageData[index * 4 + 3] = this.transparency[index];\n }\n\n return imageData;\n }\n\n /**\n * Get raw pixel data, indexes to palette\n */\n public getPixels() {\n return this.pixels;\n }\n\n /**\n * Creates a PNGPaletteImage from a PNG file byte array.\n */\n public static fromPngBytes(bytes: Uint8Array): PNGPaletteImage {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4E || bytes[3] !== 0x47) {\n throw new Error('Not a PNG file');\n }\n\n let width = 0;\n let height = 0;\n let rawPalette: RGB[] = [];\n let rawTransparency: number[] = [];\n let idatChunks: Uint8Array[] = [];\n\n let pos = 8;\n while (pos < bytes.length) {\n const length = view.getUint32(pos, false);\n const type = String.fromCharCode(bytes[pos + 4]!, bytes[pos + 5]!, bytes[pos + 6]!, bytes[pos + 7]!);\n const data = bytes.subarray(pos + 8, pos + 8 + length);\n\n if (type === 'IHDR') {\n width = view.getUint32(pos + 8, false);\n height = view.getUint32(pos + 12, false);\n } else if (type === 'PLTE') {\n for (let i = 0; i < length / 3; i++) {\n rawPalette[i] = { r: data[i * 3]!, g: data[i * 3 + 1]!, b: data[i * 3 + 2]! };\n }\n } else if (type === 'tRNS') {\n for (let i = 0; i < length; i++) {\n rawTransparency[i] = data[i]!;\n }\n } else if (type === 'IDAT') {\n idatChunks.push(data);\n } else if (type === 'IEND') {\n break;\n }\n\n pos += 12 + length;\n }\n\n if (width === 0 || height === 0) throw new Error('Invalid PNG: Missing IHDR');\n\n const img = new PNGPaletteImage(width, height, 256);\n img.palette = rawPalette;\n img.transparency = rawTransparency;\n\n const totalIdatLen = idatChunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const combinedIdat = new Uint8Array(totalIdatLen);\n let idatPos = 0;\n for (const chunk of idatChunks) {\n combinedIdat.set(chunk, idatPos);\n idatPos += chunk.length;\n }\n\n const inflated = pako.inflate(combinedIdat);\n const stride = width + 1;\n for (let y = 0; y < height; y++) {\n const filterType = inflated[y * stride];\n const rowData = inflated.subarray(y * stride + 1, y * stride + 1 + width);\n\n if (filterType === 0) {\n img.pixels.set(rowData, y * width);\n } else {\n img.pixels.set(rowData, y * width);\n }\n }\n\n return img;\n }\n\n /**\n * Sets color in color palette.\n */\n public setPaletteColor(index: number, r: number, g: number, b: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Palette index ${index} out of bounds`);\n this.palette[index] = { r, g, b };\n }\n\n /**\n * Gets color from color palette.\n */\n public getPaletteColor(index: number): RGB | undefined {\n return this.palette[index];\n }\n\n /**\n * Sets alpha value in color palette.\n */\n public setTransparency(index: number, alpha: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Transparency index ${index} out of bounds`);\n this.transparency[index] = alpha;\n }\n\n /**\n * Gets alpha value from color palette.\n */\n public getTransparency(index: number): number | undefined {\n return this.transparency[index];\n }\n\n /**\n * Sets color index at image's x & y.\n */\n public setPixelPaletteIndex(x: number, y: number, colorIndex: number): void {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return;\n this.pixels[y * this.width + x] = colorIndex;\n }\n\n /**\n * Gets color index at image's x & y.\n */\n public getPixelPaletteIndex(x: number, y: number): number {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return 0;\n return this.pixels[y * this.width + x]!;\n }\n\n /**\n * Returns encoded png bytes\n */\n public encodeToPngBytes(): Uint8Array {\n const signature = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);\n const ihdrData = new Uint8Array(13);\n const ihdrView = new DataView(ihdrData.buffer);\n ihdrView.setUint32(0, this.width, false);\n ihdrView.setUint32(4, this.height, false);\n ihdrData[8] = 8; ihdrData[9] = 3;\n const ihdr = this.createChunk('IHDR', ihdrData);\n\n const plteData = new Uint8Array(this.maxColors * 3);\n for (let i = 0; i < this.maxColors; i++) {\n const color = this.palette[i] || { r: 0, g: 0, b: 0 };\n plteData[i * 3] = color.r;\n plteData[i * 3 + 1] = color.g;\n plteData[i * 3 + 2] = color.b;\n }\n const plte = this.createChunk('PLTE', plteData);\n\n let trns: Uint8Array | null = null;\n if (this.transparency.length > 0) {\n const trnsData = new Uint8Array(this.maxColors);\n trnsData.fill(255);\n for (let i = 0; i < this.maxColors; i++) {\n if (this.transparency[i] !== undefined) trnsData[i] = this.transparency[i]!;\n }\n trns = this.createChunk('tRNS', trnsData);\n }\n\n const stride = this.width + 1;\n const idatData = new Uint8Array(this.height * stride);\n for (let y = 0; y < this.height; y++) {\n idatData[y * stride] = 0;\n idatData.set(this.pixels.subarray(y * this.width, (y + 1) * this.width), y * stride + 1);\n }\n const idat = this.createChunk('IDAT', pako.deflate(idatData));\n const iend = this.createChunk('IEND', new Uint8Array(0));\n\n const chunks = [signature, ihdr, plte];\n if (trns) chunks.push(trns);\n chunks.push(idat, iend);\n return this.concat(chunks);\n }\n\n private createChunk(type: string, data: Uint8Array): Uint8Array {\n const chunk = new Uint8Array(12 + data.length);\n const view = new DataView(chunk.buffer);\n view.setUint32(0, data.length, false);\n for (let i = 0; i < 4; i++) chunk[4 + i] = type.charCodeAt(i);\n chunk.set(data, 8);\n const crc = CRC32.buf(chunk.subarray(4, 8 + data.length));\n view.setInt32(8 + data.length, crc, false);\n return chunk;\n }\n\n private concat(arrays: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(arrays.reduce((a, b) => a + b.length, 0));\n let off = 0;\n for (const a of arrays) { out.set(a, off); off += a.length; }\n return out;\n }\n}\n"],"mappings":"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","names":["PNGPaletteImage_exports","__export","PNGPaletteImage","__toCommonJS","import_pako","import_crc_32","_PNGPaletteImage","width","height","maxColors","imageData","index","bytes","view","rawPalette","rawTransparency","idatChunks","pos","length","type","data","i","img","totalIdatLen","acc","chunk","combinedIdat","idatPos","inflated","pako","stride","y","filterType","rowData","r","g","b","alpha","x","colorIndex","signature","ihdrData","ihdrView","ihdr","plteData","color","plte","trns","trnsData","idatData","idat","iend","chunks","crc","CRC32","arrays","out","a","off"]}
|
|
@@ -11,16 +11,45 @@ declare class PNGPaletteImage {
|
|
|
11
11
|
private transparency;
|
|
12
12
|
private pixels;
|
|
13
13
|
constructor(width: number, height: number, maxColors?: number);
|
|
14
|
+
/**
|
|
15
|
+
* Get RGBA image data
|
|
16
|
+
*/
|
|
17
|
+
getImageData(): Uint8Array<ArrayBuffer>;
|
|
18
|
+
/**
|
|
19
|
+
* Get raw pixel data, indexes to palette
|
|
20
|
+
*/
|
|
21
|
+
getPixels(): Uint8Array<ArrayBufferLike>;
|
|
14
22
|
/**
|
|
15
23
|
* Creates a PNGPaletteImage from a PNG file byte array.
|
|
16
24
|
*/
|
|
17
25
|
static fromPngBytes(bytes: Uint8Array): PNGPaletteImage;
|
|
26
|
+
/**
|
|
27
|
+
* Sets color in color palette.
|
|
28
|
+
*/
|
|
18
29
|
setPaletteColor(index: number, r: number, g: number, b: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Gets color from color palette.
|
|
32
|
+
*/
|
|
19
33
|
getPaletteColor(index: number): RGB | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Sets alpha value in color palette.
|
|
36
|
+
*/
|
|
20
37
|
setTransparency(index: number, alpha: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Gets alpha value from color palette.
|
|
40
|
+
*/
|
|
21
41
|
getTransparency(index: number): number | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Sets color index at image's x & y.
|
|
44
|
+
*/
|
|
22
45
|
setPixelPaletteIndex(x: number, y: number, colorIndex: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* Gets color index at image's x & y.
|
|
48
|
+
*/
|
|
23
49
|
getPixelPaletteIndex(x: number, y: number): number;
|
|
50
|
+
/**
|
|
51
|
+
* Returns encoded png bytes
|
|
52
|
+
*/
|
|
24
53
|
encodeToPngBytes(): Uint8Array;
|
|
25
54
|
private createChunk;
|
|
26
55
|
private concat;
|
|
@@ -11,16 +11,45 @@ declare class PNGPaletteImage {
|
|
|
11
11
|
private transparency;
|
|
12
12
|
private pixels;
|
|
13
13
|
constructor(width: number, height: number, maxColors?: number);
|
|
14
|
+
/**
|
|
15
|
+
* Get RGBA image data
|
|
16
|
+
*/
|
|
17
|
+
getImageData(): Uint8Array<ArrayBuffer>;
|
|
18
|
+
/**
|
|
19
|
+
* Get raw pixel data, indexes to palette
|
|
20
|
+
*/
|
|
21
|
+
getPixels(): Uint8Array<ArrayBufferLike>;
|
|
14
22
|
/**
|
|
15
23
|
* Creates a PNGPaletteImage from a PNG file byte array.
|
|
16
24
|
*/
|
|
17
25
|
static fromPngBytes(bytes: Uint8Array): PNGPaletteImage;
|
|
26
|
+
/**
|
|
27
|
+
* Sets color in color palette.
|
|
28
|
+
*/
|
|
18
29
|
setPaletteColor(index: number, r: number, g: number, b: number): void;
|
|
30
|
+
/**
|
|
31
|
+
* Gets color from color palette.
|
|
32
|
+
*/
|
|
19
33
|
getPaletteColor(index: number): RGB | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Sets alpha value in color palette.
|
|
36
|
+
*/
|
|
20
37
|
setTransparency(index: number, alpha: number): void;
|
|
38
|
+
/**
|
|
39
|
+
* Gets alpha value from color palette.
|
|
40
|
+
*/
|
|
21
41
|
getTransparency(index: number): number | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Sets color index at image's x & y.
|
|
44
|
+
*/
|
|
22
45
|
setPixelPaletteIndex(x: number, y: number, colorIndex: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* Gets color index at image's x & y.
|
|
48
|
+
*/
|
|
23
49
|
getPixelPaletteIndex(x: number, y: number): number;
|
|
50
|
+
/**
|
|
51
|
+
* Returns encoded png bytes
|
|
52
|
+
*/
|
|
24
53
|
encodeToPngBytes(): Uint8Array;
|
|
25
54
|
private createChunk;
|
|
26
55
|
private concat;
|
package/dist/PNGPaletteImage.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import m from"pako";import A from"crc-32";var x=class y{constructor(t,e,r=256){this.width=t;this.height=e;this.maxColors=r;this.pixels=new Uint8Array(t*e)}palette=[];transparency=[];pixels;getImageData(){let t=new Uint8Array(this.width*this.height*4);for(let e=0;e<this.pixels.length;e++)t[e*4]=this.palette[this.pixels[e]].r,t[e*4+1]=this.palette[this.pixels[e]].g,t[e*4+2]=this.palette[this.pixels[e]].b,t[e*4+3]=this.transparency[e];return t}getPixels(){return this.pixels}static fromPngBytes(t){let e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t[0]!==137||t[1]!==80||t[2]!==78||t[3]!==71)throw new Error("Not a PNG file");let r=0,s=0,h=[],c=[],b=[],a=8;for(;a<t.length;){let i=e.getUint32(a,!1),p=String.fromCharCode(t[a+4],t[a+5],t[a+6],t[a+7]),f=t.subarray(a+8,a+8+i);if(p==="IHDR")r=e.getUint32(a+8,!1),s=e.getUint32(a+12,!1);else if(p==="PLTE")for(let o=0;o<i/3;o++)h[o]={r:f[o*3],g:f[o*3+1],b:f[o*3+2]};else if(p==="tRNS")for(let o=0;o<i;o++)c[o]=f[o];else if(p==="IDAT")b.push(f);else if(p==="IEND")break;a+=12+i}if(r===0||s===0)throw new Error("Invalid PNG: Missing IHDR");let u=new y(r,s,256);u.palette=h,u.transparency=c;let d=b.reduce((i,p)=>i+p.length,0),g=new Uint8Array(d),w=0;for(let i of b)g.set(i,w),w+=i.length;let n=m.inflate(g),l=r+1;for(let i=0;i<s;i++){let p=n[i*l],f=n.subarray(i*l+1,i*l+1+r);u.pixels.set(f,i*r)}return u}setPaletteColor(t,e,r,s){if(t<0||t>=this.maxColors)throw new Error(`Palette index ${t} out of bounds`);this.palette[t]={r:e,g:r,b:s}}getPaletteColor(t){return this.palette[t]}setTransparency(t,e){if(t<0||t>=this.maxColors)throw new Error(`Transparency index ${t} out of bounds`);this.transparency[t]=e}getTransparency(t){return this.transparency[t]}setPixelPaletteIndex(t,e,r){t<0||t>=this.width||e<0||e>=this.height||(this.pixels[e*this.width+t]=r)}getPixelPaletteIndex(t,e){return t<0||t>=this.width||e<0||e>=this.height?0:this.pixels[e*this.width+t]}encodeToPngBytes(){let t=new Uint8Array([137,80,78,71,13,10,26,10]),e=new Uint8Array(13),r=new DataView(e.buffer);r.setUint32(0,this.width,!1),r.setUint32(4,this.height,!1),e[8]=8,e[9]=3;let s=this.createChunk("IHDR",e),h=new Uint8Array(this.maxColors*3);for(let n=0;n<this.maxColors;n++){let l=this.palette[n]||{r:0,g:0,b:0};h[n*3]=l.r,h[n*3+1]=l.g,h[n*3+2]=l.b}let c=this.createChunk("PLTE",h),b=null;if(this.transparency.length>0){let n=new Uint8Array(this.maxColors);n.fill(255);for(let l=0;l<this.maxColors;l++)this.transparency[l]!==void 0&&(n[l]=this.transparency[l]);b=this.createChunk("tRNS",n)}let a=this.width+1,u=new Uint8Array(this.height*a);for(let n=0;n<this.height;n++)u[n*a]=0,u.set(this.pixels.subarray(n*this.width,(n+1)*this.width),n*a+1);let d=this.createChunk("IDAT",m.deflate(u)),g=this.createChunk("IEND",new Uint8Array(0)),w=[t,s,c];return b&&w.push(b),w.push(d,g),this.concat(w)}createChunk(t,e){let r=new Uint8Array(12+e.length),s=new DataView(r.buffer);s.setUint32(0,e.length,!1);for(let c=0;c<4;c++)r[4+c]=t.charCodeAt(c);r.set(e,8);let h=A.buf(r.subarray(4,8+e.length));return s.setInt32(8+e.length,h,!1),r}concat(t){let e=new Uint8Array(t.reduce((s,h)=>s+h.length,0)),r=0;for(let s of t)e.set(s,r),r+=s.length;return e}};export{x as PNGPaletteImage};
|
|
2
2
|
//# sourceMappingURL=PNGPaletteImage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PNGPaletteImage.ts"],"sourcesContent":["import pako from 'pako';\nimport CRC32 from 'crc-32';\n\nexport interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport class PNGPaletteImage {\n private palette: RGB[] = [];\n private transparency: number[] = [];\n private pixels: Uint8Array;\n\n constructor(\n public readonly width: number,\n public readonly height: number,\n public readonly maxColors: number = 256\n ) {\n this.pixels = new Uint8Array(width * height);\n }\n\n /**\n * Creates a PNGPaletteImage from a PNG file byte array.\n */\n public static fromPngBytes(bytes: Uint8Array): PNGPaletteImage {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4E || bytes[3] !== 0x47) {\n throw new Error('Not a PNG file');\n }\n\n let width = 0;\n let height = 0;\n let rawPalette: RGB[] = [];\n let rawTransparency: number[] = [];\n let idatChunks: Uint8Array[] = [];\n\n let pos = 8;\n while (pos < bytes.length) {\n const length = view.getUint32(pos, false);\n const type = String.fromCharCode(bytes[pos + 4]!, bytes[pos + 5]!, bytes[pos + 6]!, bytes[pos + 7]!);\n const data = bytes.subarray(pos + 8, pos + 8 + length);\n\n if (type === 'IHDR') {\n width = view.getUint32(pos + 8, false);\n height = view.getUint32(pos + 12, false);\n } else if (type === 'PLTE') {\n for (let i = 0; i < length / 3; i++) {\n rawPalette[i] = { r: data[i * 3]!, g: data[i * 3 + 1]!, b: data[i * 3 + 2]! };\n }\n } else if (type === 'tRNS') {\n for (let i = 0; i < length; i++) {\n rawTransparency[i] = data[i]!;\n }\n } else if (type === 'IDAT') {\n idatChunks.push(data);\n } else if (type === 'IEND') {\n break;\n }\n\n pos += 12 + length;\n }\n\n if (width === 0 || height === 0) throw new Error('Invalid PNG: Missing IHDR');\n\n const img = new PNGPaletteImage(width, height, 256);\n img.palette = rawPalette;\n img.transparency = rawTransparency;\n\n const totalIdatLen = idatChunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const combinedIdat = new Uint8Array(totalIdatLen);\n let idatPos = 0;\n for (const chunk of idatChunks) {\n combinedIdat.set(chunk, idatPos);\n idatPos += chunk.length;\n }\n\n const inflated = pako.inflate(combinedIdat);\n const stride = width + 1;\n for (let y = 0; y < height; y++) {\n // Internal parser unfiltering (Manual Logic)\n // Since we use Filter Type 0 in our encoder, we skip unfiltering complexity for now.\n // But we MUST support Filter 0 correctly by skipping the first byte of each row.\n const filterType = inflated[y * stride];\n const rowData = inflated.subarray(y * stride + 1, y * stride + 1 + width);\n if (filterType === 0) {\n img.pixels.set(rowData, y * width);\n } else {\n // Warning: other filter types not yet robustly supported for external files.\n img.pixels.set(rowData, y * width);\n }\n }\n\n return img;\n }\n\n public setPaletteColor(index: number, r: number, g: number, b: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Palette index ${index} out of bounds`);\n this.palette[index] = { r, g, b };\n }\n\n public getPaletteColor(index: number): RGB | undefined {\n return this.palette[index];\n }\n\n public setTransparency(index: number, alpha: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Transparency index ${index} out of bounds`);\n this.transparency[index] = alpha;\n }\n\n public getTransparency(index: number): number | undefined {\n return this.transparency[index];\n }\n\n public setPixelPaletteIndex(x: number, y: number, colorIndex: number): void {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return;\n this.pixels[y * this.width + x] = colorIndex;\n }\n\n public getPixelPaletteIndex(x: number, y: number): number {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return 0;\n return this.pixels[y * this.width + x]!;\n }\n\n public encodeToPngBytes(): Uint8Array {\n const signature = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);\n const ihdrData = new Uint8Array(13);\n const ihdrView = new DataView(ihdrData.buffer);\n ihdrView.setUint32(0, this.width, false);\n ihdrView.setUint32(4, this.height, false);\n ihdrData[8] = 8; ihdrData[9] = 3;\n const ihdr = this.createChunk('IHDR', ihdrData);\n\n const plteData = new Uint8Array(this.maxColors * 3);\n for (let i = 0; i < this.maxColors; i++) {\n const color = this.palette[i] || { r: 0, g: 0, b: 0 };\n plteData[i * 3] = color.r;\n plteData[i * 3 + 1] = color.g;\n plteData[i * 3 + 2] = color.b;\n }\n const plte = this.createChunk('PLTE', plteData);\n\n let trns: Uint8Array | null = null;\n if (this.transparency.length > 0) {\n const trnsData = new Uint8Array(this.maxColors);\n trnsData.fill(255);\n for (let i = 0; i < this.maxColors; i++) {\n if (this.transparency[i] !== undefined) trnsData[i] = this.transparency[i]!;\n }\n trns = this.createChunk('tRNS', trnsData);\n }\n\n const stride = this.width + 1;\n const idatData = new Uint8Array(this.height * stride);\n for (let y = 0; y < this.height; y++) {\n idatData[y * stride] = 0;\n idatData.set(this.pixels.subarray(y * this.width, (y + 1) * this.width), y * stride + 1);\n }\n const idat = this.createChunk('IDAT', pako.deflate(idatData));\n const iend = this.createChunk('IEND', new Uint8Array(0));\n\n const chunks = [signature, ihdr, plte];\n if (trns) chunks.push(trns);\n chunks.push(idat, iend);\n return this.concat(chunks);\n }\n\n private createChunk(type: string, data: Uint8Array): Uint8Array {\n const chunk = new Uint8Array(12 + data.length);\n const view = new DataView(chunk.buffer);\n view.setUint32(0, data.length, false);\n for (let i = 0; i < 4; i++) chunk[4 + i] = type.charCodeAt(i);\n chunk.set(data, 8);\n const crc = CRC32.buf(chunk.subarray(4, 8 + data.length));\n view.setInt32(8 + data.length, crc, false);\n return chunk;\n }\n\n private concat(arrays: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(arrays.reduce((a, b) => a + b.length, 0));\n let off = 0;\n for (const a of arrays) { out.set(a, off); off += a.length; }\n return out;\n }\n}\n"],"mappings":"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","names":["pako","CRC32","PNGPaletteImage","_PNGPaletteImage","width","height","maxColors","bytes","view","rawPalette","rawTransparency","idatChunks","pos","length","type","data","i","img","totalIdatLen","acc","chunk","combinedIdat","idatPos","inflated","stride","y","filterType","rowData","index","r","g","b","alpha","x","colorIndex","signature","ihdrData","ihdrView","ihdr","plteData","color","plte","trns","trnsData","idatData","idat","iend","chunks","crc","arrays","out","a","off"]}
|
|
1
|
+
{"version":3,"sources":["../src/PNGPaletteImage.ts"],"sourcesContent":["import pako from 'pako';\nimport CRC32 from 'crc-32';\n\nexport interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport class PNGPaletteImage {\n private palette: RGB[] = [];\n private transparency: number[] = [];\n private pixels: Uint8Array;\n\n constructor(\n public readonly width: number,\n public readonly height: number,\n public readonly maxColors: number = 256\n ) {\n this.pixels = new Uint8Array(width * height);\n }\n\n /**\n * Get RGBA image data\n */\n public getImageData() {\n const imageData = new Uint8Array(this.width * this.height * 4);\n\n for (let index = 0; index < this.pixels.length; index++) {\n imageData[index * 4] = this.palette[this.pixels[index]].r;\n imageData[index * 4 + 1] = this.palette[this.pixels[index]].g;\n imageData[index * 4 + 2] = this.palette[this.pixels[index]].b;\n imageData[index * 4 + 3] = this.transparency[index];\n }\n\n return imageData;\n }\n\n /**\n * Get raw pixel data, indexes to palette\n */\n public getPixels() {\n return this.pixels;\n }\n\n /**\n * Creates a PNGPaletteImage from a PNG file byte array.\n */\n public static fromPngBytes(bytes: Uint8Array): PNGPaletteImage {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n if (bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4E || bytes[3] !== 0x47) {\n throw new Error('Not a PNG file');\n }\n\n let width = 0;\n let height = 0;\n let rawPalette: RGB[] = [];\n let rawTransparency: number[] = [];\n let idatChunks: Uint8Array[] = [];\n\n let pos = 8;\n while (pos < bytes.length) {\n const length = view.getUint32(pos, false);\n const type = String.fromCharCode(bytes[pos + 4]!, bytes[pos + 5]!, bytes[pos + 6]!, bytes[pos + 7]!);\n const data = bytes.subarray(pos + 8, pos + 8 + length);\n\n if (type === 'IHDR') {\n width = view.getUint32(pos + 8, false);\n height = view.getUint32(pos + 12, false);\n } else if (type === 'PLTE') {\n for (let i = 0; i < length / 3; i++) {\n rawPalette[i] = { r: data[i * 3]!, g: data[i * 3 + 1]!, b: data[i * 3 + 2]! };\n }\n } else if (type === 'tRNS') {\n for (let i = 0; i < length; i++) {\n rawTransparency[i] = data[i]!;\n }\n } else if (type === 'IDAT') {\n idatChunks.push(data);\n } else if (type === 'IEND') {\n break;\n }\n\n pos += 12 + length;\n }\n\n if (width === 0 || height === 0) throw new Error('Invalid PNG: Missing IHDR');\n\n const img = new PNGPaletteImage(width, height, 256);\n img.palette = rawPalette;\n img.transparency = rawTransparency;\n\n const totalIdatLen = idatChunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const combinedIdat = new Uint8Array(totalIdatLen);\n let idatPos = 0;\n for (const chunk of idatChunks) {\n combinedIdat.set(chunk, idatPos);\n idatPos += chunk.length;\n }\n\n const inflated = pako.inflate(combinedIdat);\n const stride = width + 1;\n for (let y = 0; y < height; y++) {\n const filterType = inflated[y * stride];\n const rowData = inflated.subarray(y * stride + 1, y * stride + 1 + width);\n\n if (filterType === 0) {\n img.pixels.set(rowData, y * width);\n } else {\n img.pixels.set(rowData, y * width);\n }\n }\n\n return img;\n }\n\n /**\n * Sets color in color palette.\n */\n public setPaletteColor(index: number, r: number, g: number, b: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Palette index ${index} out of bounds`);\n this.palette[index] = { r, g, b };\n }\n\n /**\n * Gets color from color palette.\n */\n public getPaletteColor(index: number): RGB | undefined {\n return this.palette[index];\n }\n\n /**\n * Sets alpha value in color palette.\n */\n public setTransparency(index: number, alpha: number): void {\n if (index < 0 || index >= this.maxColors) throw new Error(`Transparency index ${index} out of bounds`);\n this.transparency[index] = alpha;\n }\n\n /**\n * Gets alpha value from color palette.\n */\n public getTransparency(index: number): number | undefined {\n return this.transparency[index];\n }\n\n /**\n * Sets color index at image's x & y.\n */\n public setPixelPaletteIndex(x: number, y: number, colorIndex: number): void {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return;\n this.pixels[y * this.width + x] = colorIndex;\n }\n\n /**\n * Gets color index at image's x & y.\n */\n public getPixelPaletteIndex(x: number, y: number): number {\n if (x < 0 || x >= this.width || y < 0 || y >= this.height) return 0;\n return this.pixels[y * this.width + x]!;\n }\n\n /**\n * Returns encoded png bytes\n */\n public encodeToPngBytes(): Uint8Array {\n const signature = new Uint8Array([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]);\n const ihdrData = new Uint8Array(13);\n const ihdrView = new DataView(ihdrData.buffer);\n ihdrView.setUint32(0, this.width, false);\n ihdrView.setUint32(4, this.height, false);\n ihdrData[8] = 8; ihdrData[9] = 3;\n const ihdr = this.createChunk('IHDR', ihdrData);\n\n const plteData = new Uint8Array(this.maxColors * 3);\n for (let i = 0; i < this.maxColors; i++) {\n const color = this.palette[i] || { r: 0, g: 0, b: 0 };\n plteData[i * 3] = color.r;\n plteData[i * 3 + 1] = color.g;\n plteData[i * 3 + 2] = color.b;\n }\n const plte = this.createChunk('PLTE', plteData);\n\n let trns: Uint8Array | null = null;\n if (this.transparency.length > 0) {\n const trnsData = new Uint8Array(this.maxColors);\n trnsData.fill(255);\n for (let i = 0; i < this.maxColors; i++) {\n if (this.transparency[i] !== undefined) trnsData[i] = this.transparency[i]!;\n }\n trns = this.createChunk('tRNS', trnsData);\n }\n\n const stride = this.width + 1;\n const idatData = new Uint8Array(this.height * stride);\n for (let y = 0; y < this.height; y++) {\n idatData[y * stride] = 0;\n idatData.set(this.pixels.subarray(y * this.width, (y + 1) * this.width), y * stride + 1);\n }\n const idat = this.createChunk('IDAT', pako.deflate(idatData));\n const iend = this.createChunk('IEND', new Uint8Array(0));\n\n const chunks = [signature, ihdr, plte];\n if (trns) chunks.push(trns);\n chunks.push(idat, iend);\n return this.concat(chunks);\n }\n\n private createChunk(type: string, data: Uint8Array): Uint8Array {\n const chunk = new Uint8Array(12 + data.length);\n const view = new DataView(chunk.buffer);\n view.setUint32(0, data.length, false);\n for (let i = 0; i < 4; i++) chunk[4 + i] = type.charCodeAt(i);\n chunk.set(data, 8);\n const crc = CRC32.buf(chunk.subarray(4, 8 + data.length));\n view.setInt32(8 + data.length, crc, false);\n return chunk;\n }\n\n private concat(arrays: Uint8Array[]): Uint8Array {\n const out = new Uint8Array(arrays.reduce((a, b) => a + b.length, 0));\n let off = 0;\n for (const a of arrays) { out.set(a, off); off += a.length; }\n return out;\n }\n}\n"],"mappings":"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","names":["pako","CRC32","PNGPaletteImage","_PNGPaletteImage","width","height","maxColors","imageData","index","bytes","view","rawPalette","rawTransparency","idatChunks","pos","length","type","data","i","img","totalIdatLen","acc","chunk","combinedIdat","idatPos","inflated","stride","y","filterType","rowData","r","g","b","alpha","x","colorIndex","signature","ihdrData","ihdrView","ihdr","plteData","color","plte","trns","trnsData","idatData","idat","iend","chunks","crc","arrays","out","a","off"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "png-palette",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Small library to
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Small library to help working with palette based PNGs.",
|
|
5
5
|
"main": "dist/PNGPaletteImage.cjs",
|
|
6
6
|
"module": "dist/PNGPaletteImage.js",
|
|
7
7
|
"types": "dist/PNGPaletteImage.d.ts",
|