@@ -297,124 +297,13 @@ public Image(Device device, Image srcImage, int flag) {
297
297
}
298
298
case SWT .IMAGE_DISABLE : {
299
299
ImageData data = srcImage .getImageData (srcImage .getZoom ());
300
- PaletteData palette = data .palette ;
301
- RGB [] rgbs = new RGB [3 ];
302
- rgbs [0 ] = device .getSystemColor (SWT .COLOR_BLACK ).getRGB ();
303
- rgbs [1 ] = device .getSystemColor (SWT .COLOR_WIDGET_NORMAL_SHADOW ).getRGB ();
304
- rgbs [2 ] = device .getSystemColor (SWT .COLOR_WIDGET_BACKGROUND ).getRGB ();
305
- ImageData newData = new ImageData (rect .width , rect .height , 8 , new PaletteData (rgbs ));
306
- newData .alpha = data .alpha ;
307
- newData .alphaData = data .alphaData ;
308
- newData .maskData = data .maskData ;
309
- newData .maskPad = data .maskPad ;
310
- if (data .transparentPixel != -1 ) newData .transparentPixel = 0 ;
311
-
312
- /* Convert the pixels. */
313
- int [] scanline = new int [rect .width ];
314
- int [] maskScanline = null ;
315
- ImageData mask = null ;
316
- if (data .maskData != null ) mask = data .getTransparencyMask ();
317
- if (mask != null ) maskScanline = new int [rect .width ];
318
- int redMask = palette .redMask ;
319
- int greenMask = palette .greenMask ;
320
- int blueMask = palette .blueMask ;
321
- int redShift = palette .redShift ;
322
- int greenShift = palette .greenShift ;
323
- int blueShift = palette .blueShift ;
324
- for (int y =0 ; y <rect .height ; y ++) {
325
- int offset = y * newData .bytesPerLine ;
326
- data .getPixels (0 , y , rect .width , scanline , 0 );
327
- if (mask != null ) mask .getPixels (0 , y , rect .width , maskScanline , 0 );
328
- for (int x =0 ; x <rect .width ; x ++) {
329
- int pixel = scanline [x ];
330
- if (!((data .transparentPixel != -1 && pixel == data .transparentPixel ) || (mask != null && maskScanline [x ] == 0 ))) {
331
- int red , green , blue ;
332
- if (palette .isDirect ) {
333
- red = pixel & redMask ;
334
- red = (redShift < 0 ) ? red >>> -redShift : red << redShift ;
335
- green = pixel & greenMask ;
336
- green = (greenShift < 0 ) ? green >>> -greenShift : green << greenShift ;
337
- blue = pixel & blueMask ;
338
- blue = (blueShift < 0 ) ? blue >>> -blueShift : blue << blueShift ;
339
- } else {
340
- red = palette .colors [pixel ].red ;
341
- green = palette .colors [pixel ].green ;
342
- blue = palette .colors [pixel ].blue ;
343
- }
344
- int intensity = red * red + green * green + blue * blue ;
345
- if (intensity < 98304 ) {
346
- newData .data [offset ] = (byte )1 ;
347
- } else {
348
- newData .data [offset ] = (byte )2 ;
349
- }
350
- }
351
- offset ++;
352
- }
353
- }
300
+ ImageData newData = applyDisableImageData (data , rect .height , rect .width );
354
301
init (newData , getZoom ());
355
302
break ;
356
303
}
357
304
case SWT .IMAGE_GRAY : {
358
305
ImageData data = srcImage .getImageData (srcImage .getZoom ());
359
- PaletteData palette = data .palette ;
360
- ImageData newData = data ;
361
- if (!palette .isDirect ) {
362
- /* Convert the palette entries to gray. */
363
- RGB [] rgbs = palette .getRGBs ();
364
- for (int i =0 ; i <rgbs .length ; i ++) {
365
- if (data .transparentPixel != i ) {
366
- RGB color = rgbs [i ];
367
- int red = color .red ;
368
- int green = color .green ;
369
- int blue = color .blue ;
370
- int intensity = (red +red +green +green +green +green +green +blue ) >> 3 ;
371
- color .red = color .green = color .blue = intensity ;
372
- }
373
- }
374
- newData .palette = new PaletteData (rgbs );
375
- } else {
376
- /* Create a 8 bit depth image data with a gray palette. */
377
- RGB [] rgbs = new RGB [256 ];
378
- for (int i =0 ; i <rgbs .length ; i ++) {
379
- rgbs [i ] = new RGB (i , i , i );
380
- }
381
- newData = new ImageData (rect .width , rect .height , 8 , new PaletteData (rgbs ));
382
- newData .alpha = data .alpha ;
383
- newData .alphaData = data .alphaData ;
384
- newData .maskData = data .maskData ;
385
- newData .maskPad = data .maskPad ;
386
- if (data .transparentPixel != -1 ) newData .transparentPixel = 254 ;
387
-
388
- /* Convert the pixels. */
389
- int [] scanline = new int [rect .width ];
390
- int redMask = palette .redMask ;
391
- int greenMask = palette .greenMask ;
392
- int blueMask = palette .blueMask ;
393
- int redShift = palette .redShift ;
394
- int greenShift = palette .greenShift ;
395
- int blueShift = palette .blueShift ;
396
- for (int y =0 ; y <rect .height ; y ++) {
397
- int offset = y * newData .bytesPerLine ;
398
- data .getPixels (0 , y , rect .width , scanline , 0 );
399
- for (int x =0 ; x <rect .width ; x ++) {
400
- int pixel = scanline [x ];
401
- if (pixel != data .transparentPixel ) {
402
- int red = pixel & redMask ;
403
- red = (redShift < 0 ) ? red >>> -redShift : red << redShift ;
404
- int green = pixel & greenMask ;
405
- green = (greenShift < 0 ) ? green >>> -greenShift : green << greenShift ;
406
- int blue = pixel & blueMask ;
407
- blue = (blueShift < 0 ) ? blue >>> -blueShift : blue << blueShift ;
408
- int intensity = (red +red +green +green +green +green +green +blue ) >> 3 ;
409
- if (newData .transparentPixel == intensity ) intensity = 255 ;
410
- newData .data [offset ] = (byte )intensity ;
411
- } else {
412
- newData .data [offset ] = (byte )254 ;
413
- }
414
- offset ++;
415
- }
416
- }
417
- }
306
+ ImageData newData = applyGrayImageData (data , rect .height , rect .width );
418
307
init (newData , getZoom ());
419
308
break ;
420
309
}
@@ -738,6 +627,150 @@ public Image(Device device, ImageDataProvider imageDataProvider) {
738
627
init ();
739
628
}
740
629
630
+ private ImageData adaptImageDataIfDisabledOrGray (ImageData data ) {
631
+ ImageData returnImageData = null ;
632
+ switch (this .styleFlag ) {
633
+ case SWT .IMAGE_DISABLE : {
634
+ ImageData newData = applyDisableImageData (data , data .height , data .width );
635
+ returnImageData = newData ;
636
+ break ;
637
+ }
638
+ case SWT .IMAGE_GRAY : {
639
+ ImageData newData = applyGrayImageData (data , data .height , data .width );
640
+ returnImageData = newData ;
641
+ break ;
642
+ }
643
+ default : {
644
+ returnImageData = data ;
645
+ break ;
646
+ }
647
+ }
648
+
649
+ return returnImageData ;
650
+ }
651
+
652
+ private ImageData applyDisableImageData (ImageData data , int height , int width ) {
653
+ PaletteData palette = data .palette ;
654
+ RGB [] rgbs = new RGB [3 ];
655
+ rgbs [0 ] = this .device .getSystemColor (SWT .COLOR_BLACK ).getRGB ();
656
+ rgbs [1 ] = this .device .getSystemColor (SWT .COLOR_WIDGET_NORMAL_SHADOW ).getRGB ();
657
+ rgbs [2 ] = this .device .getSystemColor (SWT .COLOR_WIDGET_BACKGROUND ).getRGB ();
658
+ ImageData newData = new ImageData (width , height , 8 , new PaletteData (rgbs ));
659
+ newData .alpha = data .alpha ;
660
+ newData .alphaData = data .alphaData ;
661
+ newData .maskData = data .maskData ;
662
+ newData .maskPad = data .maskPad ;
663
+ if (data .transparentPixel != -1 ) newData .transparentPixel = 0 ;
664
+
665
+ /* Convert the pixels. */
666
+ int [] scanline = new int [width ];
667
+ int [] maskScanline = null ;
668
+ ImageData mask = null ;
669
+ if (data .maskData != null ) mask = data .getTransparencyMask ();
670
+ if (mask != null ) maskScanline = new int [width ];
671
+ int redMask = palette .redMask ;
672
+ int greenMask = palette .greenMask ;
673
+ int blueMask = palette .blueMask ;
674
+ int redShift = palette .redShift ;
675
+ int greenShift = palette .greenShift ;
676
+ int blueShift = palette .blueShift ;
677
+ for (int y =0 ; y <height ; y ++) {
678
+ int offset = y * newData .bytesPerLine ;
679
+ data .getPixels (0 , y , width , scanline , 0 );
680
+ if (mask != null ) mask .getPixels (0 , y , width , maskScanline , 0 );
681
+ for (int x =0 ; x <width ; x ++) {
682
+ int pixel = scanline [x ];
683
+ if (!((data .transparentPixel != -1 && pixel == data .transparentPixel ) || (mask != null && maskScanline [x ] == 0 ))) {
684
+ int red , green , blue ;
685
+ if (palette .isDirect ) {
686
+ red = pixel & redMask ;
687
+ red = (redShift < 0 ) ? red >>> -redShift : red << redShift ;
688
+ green = pixel & greenMask ;
689
+ green = (greenShift < 0 ) ? green >>> -greenShift : green << greenShift ;
690
+ blue = pixel & blueMask ;
691
+ blue = (blueShift < 0 ) ? blue >>> -blueShift : blue << blueShift ;
692
+ } else {
693
+ red = palette .colors [pixel ].red ;
694
+ green = palette .colors [pixel ].green ;
695
+ blue = palette .colors [pixel ].blue ;
696
+ }
697
+ int intensity = red * red + green * green + blue * blue ;
698
+ if (intensity < 98304 ) {
699
+ newData .data [offset ] = (byte )1 ;
700
+ } else {
701
+ newData .data [offset ] = (byte )2 ;
702
+ }
703
+ }
704
+ offset ++;
705
+ }
706
+ }
707
+ return newData ;
708
+ }
709
+
710
+ private ImageData applyGrayImageData (ImageData data , int pHeight , int pWidth ) {
711
+ PaletteData palette = data .palette ;
712
+ ImageData newData = data ;
713
+ if (!palette .isDirect ) {
714
+ /* Convert the palette entries to gray. */
715
+ RGB [] rgbs = palette .getRGBs ();
716
+ for (int i =0 ; i <rgbs .length ; i ++) {
717
+ if (data .transparentPixel != i ) {
718
+ RGB color = rgbs [i ];
719
+ int red = color .red ;
720
+ int green = color .green ;
721
+ int blue = color .blue ;
722
+ int intensity = (red +red +green +green +green +green +green +blue ) >> 3 ;
723
+ color .red = color .green = color .blue = intensity ;
724
+ }
725
+ }
726
+ newData .palette = new PaletteData (rgbs );
727
+ } else {
728
+ /* Create a 8 bit depth image data with a gray palette. */
729
+ RGB [] rgbs = new RGB [256 ];
730
+ for (int i =0 ; i <rgbs .length ; i ++) {
731
+ rgbs [i ] = new RGB (i , i , i );
732
+ }
733
+ newData = new ImageData (pWidth , pHeight , 8 , new PaletteData (rgbs ));
734
+ newData .alpha = data .alpha ;
735
+ newData .alphaData = data .alphaData ;
736
+ newData .maskData = data .maskData ;
737
+ newData .maskPad = data .maskPad ;
738
+ if (data .transparentPixel != -1 ) newData .transparentPixel = 254 ;
739
+
740
+ /* Convert the pixels. */
741
+ int [] scanline = new int [pWidth ];
742
+ int redMask = palette .redMask ;
743
+ int greenMask = palette .greenMask ;
744
+ int blueMask = palette .blueMask ;
745
+ int redShift = palette .redShift ;
746
+ int greenShift = palette .greenShift ;
747
+ int blueShift = palette .blueShift ;
748
+ for (int y =0 ; y <pHeight ; y ++) {
749
+ int offset = y * newData .bytesPerLine ;
750
+ data .getPixels (0 , y , pWidth , scanline , 0 );
751
+ for (int x =0 ; x <pWidth ; x ++) {
752
+ int pixel = scanline [x ];
753
+ if (pixel != data .transparentPixel ) {
754
+ int red = pixel & redMask ;
755
+ red = (redShift < 0 ) ? red >>> -redShift : red << redShift ;
756
+ int green = pixel & greenMask ;
757
+ green = (greenShift < 0 ) ? green >>> -greenShift : green << greenShift ;
758
+ int blue = pixel & blueMask ;
759
+ blue = (blueShift < 0 ) ? blue >>> -blueShift : blue << blueShift ;
760
+ int intensity = (red +red +green +green +green +green +green +blue ) >> 3 ;
761
+ if (newData .transparentPixel == intensity ) intensity = 255 ;
762
+ newData .data [offset ] = (byte )intensity ;
763
+ } else {
764
+ newData .data [offset ] = (byte )254 ;
765
+ }
766
+ offset ++;
767
+ }
768
+ }
769
+ }
770
+ return newData ;
771
+ }
772
+
773
+
741
774
/**
742
775
* <b>IMPORTANT:</b> This method is not part of the public
743
776
* API for Image. It is marked public only so that it
@@ -764,20 +797,22 @@ public static Long win32_getHandle (Image image, int zoom) {
764
797
765
798
if (image .imageFileNameProvider != null ) {
766
799
ElementAtZoom <String > imageCandidate = DPIUtil .validateAndGetImagePathAtZoom (image .imageFileNameProvider , zoom );
800
+ ImageData imageData = new ImageData (imageCandidate .element ());
767
801
if (imageCandidate .zoom () == zoom ) {
768
802
/* Release current native resources */
769
803
long handle = image .initNative (imageCandidate .element (), zoom );
770
- if (handle == 0 ) image .init (new ImageData ( imageCandidate . element ()) , zoom );
804
+ if (handle == 0 ) image .init (imageData , zoom );
771
805
image .init ();
772
806
} else {
773
- ImageData resizedData = DPIUtil .scaleImageData (image .device , new ImageData ( imageCandidate . element ()) , zoom , imageCandidate .zoom ());
774
- image .init (resizedData , zoom );
775
- image .init ( );
807
+ ImageData resizedData = DPIUtil .scaleImageData (image .device , imageData , zoom , imageCandidate .zoom ());
808
+ ImageData newData = image .adaptImageDataIfDisabledOrGray (resizedData );
809
+ image .init ( newData , zoom );
776
810
}
777
811
} else if (image .imageDataProvider != null ) {
778
812
ElementAtZoom <ImageData > imageCandidate = DPIUtil .validateAndGetImageDataAtZoom (image .imageDataProvider , zoom );
779
813
ImageData resizedData = DPIUtil .scaleImageData (image .device , imageCandidate .element (), zoom , imageCandidate .zoom ());
780
- image .init (resizedData , zoom );
814
+ ImageData newData = image .adaptImageDataIfDisabledOrGray (resizedData );
815
+ image .init (newData , zoom );
781
816
image .init ();
782
817
} else {
783
818
if (image .dataAtBaseZoom == null && image .memGC == null ) {
@@ -786,7 +821,8 @@ public static Long win32_getHandle (Image image, int zoom) {
786
821
}
787
822
if (image .dataAtBaseZoom != null ) {
788
823
ImageData resizedData = image .getImageData (zoom );
789
- image .init (resizedData , zoom );
824
+ ImageData newData = image .adaptImageDataIfDisabledOrGray (resizedData );
825
+ image .init (newData , zoom );
790
826
image .init ();
791
827
}
792
828
}
@@ -944,7 +980,9 @@ long initNative(String filename, int zoom) {
944
980
ImageData img = new ImageData (width , height , depth , paletteData , scanlinePad , data );
945
981
img .transparentPixel = transparentPixel ;
946
982
img .alphaData = alphaData ;
947
- init (img , zoom );
983
+
984
+ ImageData newData = adaptImageDataIfDisabledOrGray (img );
985
+ init (newData , zoom );
948
986
handle = zoomLevelToHandle .get (zoom );
949
987
}
950
988
Gdip .Bitmap_UnlockBits (bitmap , lockedBitmapData );
0 commit comments