image.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 itemSize = array.length / (width * height);
  20. const widthIS = width * itemSize;
  21. for (let i = 0, maxI = height / 2; i < maxI; ++i) {
  22. for (let j = 0, maxJ = widthIS; j < maxJ; ++j) {
  23. const index1 = i * widthIS + j;
  24. const index2 = (height - i - 1) * widthIS + j;
  25. const tmp = array[index1];
  26. array[index1] = array[index2];
  27. array[index2] = tmp;
  28. }
  29. }
  30. return pixelData;
  31. }
  32. /** to undo pre-multiplied alpha */
  33. export function divideByAlpha(pixelData: PixelData): PixelData {
  34. const { array } = pixelData;
  35. const factor = (array instanceof Uint8Array) ? 255 : 1;
  36. for (let i = 0, il = array.length; i < il; i += 4) {
  37. const a = array[i + 3] / factor;
  38. array[i] /= a;
  39. array[i + 1] /= a;
  40. array[i + 2] /= a;
  41. }
  42. return pixelData;
  43. }
  44. }