Initial commit
This commit is contained in:
commit
e49726988c
5445 files changed
+1089914
No files matched your search
+8
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"rootDir": "../src",
|
||||
"module": "nodenext",
|
||||
"moduleResolution": "nodenext"
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"extends": "./build.json",
|
||||
"include": [
|
||||
"../src/**/*.ts",
|
||||
"../src/**/*.cts",
|
||||
"../src/**/*.tsx",
|
||||
"../src/**/*.json"
|
||||
],
|
||||
"exclude": [
|
||||
"../**/*.test.ts",
|
||||
"../src/**/*.mts",
|
||||
"../src/package.json"
|
||||
],
|
||||
"compilerOptions": {
|
||||
"outDir": "../.tshy-build/commonjs"
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"extends": "./build.json",
|
||||
"include": [
|
||||
"../src/**/*.ts",
|
||||
"../src/**/*.mts",
|
||||
"../src/**/*.tsx",
|
||||
"../src/**/*.json"
|
||||
],
|
||||
"exclude": [
|
||||
"../**/*.test.ts",
|
||||
"../src/package.json"
|
||||
],
|
||||
"compilerOptions": {
|
||||
"outDir": "../.tshy-build/esm"
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
> @jimp/plugin-rotate@1.5.0 build /Users/andrewlisowski/Documents/jimp/plugins/plugin-rotate
|
||||
> tshy
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
> @jimp/plugin-rotate@1.1.2 lint /Users/andrewlisowski/Documents/jimp/plugins/plugin-rotate
|
||||
> eslint .
|
||||
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
|
||||
> @jimp/plugin-rotate@1.1.1 test:browser /Users/andrewlisowski/Documents/jimp/plugins/plugin-rotate
|
||||
> vitest --config vitest.config.browser.mjs "--watch=false" "--u"
|
||||
|
||||
|
||||
[7m[1m[36m RUN [39m[22m[27m [36mv1.4.0[39m [90m/Users/andrewlisowski/Documents/jimp/plugins/plugin-rotate[39m
|
||||
[2m[32m Browser runner started at http://localhost:5173/[39m[22m
|
||||
|
||||
[?25l [90m·[39m 315 degrees
|
||||
[90m·[39m Rotate a non-square image[2m (12)[22m
|
||||
[90m·[39m 1 degrees
|
||||
[90m·[39m 10 degrees
|
||||
[90m·[39m 30 degrees
|
||||
[90m·[39m 45 degrees
|
||||
[90m·[39m 90 degrees
|
||||
[90m·[39m -90 degrees
|
||||
[90m·[39m 135 degrees
|
||||
[90m·[39m 180 degrees
|
||||
[90m·[39m 225 degrees
|
||||
[90m·[39m 315 degrees
|
||||
[90m·[39m -180 degrees
|
||||
[90m·[39m -270 degrees
|
||||
[90m·[39m Rotate a non-square image without resizing[2m (4)[22m
|
||||
[90m·[39m 90 degrees
|
||||
[90m·[39m 180 degrees
|
||||
[90m·[39m 270 degrees
|
||||
[90m·[39m 45 degrees
|
||||
[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m 315 degrees
|
||||
[32m✓[39m Rotate a non-square image[2m (12)[22m
|
||||
[32m✓[39m 1 degrees
|
||||
[32m✓[39m 10 degrees
|
||||
[32m✓[39m 30 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m -90 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m -180 degrees
|
||||
[32m✓[39m -270 degrees
|
||||
[32m✓[39m Rotate a non-square image without resizing[2m (4)[22m
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 270 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/[22mindex[2m.test.ts[22m[2m (34)[22m
|
||||
[32m✓[39m Rotate a image with even size[2m (14)[22m
|
||||
[32m✓[39m 1 degrees
|
||||
[32m✓[39m 91 degrees
|
||||
[32m✓[39m 30 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 60 degrees
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m -90 degrees
|
||||
[32m✓[39m 120 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 270 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m 360 degrees
|
||||
[32m✓[39m Rotate a image with odd size[2m (4)[22m
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m Rotate a non-square image[2m (12)[22m
|
||||
[32m✓[39m 1 degrees
|
||||
[32m✓[39m 10 degrees
|
||||
[32m✓[39m 30 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m -90 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m -180 degrees
|
||||
[32m✓[39m -270 degrees
|
||||
[32m✓[39m Rotate a non-square image without resizing[2m (4)[22m
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 270 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
|
||||
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
||||
[2m Tests [22m [1m[32m34 passed[39m[22m[90m (34)[39m
|
||||
[2m Start at [22m 00:40:11
|
||||
[2m Duration [22m 3.18s[2m (transform 0ms, setup 0ms, collect 251ms, tests 13ms, environment 0ms, prepare 0ms)[22m
|
||||
|
||||
[?25h[?25h
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
|
||||
|
||||
> @jimp/plugin-rotate@1.1.2 test /Users/andrewlisowski/Documents/jimp/plugins/plugin-rotate
|
||||
> vitest "--watch=false"
|
||||
|
||||
|
||||
[7m[1m[36m RUN [39m[22m[27m [36mv2.0.5[39m [90m/Users/andrewlisowski/Documents/jimp/plugins/plugin-rotate[39m
|
||||
|
||||
[?25l [90m·[39m 30 degrees
|
||||
[90m·[39m 45 degrees
|
||||
[90m·[39m 90 degrees
|
||||
[90m·[39m -90 degrees
|
||||
[90m·[39m 135 degrees
|
||||
[90m·[39m 180 degrees
|
||||
[90m·[39m 225 degrees
|
||||
[90m·[39m 315 degrees
|
||||
[90m·[39m -180 degrees
|
||||
[90m·[39m -270 degrees
|
||||
[90m·[39m Rotate a non-square image without resizing[2m (4)[22m
|
||||
[90m·[39m 90 degrees
|
||||
[90m·[39m 180 degrees
|
||||
[90m·[39m 270 degrees
|
||||
[90m·[39m 45 degrees
|
||||
[?25l[?25l[?25l[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m 30 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m -90 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m -180 degrees
|
||||
[32m✓[39m -270 degrees
|
||||
[32m✓[39m Rotate a non-square image without resizing[2m (4)[22m
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 270 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[?25l[?25l[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[1A[2K[G [32m✓[39m [2msrc/[22mindex[2m.test.ts[22m[2m (34)[22m
|
||||
[32m✓[39m Rotate a image with even size[2m (14)[22m
|
||||
[32m✓[39m 1 degrees
|
||||
[32m✓[39m 91 degrees
|
||||
[32m✓[39m 30 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 60 degrees
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m -90 degrees
|
||||
[32m✓[39m 120 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 270 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m 360 degrees
|
||||
[32m✓[39m Rotate a image with odd size[2m (4)[22m
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m Rotate a non-square image[2m (12)[22m
|
||||
[32m✓[39m 1 degrees
|
||||
[32m✓[39m 10 degrees
|
||||
[32m✓[39m 30 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m -90 degrees
|
||||
[32m✓[39m 135 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 225 degrees
|
||||
[32m✓[39m 315 degrees
|
||||
[32m✓[39m -180 degrees
|
||||
[32m✓[39m -270 degrees
|
||||
[32m✓[39m Rotate a non-square image without resizing[2m (4)[22m
|
||||
[32m✓[39m 90 degrees
|
||||
[32m✓[39m 180 degrees
|
||||
[32m✓[39m 270 degrees
|
||||
[32m✓[39m 45 degrees
|
||||
|
||||
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
||||
[2m Tests [22m [1m[32m34 passed[39m[22m[90m (34)[39m
|
||||
[2m Start at [22m 01:34:10
|
||||
[2m Duration [22m 3.38s[2m (transform 1.13s, setup 0ms, collect 1.43s, tests 32ms, environment 0ms, prepare 591ms)[22m
|
||||
|
||||
[?25h[?25h
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
# v1.1.3 (Mon Sep 02 2024)
|
||||
|
||||
#### 🐛 Bug Fix
|
||||
|
||||
- Update deps [#1319](https://github.com/jimp-dev/jimp/pull/1319) ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
#### Authors: 1
|
||||
|
||||
- Andrew Lisowski ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
---
|
||||
|
||||
# v1.1.2 (Mon Sep 02 2024)
|
||||
|
||||
#### 🐛 Bug Fix
|
||||
|
||||
- Rotate short circuit [#1317](https://github.com/jimp-dev/jimp/pull/1317) ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
#### Authors: 1
|
||||
|
||||
- Andrew Lisowski ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
---
|
||||
|
||||
# v1.1.0 (Sun Sep 01 2024)
|
||||
|
||||
#### ⚠️ Pushed to `main`
|
||||
|
||||
- upgrade tshy ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
- update more docs ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
#### Authors: 1
|
||||
|
||||
- Andrew Lisowski ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
---
|
||||
|
||||
# v1.0.3 (Sat Aug 31 2024)
|
||||
|
||||
#### 🐛 Bug Fix
|
||||
|
||||
- Fix build [#1303](https://github.com/jimp-dev/jimp/pull/1303) ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
#### ⚠️ Pushed to `main`
|
||||
|
||||
- add clean script ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
#### Authors: 1
|
||||
|
||||
- Andrew Lisowski ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
---
|
||||
|
||||
# v1.0.2 (Sat Aug 31 2024)
|
||||
|
||||
#### ⚠️ Pushed to `main`
|
||||
|
||||
- set side effects ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
- fix versions ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
- add publish config ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
|
||||
#### Authors: 1
|
||||
|
||||
- Andrew Lisowski ([@hipstersmoothie](https://github.com/hipstersmoothie))
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Oliver Moran
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
<div align="center">
|
||||
<img width="200" height="200"
|
||||
src="https://s3.amazonaws.com/pix.iemoji.com/images/emoji/apple/ios-11/256/crayon.png">
|
||||
<h1>@jimp/plugin-rotate</h1>
|
||||
<p>Rotate an image.</p>
|
||||
</div>
|
||||
|
||||
Rotates the image counter-clockwise by a number of degrees. By default the width and height of the image will be resized appropriately.
|
||||
|
||||
- [rotate](http://jimp-dev.github.io/jimp/api/jimp/classes/jimp#rotate)
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
import { ResizeStrategy } from "@jimp/plugin-resize";
|
||||
import { JimpClass } from "@jimp/types";
|
||||
import { z } from "zod";
|
||||
declare const RotateOptionsSchema: z.ZodUnion<[z.ZodNumber, z.ZodObject<{
|
||||
/** the number of degrees to rotate the image by */
|
||||
deg: z.ZodNumber;
|
||||
/** resize mode or a boolean, if false then the width and height of the image will not be changed */
|
||||
mode: z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.ZodNativeEnum<typeof ResizeStrategy>]>>;
|
||||
}, "strip", z.ZodTypeAny, {
|
||||
deg: number;
|
||||
mode?: boolean | ResizeStrategy | undefined;
|
||||
}, {
|
||||
deg: number;
|
||||
mode?: boolean | ResizeStrategy | undefined;
|
||||
}>]>;
|
||||
export type RotateOptions = z.infer<typeof RotateOptionsSchema>;
|
||||
export declare const methods: {
|
||||
/**
|
||||
* Rotates the image counter-clockwise by a number of degrees. By default the width and height of the image will be resized appropriately.
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
*
|
||||
* image.rotate(90);
|
||||
* ```
|
||||
*/
|
||||
rotate<I extends JimpClass>(image: I, options: RotateOptions): I;
|
||||
};
|
||||
export {};
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,mBAAmB;IAGrB,mDAAmD;;IAEnD,oGAAoG;;;;;;;;IAGtG,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAuMhE,eAAO,MAAM,OAAO;IAClB;;;;;;;;;;OAUG;WACI,CAAC,SAAS,SAAS,SAAS,CAAC,WAAW,aAAa;CA2B7D,CAAC"}
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.methods = void 0;
|
||||
const plugin_resize_1 = require("@jimp/plugin-resize");
|
||||
const utils_1 = require("@jimp/utils");
|
||||
const core_1 = require("@jimp/core");
|
||||
const plugin_crop_1 = require("@jimp/plugin-crop");
|
||||
const zod_1 = require("zod");
|
||||
const RotateOptionsSchema = zod_1.z.union([
|
||||
zod_1.z.number(),
|
||||
zod_1.z.object({
|
||||
/** the number of degrees to rotate the image by */
|
||||
deg: zod_1.z.number(),
|
||||
/** resize mode or a boolean, if false then the width and height of the image will not be changed */
|
||||
mode: zod_1.z.union([zod_1.z.boolean(), zod_1.z.nativeEnum(plugin_resize_1.ResizeStrategy)]).optional(),
|
||||
}),
|
||||
]);
|
||||
/** function to translate the x, y coordinate to the index of the pixel in the buffer */
|
||||
function createIdxTranslationFunction(w) {
|
||||
return function (x, y) {
|
||||
return (y * w + x) << 2;
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Rotates an image counter-clockwise by multiple of 90 degrees. NB: 'this' must be a Jimp object.
|
||||
*
|
||||
* This function is based on matrix rotation. Check this to get an initial idea how it works: https://stackoverflow.com/a/8664879/10561909
|
||||
*
|
||||
* @param deg the number of degrees to rotate the image by, it should be a multiple of 90
|
||||
*/
|
||||
function matrixRotate(image, deg) {
|
||||
if (Math.abs(deg) % 90 !== 0) {
|
||||
throw new Error("Unsupported matrix rotation degree");
|
||||
}
|
||||
const w = image.bitmap.width;
|
||||
const h = image.bitmap.height;
|
||||
// decide which rotation angle to use
|
||||
let angle;
|
||||
switch (deg) {
|
||||
// 90 degree & -270 degree are same
|
||||
case 90:
|
||||
case -270:
|
||||
angle = 90;
|
||||
break;
|
||||
case 180:
|
||||
case -180:
|
||||
angle = 180;
|
||||
break;
|
||||
case 270:
|
||||
case -90:
|
||||
angle = -90;
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unsupported matrix rotation degree");
|
||||
}
|
||||
// After this switch block, angle will be 90, 180 or -90
|
||||
// calculate the new width and height
|
||||
const nW = angle === 180 ? w : h;
|
||||
const nH = angle === 180 ? h : w;
|
||||
const dstBuffer = Buffer.alloc(image.bitmap.data.length);
|
||||
const srcIdxFunction = createIdxTranslationFunction(w);
|
||||
const dstIdxFunction = createIdxTranslationFunction(nW);
|
||||
for (let x = 0; x < w; x++) {
|
||||
for (let y = 0; y < h; y++) {
|
||||
const srcIdx = srcIdxFunction(x, y);
|
||||
const pixelRGBA = image.bitmap.data.readUInt32BE(srcIdx);
|
||||
let dstIdx;
|
||||
switch (angle) {
|
||||
case 90:
|
||||
dstIdx = dstIdxFunction(y, w - x - 1);
|
||||
break;
|
||||
case -90:
|
||||
dstIdx = dstIdxFunction(h - y - 1, x);
|
||||
break;
|
||||
case 180:
|
||||
dstIdx = dstIdxFunction(w - x - 1, h - y - 1);
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unsupported matrix rotation angle");
|
||||
}
|
||||
dstBuffer.writeUInt32BE(pixelRGBA, dstIdx);
|
||||
}
|
||||
}
|
||||
image.bitmap.data = dstBuffer;
|
||||
image.bitmap.width = nW;
|
||||
image.bitmap.height = nH;
|
||||
}
|
||||
function createTranslationFunction(deltaX, deltaY) {
|
||||
return function (x, y) {
|
||||
return {
|
||||
x: x + deltaX,
|
||||
y: y + deltaY,
|
||||
};
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Rotates an image counter-clockwise by an arbitrary number of degrees. NB: 'this' must be a Jimp object.
|
||||
* @param {number} deg the number of degrees to rotate the image by
|
||||
*/
|
||||
function advancedRotate(image, deg, mode) {
|
||||
const rad = (deg * Math.PI) / 180;
|
||||
const cosine = Math.cos(rad);
|
||||
const sine = Math.sin(rad);
|
||||
// the final width and height will change if resize == true
|
||||
let w = image.bitmap.width;
|
||||
let h = image.bitmap.height;
|
||||
if (mode === true || typeof mode === "string") {
|
||||
// resize the image to it maximum dimension and blit the existing image
|
||||
// onto the center so that when it is rotated the image is kept in bounds
|
||||
// http://stackoverflow.com/questions/3231176/how-to-get-size-of-a-rotated-rectangle
|
||||
// Plus 1 border pixel to ensure to show all rotated result for some cases.
|
||||
w =
|
||||
Math.ceil(Math.abs(image.bitmap.width * cosine) +
|
||||
Math.abs(image.bitmap.height * sine)) + 1;
|
||||
h =
|
||||
Math.ceil(Math.abs(image.bitmap.width * sine) +
|
||||
Math.abs(image.bitmap.height * cosine)) + 1;
|
||||
// Ensure destination to have even size to a better result.
|
||||
if (w % 2 !== 0) {
|
||||
w++;
|
||||
}
|
||||
if (h % 2 !== 0) {
|
||||
h++;
|
||||
}
|
||||
const c = (0, utils_1.clone)(image);
|
||||
image.scan((_, __, idx) => {
|
||||
image.bitmap.data.writeUInt32BE(image.background, idx);
|
||||
});
|
||||
const max = Math.max(w, h, image.bitmap.width, image.bitmap.height);
|
||||
image = plugin_resize_1.methods.resize(image, {
|
||||
h: max,
|
||||
w: max,
|
||||
mode: mode === true ? undefined : mode,
|
||||
});
|
||||
image = (0, core_1.composite)(image, c, image.bitmap.width / 2 - c.bitmap.width / 2, image.bitmap.height / 2 - c.bitmap.height / 2);
|
||||
}
|
||||
const bW = image.bitmap.width;
|
||||
const bH = image.bitmap.height;
|
||||
const dstBuffer = Buffer.alloc(image.bitmap.data.length);
|
||||
const translate2Cartesian = createTranslationFunction(-(bW / 2), -(bH / 2));
|
||||
const translate2Screen = createTranslationFunction(bW / 2 + 0.5, bH / 2 + 0.5);
|
||||
for (let y = 1; y <= bH; y++) {
|
||||
for (let x = 1; x <= bW; x++) {
|
||||
const cartesian = translate2Cartesian(x, y);
|
||||
const source = translate2Screen(cosine * cartesian.x - sine * cartesian.y, cosine * cartesian.y + sine * cartesian.x);
|
||||
const dstIdx = (bW * (y - 1) + x - 1) << 2;
|
||||
if (source.x >= 0 && source.x < bW && source.y >= 0 && source.y < bH) {
|
||||
const srcIdx = ((bW * (source.y | 0) + source.x) | 0) << 2;
|
||||
const pixelRGBA = image.bitmap.data.readUInt32BE(srcIdx);
|
||||
dstBuffer.writeUInt32BE(pixelRGBA, dstIdx);
|
||||
}
|
||||
else {
|
||||
// reset off-image pixels
|
||||
dstBuffer.writeUInt32BE(image.background, dstIdx);
|
||||
}
|
||||
}
|
||||
}
|
||||
image.bitmap.data = dstBuffer;
|
||||
if (mode === true || typeof mode === "string") {
|
||||
// now crop the image to the final size
|
||||
const x = Math.max(bW / 2 - w / 2, 0);
|
||||
const y = Math.max(bH / 2 - h / 2, 0);
|
||||
image = plugin_crop_1.methods.crop(image, { x, y, w, h });
|
||||
}
|
||||
}
|
||||
exports.methods = {
|
||||
/**
|
||||
* Rotates the image counter-clockwise by a number of degrees. By default the width and height of the image will be resized appropriately.
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
*
|
||||
* image.rotate(90);
|
||||
* ```
|
||||
*/
|
||||
rotate(image, options) {
|
||||
const parsed = RotateOptionsSchema.parse(options);
|
||||
const actualOptions = typeof parsed === "number" ? { deg: parsed } : parsed;
|
||||
const { mode = true } = actualOptions;
|
||||
let { deg } = actualOptions;
|
||||
// No need to do extra rotation
|
||||
deg %= 360;
|
||||
// no rotation for 0, 360, -360, 720, -720, ...
|
||||
if (deg % 360 === 0) {
|
||||
return image;
|
||||
}
|
||||
// use matrixRotate if the angle is a multiple of 90 degrees (eg: 180 or -90) and resize is allowed or not needed.
|
||||
const matrixRotateAllowed = deg % 90 === 0 &&
|
||||
(mode || image.bitmap.width === image.bitmap.height || deg % 180 === 0);
|
||||
if (matrixRotateAllowed) {
|
||||
matrixRotate(image, deg);
|
||||
}
|
||||
else {
|
||||
advancedRotate(image, deg, mode);
|
||||
}
|
||||
return image;
|
||||
},
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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 truncated
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"type": "commonjs"
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
import { ResizeStrategy } from "@jimp/plugin-resize";
|
||||
import { JimpClass } from "@jimp/types";
|
||||
import { z } from "zod";
|
||||
declare const RotateOptionsSchema: z.ZodUnion<[z.ZodNumber, z.ZodObject<{
|
||||
/** the number of degrees to rotate the image by */
|
||||
deg: z.ZodNumber;
|
||||
/** resize mode or a boolean, if false then the width and height of the image will not be changed */
|
||||
mode: z.ZodOptional<z.ZodUnion<[z.ZodBoolean, z.ZodNativeEnum<typeof ResizeStrategy>]>>;
|
||||
}, "strip", z.ZodTypeAny, {
|
||||
deg: number;
|
||||
mode?: boolean | ResizeStrategy | undefined;
|
||||
}, {
|
||||
deg: number;
|
||||
mode?: boolean | ResizeStrategy | undefined;
|
||||
}>]>;
|
||||
export type RotateOptions = z.infer<typeof RotateOptionsSchema>;
|
||||
export declare const methods: {
|
||||
/**
|
||||
* Rotates the image counter-clockwise by a number of degrees. By default the width and height of the image will be resized appropriately.
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
*
|
||||
* image.rotate(90);
|
||||
* ```
|
||||
*/
|
||||
rotate<I extends JimpClass>(image: I, options: RotateOptions): I;
|
||||
};
|
||||
export {};
|
||||
//# sourceMappingURL=index.d.ts.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,mBAAmB;IAGrB,mDAAmD;;IAEnD,oGAAoG;;;;;;;;IAGtG,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAuMhE,eAAO,MAAM,OAAO;IAClB;;;;;;;;;;OAUG;WACI,CAAC,SAAS,SAAS,SAAS,CAAC,WAAW,aAAa;CA2B7D,CAAC"}
|
||||
+198
@@ -0,0 +1,198 @@
|
||||
import { ResizeStrategy, methods as resizeMethods } from "@jimp/plugin-resize";
|
||||
import { clone } from "@jimp/utils";
|
||||
import { composite } from "@jimp/core";
|
||||
import { methods as cropMethods } from "@jimp/plugin-crop";
|
||||
import { z } from "zod";
|
||||
const RotateOptionsSchema = z.union([
|
||||
z.number(),
|
||||
z.object({
|
||||
/** the number of degrees to rotate the image by */
|
||||
deg: z.number(),
|
||||
/** resize mode or a boolean, if false then the width and height of the image will not be changed */
|
||||
mode: z.union([z.boolean(), z.nativeEnum(ResizeStrategy)]).optional(),
|
||||
}),
|
||||
]);
|
||||
/** function to translate the x, y coordinate to the index of the pixel in the buffer */
|
||||
function createIdxTranslationFunction(w) {
|
||||
return function (x, y) {
|
||||
return (y * w + x) << 2;
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Rotates an image counter-clockwise by multiple of 90 degrees. NB: 'this' must be a Jimp object.
|
||||
*
|
||||
* This function is based on matrix rotation. Check this to get an initial idea how it works: https://stackoverflow.com/a/8664879/10561909
|
||||
*
|
||||
* @param deg the number of degrees to rotate the image by, it should be a multiple of 90
|
||||
*/
|
||||
function matrixRotate(image, deg) {
|
||||
if (Math.abs(deg) % 90 !== 0) {
|
||||
throw new Error("Unsupported matrix rotation degree");
|
||||
}
|
||||
const w = image.bitmap.width;
|
||||
const h = image.bitmap.height;
|
||||
// decide which rotation angle to use
|
||||
let angle;
|
||||
switch (deg) {
|
||||
// 90 degree & -270 degree are same
|
||||
case 90:
|
||||
case -270:
|
||||
angle = 90;
|
||||
break;
|
||||
case 180:
|
||||
case -180:
|
||||
angle = 180;
|
||||
break;
|
||||
case 270:
|
||||
case -90:
|
||||
angle = -90;
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unsupported matrix rotation degree");
|
||||
}
|
||||
// After this switch block, angle will be 90, 180 or -90
|
||||
// calculate the new width and height
|
||||
const nW = angle === 180 ? w : h;
|
||||
const nH = angle === 180 ? h : w;
|
||||
const dstBuffer = Buffer.alloc(image.bitmap.data.length);
|
||||
const srcIdxFunction = createIdxTranslationFunction(w);
|
||||
const dstIdxFunction = createIdxTranslationFunction(nW);
|
||||
for (let x = 0; x < w; x++) {
|
||||
for (let y = 0; y < h; y++) {
|
||||
const srcIdx = srcIdxFunction(x, y);
|
||||
const pixelRGBA = image.bitmap.data.readUInt32BE(srcIdx);
|
||||
let dstIdx;
|
||||
switch (angle) {
|
||||
case 90:
|
||||
dstIdx = dstIdxFunction(y, w - x - 1);
|
||||
break;
|
||||
case -90:
|
||||
dstIdx = dstIdxFunction(h - y - 1, x);
|
||||
break;
|
||||
case 180:
|
||||
dstIdx = dstIdxFunction(w - x - 1, h - y - 1);
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unsupported matrix rotation angle");
|
||||
}
|
||||
dstBuffer.writeUInt32BE(pixelRGBA, dstIdx);
|
||||
}
|
||||
}
|
||||
image.bitmap.data = dstBuffer;
|
||||
image.bitmap.width = nW;
|
||||
image.bitmap.height = nH;
|
||||
}
|
||||
function createTranslationFunction(deltaX, deltaY) {
|
||||
return function (x, y) {
|
||||
return {
|
||||
x: x + deltaX,
|
||||
y: y + deltaY,
|
||||
};
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Rotates an image counter-clockwise by an arbitrary number of degrees. NB: 'this' must be a Jimp object.
|
||||
* @param {number} deg the number of degrees to rotate the image by
|
||||
*/
|
||||
function advancedRotate(image, deg, mode) {
|
||||
const rad = (deg * Math.PI) / 180;
|
||||
const cosine = Math.cos(rad);
|
||||
const sine = Math.sin(rad);
|
||||
// the final width and height will change if resize == true
|
||||
let w = image.bitmap.width;
|
||||
let h = image.bitmap.height;
|
||||
if (mode === true || typeof mode === "string") {
|
||||
// resize the image to it maximum dimension and blit the existing image
|
||||
// onto the center so that when it is rotated the image is kept in bounds
|
||||
// http://stackoverflow.com/questions/3231176/how-to-get-size-of-a-rotated-rectangle
|
||||
// Plus 1 border pixel to ensure to show all rotated result for some cases.
|
||||
w =
|
||||
Math.ceil(Math.abs(image.bitmap.width * cosine) +
|
||||
Math.abs(image.bitmap.height * sine)) + 1;
|
||||
h =
|
||||
Math.ceil(Math.abs(image.bitmap.width * sine) +
|
||||
Math.abs(image.bitmap.height * cosine)) + 1;
|
||||
// Ensure destination to have even size to a better result.
|
||||
if (w % 2 !== 0) {
|
||||
w++;
|
||||
}
|
||||
if (h % 2 !== 0) {
|
||||
h++;
|
||||
}
|
||||
const c = clone(image);
|
||||
image.scan((_, __, idx) => {
|
||||
image.bitmap.data.writeUInt32BE(image.background, idx);
|
||||
});
|
||||
const max = Math.max(w, h, image.bitmap.width, image.bitmap.height);
|
||||
image = resizeMethods.resize(image, {
|
||||
h: max,
|
||||
w: max,
|
||||
mode: mode === true ? undefined : mode,
|
||||
});
|
||||
image = composite(image, c, image.bitmap.width / 2 - c.bitmap.width / 2, image.bitmap.height / 2 - c.bitmap.height / 2);
|
||||
}
|
||||
const bW = image.bitmap.width;
|
||||
const bH = image.bitmap.height;
|
||||
const dstBuffer = Buffer.alloc(image.bitmap.data.length);
|
||||
const translate2Cartesian = createTranslationFunction(-(bW / 2), -(bH / 2));
|
||||
const translate2Screen = createTranslationFunction(bW / 2 + 0.5, bH / 2 + 0.5);
|
||||
for (let y = 1; y <= bH; y++) {
|
||||
for (let x = 1; x <= bW; x++) {
|
||||
const cartesian = translate2Cartesian(x, y);
|
||||
const source = translate2Screen(cosine * cartesian.x - sine * cartesian.y, cosine * cartesian.y + sine * cartesian.x);
|
||||
const dstIdx = (bW * (y - 1) + x - 1) << 2;
|
||||
if (source.x >= 0 && source.x < bW && source.y >= 0 && source.y < bH) {
|
||||
const srcIdx = ((bW * (source.y | 0) + source.x) | 0) << 2;
|
||||
const pixelRGBA = image.bitmap.data.readUInt32BE(srcIdx);
|
||||
dstBuffer.writeUInt32BE(pixelRGBA, dstIdx);
|
||||
}
|
||||
else {
|
||||
// reset off-image pixels
|
||||
dstBuffer.writeUInt32BE(image.background, dstIdx);
|
||||
}
|
||||
}
|
||||
}
|
||||
image.bitmap.data = dstBuffer;
|
||||
if (mode === true || typeof mode === "string") {
|
||||
// now crop the image to the final size
|
||||
const x = Math.max(bW / 2 - w / 2, 0);
|
||||
const y = Math.max(bH / 2 - h / 2, 0);
|
||||
image = cropMethods.crop(image, { x, y, w, h });
|
||||
}
|
||||
}
|
||||
export const methods = {
|
||||
/**
|
||||
* Rotates the image counter-clockwise by a number of degrees. By default the width and height of the image will be resized appropriately.
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
*
|
||||
* image.rotate(90);
|
||||
* ```
|
||||
*/
|
||||
rotate(image, options) {
|
||||
const parsed = RotateOptionsSchema.parse(options);
|
||||
const actualOptions = typeof parsed === "number" ? { deg: parsed } : parsed;
|
||||
const { mode = true } = actualOptions;
|
||||
let { deg } = actualOptions;
|
||||
// No need to do extra rotation
|
||||
deg %= 360;
|
||||
// no rotation for 0, 360, -360, 720, -720, ...
|
||||
if (deg % 360 === 0) {
|
||||
return image;
|
||||
}
|
||||
// use matrixRotate if the angle is a multiple of 90 degrees (eg: 180 or -90) and resize is allowed or not needed.
|
||||
const matrixRotateAllowed = deg % 90 === 0 &&
|
||||
(mode || image.bitmap.width === image.bitmap.height || deg % 180 === 0);
|
||||
if (matrixRotateAllowed) {
|
||||
matrixRotate(image, deg);
|
||||
}
|
||||
else {
|
||||
advancedRotate(image, deg, mode);
|
||||
}
|
||||
return image;
|
||||
},
|
||||
};
|
||||
//# sourceMappingURL=index.js.map
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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 truncated
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"type": "module"
|
||||
}
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
import shared from "@jimp/config-eslint/base.js";
|
||||
export default [...shared];
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"name": "@jimp/plugin-rotate",
|
||||
"version": "1.6.0",
|
||||
"repository": "jimp-dev/jimp",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint .",
|
||||
"test": "vitest",
|
||||
"test:browser": "vitest --config vitest.config.browser.mjs",
|
||||
"build": "tshy",
|
||||
"dev": "tshy --watch",
|
||||
"clean": "rm -rf node_modules .tshy .tshy-build dist .turbo"
|
||||
},
|
||||
"author": "Andrew Lisowski <lisowski54@gmail.com>",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@jimp/core": "1.6.0",
|
||||
"@jimp/plugin-crop": "1.6.0",
|
||||
"@jimp/plugin-resize": "1.6.0",
|
||||
"@jimp/types": "1.6.0",
|
||||
"@jimp/utils": "1.6.0",
|
||||
"zod": "^3.23.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@jimp/config-eslint": "1.6.0",
|
||||
"@jimp/config-typescript": "1.6.0",
|
||||
"@jimp/config-vitest": "1.6.0",
|
||||
"@jimp/core": "workspace:*",
|
||||
"@jimp/test-utils": "1.6.0",
|
||||
"@types/node": "^18.19.48",
|
||||
"@vitest/browser": "^2.0.5",
|
||||
"eslint": "^9.9.1",
|
||||
"tshy": "^3.0.2",
|
||||
"typescript": "^5.5.4",
|
||||
"vite-plugin-node-polyfills": "^0.22.0",
|
||||
"vitest": "^2.0.5"
|
||||
},
|
||||
"tshy": {
|
||||
"exclude": [
|
||||
"**/*.test.ts"
|
||||
],
|
||||
"exports": {
|
||||
"./package.json": "./package.json",
|
||||
".": "./src/index.ts"
|
||||
}
|
||||
},
|
||||
"exports": {
|
||||
"./package.json": "./package.json",
|
||||
".": {
|
||||
"import": {
|
||||
"types": "./dist/esm/index.d.ts",
|
||||
"default": "./dist/esm/index.js"
|
||||
},
|
||||
"require": {
|
||||
"types": "./dist/commonjs/index.d.ts",
|
||||
"default": "./dist/commonjs/index.js"
|
||||
}
|
||||
}
|
||||
},
|
||||
"main": "./dist/commonjs/index.js",
|
||||
"types": "./dist/commonjs/index.d.ts",
|
||||
"type": "module",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"sideEffects": false,
|
||||
"module": "./dist/esm/index.js",
|
||||
"gitHead": "c88abe6046dccbdb6e4f5f00c3dd403c81d83515"
|
||||
}
|
||||
+897
@@ -0,0 +1,897 @@
|
||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||
|
||||
exports[`Rotate a image with even size > -90 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▦▪▪▪▴▴▴▰
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▦▴▴▴▪▪▪▰
|
||||
|
||||
Data:
|
||||
|
||||
80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-FFᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-FFᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 1 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▰▴▴▴▪▪▪▰
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▦▪▪▪▴▴▴▦
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
FF-00-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 30 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▰▰
|
||||
▪▪▪▪
|
||||
▴▪▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▴▴▴
|
||||
▴▴▴▴▪▴▴▴▴▴
|
||||
▴▴▪▪▴▴▴▴▦
|
||||
▪▪▪▪▪▴▴▴
|
||||
▪▪▪▪▪
|
||||
▪▪▪
|
||||
▦
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-FFᶠᶠ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 45 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▰
|
||||
▪▪▪
|
||||
▪▪▪▪▪
|
||||
▴▴▪▪▪▪▴
|
||||
▴▴▴▴▪▪▴▴▴
|
||||
▰▰▴▴▴▴▴▴▴▴▦
|
||||
▴▴▴▴▪▪▴▴▴
|
||||
▴▴▪▪▪▪▴
|
||||
▪▪▪▪▪
|
||||
▪▪▪
|
||||
▦
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-FFᶠᶠ FF-00-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 60 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▰
|
||||
▪▪▪
|
||||
▪▪▪▪▪
|
||||
▪▪▪▪▪▴▴▴
|
||||
▴▴▪▪▴▴▴▴▦
|
||||
▴▴▴▴▪▴▴▴▴▴
|
||||
▴▴▴▴▪▪▴▴▴
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▪▪▪▪▪
|
||||
▪▪▪▪
|
||||
▦▦
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 90 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▰▪▪▪▴▴▴▦
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▰▴▴▴▪▪▪▦
|
||||
|
||||
Data:
|
||||
|
||||
FF-00-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 91 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▰▪▪▪▴▴▴▦
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▰▴▴▴▪▪▪▦
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 120 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▴▦
|
||||
▴▴▴▴
|
||||
▪▪▴▴▴▴
|
||||
▰▪▪▪▴▴▴▴▪
|
||||
▰▪▪▪▪▴▴▪▪▪
|
||||
▪▪▪▪▪▪▪▪▪
|
||||
▪▪▴▴▴▪▪▪▪▦
|
||||
▴▴▴▴▴▪▪
|
||||
▴▴▴▴▪
|
||||
▴▴▴
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 135 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
|
||||
▦
|
||||
▴▴▴
|
||||
▴▴▴▴▴
|
||||
▪▪▴▴▴▪▪
|
||||
▪▪▪▪▴▪▪▪▪
|
||||
▰▪▪▪▪▴▪▪▪▪▦
|
||||
▪▪▪▴▴▴▪▪▪
|
||||
▪▴▴▴▴▴▪
|
||||
▴▴▴▴▴
|
||||
▴▰▴
|
||||
▰
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-FFᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 180 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▦▴▴▴▪▪▪▦
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▰▪▪▪▴▴▴▰
|
||||
|
||||
Data:
|
||||
|
||||
80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
FF-00-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-FFᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 225 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▦
|
||||
▪▪▪
|
||||
▪▪▪▪▪
|
||||
▴▪▪▪▪▴▴
|
||||
▴▴▴▪▪▴▴▴▴
|
||||
▦▴▴▴▴▴▴▴▴▰▰
|
||||
▴▴▴▪▪▴▴▴▴
|
||||
▴▪▪▪▪▴▴
|
||||
▪▪▪▪▪
|
||||
▪▪▪
|
||||
▰
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-FFᶠᶠ FF-00-FFᶠᶠ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 270 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▦▪▪▪▴▴▴▰
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▦▴▴▴▪▪▪▰
|
||||
|
||||
Data:
|
||||
|
||||
80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-FFᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-FFᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 315 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▰
|
||||
▴▰▴
|
||||
▴▴▴▴▴
|
||||
▪▴▴▴▴▴▪
|
||||
▪▪▪▴▴▴▪▪▪
|
||||
▦▪▪▪▪▴▪▪▪▪▰
|
||||
▪▪▪▪▴▪▪▪▪
|
||||
▪▪▴▴▴▪▪
|
||||
▴▴▴▴▴
|
||||
▴▴▴
|
||||
▦
|
||||
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-FFᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with even size > 360 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▰▴▴▴▪▪▪▰
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
▦▪▪▪▴▴▴▦
|
||||
|
||||
Data:
|
||||
|
||||
FF-00-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with odd size > 45 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▪
|
||||
▪▪▪
|
||||
▦▪▪▪▦
|
||||
▴▴▦▪▦▴▴
|
||||
▴▴▴▴▦▴▴▴▴
|
||||
▴▴▦▴▦▴▴
|
||||
▦▴▴▴▦
|
||||
▴▴▴
|
||||
▴
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with odd size > 135 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▴
|
||||
▴▴▴
|
||||
▦▴▴▴▦
|
||||
▪▪▦▴▦▴▴
|
||||
▪▪▪▪▦▴▴▴▴
|
||||
▪▪▦▴▦▴▴
|
||||
▦▴▴▴▦
|
||||
▴▴▴
|
||||
▴
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with odd size > 225 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▴
|
||||
▴▴▴
|
||||
▦▴▴▴▦
|
||||
▴▴▦▴▦▴▴
|
||||
▴▴▴▴▦▴▴▴▴
|
||||
▴▴▦▪▦▴▴
|
||||
▦▪▪▪▦
|
||||
▪▪▪
|
||||
▪
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a image with odd size > 315 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▴
|
||||
▴▴▴
|
||||
▦▴▴▴▦
|
||||
▴▴▦▴▦▪▪
|
||||
▴▴▴▴▦▪▪▪▪
|
||||
▴▴▦▴▦▪▪
|
||||
▦▴▴▴▦
|
||||
▴▴▴
|
||||
▴
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > -90 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▦▦▴▴
|
||||
▦▦▴▴
|
||||
▦▦▴▴
|
||||
▦▦▴▴
|
||||
▴▴▪▪
|
||||
▴▴▪▪
|
||||
▴▴▪▪
|
||||
▴▴▪▪
|
||||
|
||||
Data:
|
||||
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > -180 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▴▴▴▴▦▦▦▦
|
||||
▴▴▴▴▦▦▦▦
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
|
||||
Data:
|
||||
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > -270 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▪▪▴▴
|
||||
▪▪▴▴
|
||||
▪▪▴▴
|
||||
▪▪▴▴
|
||||
▴▴▦▦
|
||||
▴▴▦▦
|
||||
▴▴▦▦
|
||||
▴▴▦▦
|
||||
|
||||
Data:
|
||||
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 1 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▴▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▪
|
||||
▦▦▦▦▴▴▴▴
|
||||
▦▦▦▦▴▴▴▴
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 10 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▪
|
||||
▴▴▴▪▪▪▪
|
||||
▴▴▴▴▪▪▪▴
|
||||
▴▴▦▦▴▴▴▴
|
||||
▦▦▦▦▴▴▴
|
||||
▦▦
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 30 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▪▪
|
||||
▪▪▪▪
|
||||
▴▴▪▪▴▴▴
|
||||
▴▴▴▦▴▴▴
|
||||
▴▴▦▦▴▴
|
||||
▦▦▦▦
|
||||
▦
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 45 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▪▪
|
||||
▪▪▪▴
|
||||
▴▪▪▴▴▴
|
||||
▴▴▴▴▴▴
|
||||
▴▴▴▦▦▴
|
||||
▴▴▦▦▦
|
||||
▦▦▦
|
||||
▦
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 90 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▪▪▴▴
|
||||
▪▪▴▴
|
||||
▪▪▴▴
|
||||
▪▪▴▴
|
||||
▴▴▦▦
|
||||
▴▴▦▦
|
||||
▴▴▦▦
|
||||
▴▴▦▦
|
||||
|
||||
Data:
|
||||
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 135 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
|
||||
▴
|
||||
▴▴▴
|
||||
▪▪▴▴▴
|
||||
▪▪▪▴▦▦
|
||||
▪▪▴▦▦▦
|
||||
▴▴▴▦▦▦
|
||||
▴▴▴▦
|
||||
▴▴
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 180 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▴▴▴▴▦▦▦▦
|
||||
▴▴▴▴▦▦▦▦
|
||||
▪▪▪▪▴▴▴▴
|
||||
▪▪▪▪▴▴▴▴
|
||||
|
||||
Data:
|
||||
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 225 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▦
|
||||
▦▦▦
|
||||
▦▦▦▴▴
|
||||
▴▦▦▴▴▴
|
||||
▴▴▴▴▴▴
|
||||
▴▴▴▪▪▴
|
||||
▴▪▪▪
|
||||
▪▪
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image > 315 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
▴▴
|
||||
▦▴▴▴
|
||||
▦▦▦▴▴▴
|
||||
▦▦▦▴▪▪
|
||||
▦▦▴▪▪▪
|
||||
▴▴▴▪▪
|
||||
▴▴▴
|
||||
▴
|
||||
|
||||
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 80-80-80ᶠᶠ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 80-80-80ᶠᶠ 80-80-80ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-FF-FFᶠᶠ 00-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ FF-00-00ᶠᶠ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ FF-00-00ᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image without resizing > 45 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
□▹▹▿□□
|
||||
□▹▹▿□□
|
||||
▹▹▿□□
|
||||
▹▿□□
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰
|
||||
FF-FF-FFᶠᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image without resizing > 90 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
□▹▿□
|
||||
□▹▿□
|
||||
□▹▿□
|
||||
□▹▿□
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-FF-00⁷ᶠ 00-00-FF⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image without resizing > 180 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
□□□□□□□□
|
||||
▿▿▿▿▿▿▿▿
|
||||
▹▹▹▹▹▹▹▹
|
||||
□□□□□□□□
|
||||
|
||||
Data:
|
||||
|
||||
FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ
|
||||
00-00-FF⁷ᶠ 00-00-FF⁷ᶠ 00-00-FF⁷ᶠ 00-00-FF⁷ᶠ 00-00-FF⁷ᶠ 00-00-FF⁷ᶠ 00-00-FF⁷ᶠ 00-00-FF⁷ᶠ
|
||||
00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ 00-FF-00⁷ᶠ
|
||||
FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ FF-FF-FFᶠᶠ
|
||||
`;
|
||||
|
||||
exports[`Rotate a non-square image without resizing > 270 degrees 1`] = `
|
||||
Visualization:
|
||||
|
||||
□▿▹□
|
||||
□▿▹□
|
||||
□▿▹□
|
||||
□▿▹□
|
||||
|
||||
Data:
|
||||
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-00-FF⁷ᶠ 00-FF-00⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-00-FF⁷ᶠ 00-FF-00⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-00-FF⁷ᶠ 00-FF-00⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
00-00-00⁰⁰ 00-00-00⁰⁰ FF-FF-FFᶠᶠ 00-00-FF⁷ᶠ 00-FF-00⁷ᶠ FF-FF-FFᶠᶠ 00-00-00⁰⁰ 00-00-00⁰⁰
|
||||
`;
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
import { createJimp } from "@jimp/core";
|
||||
import { makeTestImage } from "@jimp/test-utils";
|
||||
|
||||
import { methods } from "./index.js";
|
||||
|
||||
const jimp = createJimp({ plugins: [methods] });
|
||||
|
||||
describe("Rotate a image with even size", () => {
|
||||
const imgSrc = jimp.fromBitmap(
|
||||
makeTestImage(
|
||||
"▰▴▴▴▪▪▪▰",
|
||||
"▴▴▴▴▪▪▪▪",
|
||||
"▴▴▴▴▪▪▪▪",
|
||||
"▴▴▴▴▪▪▪▪",
|
||||
"▪▪▪▪▴▴▴▴",
|
||||
"▪▪▪▪▴▴▴▴",
|
||||
"▪▪▪▪▴▴▴▴",
|
||||
"▦▪▪▪▴▴▴▦",
|
||||
),
|
||||
);
|
||||
|
||||
const angles = [
|
||||
1, 91, 30, 45, 60, 90, -90, 120, 135, 180, 225, 270, 315, 360,
|
||||
];
|
||||
|
||||
angles.forEach((angle) => {
|
||||
test(`${angle} degrees`, () => {
|
||||
expect(imgSrc.clone().rotate(angle)).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("Rotate a image with odd size", () => {
|
||||
const imgSrc = jimp.fromBitmap(
|
||||
makeTestImage(
|
||||
"▴▴▴▦▪▪▪",
|
||||
"▴▴▴▦▪▪▪",
|
||||
"▴▴▴▦▪▪▪",
|
||||
"▦▦▦▦▦▦▦",
|
||||
"▴▴▴▦▴▴▴",
|
||||
"▴▴▴▦▴▴▴",
|
||||
"▴▴▴▦▴▴▴",
|
||||
),
|
||||
);
|
||||
|
||||
const angles = [45, 135, 225, 315];
|
||||
|
||||
angles.forEach((angle) => {
|
||||
test(`${angle} degrees`, () => {
|
||||
expect(imgSrc.clone().rotate(angle)).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("Rotate a non-square image", () => {
|
||||
const imgSrc = jimp.fromBitmap(
|
||||
makeTestImage("▴▴▴▴▪▪▪▪", "▴▴▴▴▪▪▪▪", "▦▦▦▦▴▴▴▴", "▦▦▦▦▴▴▴▴"),
|
||||
);
|
||||
|
||||
const angles = [1, 10, 30, 45, 90, -90, 135, 180, 225, 315, -180, -270];
|
||||
|
||||
angles.forEach((angle) => {
|
||||
test(`${angle} degrees`, () => {
|
||||
expect(imgSrc.clone().rotate(angle)).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("Rotate a non-square image without resizing", () => {
|
||||
const imgSrc = jimp.fromBitmap(
|
||||
makeTestImage("□□□□□□□□", "▹▹▹▹▹▹▹▹", "▿▿▿▿▿▿▿▿", "□□□□□□□□"),
|
||||
);
|
||||
|
||||
const angles = [90, 180, 270, 45];
|
||||
|
||||
angles.forEach((angle) => {
|
||||
test(`${angle} degrees`, () => {
|
||||
expect(
|
||||
imgSrc.clone().rotate({ deg: angle, mode: false }),
|
||||
).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
});
|
||||
+256
@@ -0,0 +1,256 @@
|
||||
import { ResizeStrategy, methods as resizeMethods } from "@jimp/plugin-resize";
|
||||
import { JimpClass } from "@jimp/types";
|
||||
import { clone } from "@jimp/utils";
|
||||
import { composite } from "@jimp/core";
|
||||
import { methods as cropMethods } from "@jimp/plugin-crop";
|
||||
import { z } from "zod";
|
||||
|
||||
const RotateOptionsSchema = z.union([
|
||||
z.number(),
|
||||
z.object({
|
||||
/** the number of degrees to rotate the image by */
|
||||
deg: z.number(),
|
||||
/** resize mode or a boolean, if false then the width and height of the image will not be changed */
|
||||
mode: z.union([z.boolean(), z.nativeEnum(ResizeStrategy)]).optional(),
|
||||
}),
|
||||
]);
|
||||
|
||||
export type RotateOptions = z.infer<typeof RotateOptionsSchema>;
|
||||
|
||||
/** function to translate the x, y coordinate to the index of the pixel in the buffer */
|
||||
function createIdxTranslationFunction(w: number) {
|
||||
return function (x: number, y: number) {
|
||||
return (y * w + x) << 2;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotates an image counter-clockwise by multiple of 90 degrees. NB: 'this' must be a Jimp object.
|
||||
*
|
||||
* This function is based on matrix rotation. Check this to get an initial idea how it works: https://stackoverflow.com/a/8664879/10561909
|
||||
*
|
||||
* @param deg the number of degrees to rotate the image by, it should be a multiple of 90
|
||||
*/
|
||||
function matrixRotate<I extends JimpClass>(image: I, deg: number) {
|
||||
if (Math.abs(deg) % 90 !== 0) {
|
||||
throw new Error("Unsupported matrix rotation degree");
|
||||
}
|
||||
|
||||
const w = image.bitmap.width;
|
||||
const h = image.bitmap.height;
|
||||
|
||||
// decide which rotation angle to use
|
||||
let angle;
|
||||
|
||||
switch (deg) {
|
||||
// 90 degree & -270 degree are same
|
||||
case 90:
|
||||
case -270:
|
||||
angle = 90;
|
||||
break;
|
||||
|
||||
case 180:
|
||||
case -180:
|
||||
angle = 180;
|
||||
break;
|
||||
|
||||
case 270:
|
||||
case -90:
|
||||
angle = -90;
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Error("Unsupported matrix rotation degree");
|
||||
}
|
||||
// After this switch block, angle will be 90, 180 or -90
|
||||
|
||||
// calculate the new width and height
|
||||
const nW = angle === 180 ? w : h;
|
||||
const nH = angle === 180 ? h : w;
|
||||
|
||||
const dstBuffer = Buffer.alloc(image.bitmap.data.length);
|
||||
|
||||
const srcIdxFunction = createIdxTranslationFunction(w);
|
||||
const dstIdxFunction = createIdxTranslationFunction(nW);
|
||||
|
||||
for (let x = 0; x < w; x++) {
|
||||
for (let y = 0; y < h; y++) {
|
||||
const srcIdx = srcIdxFunction(x, y);
|
||||
const pixelRGBA = image.bitmap.data.readUInt32BE(srcIdx);
|
||||
|
||||
let dstIdx;
|
||||
switch (angle) {
|
||||
case 90:
|
||||
dstIdx = dstIdxFunction(y, w - x - 1);
|
||||
break;
|
||||
case -90:
|
||||
dstIdx = dstIdxFunction(h - y - 1, x);
|
||||
break;
|
||||
case 180:
|
||||
dstIdx = dstIdxFunction(w - x - 1, h - y - 1);
|
||||
break;
|
||||
default:
|
||||
throw new Error("Unsupported matrix rotation angle");
|
||||
}
|
||||
|
||||
dstBuffer.writeUInt32BE(pixelRGBA, dstIdx);
|
||||
}
|
||||
}
|
||||
|
||||
image.bitmap.data = dstBuffer;
|
||||
image.bitmap.width = nW;
|
||||
image.bitmap.height = nH;
|
||||
}
|
||||
|
||||
function createTranslationFunction(deltaX: number, deltaY: number) {
|
||||
return function (x: number, y: number) {
|
||||
return {
|
||||
x: x + deltaX,
|
||||
y: y + deltaY,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotates an image counter-clockwise by an arbitrary number of degrees. NB: 'this' must be a Jimp object.
|
||||
* @param {number} deg the number of degrees to rotate the image by
|
||||
*/
|
||||
function advancedRotate<I extends JimpClass>(
|
||||
image: I,
|
||||
deg: number,
|
||||
mode: boolean | ResizeStrategy
|
||||
) {
|
||||
const rad = (deg * Math.PI) / 180;
|
||||
const cosine = Math.cos(rad);
|
||||
const sine = Math.sin(rad);
|
||||
|
||||
// the final width and height will change if resize == true
|
||||
let w = image.bitmap.width;
|
||||
let h = image.bitmap.height;
|
||||
|
||||
if (mode === true || typeof mode === "string") {
|
||||
// resize the image to it maximum dimension and blit the existing image
|
||||
// onto the center so that when it is rotated the image is kept in bounds
|
||||
|
||||
// http://stackoverflow.com/questions/3231176/how-to-get-size-of-a-rotated-rectangle
|
||||
// Plus 1 border pixel to ensure to show all rotated result for some cases.
|
||||
w =
|
||||
Math.ceil(
|
||||
Math.abs(image.bitmap.width * cosine) +
|
||||
Math.abs(image.bitmap.height * sine)
|
||||
) + 1;
|
||||
h =
|
||||
Math.ceil(
|
||||
Math.abs(image.bitmap.width * sine) +
|
||||
Math.abs(image.bitmap.height * cosine)
|
||||
) + 1;
|
||||
// Ensure destination to have even size to a better result.
|
||||
if (w % 2 !== 0) {
|
||||
w++;
|
||||
}
|
||||
|
||||
if (h % 2 !== 0) {
|
||||
h++;
|
||||
}
|
||||
|
||||
const c = clone(image);
|
||||
|
||||
image.scan((_, __, idx) => {
|
||||
image.bitmap.data.writeUInt32BE(image.background, idx);
|
||||
});
|
||||
|
||||
const max = Math.max(w, h, image.bitmap.width, image.bitmap.height);
|
||||
image = resizeMethods.resize(image, {
|
||||
h: max,
|
||||
w: max,
|
||||
mode: mode === true ? undefined : mode,
|
||||
});
|
||||
|
||||
image = composite(
|
||||
image,
|
||||
c,
|
||||
image.bitmap.width / 2 - c.bitmap.width / 2,
|
||||
image.bitmap.height / 2 - c.bitmap.height / 2
|
||||
);
|
||||
}
|
||||
|
||||
const bW = image.bitmap.width;
|
||||
const bH = image.bitmap.height;
|
||||
const dstBuffer = Buffer.alloc(image.bitmap.data.length);
|
||||
|
||||
const translate2Cartesian = createTranslationFunction(-(bW / 2), -(bH / 2));
|
||||
const translate2Screen = createTranslationFunction(
|
||||
bW / 2 + 0.5,
|
||||
bH / 2 + 0.5
|
||||
);
|
||||
|
||||
for (let y = 1; y <= bH; y++) {
|
||||
for (let x = 1; x <= bW; x++) {
|
||||
const cartesian = translate2Cartesian(x, y);
|
||||
const source = translate2Screen(
|
||||
cosine * cartesian.x - sine * cartesian.y,
|
||||
cosine * cartesian.y + sine * cartesian.x
|
||||
);
|
||||
const dstIdx = (bW * (y - 1) + x - 1) << 2;
|
||||
|
||||
if (source.x >= 0 && source.x < bW && source.y >= 0 && source.y < bH) {
|
||||
const srcIdx = ((bW * (source.y | 0) + source.x) | 0) << 2;
|
||||
const pixelRGBA = image.bitmap.data.readUInt32BE(srcIdx);
|
||||
dstBuffer.writeUInt32BE(pixelRGBA, dstIdx);
|
||||
} else {
|
||||
// reset off-image pixels
|
||||
dstBuffer.writeUInt32BE(image.background, dstIdx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
image.bitmap.data = dstBuffer;
|
||||
|
||||
if (mode === true || typeof mode === "string") {
|
||||
// now crop the image to the final size
|
||||
const x = Math.max(bW / 2 - w / 2, 0);
|
||||
const y = Math.max(bH / 2 - h / 2, 0);
|
||||
image = cropMethods.crop(image, { x, y, w, h });
|
||||
}
|
||||
}
|
||||
|
||||
export const methods = {
|
||||
/**
|
||||
* Rotates the image counter-clockwise by a number of degrees. By default the width and height of the image will be resized appropriately.
|
||||
* @example
|
||||
* ```ts
|
||||
* import { Jimp } from "jimp";
|
||||
*
|
||||
* const image = await Jimp.read("test/image.png");
|
||||
*
|
||||
* image.rotate(90);
|
||||
* ```
|
||||
*/
|
||||
rotate<I extends JimpClass>(image: I, options: RotateOptions) {
|
||||
const parsed = RotateOptionsSchema.parse(options);
|
||||
const actualOptions = typeof parsed === "number" ? { deg: parsed } : parsed;
|
||||
const { mode = true } = actualOptions;
|
||||
let { deg } = actualOptions;
|
||||
|
||||
// No need to do extra rotation
|
||||
deg %= 360;
|
||||
|
||||
// no rotation for 0, 360, -360, 720, -720, ...
|
||||
if (deg % 360 === 0) {
|
||||
return image;
|
||||
}
|
||||
|
||||
// use matrixRotate if the angle is a multiple of 90 degrees (eg: 180 or -90) and resize is allowed or not needed.
|
||||
const matrixRotateAllowed =
|
||||
deg % 90 === 0 &&
|
||||
(mode || image.bitmap.width === image.bitmap.height || deg % 180 === 0);
|
||||
|
||||
if (matrixRotateAllowed) {
|
||||
matrixRotate(image, deg);
|
||||
} else {
|
||||
advancedRotate(image, deg, mode);
|
||||
}
|
||||
|
||||
return image;
|
||||
},
|
||||
};
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": "@jimp/config-typescript/base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "dist"
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
import config from "@jimp/config-vitest/browser";
|
||||
|
||||
export default config;
|
||||
Reference in new issue
Block a user