Welcome to Fractal Forums

Fractal Software => Windows Fractal Software => Topic started by: claude on March 16, 2017, 05:41:13 PM




Title: Windows bitmap size test
Post by: claude on March 16, 2017, 05:41:13 PM
So I discovered that WINE (Windows compatibility layer for other operating systems) has a limit of 128MB for bitmap size.  This is supposedly because XP had that limit, and the code commit was from 2008.  Others report that Kalles Fraktaler can render much bigger images without problems, so the limit has probably changed in more recent versions of MS Windows.

With the aim of filing a detailed bug report against WINE, I'd appreciate people with Windows could run the attached program from the command prompt and report the results here, along with Windows version details.  Source code is included in the zip, along with 32bit and 64bit exes.  (Check with your antivirus in case nasties might have been introduced in transit through the unencrypted ether...)

Thanks!

For example on my GNU/Linux/Debian/Stretch I get

Code:
$ apt-cache policy wine
wine:
  Installed: 1.8.6-5
  Candidate: 1.8.6-5
  Version table:
 *** 1.8.6-5 500
        500 http://ftp.uk.debian.org/debian stretch/main amd64 Packages
        500 http://ftp.uk.debian.org/debian stretch/main i386 Packages
        100 /var/lib/dpkg/status

$ ./test-bitmap-size.64.exe
SUCCESS CreateCompatibleBitmap(...,0,0): 0 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,3,3): 36 bytes
SUCCESS CreateCompatibleBitmap(...,4,4): 64 bytes
SUCCESS CreateCompatibleBitmap(...,7,7): 196 bytes
SUCCESS CreateCompatibleBitmap(...,10,10): 400 bytes
SUCCESS CreateCompatibleBitmap(...,15,15): 900 bytes
SUCCESS CreateCompatibleBitmap(...,21,21): 1764 bytes
SUCCESS CreateCompatibleBitmap(...,31,31): 3844 bytes
SUCCESS CreateCompatibleBitmap(...,44,44): 7744 bytes
SUCCESS CreateCompatibleBitmap(...,63,63): 15876 bytes
SUCCESS CreateCompatibleBitmap(...,89,89): 31684 bytes
SUCCESS CreateCompatibleBitmap(...,127,127): 64516 bytes
SUCCESS CreateCompatibleBitmap(...,180,180): 129600 bytes
SUCCESS CreateCompatibleBitmap(...,255,255): 260100 bytes
SUCCESS CreateCompatibleBitmap(...,361,361): 521284 bytes
SUCCESS CreateCompatibleBitmap(...,511,511): 1044484 bytes
SUCCESS CreateCompatibleBitmap(...,723,723): 2090916 bytes
SUCCESS CreateCompatibleBitmap(...,1023,1023): 4186116 bytes
SUCCESS CreateCompatibleBitmap(...,1447,1447): 8375236 bytes
SUCCESS CreateCompatibleBitmap(...,2047,2047): 16760836 bytes
SUCCESS CreateCompatibleBitmap(...,2895,2895): 33524100 bytes
SUCCESS CreateCompatibleBitmap(...,4095,4095): 67076100 bytes
SUCCESS CreateCompatibleBitmap(...,5791,5791): 134142724 bytes
ERROR CreateCompatibleBitmap(...,8191,8191): 8


Title: Re: Windows bitmap size test
Post by: Chillheimer on March 16, 2017, 06:02:47 PM

Windows 10 Pro 64 bit, 32gb ram, corei7-3770k

