BRESULT cmndraw_bmp4inf(CMNBMP *bmp, const void *ptr) { const BMPFILE *bf; const BMPINFO *bi; const UINT8 *palptr; BMPDATA inf; UINT8 *src; int bmpalign; UINT pals; UINT c; if ((bmp == NULL) || (ptr == NULL)) { return(FAILURE); } bf = (BMPFILE *)ptr; bi = (BMPINFO *)(bf + 1); palptr = (UINT8 *)(bi + 1); if (((bf->bfType[0] != 'B') && (bf->bfType[1] != 'M')) || (bmpdata_getinfo(bi, &inf) != SUCCESS) || (inf.bpp != 4)) { return(FAILURE); } pals = min(LOADINTELDWORD(bi->biClrUsed), 16); src = (UINT8 *)bf + (LOADINTELDWORD(bf->bfOffBits)); bmpalign = bmpdata_getalign(bi); if (inf.height > 0) { bmp->ptr = src + ((inf.height - 1) * bmpalign); bmp->width = inf.width; bmp->height = inf.height; bmp->align = bmpalign * -1; } else { bmp->ptr = src; bmp->width = inf.width; bmp->height = inf.height * -1; bmp->align = bmpalign; } bmp->pals = pals; ZeroMemory(bmp->paltbl, sizeof(bmp->paltbl)); for (c=0; c<pals; c++) { bmp->paltbl[c].p.b = palptr[c*4+0]; bmp->paltbl[c].p.g = palptr[c*4+1]; bmp->paltbl[c].p.r = palptr[c*4+2]; } return(SUCCESS); }
void dlgs_drawbmp(HDC hdc, UINT8 *bmp) { BMPFILE *bf; BMPINFO *bi; BMPDATA inf; HBITMAP hbmp; UINT8 *image; HDC hmdc; if (bmp == NULL) { return; } bf = (BMPFILE *)bmp; bi = (BMPINFO *)(bf + 1); if (bmpdata_getinfo(bi, &inf) != SUCCESS) { goto dsdb_err1; } hbmp = CreateDIBSection(hdc, (BITMAPINFO *)bi, DIB_RGB_COLORS, (void **)&image, NULL, 0); if (hbmp == NULL) { goto dsdb_err1; } CopyMemory(image, bmp + (LOADINTELDWORD(bf->bfOffBits)), bmpdata_getdatasize(bi)); hmdc = CreateCompatibleDC(hdc); SelectObject(hmdc, hbmp); if (inf.height < 0) { inf.height *= -1; } BitBlt(hdc, 0, 0, inf.width, inf.height, hmdc, 0, 0, SRCCOPY); DeleteDC(hmdc); DeleteObject(hbmp); dsdb_err1: _MFREE(bmp); }
UINT8 fontpc98_read(const OEMCHAR *filename, UINT8 loading) { FILEH fh; BMPFILE bf; BMPINFO bi; UINT8 *bmpdata; BMPDATA bd; long fptr; if (!(loading & FONTLOAD_16)) { goto fr98_err1; } // ファイルをオープン fh = file_open_rb(filename); if (fh == FILEH_INVALID) { goto fr98_err1; } // BITMAPFILEHEADER の読み込み if ((file_read(fh, &bf, sizeof(bf)) != sizeof(bf)) || (bf.bfType[0] != 'B') || (bf.bfType[1] != 'M')) { goto fr98_err2; } // BITMAPINFOHEADER の読み込み if ((file_read(fh, &bi, sizeof(bi)) != sizeof(bi)) || (bmpdata_getinfo(&bi, &bd) != SUCCESS) || (bd.width != BMPWIDTH) || (bd.height != BMPHEIGHT) || (bd.bpp != 1) || (LOADINTELDWORD(bi.biSizeImage) != BMPDATASIZE)) { goto fr98_err2; } // BITMAPデータ頭だし fptr = LOADINTELDWORD(bf.bfOffBits); if (file_seek(fh, fptr, FSEEK_SET) != fptr) { goto fr98_err2; } // メモリアロケート bmpdata = (UINT8 *)_MALLOC(BMPDATASIZE, "pc98font"); if (bmpdata == NULL) { goto fr98_err2; } // BITMAPデータの読みだし if (file_read(fh, bmpdata, BMPDATASIZE) != BMPDATASIZE) { goto fr98_err3; } // 8x16 フォント(〜0x7f)を読む必要がある? if (loading & FONT_ANK16a) { loading &= ~FONT_ANK16a; pc98ankcpy(fontrom + 0x80000, bmpdata, 0x000, 0x080); } // 8x16 フォント(0x80〜)を読む必要がある? if (loading & FONT_ANK16b) { loading &= ~FONT_ANK16b; pc98ankcpy(fontrom + 0x80800, bmpdata, 0x080, 0x100); } // 第一水準漢字を読む必要がある? if (loading & FONT_KNJ1) { loading &= ~FONT_KNJ1; pc98knjcpy(fontrom, bmpdata, 0x01, 0x30); } // 第二水準漢字を読む必要がある? if (loading & FONT_KNJ2) { loading &= ~FONT_KNJ2; pc98knjcpy(fontrom, bmpdata, 0x30, 0x56); } // 拡張漢字を読む必要がある? if (loading & FONT_KNJ3) { loading &= ~FONT_KNJ3; pc98knjcpy(fontrom, bmpdata, 0x58, 0x60); } fr98_err3: _MFREE(bmpdata); fr98_err2: file_close(fh); fr98_err1: return(loading); }