diff --git a/ImageScript.d.ts b/ImageScript.d.ts index 34573e2..447e75b 100644 --- a/ImageScript.d.ts +++ b/ImageScript.d.ts @@ -17,7 +17,7 @@ export class Image { * [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): number; @@ -112,6 +112,8 @@ export class Image { rotate(angle: number, resize?: boolean): Image; + flip(direction: 'horizontal' | 'vertical'): Image; + private __apply__(image: Image | Frame): Image | Frame; static gradient(colors: { [position: number]: number; }): ((position: number) => number); @@ -162,7 +164,7 @@ export class Frame extends Image { get disposalMode(): number; set disposalMode(disposalMode: string|number); - + toString(): string; static from(image: Image, duration?: number, xOffset?: number, yOffset?: number, disposalMode?: typeof Frame.DISPOSAL_KEEP | string): Frame; diff --git a/ImageScript.js b/ImageScript.js index fe06ac4..fc205f5 100644 --- a/ImageScript.js +++ b/ImageScript.js @@ -829,6 +829,17 @@ class Image { return this.__apply__(out); } + /** + * Flips / mirrors the image horizontally or vertically + * @param {'horizontal' | 'vertical'} direction The direction to flip + */ + flip(direction) { + const frame = new v2(this.width, this.height, this.bitmap).flip(direction); + + this.bitmap.set(frame.u8); + return this; + } + /** * @private * @param {Image|Frame} image diff --git a/tests/flip.js b/tests/flip.js new file mode 100644 index 0000000..9fe22d3 --- /dev/null +++ b/tests/flip.js @@ -0,0 +1,36 @@ +const fs = require('fs').promises; +const {Image} = require('../ImageScript'); + +(async () => { + const input = await fs.readFile('./tests/targets/external.png'); + + { + const image = await Image.decode(input); + image.flip('horizontal'); + + const output = await image.encode(1, {creationTime: 0, software: ''}); + + if (process.env.OVERWRITE_TEST) + await fs.writeFile('./tests/targets/flip-horizontal.png', output); + + const target = await fs.readFile('./tests/targets/flip-horizontal.png'); + + if (!Buffer.from(target).equals(Buffer.from(output))) + process.exit(1); + } + + { + const image = await Image.decode(input); + image.flip('vertical'); + + const output = await image.encode(1, {creationTime: 0, software: ''}); + + if (process.env.OVERWRITE_TEST) + await fs.writeFile('./tests/targets/flip-vertical.png', output); + + const target = await fs.readFile('./tests/targets/flip-vertical.png'); + + if (!Buffer.from(target).equals(Buffer.from(output))) + process.exit(1); + } +})(); diff --git a/tests/targets/flip-horizontal.png b/tests/targets/flip-horizontal.png new file mode 100644 index 0000000..432046f Binary files /dev/null and b/tests/targets/flip-horizontal.png differ diff --git a/tests/targets/flip-vertical.png b/tests/targets/flip-vertical.png new file mode 100644 index 0000000..29262e3 Binary files /dev/null and b/tests/targets/flip-vertical.png differ