Code:
SUCCESS CreateCompatibleBitmap(...,0,0): 0 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,3,3): 36 bytes
SUCCESS CreateCompatibleBitmap(...,4,4): 64 bytes
SUCCESS CreateCompatibleBitmap(...,7,7): 196 bytes
SUCCESS CreateCompatibleBitmap(...,10,10): 400 bytes
SUCCESS CreateCompatibleBitmap(...,15,15): 900 bytes
SUCCESS CreateCompatibleBitmap(...,21,21): 1764 bytes
SUCCESS CreateCompatibleBitmap(...,31,31): 3844 bytes
SUCCESS CreateCompatibleBitmap(...,44,44): 7744 bytes
SUCCESS CreateCompatibleBitmap(...,63,63): 15876 bytes
SUCCESS CreateCompatibleBitmap(...,89,89): 31684 bytes
SUCCESS CreateCompatibleBitmap(...,127,127): 64516 bytes
SUCCESS CreateCompatibleBitmap(...,180,180): 129600 bytes
SUCCESS CreateCompatibleBitmap(...,255,255): 260100 bytes
SUCCESS CreateCompatibleBitmap(...,361,361): 521284 bytes
SUCCESS CreateCompatibleBitmap(...,511,511): 1044484 bytes
SUCCESS CreateCompatibleBitmap(...,723,723): 2090916 bytes
SUCCESS CreateCompatibleBitmap(...,1023,1023): 4186116 bytes
SUCCESS CreateCompatibleBitmap(...,1447,1447): 8375236 bytes
SUCCESS CreateCompatibleBitmap(...,2047,2047): 16760836 bytes
SUCCESS CreateCompatibleBitmap(...,2895,2895): 33524100 bytes
SUCCESS CreateCompatibleBitmap(...,4095,4095): 67076100 bytes
SUCCESS CreateCompatibleBitmap(...,5791,5791): 134142724 bytes
SUCCESS CreateCompatibleBitmap(...,8191,8191): 268369924 bytes
SUCCESS CreateCompatibleBitmap(...,11584,11584): 536756224 bytes
SUCCESS CreateCompatibleBitmap(...,16383,16383): 1073610756 bytes
SUCCESS CreateCompatibleBitmap(...,23169,23169): 2147210244 bytes
ERROR CreateCompatibleBitmap(...,32767,32767): 3735928559


Title: Re: Windows bitmap size test
Post by: Dinkydau on March 16, 2017, 07:30:26 PM
Windows 7 ultimate

Does anything else matter? 32 GB RAM and intel i7-5820K (haswell, 6-core, 3,3 GHz, hyperthreading)

Code:
SUCCESS CreateCompatibleBitmap(...,0,0): 0 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,3,3): 36 bytes
SUCCESS CreateCompatibleBitmap(...,4,4): 64 bytes
SUCCESS CreateCompatibleBitmap(...,7,7): 196 bytes
SUCCESS CreateCompatibleBitmap(...,10,10): 400 bytes
SUCCESS CreateCompatibleBitmap(...,15,15): 900 bytes
SUCCESS CreateCompatibleBitmap(...,21,21): 1764 bytes
SUCCESS CreateCompatibleBitmap(...,31,31): 3844 bytes
SUCCESS CreateCompatibleBitmap(...,44,44): 7744 bytes
SUCCESS CreateCompatibleBitmap(...,63,63): 15876 bytes
SUCCESS CreateCompatibleBitmap(...,89,89): 31684 bytes
SUCCESS CreateCompatibleBitmap(...,127,127): 64516 bytes
SUCCESS CreateCompatibleBitmap(...,180,180): 129600 bytes
SUCCESS CreateCompatibleBitmap(...,255,255): 260100 bytes
SUCCESS CreateCompatibleBitmap(...,361,361): 521284 bytes
SUCCESS CreateCompatibleBitmap(...,511,511): 1044484 bytes
SUCCESS CreateCompatibleBitmap(...,723,723): 2090916 bytes
SUCCESS CreateCompatibleBitmap(...,1023,1023): 4186116 bytes
SUCCESS CreateCompatibleBitmap(...,1447,1447): 8375236 bytes
SUCCESS CreateCompatibleBitmap(...,2047,2047): 16760836 bytes
SUCCESS CreateCompatibleBitmap(...,2895,2895): 33524100 bytes
SUCCESS CreateCompatibleBitmap(...,4095,4095): 67076100 bytes
SUCCESS CreateCompatibleBitmap(...,5791,5791): 134142724 bytes
SUCCESS CreateCompatibleBitmap(...,8191,8191): 268369924 bytes
SUCCESS CreateCompatibleBitmap(...,11584,11584): 536756224 bytes
SUCCESS CreateCompatibleBitmap(...,16383,16383): 1073610756 bytes
SUCCESS CreateCompatibleBitmap(...,23169,23169): 2147210244 bytes
ERROR CreateCompatibleBitmap(...,32767,32767): 3735928559



Title: Re: Windows bitmap size test
Post by: PieMan597 on March 16, 2017, 08:46:01 PM
Windows 10 pro 64 bit, fx-9350 16 gb of ram

