MiniGUI - 位图
(1)位图文件的装载
int GUIAPI LoadBitmapFromFile (HDC hdc, PBITMAP pBitmap, const char* spFileName);
#define LoadBitmap LoadBitmapFromFile
void GUIAPI UnloadBitmap (PBITMAP pBitmap);
在从文件中装载位图时,MiniGUI 通过文件的后缀名判断位图文件的类型。MiniGUI 库中内建有对 Windows BMP 和 GIF 格式的支持,而对 JPEG 以及 PNG 等位图格式的支持,是通过 libjpeg 和 libpng 库实现的。
MiniGUI的图片格式包括:bmp/lbm/pcx/tga/gif/jpg/jpeg/png
libminigui-gpl-3.0.12/src/include/readbmp.h
1 typedef struct _BITMAP_TYPE_INFO BITMAP_TYPE_INFO; 2 3 /* 4 * structure for Image operations 5 * The idea comes from readbmp.c in Allegro by Shawn Hargreaves. 6 */ 7 struct _BITMAP_TYPE_INFO 8 { 9 char ext[8]; 10 void* (*init) (MG_RWops* fp, MYBITMAP *my_bmp, RGB *pal); 11 int (*load) (MG_RWops* fp, void* init_info, MYBITMAP *my_bmp, 12 CB_ONE_SCANLINE cb, void* context); 13 void (*cleanup) (void* init_info); 14 int (*save) (MG_RWops* fp, MYBITMAP *my_bmp, RGB *pal); 15 BOOL (*check) (MG_RWops* fp); 16 };
libminigui-gpl-3.0.12/src/mybmp.c
1 #define MAX_BITMAP_TYPES 9 2 3 static BITMAP_TYPE_INFO bitmap_types[MAX_BITMAP_TYPES] = 4 { 5 { "bmp", __mg_init_bmp, __mg_load_bmp, __mg_cleanup_bmp, 6 #ifdef _MGMISC_SAVEBITMAP 7 __mg_save_bmp, __mg_check_bmp }, 8 #else 9 NULL, __mg_check_bmp }, 10 #endif 11 12 #ifdef _MGIMAGE_LBM 13 { "lbm", __mg_init_lbm, __mg_load_lbm, __mg_cleanup_lbm, NULL, __mg_check_lbm }, 14 #endif 15 #ifdef _MGIMAGE_PCX 16 { "pcx", __mg_init_pcx, __mg_load_pcx, __mg_cleanup_pcx, NULL, NULL }, 17 #endif 18 #ifdef _MGIMAGE_TGA 19 { "tga", __mg_init_tga, __mg_load_tga, __mg_cleanup_tga, NULL, NULL }, 20 #endif 21 #ifdef _MGIMAGE_GIF 22 { "gif", __mg_init_gif, __mg_load_gif, __mg_cleanup_gif, NULL, __mg_check_gif }, 23 #endif 24 #ifdef _MGIMAGE_JPG 25 { "jpg", __mg_init_jpg, __mg_load_jpg, __mg_cleanup_jpg, NULL, __mg_check_jpg }, 26 { "jpeg", __mg_init_jpg, __mg_load_jpg, __mg_cleanup_jpg, NULL, __mg_check_jpg }, 27 #endif 28 #ifdef _MGIMAGE_PNG 29 { "png", __mg_init_png, __mg_load_png, __mg_cleanup_png, NULL, __mg_check_png }, 30 #endif 31 };
(2)位图填充
FillBoxWithBitmap 用设备相关位图对象填充矩形 框,可以用来扩大或者缩小位图;FillBoxWithBitmapPart 用设备相关位图对象的部分填充矩形框,也可以扩大或缩小位图。
void GUIAPI FillBoxWithBitmap (HDC hdc, int x, int y, int w, int h, PBITMAP pBitmap);
void GUIAPI FillBoxWithBitmapPart (HDC hdc, int x, int y, int w, int h, int bw, int bh, PBITMAP pBitmap, int xo, int yo);
(3)位块传送
“位块传送(bit block transfer)”操作指的是把内存或显示RAM中的某块矩形区域的颜色数据复制到另一个内存或显示区域。 位块传送通常是一个高速的图像传送操作。
BitBlt 函数用来实现两个相同或不同的设备上下文之间的显示内存复 制,StretchBlt 则在 BitBlt的基础上进行缩放操作。
void GUIAPI BitBlt (HDC hsdc, int sx, int sy, int sw, int sh, HDC hddc, int dx, int dy, DWORD dwRop);
void GUIAPI StretchBlt (HDC hsdc, int sx, int sy, int sw, int sh, HDC hddc, int dx, int dy, int dw, int dh, DWORD dwRop);