81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
import { existsSync } from 'node:fs'
|
|
|
|
import { describe, expect, test } from 'bun:test'
|
|
|
|
import { initCanvasKit } from '#cli/headless'
|
|
|
|
const MATRIX_PATH = '/tmp/open-pencil-boolean-matrix.png'
|
|
const CELL_W = 180
|
|
const CELL_H = 150
|
|
const MATRIX_COLUMNS = 4
|
|
const MATRIX_ROWS = 8
|
|
const MIN_CELL_COLORED_PIXELS = 50
|
|
|
|
function isColoredPixel(pixels: Uint8Array, index: number): boolean {
|
|
const isWhite = pixels[index] > 245 && pixels[index + 1] > 245 && pixels[index + 2] > 245
|
|
return !isWhite && pixels[index + 3] > 0
|
|
}
|
|
|
|
function countCellColoredPixels(
|
|
pixels: Uint8Array,
|
|
imageWidth: number,
|
|
column: number,
|
|
row: number
|
|
): number {
|
|
let count = 0
|
|
const startX = column * CELL_W
|
|
const startY = row * CELL_H
|
|
for (let y = startY; y < startY + CELL_H; y++) {
|
|
for (let x = startX; x < startX + CELL_W; x++) {
|
|
if (isColoredPixel(pixels, (y * imageWidth + x) * 4)) count++
|
|
}
|
|
}
|
|
return count
|
|
}
|
|
|
|
describe('boolean visual matrix', () => {
|
|
test('generates a non-empty visual fixture for supported shape cases', async () => {
|
|
const proc = Bun.spawnSync({
|
|
cmd: ['bun', 'tests/engine/render/canvas/visual/boolean-matrix.ts'],
|
|
stdout: 'pipe',
|
|
stderr: 'pipe'
|
|
})
|
|
expect(proc.exitCode).toBe(0)
|
|
expect(existsSync(MATRIX_PATH)).toBe(true)
|
|
|
|
const ck = await initCanvasKit()
|
|
const bytes = await Bun.file(MATRIX_PATH).arrayBuffer()
|
|
const image = ck.MakeImageFromEncoded(bytes)
|
|
expect(image).not.toBeNull()
|
|
if (!image) return
|
|
|
|
const imageWidth = image.width()
|
|
const imageHeight = image.height()
|
|
expect(imageWidth).toBe(720)
|
|
expect(imageHeight).toBe(1200)
|
|
|
|
const pixels = image.readPixels(0, 0, {
|
|
width: imageWidth,
|
|
height: imageHeight,
|
|
colorType: ck.ColorType.RGBA_8888,
|
|
alphaType: ck.AlphaType.Unpremul,
|
|
colorSpace: ck.ColorSpace.SRGB
|
|
})
|
|
image.delete()
|
|
|
|
let coloredPixels = 0
|
|
for (let i = 0; i < pixels.length; i += 4) {
|
|
if (isColoredPixel(pixels, i)) coloredPixels++
|
|
}
|
|
expect(coloredPixels).toBeGreaterThan(20_000)
|
|
|
|
for (let row = 0; row < MATRIX_ROWS; row++) {
|
|
for (let column = 0; column < MATRIX_COLUMNS; column++) {
|
|
expect(countCellColoredPixels(pixels, imageWidth, column, row)).toBeGreaterThan(
|
|
MIN_CELL_COLORED_PIXELS
|
|
)
|
|
}
|
|
}
|
|
})
|
|
})
|