mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 06:20:11 +00:00
## Summary Consolidate duplicate `rgbToHSL` implementation — mask editor now uses the shared `colorUtil.ts` version instead of its own copy. ## Changes - Export `rgbToHsl` from `src/utils/colorUtil.ts` (was private) - Replace 30-line local `rgbToHSL` in `useCanvasTools.ts` with a 2-line wrapper that imports from `colorUtil.ts` and scales the return values from 0-1 to degree/percentage ## Testing ### Automated - All 176 existing tests pass (`colorUtil.test.ts` + `maskeditor/` suite) - No new tests needed — behavior is identical ### E2E Verification Steps 1. Open any image in the mask editor 2. Select the magic wand / color picker tool 3. Use HSL-based color matching — results should be identical to before ## Review Focus The canonical `rgbToHsl` returns normalized 0-1 values while the mask editor needs degree/percentage scale (h: 0-360, s: 0-100, l: 0-100). The local wrapper handles this conversion. Fixes #11080 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-11134-chore-11080-consolidate-duplicate-rgbToHSL-use-shared-colorUtil-33e6d73d36508120bbd8f444f5cc94b6) by [Unito](https://www.unito.io) Co-authored-by: Terry Jia <terryjia88@gmail.com>
This commit is contained in:
@@ -2,6 +2,7 @@ import { ref, watch } from 'vue'
|
||||
import { useMaskEditorStore } from '@/stores/maskEditorStore'
|
||||
import { ColorComparisonMethod } from '@/extensions/core/maskeditor/types'
|
||||
import type { Point } from '@/extensions/core/maskeditor/types'
|
||||
import { rgbToHsl } from '@/utils/colorUtil'
|
||||
|
||||
const getPixelAlpha = (
|
||||
data: Uint8ClampedArray,
|
||||
@@ -47,39 +48,8 @@ const rgbToHSL = (
|
||||
g: number,
|
||||
b: number
|
||||
): { h: number; s: number; l: number } => {
|
||||
r /= 255
|
||||
g /= 255
|
||||
b /= 255
|
||||
|
||||
const max = Math.max(r, g, b)
|
||||
const min = Math.min(r, g, b)
|
||||
let h = 0
|
||||
let s = 0
|
||||
const l = (max + min) / 2
|
||||
|
||||
if (max !== min) {
|
||||
const d = max - min
|
||||
s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
|
||||
|
||||
switch (max) {
|
||||
case r:
|
||||
h = (g - b) / d + (g < b ? 6 : 0)
|
||||
break
|
||||
case g:
|
||||
h = (b - r) / d + 2
|
||||
break
|
||||
case b:
|
||||
h = (r - g) / d + 4
|
||||
break
|
||||
}
|
||||
h /= 6
|
||||
}
|
||||
|
||||
return {
|
||||
h: h * 360,
|
||||
s: s * 100,
|
||||
l: l * 100
|
||||
}
|
||||
const hsl = rgbToHsl({ r, g, b })
|
||||
return { h: hsl.h * 360, s: hsl.s * 100, l: hsl.l * 100 }
|
||||
}
|
||||
|
||||
const rgbToLab = (rgb: {
|
||||
|
||||
@@ -36,7 +36,7 @@ export function isTransparent(color: string) {
|
||||
return false
|
||||
}
|
||||
|
||||
function rgbToHsl({ r, g, b }: RGB): HSL {
|
||||
export function rgbToHsl({ r, g, b }: RGB): HSL {
|
||||
r /= 255
|
||||
g /= 255
|
||||
b /= 255
|
||||
|
||||
Reference in New Issue
Block a user