@@ -198,19 +198,20 @@ class RadialAxialShading extends BaseShading {
198198
199199 const color = new Float32Array ( cs . numComps ) ,
200200 ratio = new Float32Array ( 1 ) ;
201- let rgbColor ;
202201
203202 let iBase = 0 ;
204203 ratio [ 0 ] = t0 ;
205204 fn ( ratio , 0 , color , 0 ) ;
206- let rgbBase = cs . getRgb ( color , 0 ) ;
207- const cssColorBase = Util . makeHexColor ( rgbBase [ 0 ] , rgbBase [ 1 ] , rgbBase [ 2 ] ) ;
208- colorStops . push ( [ 0 , cssColorBase ] ) ;
205+ const rgbBuffer = new Uint8ClampedArray ( 3 ) ;
206+ cs . getRgb ( color , 0 , rgbBuffer ) ;
207+ let [ rBase , gBase , bBase ] = rgbBuffer ;
208+ colorStops . push ( [ 0 , Util . makeHexColor ( rBase , gBase , bBase ) ] ) ;
209209
210210 let iPrev = 1 ;
211211 ratio [ 0 ] = t0 + step ;
212212 fn ( ratio , 0 , color , 0 ) ;
213- let rgbPrev = cs . getRgb ( color , 0 ) ;
213+ cs . getRgb ( color , 0 , rgbBuffer ) ;
214+ let [ rPrev , gPrev , bPrev ] = rgbBuffer ;
214215
215216 // Slopes are rise / run.
216217 // A max slope is from the least value the base component could have been
@@ -221,63 +222,66 @@ class RadialAxialShading extends BaseShading {
221222 // so the conservative deltas are +-1 (+-.5 for base and -+.5 for current).
222223
223224 // The run is iPrev - iBase = 1, so omitted.
224- let maxSlopeR = rgbPrev [ 0 ] - rgbBase [ 0 ] + 1 ;
225- let maxSlopeG = rgbPrev [ 1 ] - rgbBase [ 1 ] + 1 ;
226- let maxSlopeB = rgbPrev [ 2 ] - rgbBase [ 2 ] + 1 ;
227- let minSlopeR = rgbPrev [ 0 ] - rgbBase [ 0 ] - 1 ;
228- let minSlopeG = rgbPrev [ 1 ] - rgbBase [ 1 ] - 1 ;
229- let minSlopeB = rgbPrev [ 2 ] - rgbBase [ 2 ] - 1 ;
225+ let maxSlopeR = rPrev - rBase + 1 ;
226+ let maxSlopeG = gPrev - gBase + 1 ;
227+ let maxSlopeB = bPrev - bBase + 1 ;
228+ let minSlopeR = rPrev - rBase - 1 ;
229+ let minSlopeG = gPrev - gBase - 1 ;
230+ let minSlopeB = bPrev - bBase - 1 ;
230231
231232 for ( let i = 2 ; i < NUMBER_OF_SAMPLES ; i ++ ) {
232233 ratio [ 0 ] = t0 + i * step ;
233234 fn ( ratio , 0 , color , 0 ) ;
234- rgbColor = cs . getRgb ( color , 0 ) ;
235+ cs . getRgb ( color , 0 , rgbBuffer ) ;
236+ const [ r , g , b ] = rgbBuffer ;
235237
236238 // Keep going if the maximum minimum slope <= the minimum maximum slope.
237239 // Otherwise add a rgbPrev color stop and make it the new base.
238240
239241 const run = i - iBase ;
240- maxSlopeR = Math . min ( maxSlopeR , ( rgbColor [ 0 ] - rgbBase [ 0 ] + 1 ) / run ) ;
241- maxSlopeG = Math . min ( maxSlopeG , ( rgbColor [ 1 ] - rgbBase [ 1 ] + 1 ) / run ) ;
242- maxSlopeB = Math . min ( maxSlopeB , ( rgbColor [ 2 ] - rgbBase [ 2 ] + 1 ) / run ) ;
243- minSlopeR = Math . max ( minSlopeR , ( rgbColor [ 0 ] - rgbBase [ 0 ] - 1 ) / run ) ;
244- minSlopeG = Math . max ( minSlopeG , ( rgbColor [ 1 ] - rgbBase [ 1 ] - 1 ) / run ) ;
245- minSlopeB = Math . max ( minSlopeB , ( rgbColor [ 2 ] - rgbBase [ 2 ] - 1 ) / run ) ;
242+ maxSlopeR = Math . min ( maxSlopeR , ( r - rBase + 1 ) / run ) ;
243+ maxSlopeG = Math . min ( maxSlopeG , ( g - gBase + 1 ) / run ) ;
244+ maxSlopeB = Math . min ( maxSlopeB , ( b - bBase + 1 ) / run ) ;
245+ minSlopeR = Math . max ( minSlopeR , ( r - rBase - 1 ) / run ) ;
246+ minSlopeG = Math . max ( minSlopeG , ( g - gBase - 1 ) / run ) ;
247+ minSlopeB = Math . max ( minSlopeB , ( b - bBase - 1 ) / run ) ;
246248
247249 const slopesExist =
248250 minSlopeR <= maxSlopeR &&
249251 minSlopeG <= maxSlopeG &&
250252 minSlopeB <= maxSlopeB ;
251253
252254 if ( ! slopesExist ) {
253- const cssColor = Util . makeHexColor ( rgbPrev [ 0 ] , rgbPrev [ 1 ] , rgbPrev [ 2 ] ) ;
255+ const cssColor = Util . makeHexColor ( rPrev , gPrev , bPrev ) ;
254256 colorStops . push ( [ iPrev / NUMBER_OF_SAMPLES , cssColor ] ) ;
255257
256258 // TODO: When fn frequency is high (iPrev - iBase === 1 twice in a row),
257259 // send the color space and function to do the sampling display side.
258260
259261 // The run is i - iPrev = 1, so omitted.
260- maxSlopeR = rgbColor [ 0 ] - rgbPrev [ 0 ] + 1 ;
261- maxSlopeG = rgbColor [ 1 ] - rgbPrev [ 1 ] + 1 ;
262- maxSlopeB = rgbColor [ 2 ] - rgbPrev [ 2 ] + 1 ;
263- minSlopeR = rgbColor [ 0 ] - rgbPrev [ 0 ] - 1 ;
264- minSlopeG = rgbColor [ 1 ] - rgbPrev [ 1 ] - 1 ;
265- minSlopeB = rgbColor [ 2 ] - rgbPrev [ 2 ] - 1 ;
262+ maxSlopeR = r - rPrev + 1 ;
263+ maxSlopeG = g - gPrev + 1 ;
264+ maxSlopeB = b - bPrev + 1 ;
265+ minSlopeR = r - rPrev - 1 ;
266+ minSlopeG = g - gPrev - 1 ;
267+ minSlopeB = b - bPrev - 1 ;
266268
267269 iBase = iPrev ;
268- rgbBase = rgbPrev ;
270+ rBase = rPrev ;
271+ gBase = gPrev ;
272+ bBase = bPrev ;
269273 }
270274
271275 iPrev = i ;
272- rgbPrev = rgbColor ;
276+ rPrev = r ;
277+ gPrev = g ;
278+ bPrev = b ;
273279 }
274- const cssColor = Util . makeHexColor ( rgbPrev [ 0 ] , rgbPrev [ 1 ] , rgbPrev [ 2 ] ) ;
275- colorStops . push ( [ 1 , cssColor ] ) ;
280+ colorStops . push ( [ 1 , Util . makeHexColor ( rPrev , gPrev , bPrev ) ] ) ;
276281
277282 let background = "transparent" ;
278283 if ( dict . has ( "Background" ) ) {
279- rgbColor = cs . getRgb ( dict . get ( "Background" ) , 0 ) ;
280- background = Util . makeHexColor ( rgbColor [ 0 ] , rgbColor [ 1 ] , rgbColor [ 2 ] ) ;
284+ background = cs . getRgbHex ( dict . get ( "Background" ) , 0 ) ;
281285 }
282286
283287 if ( ! extendStart ) {
0 commit comments