for the 64 bit porgram:
Code:
SUCCESS CreateCompatibleBitmap(...,0,0): 0 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 4 bytes
SUCCESS CreateCompatibleBitmap(...,3,3): 36 bytes
SUCCESS CreateCompatibleBitmap(...,4,4): 64 bytes
SUCCESS CreateCompatibleBitmap(...,7,7): 196 bytes
SUCCESS CreateCompatibleBitmap(...,10,10): 400 bytes
SUCCESS CreateCompatibleBitmap(...,15,15): 900 bytes
SUCCESS CreateCompatibleBitmap(...,21,21): 1764 bytes
SUCCESS CreateCompatibleBitmap(...,31,31): 3844 bytes
SUCCESS CreateCompatibleBitmap(...,44,44): 7744 bytes
SUCCESS CreateCompatibleBitmap(...,63,63): 15876 bytes
SUCCESS CreateCompatibleBitmap(...,89,89): 31684 bytes
SUCCESS CreateCompatibleBitmap(...,127,127): 64516 bytes
SUCCESS CreateCompatibleBitmap(...,180,180): 129600 bytes
SUCCESS CreateCompatibleBitmap(...,255,255): 260100 bytes
SUCCESS CreateCompatibleBitmap(...,361,361): 521284 bytes
SUCCESS CreateCompatibleBitmap(...,511,511): 1044484 bytes
SUCCESS CreateCompatibleBitmap(...,723,723): 2090916 bytes
SUCCESS CreateCompatibleBitmap(...,1023,1023): 4186116 bytes
SUCCESS CreateCompatibleBitmap(...,1447,1447): 8375236 bytes
SUCCESS CreateCompatibleBitmap(...,2047,2047): 16760836 bytes
SUCCESS CreateCompatibleBitmap(...,2895,2895): 33524100 bytes
SUCCESS CreateCompatibleBitmap(...,4095,4095): 67076100 bytes
SUCCESS CreateCompatibleBitmap(...,5791,5791): 134142724 bytes
SUCCESS CreateCompatibleBitmap(...,8191,8191): 268369924 bytes
SUCCESS CreateCompatibleBitmap(...,11584,11584): 536756224 bytes
SUCCESS CreateCompatibleBitmap(...,16383,16383): 1073610756 bytes
SUCCESS CreateCompatibleBitmap(...,23169,23169): 2147210244 bytes
ERROR CreateCompatibleBitmap(...,32767,32767): 3735928559

32 bit:

Code:
SUCCESS CreateCompatibleBitmap(...,0,0): 18037900570525696 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 18037900570525700 bytes
SUCCESS CreateCompatibleBitmap(...,1,1): 18037900570525700 bytes
SUCCESS CreateCompatibleBitmap(...,3,3): 18037900570525732 bytes
SUCCESS CreateCompatibleBitmap(...,4,4): 18037900570525760 bytes
SUCCESS CreateCompatibleBitmap(...,7,7): 18037900570525892 bytes
SUCCESS CreateCompatibleBitmap(...,10,10): 18037900570526096 bytes
SUCCESS CreateCompatibleBitmap(...,15,15): 18037900570526596 bytes
SUCCESS CreateCompatibleBitmap(...,21,21): 18037900570527460 bytes
SUCCESS CreateCompatibleBitmap(...,31,31): 18037900570529540 bytes
SUCCESS CreateCompatibleBitmap(...,44,44): 18037900570533440 bytes
SUCCESS CreateCompatibleBitmap(...,63,63): 18037900570541572 bytes
SUCCESS CreateCompatibleBitmap(...,89,89): 18037900570557380 bytes
SUCCESS CreateCompatibleBitmap(...,127,127): 18037900570590212 bytes
SUCCESS CreateCompatibleBitmap(...,180,180): 18037900570655296 bytes
SUCCESS CreateCompatibleBitmap(...,255,255): 18037900570785796 bytes
SUCCESS CreateCompatibleBitmap(...,361,361): 18037900571046980 bytes
SUCCESS CreateCompatibleBitmap(...,511,511): 18037900571570180 bytes
SUCCESS CreateCompatibleBitmap(...,723,723): 18037900572616612 bytes
SUCCESS CreateCompatibleBitmap(...,1023,1023): 18037900574711812 bytes
SUCCESS CreateCompatibleBitmap(...,1447,1447): 18037900578900932 bytes
SUCCESS CreateCompatibleBitmap(...,2047,2047): 18037900587286532 bytes
SUCCESS CreateCompatibleBitmap(...,2895,2895): 18037900604049796 bytes
SUCCESS CreateCompatibleBitmap(...,4095,4095): 18037900637601796 bytes
SUCCESS CreateCompatibleBitmap(...,5791,5791): 18037900704668420 bytes
SUCCESS CreateCompatibleBitmap(...,8191,8191): 18037900838895620 bytes
SUCCESS CreateCompatibleBitmap(...,11584,11584): 18037901107281920 bytes
SUCCESS CreateCompatibleBitmap(...,16383,16383): 18037901644136452 bytes
SUCCESS CreateCompatibleBitmap(...,23169,23169): 18037902717735940 bytes
ERROR CreateCompatibleBitmap(...,32767,32767): 3735928559


