#include "DHL_OSAL.h" #include "DHL_Graphic.h" //#include //#include #include "BMF.h" #include "DMG_Util.h" //#include "font_img_18.h" //#include "font_img_20.h" //#include "font_img_22.h" #include "osd_font_13.h" //#include "osd_font_16.h" #include "osd_font_18.h" #include "osd_font_20.h" #include "osd_font_22.h" #include "osd_font_23.h" #include "osd_font_24.h" //#include "osd_font_26.h" #include "osd_font_36.h" #include "osd_font_47.h" static struct { UINT8 style; UINT8 fsize; UINT8 depth; UINT8 *pdata; int len; int num_ch; } p_font_array[]={ {BMF_STYLE1, 13, OSD_FONT_DEPTH_13, p_osd_font_13, sizeof(p_osd_font_13), NUM_OSD_FONT_13}, {BMF_STYLE1, 18, OSD_FONT_DEPTH_18, p_osd_font_18, sizeof(p_osd_font_18), NUM_OSD_FONT_18}, {BMF_STYLE1, 20, OSD_FONT_DEPTH_20, p_osd_font_20, sizeof(p_osd_font_20), NUM_OSD_FONT_20}, {BMF_STYLE1, 22, OSD_FONT_DEPTH_22, p_osd_font_22, sizeof(p_osd_font_22), NUM_OSD_FONT_22}, {BMF_STYLE1, 23, OSD_FONT_DEPTH_23, p_osd_font_23, sizeof(p_osd_font_23), NUM_OSD_FONT_23}, {BMF_STYLE1, 24, OSD_FONT_DEPTH_24, p_osd_font_24, sizeof(p_osd_font_24), NUM_OSD_FONT_24}, // {BMF_STYLE1, 26, OSD_FONT_DEPTH_26, p_osd_font_26, sizeof(p_osd_font_26), NUM_OSD_FONT_26}, {BMF_STYLE1, 36, OSD_FONT_DEPTH_36, p_osd_font_36, sizeof(p_osd_font_36), NUM_OSD_FONT_36}, {BMF_STYLE1, 47, OSD_FONT_DEPTH_47, p_osd_font_47, sizeof(p_osd_font_47), NUM_OSD_FONT_47}, }; #define NUM_FONT (sizeof(p_font_array)/sizeof(p_font_array[0])) static int p_idx_table[NUM_FONT][0x1000]; static BOOL p_is_idx_created=FALSE; #define IMAGE_TYPE_NULL_GLYPH 0x0020 //0x0041('A')->0x0020(' ') #define CALI_X 8 #define CALI_Y 8 #if 0 __Local_Var__() #endif #if 0 ___APIs_For_CC___() {} /* CC¸¦ À§ÇÑ Èû¼öµé */ #endif void BMF_InitFontManager(void *fn_m, void *fn_f, int a, int b, int c, int d) { /* ÇØÁÙ °Í ¾øÀ½ */ } void BMF_InitFontContext(BMF_FC *fc, int a, int b) { /* TODO : ÃʱâÈ­ */ int i,j; if(p_is_idx_created) return; if(!fc) return; for(j=0; j>2); int height=((array[i+2]&0x3)<<4) | (array[i+3]>>4); if(p_font_array[j].depth==1) { if(pitch==0) pitch=0; else pitch=((pitch-1)/16)*2+2; } else if(p_font_array[j].depth==4) { if(pitch==0) pitch=0; else pitch=((pitch-1)/4)*2+2; } if(p_idx_table[j][code>>4]==-1) { p_idx_table[j][code>>4]=i; } i+=5+pitch*height; } } p_is_idx_created=TRUE; } void BMF_TermFontManager() { /* ÇØÁÙ °Í ¾øÀ½ */ } void BMF_AddFont(UINT8 *pdta) { /* ÇØÁÙ °Í ¾øÀ½ */ } void BMF_SetFont(BMF_FC *fc, int style) { /* ÇØÁÙ °Í ¾øÀ½ */ if(!fc) return; if(styleBMF_STYLE1) style=BMF_STYLE1; fc->font_style=style; } void BMF_SetSize(BMF_FC *fc, int width, int height) { if(!fc) return; fc->xSize=width; fc->ySize=height; } void BMF_SetItalic(BMF_FC *fc, BOOL bSet) { /* TODO */ fc->bItalic=bSet; } void BMF_SetBold(BMF_FC *fc, BOOL bSet) { /* TODO */ fc->bBold=bSet; } void BMF_SetEdgeType(BMF_FC *fc, int type) { /* TODO */ } void BMF_SetRasterType(BMF_FC *fc, int raster) { /* ÇØÁÙ °Í ¾øÀ½ */ } #define USE_SMOOTH_ITALIC 1 BMF_BOOL BMF_GetCharImage(BMF_FC *fc, BMF_CODE code, BMF_IMAGE *image) { UINT8 *array, *data_array; int *idx_table; int i, idx; UINT16 fcode; int fx, fy, fw, fh, pitch; int pi, pj; int depth; /* 1, 4, 8 bit supported */ static UINT8 imageBuf[1024], tempBuf[1024]; if(!fc) goto label_failed; if(!p_is_idx_created) { BMF_InitFontContext(fc,0,0); } for(i=0, idx=-1; ifont_style!=p_font_array[i].style) continue; if(p_font_array[i].fsize>=fc->ySize) { idx=i; break; } } if(idx==-1) { /* ÇØ´ç font styleÀÌ ¾øÀ¸¸é ºñ½ÁÇÑ size¸¦ ¼±ÅÃÇÔ */ for(i=0; i=fc->ySize) { idx=i; break; } } } if(idx==-1) idx=0; /* ºñ½ÁÇÑ sizeµµ ¾øÀ¸¸é ù ¹øÂ° */ array=p_font_array[idx].pdata; idx_table=p_idx_table[idx]; depth=p_font_array[idx].depth; if(idx_table[code>>4]==(UINT16)-1) goto label_failed; for(i=idx_table[code>>4];;) { fcode=(array[i]<<8) | array[i+1]; if(fcode>2; fh=((array[i+2]&0x3)<<4) | (array[i+3]>>4); if(depth==1) { if(fw==0) pitch=0; else pitch=((fw-1)/16)*2+2; } else if(depth==4) { if(fw==0) pitch=0; else pitch=((fw-1)/4)*2+2; } else { pitch=fw; } i+=5+pitch*fh; continue; } else if(fcode>code) goto label_failed; fx=((array[i+3]&0xf)<<2) | (array[i+4]>>6); fy=array[i+4]&0x3f; fx-=CALI_X; fy-=CALI_Y; fw=array[i+2]>>2; fh=((array[i+2]&0x3)<<4) | (array[i+3]>>4); i+=5; if(depth==1) { if(fw==0) pitch=0; else pitch=((fw-1)/16)*2+2; } else if(depth==4) { if(fw==0) pitch=0; else pitch=((fw-1)/4)*2+2; } else { pitch=fw; } /* JUNGLE ÆùÆ®ÀÇ ÁÂÇ¥ ±âÁØÀº ¿ÞÂÊ À§°¡ ¾Æ´Ï¶ó ¿ÞÂÊ ¾Æ·¡ÀÓ */ image->bbox.ox=fx; image->bbox.oy=fc->ySize-fy-fh+(fc->ySize/4-2);//fy-fh+4; /* (fc->ySize/4-1)´Â º¸Á¤°ª */ image->bbox.sx=fw; image->bbox.sy=fh; if(fc->bItalic) { #if USE_SMOOTH_ITALIC image->bbox.ox-=image->bbox.sy/6; image->bbox.sx+=image->bbox.sy/3; #else image->bbox.ox-=image->bbox.sy/4; image->bbox.sx+=image->bbox.sy/2; #endif } if(fc->bBold) { image->bbox.oy--; image->bbox.sx++; image->bbox.sy++; } image->bSize=image->bbox.sx; /* 1pixel´ç 1byte */ image->lSize=image->bbox.sx*image->bbox.sy; #if 0 image->width=image->bbox.sx; #if USE_SMOOTH_ITALIC if(fc->bItalic) image->width-=image->bbox.sy/3; #else if(fc->bItalic) image->width-=image->bbox.sy/2; #endif if(image->width > fc->xSize) { image->width=fc->xSize; image->bbox.ox=-(image->width-fc->xSize)/2; } if(image->width < fc->xSize/4) { image->width=fc->xSize/4; image->bbox.ox+=(fc->xSize/2-image->width)/2; } #else if(code==0x20 || code==0xa0) image->width=fc->xSize/3; else image->width=image->bbox.sx; #if USE_SMOOTH_ITALIC if(fc->bItalic) image->width-=image->bbox.sy/9; #else if(fc->bItalic) image->width-=image->bbox.sy/6; #endif #endif image->height=fc->ySize; image->type=BMF_IMAGE_TYPE_BITMAP_65; /* »ç¿ëÇÏÁö ¾ÊÀ½ */ image->xAdvance=0; image->yAdvance=0; memset(imageBuf, 0, sizeof(imageBuf)); image->data=imageBuf; for(pj=0; pjbItalic) { #if USE_SMOOTH_ITALIC int nx=pi+ny/3; #else int nx=pi+ny/2; #endif image->data[ny*image->bbox.sx+nx]=255; if(fc->bBold) { image->data[ny*image->bbox.sx+nx+1]=255; image->data[(ny+1)*image->bbox.sx+nx]=255; image->data[(ny+1)*image->bbox.sx+nx+1]=255; } } else { image->data[ny*image->bbox.sx+pi]=255; if(fc->bBold) { image->data[ny*image->bbox.sx+pi+1]=255; image->data[(ny+1)*image->bbox.sx+pi]=255; image->data[(ny+1)*image->bbox.sx+pi+1]=255; } } } /* depth==1 */ else if(depth==4) { if(pi%2==0) image->data[ny*image->bbox.sx+pi]=(array[i+pitch*pj+pi/2]&0xf0); else image->data[ny*image->bbox.sx+pi]=(array[i+pitch*pj+pi/2]&0x0f)<<4; } else { /* italic, bold Áö¿ø ¾ÈÇÔ */ image->data[ny*image->bbox.sx+pi]=array[i+pitch*pj+pi]; } } } return 1; } label_failed : /* ¸øÃ£À½ */ //printf("label failed code(0x%x)\n", code); image->bbox.ox=0; image->bbox.oy=0; image->bbox.sx=0; image->bbox.sy=0; image->width=0; image->type=BMF_IMAGE_TYPE_NULL_GLYPH; return 0; } #if 0 __APIs_For_DMG__() {} #endif #define CH_BLANK 0x20 #define MARGIN (p_reg_font_attr.size>=36?2:0) static BMF_FC p_reg_fc; static BMF_FontAttr p_reg_font_attr; /* antialias dhl graphic¿¡¼­ ±×´ë·Î °¡Á®¿È */ static UINT32 p_antialias_argb8888_pixels(UINT32 bg_pixel, UINT32 fg_pixel, int alpha) { int a1,r1,g1,b1; int a2,r2,g2,b2; /* no change */ if (alpha <= 0) return bg_pixel; else if (alpha >= 255) return fg_pixel; DHL_DECOMPOSE_ARGB8888(bg_pixel,a1,r1,g1,b1); DHL_DECOMPOSE_ARGB8888(fg_pixel,a2,r2,g2,b2); /* blend them */ DHL_BLEND(r1,r2,alpha); DHL_BLEND(g1,g2,alpha); DHL_BLEND(b1,b2,alpha); DHL_BLEND(a1,a2,alpha); /* TODO: is this right? */ return DHL_COMPOSE_ARGB8888(a1,r1,g1,b1); } static UINT32 p_antialias_argb4444_pixels(UINT32 bg_pixel, UINT32 fg_pixel, int alpha) { int a1,r1,g1,b1; int a2,r2,g2,b2; /* no change */ if (alpha <= 0) return bg_pixel; else if (alpha >= 255) return fg_pixel; DHL_DECOMPOSE_ARGB4444(bg_pixel,a1,r1,g1,b1); DHL_DECOMPOSE_ARGB4444(fg_pixel,a2,r2,g2,b2); /* blend them */ DHL_BLEND(r1,r2,alpha); DHL_BLEND(g1,g2,alpha); DHL_BLEND(b1,b2,alpha); DHL_BLEND(a1,a2,alpha); return DHL_COMPOSE_ARGB4444(a1,r1,g1,b1); } static UINT32 p_antialias_rgb565_pixels(UINT32 bg_pixel, UINT32 fg_pixel, int alpha) { int a1,r1,g1,b1; int a2,r2,g2,b2; /* no change */ if (alpha <= 0) return bg_pixel; else if (alpha >= 255) return fg_pixel; DHL_DECOMPOSE_RGB565(bg_pixel,r1,g1,b1); DHL_DECOMPOSE_RGB565(fg_pixel,r2,g2,b2); /* blend them */ DHL_BLEND(r1,r2,alpha); DHL_BLEND(g1,g2,alpha); DHL_BLEND(b1,b2,alpha); return DHL_COMPOSE_RGB565(r1,g1,b1); } static UINT32 p_antialias_argb1555_pixels(UINT32 bg_pixel, UINT32 fg_pixel, int alpha) { int a1,r1,g1,b1; int a2,r2,g2,b2; /* no change */ if (alpha <= 0) return bg_pixel; else if (alpha >= 255) return fg_pixel; DHL_DECOMPOSE_ARGB1555(bg_pixel,a1,r1,g1,b1); DHL_DECOMPOSE_ARGB1555(fg_pixel,a2,r2,g2,b2); /* blend them */ DHL_BLEND(r1,r2,alpha); DHL_BLEND(g1,g2,alpha); DHL_BLEND(b1,b2,alpha); DHL_BLEND(a1,a2,alpha); return DHL_COMPOSE_ARGB1555(a1,r1,g1,b1); } int BMF_PrintCh(tDHL_PlaneID id, int x, int y, UINT16 ch, UINT32 c_font) { int i, j; int x_margin; UINT8 *p; BMF_IMAGE image; UINT32 color, c_bg; int ch_width; int ch_sx, ch_sy, ch_ox, ch_oy, bsize; UINT8 *pdata; void *plane_addr; int plane_pitch; tDHL_PixelType pixel_type; if(ch==0) return 0; /* ch°¡ 0ÀÌ¸é ¹Ù·Î returnÇØ¹ö¸°´Ù. */ if(DHL_OK!=DHL_GetPlaneMemory(id, &plane_addr) || DHL_OK!=DHL_GetPlanePitch(id, &plane_pitch)) { DHL_OS_Printf("%s : plane is not inited yet\n", __FUNCTION__); return 0; } DHL_GetPlanePixelType(id, &pixel_type); BMF_GetCharImage(&p_reg_fc, ch, &image); if(image.type != BMF_IMAGE_TYPE_BITMAP_65) { DHL_OS_Printf("getting image failed(ch:0x%x) !!\n", ch); BMF_GetCharImage(&p_reg_fc, CH_BLANK, &image); } if(image.type != BMF_IMAGE_TYPE_BITMAP_65) { DHL_OS_Printf("getting image from BMF font engine failed!!!(0x%x:%c)\n", ch, ch); return 0; } ch_width=image.width; ch_sx=image.bbox.sx; ch_sy=image.bbox.sy; ch_ox=image.bbox.ox; ch_oy=image.bbox.oy; bsize=image.bSize; pdata=image.data; label_font_drawing : #if 0 x_margin=MARGIN; //sizeÀÇ 1/10ÀÌ marginÀÌ µÊ #else x_margin=0; #endif if(p_reg_font_attr.is_underline) { //underline DHL_DrawHLine(id, x, y+p_reg_font_attr.size*(1-x_margin), ch_width+x_margin*2, c_font); } if(pixel_type==eDHL_PIXELTYPE_ARGB4444) { c_font=DHL_COMPOSE_ARGB4444(c_font>>24, (c_font>>16)&0xff, (c_font>>8)&0xff, c_font&0xff); } else if(pixel_type==eDHL_PIXELTYPE_RGB565) { c_font=DHL_COMPOSE_RGB565((c_font>>16)&0xff, (c_font>>8)&0xff, c_font&0xff); } else if(pixel_type==eDHL_PIXELTYPE_ARGB1555) { c_font=DHL_COMPOSE_ARGB1555(c_font>>24, (c_font>>16)&0xff, (c_font>>8)&0xff, c_font&0xff); } if(ch>=0x200 && !p_reg_font_attr.is_unicode) { //¿Ï¼ºÇüÀ» unicode·Î º¯°æÇÔ. ch=DMG_Ksx1001toUnicode(ch); } for(j=0, p=pdata; jsize!=p_reg_font_attr.size) BMF_SetSize(&p_reg_fc, pfont_attr->size, pfont_attr->size); if(pfont_attr->is_bold!=p_reg_font_attr.is_bold) BMF_SetBold(&p_reg_fc, pfont_attr->is_bold?1:0); if(pfont_attr->is_italic!=p_reg_font_attr.is_italic) BMF_SetItalic(&p_reg_fc, pfont_attr->is_italic?1:0); if(pfont_attr->font_style!=p_reg_font_attr.font_style) BMF_SetFont(&p_reg_fc, pfont_attr->font_style); if(pfont_attr->edge_type!=p_reg_font_attr.edge_type) BMF_SetEdgeType(&p_reg_fc, pfont_attr->edge_type); memcpy(&p_reg_font_attr, pfont_attr, sizeof(p_reg_font_attr)); } void BMF_FontInit(BMF_FontAttr *pfont_attr) { BMF_InitFontManager(0, 0, 0, 0, 0, 0); BMF_InitFontContext(&p_reg_fc, 0, 0); BMF_SetSize(&p_reg_fc, pfont_attr->size, 0); BMF_SetBold(&p_reg_fc, 0); BMF_SetItalic(&p_reg_fc, 0); BMF_SetFont(&p_reg_fc, 0); BMF_SetEdgeType(&p_reg_fc, 0); BMF_SetFontAttr(pfont_attr); } #if 0 ___Debug___() #endif