mirror of
https://github.com/nothings/stb-imv
synced 2024-11-21 21:11:51 +03:00
update latest stb.h, stb_image.c BMP changes, etc.
This commit is contained in:
parent
b9250aa2a5
commit
aa882483f5
35
imv.c
35
imv.c
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
29
stb_image.c
29
stb_image.c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user