@@ -115,10 +115,10 @@ public class ICC_ColorSpace extends ColorSpace {
115
115
private boolean needScaleInit = true ;
116
116
117
117
// {to,from}{RGB,CIEXYZ} methods create and cache these when needed
118
- private transient ColorTransform this2srgb ;
119
- private transient ColorTransform srgb2this ;
120
- private transient ColorTransform this2xyz ;
121
- private transient ColorTransform xyz2this ;
118
+ private transient volatile ColorTransform this2srgb ;
119
+ private transient volatile ColorTransform srgb2this ;
120
+ private transient volatile ColorTransform this2xyz ;
121
+ private transient volatile ColorTransform xyz2this ;
122
122
123
123
/**
124
124
* Constructs a new {@code ICC_ColorSpace} from an {@code ICC_Profile}
@@ -193,20 +193,22 @@ public ICC_Profile getProfile() {
193
193
* @throws ArrayIndexOutOfBoundsException if array length is not at least
194
194
* the number of components in this {@code ColorSpace}
195
195
*/
196
- public float [] toRGB (float [] colorvalue ) {
197
-
196
+ public float [] toRGB (float [] colorvalue ) {
198
197
if (this2srgb == null ) {
199
- ColorTransform [] transformList = new ColorTransform [2 ];
200
- ICC_ColorSpace srgbCS =
201
- (ICC_ColorSpace ) ColorSpace .getInstance (CS_sRGB );
202
- PCMM mdl = CMSManager .getModule ();
203
- transformList [0 ] = mdl .createTransform (
204
- thisProfile , ColorTransform .Any , ColorTransform .In );
205
- transformList [1 ] = mdl .createTransform (
206
- srgbCS .getProfile (), ColorTransform .Any , ColorTransform .Out );
207
- this2srgb = mdl .createTransform (transformList );
208
- if (needScaleInit ) {
209
- setComponentScaling ();
198
+ synchronized (this ) {
199
+ if (this2srgb == null ) {
200
+ ColorTransform [] transforms = new ColorTransform [2 ];
201
+ var srgb = (ICC_ColorSpace ) getInstance (CS_sRGB );
202
+ PCMM mdl = CMSManager .getModule ();
203
+ transforms [0 ] = mdl .createTransform (thisProfile ,
204
+ ColorTransform .Any , ColorTransform .In );
205
+ transforms [1 ] = mdl .createTransform (srgb .getProfile (),
206
+ ColorTransform .Any , ColorTransform .Out );
207
+ if (needScaleInit ) {
208
+ setComponentScaling ();
209
+ }
210
+ this2srgb = mdl .createTransform (transforms );
211
+ }
210
212
}
211
213
}
212
214
@@ -243,20 +245,22 @@ public float[] toRGB (float[] colorvalue) {
243
245
* this {@code ColorSpace}
244
246
* @throws ArrayIndexOutOfBoundsException if array length is not at least 3
245
247
*/
246
- public float [] fromRGB (float [] rgbvalue ) {
247
-
248
+ public float [] fromRGB (float [] rgbvalue ) {
248
249
if (srgb2this == null ) {
249
- ColorTransform [] transformList = new ColorTransform [2 ];
250
- ICC_ColorSpace srgbCS =
251
- (ICC_ColorSpace ) ColorSpace .getInstance (CS_sRGB );
252
- PCMM mdl = CMSManager .getModule ();
253
- transformList [0 ] = mdl .createTransform (
254
- srgbCS .getProfile (), ColorTransform .Any , ColorTransform .In );
255
- transformList [1 ] = mdl .createTransform (
256
- thisProfile , ColorTransform .Any , ColorTransform .Out );
257
- srgb2this = mdl .createTransform (transformList );
258
- if (needScaleInit ) {
259
- setComponentScaling ();
250
+ synchronized (this ) {
251
+ if (srgb2this == null ) {
252
+ ColorTransform [] transforms = new ColorTransform [2 ];
253
+ var srgb = (ICC_ColorSpace ) getInstance (CS_sRGB );
254
+ PCMM mdl = CMSManager .getModule ();
255
+ transforms [0 ] = mdl .createTransform (srgb .getProfile (),
256
+ ColorTransform .Any , ColorTransform .In );
257
+ transforms [1 ] = mdl .createTransform (thisProfile ,
258
+ ColorTransform .Any , ColorTransform .Out );
259
+ if (needScaleInit ) {
260
+ setComponentScaling ();
261
+ }
262
+ srgb2this = mdl .createTransform (transforms );
263
+ }
260
264
}
261
265
}
262
266
@@ -373,26 +377,28 @@ public float[] fromRGB(float[] rgbvalue) {
373
377
* @throws ArrayIndexOutOfBoundsException if array length is not at least
374
378
* the number of components in this {@code ColorSpace}
375
379
*/
376
- public float [] toCIEXYZ (float [] colorvalue ) {
377
-
380
+ public float [] toCIEXYZ (float [] colorvalue ) {
378
381
if (this2xyz == null ) {
379
- ColorTransform [] transformList = new ColorTransform [2 ];
380
- ICC_ColorSpace xyzCS =
381
- (ICC_ColorSpace ) ColorSpace .getInstance (CS_CIEXYZ );
382
- PCMM mdl = CMSManager .getModule ();
383
- try {
384
- transformList [0 ] = mdl .createTransform (
385
- thisProfile , ICC_Profile .icRelativeColorimetric ,
386
- ColorTransform .In );
387
- } catch (CMMException e ) {
388
- transformList [0 ] = mdl .createTransform (
389
- thisProfile , ColorTransform .Any , ColorTransform .In );
390
- }
391
- transformList [1 ] = mdl .createTransform (
392
- xyzCS .getProfile (), ColorTransform .Any , ColorTransform .Out );
393
- this2xyz = mdl .createTransform (transformList );
394
- if (needScaleInit ) {
395
- setComponentScaling ();
382
+ synchronized (this ) {
383
+ if (this2xyz == null ) {
384
+ ColorTransform [] transforms = new ColorTransform [2 ];
385
+ var xyz = (ICC_ColorSpace ) getInstance (CS_CIEXYZ );
386
+ PCMM mdl = CMSManager .getModule ();
387
+ try {
388
+ transforms [0 ] = mdl .createTransform (thisProfile ,
389
+ ICC_Profile .icRelativeColorimetric ,
390
+ ColorTransform .In );
391
+ } catch (CMMException e ) {
392
+ transforms [0 ] = mdl .createTransform (thisProfile ,
393
+ ColorTransform .Any , ColorTransform .In );
394
+ }
395
+ transforms [1 ] = mdl .createTransform (xyz .getProfile (),
396
+ ColorTransform .Any , ColorTransform .Out );
397
+ if (needScaleInit ) {
398
+ setComponentScaling ();
399
+ }
400
+ this2xyz = mdl .createTransform (transforms );
401
+ }
396
402
}
397
403
}
398
404
@@ -511,26 +517,28 @@ public float[] toCIEXYZ(float[] colorvalue) {
511
517
* this {@code ColorSpace}
512
518
* @throws ArrayIndexOutOfBoundsException if array length is not at least 3
513
519
*/
514
- public float [] fromCIEXYZ (float [] colorvalue ) {
515
-
520
+ public float [] fromCIEXYZ (float [] colorvalue ) {
516
521
if (xyz2this == null ) {
517
- ColorTransform [] transformList = new ColorTransform [2 ];
518
- ICC_ColorSpace xyzCS =
519
- (ICC_ColorSpace ) ColorSpace .getInstance (CS_CIEXYZ );
520
- PCMM mdl = CMSManager .getModule ();
521
- transformList [0 ] = mdl .createTransform (
522
- xyzCS .getProfile (), ColorTransform .Any , ColorTransform .In );
523
- try {
524
- transformList [1 ] = mdl .createTransform (
525
- thisProfile , ICC_Profile .icRelativeColorimetric ,
526
- ColorTransform .Out );
527
- } catch (CMMException e ) {
528
- transformList [1 ] = CMSManager .getModule ().createTransform (
529
- thisProfile , ColorTransform .Any , ColorTransform .Out );
530
- }
531
- xyz2this = mdl .createTransform (transformList );
532
- if (needScaleInit ) {
533
- setComponentScaling ();
522
+ synchronized (this ) {
523
+ if (xyz2this == null ) {
524
+ ColorTransform [] transforms = new ColorTransform [2 ];
525
+ var xyz = (ICC_ColorSpace ) getInstance (CS_CIEXYZ );
526
+ PCMM mdl = CMSManager .getModule ();
527
+ transforms [0 ] = mdl .createTransform (xyz .getProfile (),
528
+ ColorTransform .Any , ColorTransform .In );
529
+ try {
530
+ transforms [1 ] = mdl .createTransform (thisProfile ,
531
+ ICC_Profile .icRelativeColorimetric ,
532
+ ColorTransform .Out );
533
+ } catch (CMMException e ) {
534
+ transforms [1 ] = mdl .createTransform (thisProfile ,
535
+ ColorTransform .Any , ColorTransform .Out );
536
+ }
537
+ if (needScaleInit ) {
538
+ setComponentScaling ();
539
+ }
540
+ xyz2this = mdl .createTransform (transforms );
541
+ }
534
542
}
535
543
}
536
544
0 commit comments