Skip to content

Instantly share code, notes, and snippets.

@MaxGraey
Last active January 26, 2019 18:05
Show Gist options
  • Save MaxGraey/b9fd909d1da44aa4516c70fab1337712 to your computer and use it in GitHub Desktop.
Save MaxGraey/b9fd909d1da44aa4516c70fab1337712 to your computer and use it in GitHub Desktop.
rotate image for squoosh
export function rotate(inputWidth: i32, inputHeight: i32, rotate: i32): void {
const bpp = 4;
let offset = inputWidth * inputHeight * bpp;
let i = 0;
// In the straight-copy case, d1 is x, d2 is y.
// x starts at 0 and increases.
// y starts at 0 and increases.
let d1Start: i32;
let d1Limit: i32;
let d1Advance: i32;
let d1Multiplier: i32;
let d2Start: i32;
let d2Limit: i32;
let d2Advance: i32;
let d2Multiplier: i32;
switch (rotate) {
case 90:
// d1 is y, d2 is x.
// y starts at its max value and decreases.
// x starts at 0 and increases.
d1Start = inputHeight - 1;
d1Limit = inputHeight;
d1Advance = -1;
d1Multiplier = inputWidth;
d2Start = 0;
d2Limit = inputWidth;
d2Advance = 1;
d2Multiplier = 1;
break;
case 180:
// d1 is x, d2 is y.
// x starts at its max and decreases.
// y starts at its max and decreases.
d1Start = inputWidth - 1;
d1Limit = inputWidth;
d1Advance = -1;
d1Multiplier = 1;
d2Start = inputHeight - 1;
d2Limit = inputHeight;
d2Advance = -1;
d2Multiplier = inputWidth;
break;
case 270:
// d1 is y, d2 is x.
// y starts at 0 and increases.
// x starts at its max and decreases.
d1Start = 0;
d1Limit = inputHeight;
d1Advance = 1;
d1Multiplier = inputWidth;
d2Start = inputWidth - 1;
d2Limit = inputWidth;
d2Advance = -1;
d2Multiplier = 1;
break;
default:
d1Start = 0;
d1Limit = inputWidth;
d1Advance = 1;
d1Multiplier = 1;
d2Start = 0;
d2Limit = inputHeight;
d2Advance = 1;
d2Multiplier = inputWidth;
break;
}
d1Multiplier *= 4;
for (let d2 = d2Start; d2 >= 0 && d2 < d2Limit; d2 += d2Advance) {
let d2Offset = (d2 * d2Multiplier) * 4;
for (let d1 = d1Start; d1 >= 0 && d1 < d1Limit; d1 += d1Advance) {
let start = d1 * d1Multiplier + d2Offset;
store<u32>(offset + i * 4, load<u32>(start));
i++;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment