1
1
import { Box , Flex } from '@invoke-ai/ui-library' ;
2
+ import { useStore } from '@nanostores/react' ;
2
3
import { createSelector } from '@reduxjs/toolkit' ;
3
4
import { useAppDispatch , useAppSelector } from 'app/store/storeHooks' ;
4
5
import { useEntityAdapterContext } from 'features/controlLayers/contexts/EntityAdapterContext' ;
5
6
import { useEntityIdentifierContext } from 'features/controlLayers/contexts/EntityIdentifierContext' ;
6
7
import { rasterLayerAdjustmentsCurvesUpdated } from 'features/controlLayers/store/canvasSlice' ;
7
8
import { selectCanvasSlice , selectEntity } from 'features/controlLayers/store/selectors' ;
8
- import type { ChannelName , ChannelPoints } from 'features/controlLayers/store/types' ;
9
+ import type { ChannelName , ChannelPoints , CurvesAdjustmentsConfig } from 'features/controlLayers/store/types' ;
9
10
import { memo , useCallback , useEffect , useMemo , useState } from 'react' ;
10
11
import { useTranslation } from 'react-i18next' ;
11
12
@@ -16,6 +17,13 @@ const DEFAULT_POINTS: ChannelPoints = [
16
17
[ 255 , 255 ] ,
17
18
] ;
18
19
20
+ const DEFAULT_CURVES : CurvesAdjustmentsConfig = {
21
+ master : DEFAULT_POINTS ,
22
+ r : DEFAULT_POINTS ,
23
+ g : DEFAULT_POINTS ,
24
+ b : DEFAULT_POINTS ,
25
+ } ;
26
+
19
27
type ChannelHistograms = Record < ChannelName , number [ ] | null > ;
20
28
21
29
const calculateHistogramsFromImageData = ( imageData : ImageData ) : ChannelHistograms | null => {
@@ -62,29 +70,29 @@ export const RasterLayerCurvesAdjustmentsEditor = memo(() => {
62
70
const entityIdentifier = useEntityIdentifierContext < 'raster_layer' > ( ) ;
63
71
const adapter = useEntityAdapterContext < 'raster_layer' > ( 'raster_layer' ) ;
64
72
const { t } = useTranslation ( ) ;
65
- const selectLayer = useMemo (
66
- ( ) => createSelector ( selectCanvasSlice , ( canvas ) => selectEntity ( canvas , entityIdentifier ) ) ,
67
- [ entityIdentifier ]
68
- ) ;
69
- const layer = useAppSelector ( selectLayer ) ;
73
+ const selectCurves = useMemo ( ( ) => {
74
+ return createSelector (
75
+ selectCanvasSlice ,
76
+ ( canvas ) => selectEntity ( canvas , entityIdentifier ) ?. adjustments ?. curves ?? DEFAULT_CURVES
77
+ ) ;
78
+ } , [ entityIdentifier ] ) ;
79
+ const curves = useAppSelector ( selectCurves ) ;
80
+
70
81
const selectIsDisabled = useMemo ( ( ) => {
71
82
return createSelector (
72
83
selectCanvasSlice ,
73
84
( canvas ) => selectEntity ( canvas , entityIdentifier ) ?. adjustments ?. enabled !== true
74
85
) ;
75
86
} , [ entityIdentifier ] ) ;
76
87
const isDisabled = useAppSelector ( selectIsDisabled ) ;
88
+ // The canvas cache for the layer serves as a proxy for when the layer changes and can be used to trigger histo recalc
89
+ const canvasCache = useStore ( adapter . $canvasCache ) ;
77
90
78
91
const [ histMaster , setHistMaster ] = useState < number [ ] | null > ( null ) ;
79
92
const [ histR , setHistR ] = useState < number [ ] | null > ( null ) ;
80
93
const [ histG , setHistG ] = useState < number [ ] | null > ( null ) ;
81
94
const [ histB , setHistB ] = useState < number [ ] | null > ( null ) ;
82
95
83
- const pointsMaster = layer ?. adjustments ?. curves . master ?? DEFAULT_POINTS ;
84
- const pointsR = layer ?. adjustments ?. curves . r ?? DEFAULT_POINTS ;
85
- const pointsG = layer ?. adjustments ?. curves . g ?? DEFAULT_POINTS ;
86
- const pointsB = layer ?. adjustments ?. curves . b ?? DEFAULT_POINTS ;
87
-
88
96
const recalcHistogram = useCallback ( ( ) => {
89
97
try {
90
98
const rect = adapter . transformer . getRelativeRect ( ) ;
@@ -110,7 +118,7 @@ export const RasterLayerCurvesAdjustmentsEditor = memo(() => {
110
118
111
119
useEffect ( ( ) => {
112
120
recalcHistogram ( ) ;
113
- } , [ layer ?. objects , layer ?. adjustments , recalcHistogram ] ) ;
121
+ } , [ canvasCache , recalcHistogram ] ) ;
114
122
115
123
const onChangePoints = useCallback (
116
124
( channel : ChannelName , pts : ChannelPoints ) => {
@@ -138,28 +146,28 @@ export const RasterLayerCurvesAdjustmentsEditor = memo(() => {
138
146
< RasterLayerCurvesAdjustmentsGraph
139
147
title = { t ( 'controlLayers.adjustments.master' ) }
140
148
channel = "master"
141
- points = { pointsMaster }
149
+ points = { curves . master }
142
150
histogram = { histMaster }
143
151
onChange = { onChangeMaster }
144
152
/>
145
153
< RasterLayerCurvesAdjustmentsGraph
146
154
title = { t ( 'common.red' ) }
147
155
channel = "r"
148
- points = { pointsR }
156
+ points = { curves . r }
149
157
histogram = { histR }
150
158
onChange = { onChangeR }
151
159
/>
152
160
< RasterLayerCurvesAdjustmentsGraph
153
161
title = { t ( 'common.green' ) }
154
162
channel = "g"
155
- points = { pointsG }
163
+ points = { curves . g }
156
164
histogram = { histG }
157
165
onChange = { onChangeG }
158
166
/>
159
167
< RasterLayerCurvesAdjustmentsGraph
160
168
title = { t ( 'common.blue' ) }
161
169
channel = "b"
162
- points = { pointsB }
170
+ points = { curves . b }
163
171
histogram = { histB }
164
172
onChange = { onChangeB }
165
173
/>
0 commit comments