mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-25 01:04:06 +00:00
## GPU accelerated brush engine for the mask editor - Full GPU acceleration using TypeGPU and type-safe shaders - Catmull-Rom Spline Smoothing - arc-length equidistant resampling - much improved performance, even for huge images - photoshop like opacity clamping for brush strokes - much improved soft brushes - fallback to CPU fully implemented, much improved CPU rendering features as well ### Tested Browsers - Chrome (fully supported) - Safari 26 (fully supported, prev versions CPU fallback) - Firefox (CPU fallback, flags needed for full support) https://github.com/user-attachments/assets/b7b5cb8a-2290-4a95-ae7d-180e11fccdb0 https://github.com/user-attachments/assets/4297aaa5-f249-499a-9b74-869677f1c73b https://github.com/user-attachments/assets/602b4783-3e2b-489e-bcb9-70534bcaac5e ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6767-GPU-accelerated-maskeditor-rendering-2b16d73d3650818cb294e1fca03f6169) by [Unito](https://www.unito.io)
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import { getEffectiveBrushSize, getEffectiveHardness } from './brushUtils'
|
|
|
|
describe('brushUtils', () => {
|
|
describe('getEffectiveBrushSize', () => {
|
|
it('should return original size when hardness is 1.0', () => {
|
|
const size = 100
|
|
const hardness = 1.0
|
|
expect(getEffectiveBrushSize(size, hardness)).toBe(100)
|
|
})
|
|
|
|
it('should return 1.5x size when hardness is 0.0', () => {
|
|
const size = 100
|
|
const hardness = 0.0
|
|
expect(getEffectiveBrushSize(size, hardness)).toBe(150)
|
|
})
|
|
|
|
it('should interpolate linearly', () => {
|
|
const size = 100
|
|
const hardness = 0.5
|
|
// Scale should be 1.0 + 0.5 * 0.5 = 1.25
|
|
expect(getEffectiveBrushSize(size, hardness)).toBe(125)
|
|
})
|
|
})
|
|
|
|
describe('getEffectiveHardness', () => {
|
|
it('should return same hardness if effective size matches size', () => {
|
|
const size = 100
|
|
const hardness = 0.8
|
|
const effectiveSize = 100
|
|
expect(getEffectiveHardness(size, hardness, effectiveSize)).toBe(0.8)
|
|
})
|
|
|
|
it('should scale hardness down as effective size increases', () => {
|
|
const size = 100
|
|
const hardness = 0.5
|
|
// Effective size at 0.5 hardness is 125
|
|
const effectiveSize = 125
|
|
// Hard core radius = 50. New hardness = 50 / 125 = 0.4
|
|
expect(getEffectiveHardness(size, hardness, effectiveSize)).toBe(0.4)
|
|
})
|
|
|
|
it('should return 0 if effective size is 0', () => {
|
|
expect(getEffectiveHardness(100, 0.5, 0)).toBe(0)
|
|
})
|
|
})
|
|
})
|