Merge branch 'dankan1890-icon_fix' into develop

This commit is contained in:
Jinhao 2016-11-14 03:27:11 +08:00
commit 5564a0299b
4 changed files with 32 additions and 29 deletions

View File

@ -10,47 +10,47 @@ namespace detail {
// in an ICO file. // in an ICO file.
typedef struct typedef struct
{ {
uint8_t bWidth; // Width of the image std::uint8_t bWidth; // Width of the image
uint8_t bHeight; // Height of the image (times 2) std::uint8_t bHeight; // Height of the image (times 2)
uint8_t bColorCount; // Number of colors in image (0 if >=8bpp) std::uint8_t bColorCount; // Number of colors in image (0 if >=8bpp)
uint8_t bReserved; // Reserved std::uint8_t bReserved; // Reserved
uint16_t wPlanes; // Color Planes std::uint16_t wPlanes; // Color Planes
uint16_t wBitCount; // Bits per pixel std::uint16_t wBitCount; // Bits per pixel
uint32_t dwBytesInRes; // how many bytes in this resource? std::uint32_t dwBytesInRes; // how many bytes in this resource?
uint32_t dwImageOffset; // where in the file is this image std::uint32_t dwImageOffset; // where in the file is this image
} ICONDIRENTRY, *LPICONDIRENTRY; } ICONDIRENTRY, *LPICONDIRENTRY;
typedef struct typedef struct
{ {
uint16_t idReserved; // Reserved std::uint16_t idReserved; // Reserved
uint16_t idType; // resource type (1 for icons) std::uint16_t idType; // resource type (1 for icons)
uint16_t idCount; // how many images? std::uint16_t idCount; // how many images?
//ICONDIRENTRY idEntries[1]; // the entries for each image //ICONDIRENTRY idEntries[1]; // the entries for each image
} ICONDIR, *LPICONDIR; } ICONDIR, *LPICONDIR;
// size - 40 bytes // size - 40 bytes
typedef struct typedef struct
{ {
uint32_t biSize; std::uint32_t biSize;
uint32_t biWidth; std::uint32_t biWidth;
uint32_t biHeight; // Icon Height (added height of XOR-Bitmap and AND-Bitmap) std::uint32_t biHeight; // Icon Height (added height of XOR-Bitmap and AND-Bitmap)
uint16_t biPlanes; std::uint16_t biPlanes;
uint16_t biBitCount; std::uint16_t biBitCount;
uint32_t biCompression; std::uint32_t biCompression;
int32_t biSizeImage; std::int32_t biSizeImage;
uint32_t biXPelsPerMeter; std::uint32_t biXPelsPerMeter;
uint32_t biYPelsPerMeter; std::uint32_t biYPelsPerMeter;
uint32_t biClrUsed; std::uint32_t biClrUsed;
uint32_t biClrImportant; std::uint32_t biClrImportant;
} s_BITMAPINFOHEADER, *s_PBITMAPINFOHEADER; } s_BITMAPINFOHEADER, *s_PBITMAPINFOHEADER;
// 46 bytes // 46 bytes
typedef struct typedef struct
{ {
s_BITMAPINFOHEADER icHeader; // DIB header s_BITMAPINFOHEADER icHeader; // DIB header
uint32_t icColors[1]; // Color table (short 4 bytes) //RGBQUAD std::uint32_t icColors[1]; // Color table (short 4 bytes) //RGBQUAD
uint8_t icXOR[1]; // DIB bits for XOR mask std::uint8_t icXOR[1]; // DIB bits for XOR mask
uint8_t icAND[1]; // DIB bits for AND mask std::uint8_t icAND[1]; // DIB bits for AND mask
} ICONIMAGE, *LPICONIMAGE; } ICONIMAGE, *LPICONIMAGE;
@ -61,7 +61,7 @@ class image_ico_ex
{ {
auto width = 0; auto width = 0;
auto height = 0; auto height = 0;
auto buffer = (unsigned char *)data; auto buffer = (std::uint8_t *)data;
auto icoDir = reinterpret_cast<LPICONDIR>(buffer); auto icoDir = reinterpret_cast<LPICONDIR>(buffer);
int iconsCount = icoDir->idCount; int iconsCount = icoDir->idCount;
if (icoDir->idReserved != 0 || icoDir->idType != 1 || iconsCount == 0 || iconsCount > 20) if (icoDir->idReserved != 0 || icoDir->idType != 1 || iconsCount == 0 || iconsCount > 20)

View File

@ -11,6 +11,8 @@
#endif #endif
#include <stdio.h> #include <stdio.h>
#include <cstring>
namespace nana namespace nana
{ {

View File

@ -363,8 +363,9 @@ namespace paint
if (!ptr && bytes > 40 /* sizeof(BITMAPINFOHEADER) */ && (40 == *reinterpret_cast<const uint32_t*>(data))) { if (!ptr && bytes > 40 /* sizeof(BITMAPINFOHEADER) */ && (40 == *reinterpret_cast<const uint32_t*>(data))) {
ptr = std::make_shared<detail::image_ico>(true); ptr = std::make_shared<detail::image_ico>(true);
} }
else
#endif #endif
else if (!ptr && bytes > 40 && (0x00010000 == *reinterpret_cast<const unsigned*>(data))) if (!ptr && bytes > 40 && (0x00010000 == *reinterpret_cast<const unsigned*>(data)))
ptr = std::make_shared<detail::image_ico_ex>(); ptr = std::make_shared<detail::image_ico_ex>();
} }
} }

View File

@ -457,7 +457,7 @@ namespace nana{ namespace paint
HDC context = drawable->context; HDC context = drawable->context;
HBITMAP pixmap = drawable->pixmap; HBITMAP pixmap = drawable->pixmap;
HBITMAP orig_bmp; HBITMAP orig_bmp = pixmap;
if(need_dup) if(need_dup)
{ {
context = ::CreateCompatibleDC(drawable->context); context = ::CreateCompatibleDC(drawable->context);
@ -795,7 +795,7 @@ namespace nana{ namespace paint
std::unique_ptr<unsigned char[]> autoptr; std::unique_ptr<unsigned char[]> autoptr;
auto rgb_color = clr.px_color().value; auto rgb_color = clr.px_color().value;
nana::pixel_color_t rgb_imd; nana::pixel_color_t rgb_imd = { 0 };
if(fade) if(fade)
{ {
autoptr = detail::alloc_fade_table(1 - fade_rate); autoptr = detail::alloc_fade_table(1 - fade_rate);