image.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /**
  2. * Copyright (c) 2019-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. export { PixelData };
  7. interface PixelData {
  8. readonly array: Uint8Array | Float32Array
  9. readonly width: number
  10. readonly height: number
  11. }
  12. namespace PixelData {
  13. export function create(array: Uint8Array | Float32Array, width: number, height: number): PixelData {
  14. return { array, width, height };
  15. }
  16. /** horizontally flips the pixel data in-place */
  17. export function flipY(pixelData: PixelData): PixelData {
  18. const { array, width, height } = pixelData;
  19. const width4 = width * 4;
  20. for (let i = 0, maxI = height / 2; i < maxI; ++i) {
  21. for (let j = 0, maxJ = width4; j < maxJ; ++j) {
  22. const index1 = i * width4 + j;
  23. const index2 = (height - i - 1) * width4 + j;
  24. const tmp = array[index1];
  25. array[index1] = array[index2];
  26. array[index2] = tmp;
  27. }
  28. }
  29. return pixelData;
  30. }
  31. /** to undo pre-multiplied alpha */
  32. export function divideByAlpha(pixelData: PixelData): PixelData {
  33. const { array } = pixelData;
  34. const factor = (array instanceof Uint8Array) ? 255 : 1;
  35. for (let i = 0, il = array.length; i < il; i += 4) {
  36. const a = array[i + 3] / factor;
  37. array[i] /= a;
  38. array[i + 1] /= a;
  39. array[i + 2] /= a;
  40. }
  41. return pixelData;
  42. }
  43. }