claude
Fractal Bachius
Posts: 563
|
|
« 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 $ 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
|
|
|
Logged
|
|
|
|
Chillheimer
|
|
« Reply #1 on: March 16, 2017, 06:02:47 PM » |
|
Windows 10 Pro 64 bit, 32gb ram, corei7-3770k 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
|
|
|
Logged
|
--- Fractals - add some Chaos to your life and put the world in order. ---
|
|
|
Dinkydau
|
|
« Reply #2 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) 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
|
|
|
Logged
|
|
|
|
PieMan597
|
|
« Reply #3 on: March 16, 2017, 08:46:01 PM » |
|
Windows 10 pro 64 bit, fx-9350 16 gb of ram for the 64 bit porgram: 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: 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
|
|
|
Logged
|
|
|
|
xenodreambuie
|
|
« Reply #4 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.
|
|
|
Logged
|
|
|
|
claude
Fractal Bachius
Posts: 563
|
|
« Reply #5 on: March 28, 2017, 05:51:31 PM » |
|
|
|
|
Logged
|
|
|
|
claude
Fractal Bachius
Posts: 563
|
|
« Reply #6 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: 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: 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: 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: // 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
|
|
« Last Edit: July 11, 2017, 07:33:44 PM by claude, Reason: code, test image »
|
Logged
|
|
|
|
|