Skip to content

Commit fa1727b

Browse files
author
Gusted
authored
Faster UI render (darkreader#5926)
- Resolves darkreader#5035 Well this is only 1 of the problems, it should do the job for now to make the rendering for malevic a bit easier Other falpit is the immense recursive calling of `execute` that over time is taking time.
1 parent 1b35887 commit fa1727b

2 files changed

Lines changed: 29 additions & 6 deletions

File tree

src/ui/controls/color-picker/hsb-picker.tsx

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type {RGBA} from '../../../utils/color';
44
import {rgbToHSL, parse, hslToString, rgbToHexString} from '../../../utils/color';
55
import {clamp, scale} from '../../../utils/math';
66
import {createSwipeHandler} from '../../utils';
7+
import {isElementHidden} from '../utils';
78

89
interface HSB {
910
h: number;
@@ -18,12 +19,23 @@ interface HSBPickerProps {
1819
}
1920

2021
interface HSBPickerState {
22+
wasPrevHidden: boolean;
23+
hueCanvasRendered: boolean;
2124
activeHSB: HSB;
2225
activeChangeHandler: (color: string) => void;
2326
hueTouchStartHandler: (e: TouchEvent) => void;
2427
sbTouchStartHandler: (e: TouchEvent) => void;
2528
}
2629

30+
const hsbPickerDefaults: HSBPickerState = {
31+
wasPrevHidden: true,
32+
hueCanvasRendered: false,
33+
activeHSB: null,
34+
activeChangeHandler: null,
35+
hueTouchStartHandler: null,
36+
sbTouchStartHandler: null
37+
};
38+
2739
function rgbToHSB({r, g, b}: RGBA) {
2840
const min = Math.min(r, g, b);
2941
const max = Math.max(r, g, b);
@@ -102,7 +114,7 @@ function renderSB(hue: number, canvas: HTMLCanvasElement) {
102114

103115
export default function HSBPicker(props: HSBPickerProps) {
104116
const context = getContext();
105-
const store = context.store as HSBPickerState;
117+
const store = context.getStore(hsbPickerDefaults) as HSBPickerState;
106118
store.activeChangeHandler = props.onChange;
107119

108120
const prevColor = context.prev && context.prev.props.color;
@@ -118,15 +130,22 @@ export default function HSBPicker(props: HSBPickerProps) {
118130
}
119131

120132
function onSBCanvasRender(canvas: HTMLCanvasElement) {
133+
if (isElementHidden(canvas)) {
134+
return;
135+
}
121136
const hue = activeHSB.h;
122137
const prevHue = prevColor && rgbToHSB(parse(prevColor)).h;
123-
if (hue === prevHue) {
124-
return;
138+
if (store.wasPrevHidden || hue !== prevHue) {
139+
renderSB(hue, canvas);
125140
}
126-
renderSB(hue, canvas);
141+
store.wasPrevHidden = false;
127142
}
128143

129-
function onHueCanvasCreate(canvas: HTMLCanvasElement) {
144+
function onHueCanvasRender(canvas: HTMLCanvasElement) {
145+
if (store.hueCanvasRendered || isElementHidden(canvas)) {
146+
return;
147+
}
148+
store.hueCanvasRendered = true;
130149
renderHue(canvas);
131150
}
132151

@@ -207,7 +226,7 @@ export default function HSBPicker(props: HSBPickerProps) {
207226
store.hueTouchStartHandler = onHuePointerDown;
208227
}}
209228
>
210-
<canvas class="hsb-picker__hue-canvas" oncreate={onHueCanvasCreate} />
229+
<canvas class="hsb-picker__hue-canvas" onrender={onHueCanvasRender} />
211230
<span class="hsb-picker__hue-cursor" style={hueCursorStyle}></span>
212231
</span>
213232
</span>

src/ui/controls/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ export function omitAttrs(omit: string[], attrs: Malevic.NodeAttrs) {
2121
});
2222
return result;
2323
}
24+
25+
export function isElementHidden(element: HTMLElement) {
26+
return element.offsetParent === null;
27+
}

0 commit comments

Comments
 (0)