blob: 2ce2fe4295604a7a0668ab9ace80db16ca339ffb [file] [log] [blame]
import { EncodableTextureFormat } from '../../format_info.js';
import { PerTexelComponent } from '../../util/texture/texel_data.js';
import { TexelView } from '../../util/texture/texel_view.js';
type TestColor = PerTexelComponent<number>;
// None of the dst texture format is 'uint' or 'sint', so we can always use float value.
const kColors = {
Red: { R: 1.0, G: 0.0, B: 0.0, A: 1.0 },
Green: { R: 0.0, G: 1.0, B: 0.0, A: 1.0 },
Blue: { R: 0.0, G: 0.0, B: 1.0, A: 1.0 },
Black: { R: 0.0, G: 0.0, B: 0.0, A: 1.0 },
White: { R: 1.0, G: 1.0, B: 1.0, A: 1.0 },
SemitransparentWhite: { R: 1.0, G: 1.0, B: 1.0, A: 0.6 },
} as const;
export const kTestColorsOpaque = [
kColors.Red,
kColors.Green,
kColors.Blue,
kColors.Black,
kColors.White,
] as const;
export const kTestColorsAll = [...kTestColorsOpaque, kColors.SemitransparentWhite] as const;
export function makeTestColorsTexelView({
testColors,
format,
width,
height,
premultiplied,
flipY,
}: {
testColors: readonly TestColor[];
format: EncodableTextureFormat;
width: number;
height: number;
premultiplied: boolean;
flipY: boolean;
}) {
return TexelView.fromTexelsAsColors(format, coords => {
const y = flipY ? height - coords.y - 1 : coords.y;
const pixelPos = y * width + coords.x;
const currentPixel = testColors[pixelPos % testColors.length];
if (premultiplied && currentPixel.A !== 1.0) {
return {
R: currentPixel.R! * currentPixel.A!,
G: currentPixel.G! * currentPixel.A!,
B: currentPixel.B! * currentPixel.A!,
A: currentPixel.A,
};
} else {
return currentPixel;
}
});
}