Last active
January 26, 2019 18:05
-
-
Save MaxGraey/b9fd909d1da44aa4516c70fab1337712 to your computer and use it in GitHub Desktop.
rotate image for squoosh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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