update latest stb.h, stb_image.c BMP changes, etc.

This commit is contained in:
nothings.org 2007-07-15 00:13:20 +00:00
parent b9250aa2a5
commit aa882483f5
4 changed files with 2199 additions and 1749 deletions

35
imv.c
View File

@ -116,11 +116,9 @@ HWND win;
void platformDrawBitmap(HDC hdc, int x, int y, unsigned char *bits, int w, int h, int stride, int dim) void platformDrawBitmap(HDC hdc, int x, int y, unsigned char *bits, int w, int h, int stride, int dim)
{ {
int i; int i;
BITMAPINFOHEADER b; BITMAPINFOHEADER b = { sizeof(b) };
int result; int result;
memset(&b, 0, sizeof(b));
b.biSize = sizeof(b);
b.biPlanes=1; b.biPlanes=1;
b.biBitCount=BPP*8; b.biBitCount=BPP*8;
b.biWidth = stride/BPP; b.biWidth = stride/BPP;
@ -628,8 +626,7 @@ int label_font_height=12;
// build the font for the filename label // build the font for the filename label
void build_label_font(void) void build_label_font(void)
{ {
LOGFONT lf; LOGFONT lf = {0};
memset(&lf, 0, sizeof(lf));
lf.lfHeight = label_font_height; lf.lfHeight = label_font_height;
lf.lfOutPrecision = OUT_TT_PRECIS; // prefer truetype to raster fonts lf.lfOutPrecision = OUT_TT_PRECIS; // prefer truetype to raster fonts
strcpy(lf.lfFaceName, "Times New Roman"); strcpy(lf.lfFaceName, "Times New Roman");
@ -1382,9 +1379,7 @@ static char filenamebuffer[4096];
void open_file(void) void open_file(void)
{ {
OPENFILENAME o; OPENFILENAME o = { sizeof(o) };
memset(&o, 0, sizeof(o));
o.lStructSize = sizeof(o);
o.lpstrFilter = open_filter; o.lpstrFilter = open_filter;
o.lpstrFile = filenamebuffer; o.lpstrFile = filenamebuffer;
filenamebuffer[0] = 0; filenamebuffer[0] = 0;
@ -2140,7 +2135,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
MEMORYSTATUS mem; MEMORYSTATUS mem;
MSG msg; MSG msg;
WNDCLASSEX wndclass; WNDCLASSEX wndclass = { sizeof(wndclass) };
HWND hWnd; HWND hWnd;
// initial loaded image // initial loaded image
@ -2177,8 +2172,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
assert(helptext_center[sizeof(helptext_center)-1]==0); assert(helptext_center[sizeof(helptext_center)-1]==0);
// create the main window class // create the main window class
memset(&wndclass, 0, sizeof(wndclass));
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_OWNDC | CS_DBLCLKS; wndclass.style = CS_OWNDC | CS_DBLCLKS;
wndclass.lpfnWndProc = (WNDPROC)MainWndProc; wndclass.lpfnWndProc = (WNDPROC)MainWndProc;
wndclass.hInstance = hInstance; wndclass.hInstance = hInstance;
@ -2204,9 +2197,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
if (argc < 1) { if (argc < 1) {
// if run with no arguments, get an initial filename // if run with no arguments, get an initial filename
OPENFILENAME o; OPENFILENAME o = { sizeof(o) };
memset(&o, 0, sizeof(o));
o.lStructSize = sizeof(o);
o.lpstrFilter = open_filter; o.lpstrFilter = open_filter;
o.lpstrFile = filenamebuffer; o.lpstrFile = filenamebuffer;
filenamebuffer[0] = 0; filenamebuffer[0] = 0;
@ -2255,8 +2246,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
// allocate semaphores / mutexes // allocate semaphores / mutexes
cache_mutex = stb_mutex_new(); cache_mutex = stb_mutex_new();
decode_mutex = stb_mutex_new(); decode_mutex = stb_mutex_new();
decode_queue = stb_sem_new(1,1); decode_queue = stb_sem_new(1);
disk_command_queue = stb_sem_new(1,1); disk_command_queue = stb_sem_new(1);
resize_merge = stb_sync_new(); resize_merge = stb_sync_new();
// go ahead and start the other tasks // go ahead and start the other tasks
@ -3167,18 +3158,20 @@ static uint8 *imv_decode_from_memory(uint8 *mem, int len, int *x, int *y, int *n
uint8 *res = NULL; uint8 *res = NULL;
imv_failure_string = NULL; imv_failure_string = NULL;
res = stbi_load_from_memory(mem, len, x, y, n, n_req);
if (res) return res;
imv_failure_string = stbi_failure_reason();
#ifdef USE_FREEIMAGE #ifdef USE_FREEIMAGE
if (!only_stbi) { if (!only_stbi) {
if (res == NULL && FreeImagePresent) { if (FreeImagePresent) {
FIMEMORY *fi = FreeImage_OpenMemory(mem,len); FIMEMORY *fi = FreeImage_OpenMemory(mem,len);
res = LoadImageWithFreeImage(fi, x, y, n, n_req); res = LoadImageWithFreeImage(fi, x, y, n, n_req);
FreeImage_CloseMemory(fi); FreeImage_CloseMemory(fi);
// if no error message is generated, because it's not a known type,
// we'll get the unknown-type message from stbi_failure_reason()
} }
if (res) return res;
} }
#endif #endif
res = stbi_load_from_memory(mem, len, x, y, n, n_req);
if (res == NULL && imv_failure_string == NULL)
imv_failure_string = stbi_failure_reason();
return res; return res;
} }

View File

@ -5,14 +5,14 @@
* feature: use FreeImage.dll if it's available * feature: use FreeImage.dll if it's available
* bugfix: fix bug in right or bottom cursor region due to internal cleanup * bugfix: fix bug in right or bottom cursor region due to internal cleanup
Version 0.93: Beta 4 Version 0.93: Beta 4 (2007-07-10)
* bugfix: alter stb_image to support jpegs with weird header blocks * bugfix: alter stb_image to support jpegs with weird header blocks
* bugfix: exit after printing directory error message * bugfix: exit after printing directory error message
* bugfix: change naming of frame/border variables * bugfix: change naming of frame/border variables
* bugfix: ESC when showing help clears help, rather than exiting * bugfix: ESC when showing help clears help, rather than exiting
* internal: clean up registry code to halve registry ops * internal: clean up registry code to halve registry ops
Version 0.92: Beta 3 Version 0.92: Beta 3 (2007-07-03)
* internal: replace Sleep()-based thread-joining code with synchronization primitive * internal: replace Sleep()-based thread-joining code with synchronization primitive
* internal: change work queue internals to use stb_mutex * internal: change work queue internals to use stb_mutex
* internal: change stb_mutex from using win32 semaphore to using CRITICAL_SECTION * internal: change stb_mutex from using win32 semaphore to using CRITICAL_SECTION

3880
stb.h

File diff suppressed because it is too large Load Diff

View File

@ -2174,7 +2174,7 @@ static int bmp_test(void)
get16le(); // discard reserved get16le(); // discard reserved
get32le(); // discard data offset get32le(); // discard data offset
sz = get32le(); sz = get32le();
if (sz == 12 || sz == 40 || sz == 108) return 1; if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1;
return 0; return 0;
} }
@ -2247,10 +2247,15 @@ static stbi_uc *bmp_load(int *x, int *y, int *comp, int req_comp)
get16le(); // discard reserved get16le(); // discard reserved
offset = get32le(); offset = get32le();
hsz = get32le(); hsz = get32le();
if (hsz != 12 && hsz != 40 && hsz != 108) return ep("unknown BMP", "BMP type not supported: unknown"); if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return ep("unknown BMP", "BMP type not supported: unknown");
failure_reason = "bad BMP"; failure_reason = "bad BMP";
img_x = get32le(); if (hsz == 12) {
img_y = get32le(); img_x = get16le();
img_y = get16le();
} else {
img_x = get32le();
img_y = get32le();
}
if (get16le() != 1) return 0; if (get16le() != 1) return 0;
bpp = get16le(); bpp = get16le();
if (bpp == 1) return ep("monochrome", "BMP type not supported: 1-bit"); if (bpp == 1) return ep("monochrome", "BMP type not supported: 1-bit");
@ -2260,15 +2265,22 @@ static stbi_uc *bmp_load(int *x, int *y, int *comp, int req_comp)
if (bpp < 24) if (bpp < 24)
psize = (offset - 14 - 24) / 3; psize = (offset - 14 - 24) / 3;
} else { } else {
compress = get32(); compress = get32le();
if (compress == 1 || compress == 2) return ep("BMP RLE", "BMP type not supported: RLE"); if (compress == 1 || compress == 2) return ep("BMP RLE", "BMP type not supported: RLE");
get32le(); // discard sizeof get32le(); // discard sizeof
get32le(); // discard hres get32le(); // discard hres
get32le(); // discard vres get32le(); // discard vres
get32le(); // discard colorsused get32le(); // discard colorsused
get32le(); // discard max important get32le(); // discard max important
if (hsz == 40) { if (hsz == 40 || hsz == 56) {
if (hsz == 56) {
get32le();
get32le();
get32le();
get32le();
}
if (bpp == 16 || bpp == 32) { if (bpp == 16 || bpp == 32) {
mr = mg = mb = 0;
if (compress == 0) { if (compress == 0) {
if (bpp == 32) { if (bpp == 32) {
mr = 0xff << 16; mr = 0xff << 16;
@ -2283,6 +2295,11 @@ static stbi_uc *bmp_load(int *x, int *y, int *comp, int req_comp)
mr = get32le(); mr = get32le();
mg = get32le(); mg = get32le();
mb = get32le(); mb = get32le();
// not documented, but generated by photoshop and handled by mspaint
if (mr == mg && mg == mb) {
// ?!?!?
return NULL;
}
} else } else
return NULL; return NULL;
} }