@@ -490,6 +490,7 @@ TCImageOptions *TCImage::getCompressionOptions(void)
490
490
}
491
491
492
492
#ifdef WIN32
493
+
493
494
// Note: static method
494
495
TCImage *TCImage::createFromResource (
495
496
HMODULE hModule,
@@ -531,4 +532,132 @@ TCImage *TCImage::createFromResource(
531
532
}
532
533
return retVal;
533
534
}
535
+
536
+ // Note: static method.
537
+ HBITMAP TCImage::createDIBSection (
538
+ HDC hBitmapDC,
539
+ int bitmapWidth,
540
+ int bitmapHeight,
541
+ int hDPI,
542
+ int vDPI,
543
+ BYTE **bmBuffer)
544
+ {
545
+ BITMAPINFO bmi;
546
+
547
+ bmi.bmiHeader .biSize = sizeof (bmi.bmiHeader );
548
+ bmi.bmiHeader .biWidth = bitmapWidth;
549
+ bmi.bmiHeader .biHeight = bitmapHeight;
550
+ bmi.bmiHeader .biPlanes = 1 ;
551
+ bmi.bmiHeader .biBitCount = 24 ;
552
+ bmi.bmiHeader .biCompression = BI_RGB;
553
+ bmi.bmiHeader .biSizeImage = 0 ;// roundUp(bitmapWidth * 3, 4) * bitmapHeight;
554
+ bmi.bmiHeader .biXPelsPerMeter = (long )(hDPI * 39.37 );
555
+ bmi.bmiHeader .biYPelsPerMeter = (long )(vDPI * 39.37 );
556
+ bmi.bmiHeader .biClrUsed = 0 ;
557
+ bmi.bmiHeader .biClrImportant = 0 ;
558
+ bmi.bmiColors [0 ].rgbRed = 0 ;
559
+ bmi.bmiColors [0 ].rgbGreen = 0 ;
560
+ bmi.bmiColors [0 ].rgbBlue = 0 ;
561
+ bmi.bmiColors [0 ].rgbReserved = 0 ;
562
+ return CreateDIBSection (hBitmapDC, &bmi, DIB_RGB_COLORS,
563
+ (void **)bmBuffer, NULL , 0 );
564
+ }
565
+
566
+ HBITMAP TCImage::createMask (bool updateSource /* = false*/ )
567
+ {
568
+ TCByte *dstData;
569
+ int dstBytesPerLine;
570
+ int srcBytesPerLine = getRowSize ();
571
+ HBITMAP hNewBitmap = NULL ;
572
+ int maskSize;
573
+
574
+ dstBytesPerLine = roundUp ((width + 7 ) / 8 , 2 );
575
+ maskSize = dstBytesPerLine * height;
576
+ dstData = new TCByte[maskSize];
577
+ memset (dstData, 0 , maskSize);
578
+ for (int y = 0 ; y < height; y++)
579
+ {
580
+ int srcYOffset = flipped ? srcBytesPerLine * (height - y - 1 ) :
581
+ srcBytesPerLine * y;
582
+ int dstYOffset = dstBytesPerLine * y;
583
+
584
+ for (int x = 0 ; x < width; x++)
585
+ {
586
+ TCByte alpha = imageData[srcYOffset + x * 4 + 3 ];
587
+
588
+ if (alpha < 128 )
589
+ {
590
+ int byteOffset = dstYOffset + x / 8 ;
591
+ int bitOffset = 7 - (x % 8 );
592
+
593
+ dstData[byteOffset] |= (1 << bitOffset);
594
+ if (updateSource)
595
+ {
596
+ imageData[srcYOffset + x * 4 + 0 ] = 0 ;
597
+ imageData[srcYOffset + x * 4 + 1 ] = 0 ;
598
+ imageData[srcYOffset + x * 4 + 2 ] = 0 ;
599
+ }
600
+ }
601
+ }
602
+ }
603
+ hNewBitmap = CreateBitmap (width, height, 1 , 1 , dstData);
604
+ delete dstData;
605
+ return hNewBitmap;
606
+ }
607
+
608
+ void TCImage::getBmpAndMask (
609
+ HBITMAP &hBitmap,
610
+ HBITMAP &hMask,
611
+ bool updateSource /* = false*/ )
612
+ {
613
+ HDC hdc = CreateCompatibleDC (NULL );
614
+ BYTE *bmBuffer = NULL ;
615
+ int srcBytesPerLine = getRowSize ();
616
+ int dstBytesPerLine = roundUp (width * 3 , 4 );
617
+
618
+ hBitmap = createDIBSection (hdc, width, height, 0 , 0 , &bmBuffer);
619
+ hMask = createMask (updateSource);
620
+ for (int y = 0 ; y < height; y++)
621
+ {
622
+ int srcYOffset = srcBytesPerLine * y;
623
+ int dstYOffset = dstBytesPerLine * y;
624
+
625
+ for (int x = 0 ; x < width; x++)
626
+ {
627
+ bmBuffer[dstYOffset + x * 3 + 0 ] =
628
+ imageData[srcYOffset + x * 4 + 2 ];
629
+ bmBuffer[dstYOffset + x * 3 + 1 ] =
630
+ imageData[srcYOffset + x * 4 + 1 ];
631
+ bmBuffer[dstYOffset + x * 3 + 2 ] =
632
+ imageData[srcYOffset + x * 4 + 0 ];
633
+ }
634
+ }
635
+ DeleteDC (hdc);
636
+ }
637
+
638
+ HICON TCImage::loadIconFromPngResource (HMODULE hModule, int resourceId)
639
+ {
640
+ TCImage *image = TCImage::createFromResource (hModule, resourceId, 4 , true );
641
+
642
+ if (image != NULL )
643
+ {
644
+ HBITMAP hBitmap;
645
+ HBITMAP hMask;
646
+ ICONINFO ii;
647
+ HICON hIcon;
648
+
649
+ image->getBmpAndMask (hBitmap, hMask, true );
650
+ image->release ();
651
+ memset (&ii, 0 , sizeof (ii));
652
+ ii.fIcon = FALSE ;
653
+ ii.hbmMask = hMask;
654
+ ii.hbmColor = hBitmap;
655
+ hIcon = CreateIconIndirect (&ii);
656
+ DeleteObject (hBitmap);
657
+ DeleteObject (hMask);
658
+ return hIcon;
659
+ }
660
+ return NULL ;
661
+ }
662
+
534
663
#endif // WIN32
0 commit comments