Title: Re: Windows bitmap size test
Post by: xenodreambuie on March 16, 2017, 08:48:58 PM
The easiest way to create large bitmaps in older Windows versions is to use a DIB (device independent bitmap), and not use the API to create it. Other API calls such as StretchDIBits still work as long as the data structure is correct. It has the advantage of being compatible all the way back to Win95, though these days XP is sufficient.


Title: Re: Windows bitmap size test
Post by: claude on March 28, 2017, 05:51:31 PM
Thanks everyone!  I filed the bug report:  https://bugs.winehq.org/show_bug.cgi?id=42727


Title: Re: Windows bitmap size test
Post by: claude on July 11, 2017, 06:07:59 PM
The easiest way to create large bitmaps in older Windows versions is to use a DIB (device independent bitmap), and not use the API to create it. Other API calls such as StretchDIBits still work as long as the data structure is correct. It has the advantage of being compatible all the way back to Win95, though these days XP is sufficient.

Do you have any example code?

The problem in WINE (artifical 128MB limit) is in the function:

Code:
HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp );

so I need to avoid that.  Also these functions in WINE call it eventually and must be avoided too:

Code:
HBITMAP WINAPI CreateBitmap(INT width, INT height, UINT planes, UINT bpp, LPCVOID bits);
HBITMAP WINAPI CreateCompatibleBitmap(HDC hdc, INT width, INT height);
HBITMAP WINAPI CreateDiscardableBitmap(HDC hdc, INT width, INT height);
HBITMAP WINAPI CreateDIBitmap(HDC hdc, const BITMAPINFOHEADER *header, DWORD init, LPCVOID bits, const BITMAPINFO *data, UINT coloruse);

I may be able to use:

Code:
HBITMAP WINAPI DECLSPEC_HOTPATCH CreateDIBSection(HDC hdc, const BITMAPINFO *bmi, UINT usage, void **bits, HANDLE section, DWORD offset);

EDIT: it seems to work with CreateDIBSection!  Here's the code I'm testing:

Code:
// based on: https://source.winehq.org/git/wine.git/blob/39935fe5ad889d537d828cc82771bdb969cdb2d4:/dlls/gdi32/gdi_private.h#l561
static inline long long get_bitmap_stride(long long width, long long bpp)
{
  return ((width * bpp + 15LL) >> 3LL) & ~1LL;
}

// workaround https://bugs.winehq.org/show_bug.cgi?id=42727
// "obsolete 128MB bitmap size limit"
// see also: http://www.fractalforums.com/windows-fractal-software/windows-bitmap-size-test/
HBITMAP create_bitmap(HDC hdc, int width, int height)
{
  long long stride = get_bitmap_stride(width, 24LL);
  long long bytes = stride * height;
  if (bytes >= 2LL * 1024LL * 1024LL * 1024LL || bytes <= 0LL)
  {
    fprintf(stderr, "ERROR image too large (%lld bytes)
", bytes);
    return 0;
  }
  BITMAPINFO bmi;
  bmi.bmiHeader.biSize = sizeof(bmi);
  bmi.bmiHeader.biWidth = width;
  bmi.bmiHeader.biHeight = height;
  bmi.bmiHeader.biPlanes = 1;
  bmi.bmiHeader.biBitCount = 24;
  bmi.bmiHeader.biCompression = BI_RGB;
  bmi.bmiHeader.biSizeImage = bytes;
  bmi.bmiHeader.biXPelsPerMeter = 2835; // 72 dpi
  bmi.bmiHeader.biYPelsPerMeter = 2835; // 72 dpi
  bmi.bmiHeader.biClrUsed = 0;
  bmi.bmiHeader.biClrImportant = 0;
  return CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, 0, 0, 0);
}

Here's a test image, 16000x9000: https://mathr.co.uk/kf/big-bitmap-wine-test.jpg