From f4d22751c1c15c9853280ccadba952073a2a7741 Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Thu, 16 Dec 2021 22:55:47 +0800 Subject: [PATCH 01/11] added typescript decl. (testing/1) --- ImageScript.d.ts | 240 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 ImageScript.d.ts diff --git a/ImageScript.d.ts b/ImageScript.d.ts new file mode 100644 index 0000000..154d948 --- /dev/null +++ b/ImageScript.d.ts @@ -0,0 +1,240 @@ +class Image { + private __width__: number; + private __height__: number; + private __buffer__: ArrayBuffer; + private __view__: DataView; + private __u32__: Uint32Array; + bitmap: Uint8ClampedArray; + + constructor(width: number, height: number) { + this.__width__; + this.__height__; + this.__buffer__; + this.__view__; + this.__u32__; + this.bitmap; + }; + + private toString(): string; + + get width(): number; + + get height(): number; + + *[Symbol.iterator](): void; + + *iterateWithColors(): Generator<[x: number, y: number, color: number], void, unknown>; + + static rgbaToColor(r: number, g: number, b: number, a: number): number; + + static rgbToColor(r: number, g: number, b: number): typeof Image.rgbaToColor; + + static hslaToColor(h: number, s: number, l: number, a: number): typeof Image.rgbaToColor; + + static hslToColor(h: number, s: number, l: number): typeof Image.hslaToColor; + + static rgbaToHSLA(r: number, g: number, b: number, a: number): number[]; + + static colorToRGBA(color: number): number[]; + + static colorToRGB(color: number): typeof Image.colorToRGBA[]; + + getPixelAt(x: number, y: number): number; + + getRGBAAt(x: number, y: number): Uint8ClampedArray; + + setPixelAt(x: number, y: number, pixelColor: number): Image; + + private __set_pixel__(x: number, y: number, pixelColor: number): void; + + private __check_boundaries__(x: number, y: number): void; + + private static get __out_of_bounds__(): string; + + fill (color: number | colorFunction): Image; + + clone(): Image; + + static get RESIZE_NEAREST_NEIGHBOR(): string; + + static get RESIZE_AUTO(): number; + + scale(factor: number, mode?: string): Image; + + private __scale__(factor: number, mode?: string); + + resize(width: number, height: number, mode?: string): Image; + + contain(width: number, height: number, mode?: string): Image; + + fill(width: number, height: number, mode?: string): Image; + + cover(width: number, height: number, mode?: string): Image; + + private __resize__(width: number, height: number, mode?: string): Image; + + private __resize_nearest_neighbor__(width: number, height: number): Image; + + crop(x: number, y: number, width: number, height: number): Image; + + private __crop__(x: number, y: number, width: number, height: number): Image; + + drawBox(x: number, y: number, width: number, height: number, color: number | colorFunction): Image; + + private __fast_box__(x: number, y: number, width: number, height: number, color: number): Image; + + drawCircle(x: number, y: number, radius: number, color: number | colorFunction): Image; + + cropCircle(max?: boolean, feathering?: number): Image; + + opacity(opacity: number, absolute?: boolean): Image; + + red(saturation: number, absolute?: boolean): Image; + + green(saturation: number, absolute?: boolean): Image; + + blue(saturation: number, absolute?: boolean): Image; + + private __set_channel_value__(value: number, absolute: boolean, offset: number): void; + + lightness(value: number, absolute?: boolean): Image; + + saturation(value: number, absolute?: boolean): Image; + + composite(source: Image, x: number, y: number): Image; + + invert(): Image; + + invertValue(): Image; + + invertSaturation(): Image; + + invertHue(): Image; + + hueShift(degrees: number): Image; + + averageColor(): typeof Image.rgbaToColor | number; + + dominantColor(ignoreBlack?: boolean, ignoreWhite?: boolean, bwThreshold?: number): typeof Image.hslaToColor | number; + + rotate(angle: number, resize?: boolean): Image; + + private __apply__(image: Image): Image; + + static gradient(colors: Object): (function(number): number); + + roundCorners(radius?: number): Image; + + private static __gradient__(startColor: number, endColor: number): number; + + fisheye(radius?: number): Image; + + async encode(compression?: number, metadata: PNGMetadata): Promise; + + async encodeJPEG(quality?: number): Promise; + + async encodeWEBP(quality?: null | number): Promise; + + static async encode(data: Buffer | Uint8Array): Promise + + static get SVG_MODE_SCALE(): number; + + static get SVG_MODE_WIDTH(): number; + + static get SVG_MODE_HEIGHT(): number; + + static async renderSVG(svg: string, size?: number, mode?: number): Promise; + + static async renderText(font: Uint8Array, scale: number, text: string, color?: number, layout: TextLayout): Promise; +}; + +class Frame extends Image { + static get DISPOSAL_KEEP(): string; + + static get DISPOSAL_PREVIOUS(): string; + + static get DISPOSAL_BACKGROUND(): string + + static __convert_disposal_mode__(mode: string | number): any; + + constructor(width: number, height: number, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: typeof Frame.DISPOSAL_KEEP | string) { + // super(width, height); + this.duration = duration; + this.xOffset = xOffset; + this.yOffset = yOffset; + this.disposalMode = disposalMode; + }; + + toString(): string; + + static from(image: Image, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: typeof Frame.DISPOSAL_KEEP | string): Frame; + + resize(width: number, height: number, mode?: typeof Image.RESIZE_NEAREST_NEIGHBOR | string): Image; +}; + +class GIF extends Array { + constructor(frames: Frame[], loopCount?: number) { + // super(...frames); + this.loopCount = loopCount; + }; + + get width(): number; + + get height(): number; + + toString(): string; + + * [Symbol.iterator](): Generator + + slice(start: number, end: number): GIF; + + get duration(): number; + + async encode(quality?: number): Promise + + static async decode(data: Buffer | Uint8Array, onlyExtractFirstFrame?: boolean): Promise; + + resize(width: number, height: number, mode?: typeof Image.RESIZE_NEAREST_NEIGHBOR | string): void; +} + +class TextLayout { + constructor(options?: { + maxWidth?: number, + maxHeight?: number, + wrapStyle?: string, + verticalAlign?: string, + horizontalAlign?: string, + wrapHardBreaks?: boolean + }) {} +}; + +class ImageType { + static getType(data: Buffer | Uint8Array): string | null; + + static isPNG(view: DataView): boolean; + + static isJPEG(view: DataView): boolean; + + static isTIFF(view: DataView): boolean; + + static isGIF(view: DataView): boolean; +}; + +function decode(data: Uint8Array | Buffer, onlyExtractFirstFrame?: boolean): Promise; + +type colorFunction = (x: number, y: number) => number; + +type PNGMetadata = { + title?: string, + author?: string, + description?: string, + copyright?: string, + creationTime?: number, + software?: string, + disclaimer?: string, + warning?: string, + source?: string, + comment?: string +}; + +export = {Image, GIF, Frame, TextLayout, ImageType, decode}; From 41514e50fa13c1a7114538ed9b922b37cca06ef6 Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Thu, 16 Dec 2021 22:56:13 +0800 Subject: [PATCH 02/11] tsconfig --- tsconfig.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tsconfig.json diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1312e9a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "allowJs": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "lib": ["es6"] + }, + "files": ["ImageScript.d.ts"] +} From aca1029682f295adf3a415ff2e9268c5d175a873 Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:00:02 +0800 Subject: [PATCH 03/11] fixed constructor. (testing/2) --- ImageScript.d.ts | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index 154d948..c97b875 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -6,14 +6,7 @@ class Image { private __u32__: Uint32Array; bitmap: Uint8ClampedArray; - constructor(width: number, height: number) { - this.__width__; - this.__height__; - this.__buffer__; - this.__view__; - this.__u32__; - this.bitmap; - }; + constructor(width: number, height: number); private toString(): string; @@ -157,13 +150,7 @@ class Frame extends Image { static __convert_disposal_mode__(mode: string | number): any; - constructor(width: number, height: number, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: typeof Frame.DISPOSAL_KEEP | string) { - // super(width, height); - this.duration = duration; - this.xOffset = xOffset; - this.yOffset = yOffset; - this.disposalMode = disposalMode; - }; + constructor(width: number, height: number, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: typeof Frame.DISPOSAL_KEEP | string); toString(): string; @@ -173,10 +160,7 @@ class Frame extends Image { }; class GIF extends Array { - constructor(frames: Frame[], loopCount?: number) { - // super(...frames); - this.loopCount = loopCount; - }; + constructor(frames: Frame[], loopCount?: number); get width(): number; @@ -205,7 +189,7 @@ class TextLayout { verticalAlign?: string, horizontalAlign?: string, wrapHardBreaks?: boolean - }) {} + }); }; class ImageType { From 1bc1adaa5efaa6d682879f2e6e801d7157f7be7f Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:13:57 +0800 Subject: [PATCH 04/11] added "encode" overload, fixed typo. (testing/3) --- ImageScript.d.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index c97b875..5be342c 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -14,9 +14,9 @@ class Image { get height(): number; - *[Symbol.iterator](): void; + * [Symbol.iterator](): void; - *iterateWithColors(): Generator<[x: number, y: number, color: number], void, unknown>; + * iterateWithColors(): Generator<[x: number, y: number, color: number], void, unknown>; static rgbaToColor(r: number, g: number, b: number, a: number): number; @@ -112,7 +112,7 @@ class Image { rotate(angle: number, resize?: boolean): Image; - private __apply__(image: Image): Image; + private __apply__(image: Image | Frame): Image | Frame; static gradient(colors: Object): (function(number): number); @@ -123,6 +123,8 @@ class Image { fisheye(radius?: number): Image; async encode(compression?: number, metadata: PNGMetadata): Promise; + + async encode(metadata: PNGMetadata): Promise; async encodeJPEG(quality?: number): Promise; From 4773f2e80d7abce2155aa4f7d4d03b2ae6d90fdb Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:16:16 +0800 Subject: [PATCH 05/11] fixed static gradient. (testing/4) --- ImageScript.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index 5be342c..967f8f0 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -114,7 +114,7 @@ class Image { private __apply__(image: Image | Frame): Image | Frame; - static gradient(colors: Object): (function(number): number); + static gradient(colors: { [x: number]: number; }): (function(number): number); roundCorners(radius?: number): Image; @@ -123,7 +123,7 @@ class Image { fisheye(radius?: number): Image; async encode(compression?: number, metadata: PNGMetadata): Promise; - + async encode(metadata: PNGMetadata): Promise; async encodeJPEG(quality?: number): Promise; From ecfe4550e206707b405e71733681b1406f30ace1 Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Thu, 16 Dec 2021 23:27:04 +0800 Subject: [PATCH 06/11] fixed static gradient, part 2. (testing/5) --- ImageScript.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index 967f8f0..0acbad5 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -114,7 +114,7 @@ class Image { private __apply__(image: Image | Frame): Image | Frame; - static gradient(colors: { [x: number]: number; }): (function(number): number); + static gradient(colors: { [x: number]: number; }): ((position: number) => number); roundCorners(radius?: number): Image; From ccb1bdfdb9a6d4a80aa832d0db7fed1af2eaa0f5 Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Fri, 17 Dec 2021 18:03:38 +0800 Subject: [PATCH 07/11] export straight to class, fixed typo. (testing/6) --- ImageScript.d.ts | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index 0acbad5..c28d061 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -1,4 +1,4 @@ -class Image { +export class Image { private __width__: number; private __height__: number; private __buffer__: ArrayBuffer; @@ -44,7 +44,7 @@ class Image { private static get __out_of_bounds__(): string; - fill (color: number | colorFunction): Image; + fill(color: number | colorFunction): Image; clone(): Image; @@ -60,7 +60,7 @@ class Image { contain(width: number, height: number, mode?: string): Image; - fill(width: number, height: number, mode?: string): Image; + fit(width: number, height: number, mode?: string): Image; cover(width: number, height: number, mode?: string): Image; @@ -94,7 +94,7 @@ class Image { saturation(value: number, absolute?: boolean): Image; - composite(source: Image, x: number, y: number): Image; + composite(source: Image, x?: number, y?: number): Image; invert(): Image; @@ -114,7 +114,7 @@ class Image { private __apply__(image: Image | Frame): Image | Frame; - static gradient(colors: { [x: number]: number; }): ((position: number) => number); + static gradient(colors: { [x: number]: number; }): (function(number): number); roundCorners(radius?: number): Image; @@ -122,9 +122,8 @@ class Image { fisheye(radius?: number): Image; - async encode(compression?: number, metadata: PNGMetadata): Promise; - - async encode(metadata: PNGMetadata): Promise; + async encode(compression?: number, metadata?: PNGMetadata): Promise; + async encode(metadata?: PNGMetadata): Promise; async encodeJPEG(quality?: number): Promise; @@ -140,10 +139,10 @@ class Image { static async renderSVG(svg: string, size?: number, mode?: number): Promise; - static async renderText(font: Uint8Array, scale: number, text: string, color?: number, layout: TextLayout): Promise; + static async renderText(font: Uint8Array, scale: number, text: string, color?: number, layout?: TextLayout): Promise; }; -class Frame extends Image { +export class Frame extends Image { static get DISPOSAL_KEEP(): string; static get DISPOSAL_PREVIOUS(): string; @@ -161,7 +160,7 @@ class Frame extends Image { resize(width: number, height: number, mode?: typeof Image.RESIZE_NEAREST_NEIGHBOR | string): Image; }; -class GIF extends Array { +export class GIF extends Array { constructor(frames: Frame[], loopCount?: number); get width(): number; @@ -183,7 +182,7 @@ class GIF extends Array { resize(width: number, height: number, mode?: typeof Image.RESIZE_NEAREST_NEIGHBOR | string): void; } -class TextLayout { +export class TextLayout { constructor(options?: { maxWidth?: number, maxHeight?: number, @@ -194,7 +193,7 @@ class TextLayout { }); }; -class ImageType { +export class ImageType { static getType(data: Buffer | Uint8Array): string | null; static isPNG(view: DataView): boolean; @@ -206,7 +205,7 @@ class ImageType { static isGIF(view: DataView): boolean; }; -function decode(data: Uint8Array | Buffer, onlyExtractFirstFrame?: boolean): Promise; +export function decode(data: Uint8Array | Buffer, onlyExtractFirstFrame?: boolean): Promise; type colorFunction = (x: number, y: number) => number; @@ -222,5 +221,3 @@ type PNGMetadata = { source?: string, comment?: string }; - -export = {Image, GIF, Frame, TextLayout, ImageType, decode}; From 61aa540a8860c3e6d85046d1e6d9536aa1d94d6d Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Fri, 17 Dec 2021 18:14:42 +0800 Subject: [PATCH 08/11] fixed typeof on rgbaToColor, etc. (testing/7) --- ImageScript.d.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index c28d061..b756fd9 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -20,17 +20,17 @@ export class Image { static rgbaToColor(r: number, g: number, b: number, a: number): number; - static rgbToColor(r: number, g: number, b: number): typeof Image.rgbaToColor; + static rgbToColor(r: number, g: number, b: number): number; - static hslaToColor(h: number, s: number, l: number, a: number): typeof Image.rgbaToColor; + static hslaToColor(h: number, s: number, l: number, a: number): number; - static hslToColor(h: number, s: number, l: number): typeof Image.hslaToColor; + static hslToColor(h: number, s: number, l: number): number; static rgbaToHSLA(r: number, g: number, b: number, a: number): number[]; static colorToRGBA(color: number): number[]; - static colorToRGB(color: number): typeof Image.colorToRGBA[]; + static colorToRGB(color: number): number[]; getPixelAt(x: number, y: number): number; @@ -106,9 +106,9 @@ export class Image { hueShift(degrees: number): Image; - averageColor(): typeof Image.rgbaToColor | number; + averageColor(): number; - dominantColor(ignoreBlack?: boolean, ignoreWhite?: boolean, bwThreshold?: number): typeof Image.hslaToColor | number; + dominantColor(ignoreBlack?: boolean, ignoreWhite?: boolean, bwThreshold?: number): number; rotate(angle: number, resize?: boolean): Image; From b05a306d3763f8ec8fd380900f8d3d7d4f47c870 Mon Sep 17 00:00:00 2001 From: ray <33544674+ray-1337@users.noreply.github.com> Date: Fri, 17 Dec 2021 18:17:58 +0800 Subject: [PATCH 09/11] edited PNGMetadata:creationTime type. (testing/8) --- ImageScript.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index b756fd9..c2a7491 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -214,7 +214,7 @@ type PNGMetadata = { author?: string, description?: string, copyright?: string, - creationTime?: number, + creationTime?: string | number | Date, software?: string, disclaimer?: string, warning?: string, From f590e254720ee4f3a69844c46a7c5f257a75d5c1 Mon Sep 17 00:00:00 2001 From: Mathis Mensing Date: Tue, 29 Mar 2022 12:38:50 +0200 Subject: [PATCH 10/11] fix: typescript function syntax --- ImageScript.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index c2a7491..01f31b5 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -114,7 +114,7 @@ export class Image { private __apply__(image: Image | Frame): Image | Frame; - static gradient(colors: { [x: number]: number; }): (function(number): number); + static gradient(colors: { [position: number]: number; }): ((position: number) => number); roundCorners(radius?: number): Image; From b3438ec4d35f734abfc258e071ce88686faacbbc Mon Sep 17 00:00:00 2001 From: Mathis Mensing Date: Tue, 29 Mar 2022 12:39:04 +0200 Subject: [PATCH 11/11] fix: make __convert_disposal_mode__ private --- ImageScript.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImageScript.d.ts b/ImageScript.d.ts index 01f31b5..5e9b776 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -149,7 +149,7 @@ export class Frame extends Image { static get DISPOSAL_BACKGROUND(): string - static __convert_disposal_mode__(mode: string | number): any; + private static __convert_disposal_mode__(mode: string | number): any; constructor(width: number, height: number, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: typeof Frame.DISPOSAL_KEEP | string);