Allow use of Fl_Window::default_icon() with a scaled image.

This commit is contained in:
ManoloFLTK 2022-09-12 11:07:03 +02:00
parent d028f0b37d
commit 87ee126e1f
3 changed files with 20 additions and 20 deletions

View File

@ -4627,15 +4627,15 @@ Fl_Cocoa_Window_Driver::~Fl_Cocoa_Window_Driver()
static NSImage* rgb_to_nsimage(const Fl_RGB_Image *rgb) {
if (!rgb) return nil;
int ld = rgb->ld();
if (!ld) ld = rgb->w() * rgb->d();
if (!ld) ld = rgb->data_w() * rgb->d();
NSImage *win_icon = nil;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
if (fl_mac_os_version >= 101000) {
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:rgb->w() pixelsHigh:rgb->h()
NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:rgb->data_w() pixelsHigh:rgb->data_h()
bitsPerSample:8 samplesPerPixel:rgb->d() hasAlpha:!(rgb->d() & 1) isPlanar:NO
colorSpaceName:(rgb->d()<=2) ? NSDeviceWhiteColorSpace : NSDeviceRGBColorSpace
bitmapFormat:NSAlphaNonpremultipliedBitmapFormat bytesPerRow:ld bitsPerPixel:rgb->d()*8]; // 10.4
memcpy([bitmap bitmapData], rgb->array, rgb->h() * ld);
memcpy([bitmap bitmapData], rgb->array, rgb->data_h() * ld);
win_icon = [[NSImage alloc] initWithSize:NSMakeSize(0, 0)];
[win_icon addRepresentation:bitmap];
[bitmap release];

View File

@ -2307,17 +2307,17 @@ static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon, int hotx, in
HICON icon;
if (!is_icon) {
if ((hotx < 0) || (hotx >= image->w()))
if ((hotx < 0) || (hotx >= image->data_w()))
return NULL;
if ((hoty < 0) || (hoty >= image->h()))
if ((hoty < 0) || (hoty >= image->data_h()))
return NULL;
}
memset(&bi, 0, sizeof(BITMAPV5HEADER));
bi.bV5Size = sizeof(BITMAPV5HEADER);
bi.bV5Width = image->w();
bi.bV5Height = -image->h(); // Negative for top-down
bi.bV5Width = image->data_w();
bi.bV5Height = -image->data_h(); // Negative for top-down
bi.bV5Planes = 1;
bi.bV5BitCount = 32;
bi.bV5Compression = BI_BITFIELDS;
@ -2336,10 +2336,10 @@ static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon, int hotx, in
return NULL;
const uchar *i = (const uchar *)*image->data();
const int extra_data = image->ld() ? (image->ld() - image->w() * image->d()) : 0;
const int extra_data = image->ld() ? (image->ld() - image->data_w() * image->d()) : 0;
for (int y = 0; y < image->h(); y++) {
for (int x = 0; x < image->w(); x++) {
for (int y = 0; y < image->data_h(); y++) {
for (int x = 0; x < image->data_w(); x++) {
switch (image->d()) {
case 1:
*bits = (0xff << 24) | (i[0] << 16) | (i[0] << 8) | i[0];
@ -2361,7 +2361,7 @@ static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon, int hotx, in
}
// A mask bitmap is still needed even though it isn't used
mask = CreateBitmap(image->w(), image->h(), 1, 1, NULL);
mask = CreateBitmap(image->data_w(), image->data_h(), 1, 1, NULL);
if (mask == NULL) {
DeleteObject(bitmap);
return NULL;
@ -2397,11 +2397,11 @@ static const Fl_RGB_Image *find_best_icon(int ideal_width, const Fl_RGB_Image *i
if (best == NULL)
best = icons[i];
else {
if (best->w() < ideal_width) {
if (icons[i]->w() > best->w())
if (best->data_w() < ideal_width) {
if (icons[i]->data_w() > best->data_w())
best = icons[i];
} else {
if ((icons[i]->w() >= ideal_width) && (icons[i]->w() < best->w()))
if ((icons[i]->data_w() >= ideal_width) && (icons[i]->data_w() < best->data_w()))
best = icons[i];
}
}

View File

@ -2696,7 +2696,7 @@ static void icons_to_property(const Fl_RGB_Image *icons[], int count,
sz = 0;
for (int i = 0;i < count;i++)
sz += 2 + icons[i]->w() * icons[i]->h();
sz += 2 + icons[i]->data_w() * icons[i]->data_h();
// FIXME: Might want to sort the icons
@ -2708,15 +2708,15 @@ static void icons_to_property(const Fl_RGB_Image *icons[], int count,
image = icons[i];
data[0] = image->w();
data[1] = image->h();
data[0] = image->data_w();
data[1] = image->data_h();
data += 2;
const int extra_data = image->ld() ? (image->ld()-image->w()*image->d()) : 0;
const int extra_data = image->ld() ? (image->ld() - image->data_w() * image->d()) : 0;
const uchar *in = (const uchar*)*image->data();
for (int y = 0; y < image->h(); y++) {
for (int x = 0; x < image->w(); x++) {
for (int y = 0; y < image->data_h(); y++) {
for (int x = 0; x < image->data_w(); x++) {
switch (image->d()) {
case 1:
*data = ( 0xff<<24) | (in[0]<<16) | (in[0]<<8) | in[0];