nt9856x/code/lib/source/GxGfx/_Guide.txt
2023-03-28 15:07:53 +08:00

313 lines
12 KiB
Plaintext
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

GxGfx Note
(一)Brush weight and type
設定功能:
(A) 控制畫線段的粗細
BRUSHWEIGHT(Radius) …..可指定線段粗細=Radius*2+1 pixels, (NOTE: 0<=Radius<=15)
default = BRUSHWEIGHT(0) (預設粗細只有1pixel)
(B) 控制畫線段的筆頭
BRUSHTYPE_CIRCLE or BRUSHTYPE_SQUARE …..可指定圓形筆頭或方形筆頭
default = BRUSHTYPE_CIRCLE(預設筆頭為圓形)
支援上述新設定的drawing API有:
RESULT GxGfx_Point (DC* pDestDC, LVALUE x, LVALUE y);
RESULT GxGfx_LineTo (DC* pDestDC, LVALUE x, LVALUE y);
RESULT GxGfx_Line (DC* pDestDC, LVALUE x1, LVALUE y1, LVALUE x2, LVALUE y2);
RESULT GxGfx_FrameRect (DC* pDestDC, LVALUE x1, LVALUE y1, LVALUE x2, LVALUE y2);
RESULT GxGfx_Rectangle (DC* pDestDC, LVALUE x1, LVALUE y1, LVALUE x2, LVALUE y2);
RESULT GxGfx_Ellipse (DC* pDestDC, LVALUE x1, LVALUE y1, LVALUE x2, LVALUE y2);
RESULT GxGfx_RoundRect (DC* pDestDC, LVALUE x1, LVALUE y1, LVALUE x2, LVALUE y2, LVALUE rw, LVALUE rh);
下面是<畫粗框的圓角矩形>範例
int Radius = 2
//框線樣式=連續線段|框線粗細(Radius)|圓形筆頭, 填充樣式=填滿內部|畫出框線
GxGfx_SetShapeStroke(LINESTYLE_LINE|BRUSHWEIGHT(Radius)|BRUSHTYPE_CIRCLE, (FILLSTYLE_FILL|FILLSTYLE_BORDER));
//框線顏色=白色, 內部顏色=黑色
GxGfx_SetShapeColor(COLOR_INDEX8_WHITE, COLOR_INDEX8_BLACK, 0);
//畫出圓角矩形, 圓角直徑為20
GxGfx_RoundRect(pDC[0], x1, y1, x2, y2, 20, 20);
//回復成預設樣式
GxGfx_SetShapeStroke(SHAPELINESTYLE_DEFAULT, SHAPEFILLSTYLE_DEFAULT);
(二) Text Color
GxGfx_SetTextColor(c1,c2,c3);
第一個參數代表 : 字的顏色
第二個參數代表 : 框線的顏色
第三個參數代表 : 底線的顏色 (目前無作用)
如果某區域不想畫出來 (不想影響現有畫面上已經畫的顏色)
請使用 COLOR_TRANSPARENT 來代表
範例:
//只畫出字的部份, 但是不畫出框線的部份
GxGfx_SetTextColor(COLOR_WHITE_INDEX8, COLOR_TRANSPARENT, COLOR_TRANSPARENT);
//畫出字的部份, 也畫出框線的部份
GxGfx_SetTextColor(COLOR_WHITE_INDEX8, COLOR_RED_INDEX8, COLOR_TRANSPARENT);
//不畫出字的部份, 但畫出框線的部份
GxGfx_SetTextColor(COLOR_TRANSPARENT, COLOR_RED_INDEX8, COLOR_TRANSPARENT);
(三) Font Effect
可以動態地在使用的字型加上陰影特效, 或加上外框特效
//total 6 effects now
FONTEFFECT_SHADOW //右下角陰影
FONTEFFECT_SHADOW2 //右下角陰影(粗)
FONTEFFECT_HIGHLIGHT //左上角陰影
FONTEFFECT_HIGHLIGHT2 //左上角陰影(粗)
FONTEFFECT_OUTLINE //外框
FONTEFFECT_OUTLINE2 //外框(粗)
使用範例如下:
//no effect
GxGfx_SetTextStroke(pFont, FONTEFFECT_NONE,TEXTSCALE_DEFAULT);
GxGfx_SetTextColor(COLOR_WHITE_INDEX8, COLOR_TRANSPARENT, COLOR_TRANSPARENT);
GxGfx_Text(pDC, 0, 0, “This is a font effect test.”);
//using shadow effect (in red color)
GxGfx_SetTextStroke(pFont, FONTEFFECT_SHADOW,TEXTSCALE_DEFAULT);
GxGfx_SetTextColor(COLOR_WHITE_INDEX8, COLOR_RED_INDEX8, COLOR_TRANSPARENT);
GxGfx_Text(pDC, 0, 0, “This is a font effect test.”);
//using outline effect (in red color)
GxGfx_SetTextStroke(pFont, FONTEFFECT_OUTLINE,TEXTSCALE_DEFAULT);
GxGfx_SetTextColor(COLOR_WHITE_INDEX8, COLOR_RED_INDEX8, COLOR_TRANSPARENT);
GxGfx_Text(pDC, 0, 0, “This is a font effect test.”);
注意: 如果想要使用font effect, 請事先指定一塊記憶體給GxGfx作為temp buffer (至少4K)
GxGfx_AssignTempPool (pBuf, 0x4000);
如果缺少這的buffer, 字型將會畫不出來
(四) GxGfx_ImageInRect
可以畫 Image在指定的Rect內部, 並指定上下對齊, 左右對齊的格式 (很像GxGfx_TextInRect的用法)
使用範例如下:
//draw image and align to rect - left and top
GxGfx_SetImageLayout(IMAGELAYOUT_DEFAULT, ALIGN_LEFT| ALIGN_TOP);
GxGfx_ImageInRect(pDC, 0, 0, 320-1, 240-1, GxGfx_GetImageID(ICONID_PLAY));
//draw image and align to rect - right and middle
GxGfx_SetImageLayout(IMAGELAYOUT_DEFAULT, ALIGN_RIGHT| ALIGN_MIDDLE);
GxGfx_ImageInRect(pDC, 0, 0, 320-1, 240-1, GxGfx_GetImageID(ICONID_STOP));
注意:原先畫出放大縮小Image的功能, 已經改名為 GxGfx_ImageScale();
(五) GxGfx_Image, GxGfx_ImageScale 對 ROP的支援
ROP Formula
==========================
ROP_COPY A = B
ROP_AND A = A & B
ROP_OR A = A | B
ROP_XOR A = A ^ B
ROP_NOT A = ~B
ROP_DESTNOT A = ~A
ROP_KEY A = (B==ColorKey)?A:B
ROP_DESTKEY A = (A==ColorKey)?B:A
ROP_DESTFILL A = FillColor
ROP_ADD A = A+(B>>src_div)
ROP_SUB A = A-(B>>src_div)
ROP_ABSSUB A = abs(A-(B>>src_div))
ROP_MUL A = (A*B) >> out_div
ROP_BLEND A = (1-alpha)*A + (alpha)*B ... alpha = (src_alpha+1)/8
Normal MODE (Pxlfmt of src DC and dest DC are the same)
==============================================================================
Image ImageScale
Pxlfmt of DC INDEX1/2/4 INDEX8 YUV444/422/420 INDEX1/2/4 INDEX8 YUV444/422/420 YUV444/422/420+FILTER_LINEAR
ROP_COPY Yes Yes(GE) Yes(GE) Yes Yes Yes Yes(IME)
ROP_KEY Yes Yes Yes Yes Yes - -
ROP_DESTKEY Yes Yes(GE) Yes(GE) Yes Yes - -
ROP_NOT Yes Yes(GE) Yes(GE) Yes Yes - -
ROP_AND Yes Yes(GE) Yes(GE) Yes Yes - -
ROP_OR Yes Yes(GE) Yes(GE) Yes Yes - -
ROP_XOR Yes Yes(GE) Yes(GE) Yes Yes - -
ROP_DESTFILL Yes Yes(GE) Yes(GE) Yes Yes - -
ROP_DESTNOT Yes Yes(GE) Yes(GE) Yes Yes - -
ROP_ADD - - Yes(GE) - - - -
ROP_SUB - - Yes(GE) - - - -
ROP_ABSSUB - - Yes(GE) - - - -
ROP_MUL - - Yes(GE) - - - -
ROP_BLEND - - Yes(GE) - - - -
NOTE: GE,IME : h/w name
NOTE: MAPPING is only work if rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY)
Convert MODE (Pxlfmt of src DC and dest DC are NOT the same)
==============================================================================
Image INDEX to INDEX (_DC_BitBlt_INDEX_sw)
//rcDC ->destDC condition
INDEX1->INDEX1 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX2 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX2->INDEX2 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX2->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX2->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX4->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX4->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX8->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX2 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX1->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX1->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX2->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX2->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX4->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
Image INDEX to YUV (_DC_BitBlt_INDEX2YUV_sw)
//rcDC ->destDC condition
INDEX1->YUV444 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX1->YUV422 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX1->YUV420 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX1->RGB888 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX2->YUV444 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX2->YUV422 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX2->YUV420 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX2->RGB888 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX4->YUV444 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX4->YUV422 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX4->YUV420 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX4->RGB888 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX8->YUV444 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX8->YUV422 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX8->YUV420 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
INDEX8->RGB888 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=PALETTE
Image RGB_PK to RGB_PK (_DC_BitBlt_INDEX)
//rcDC ->destDC condition
RGB888_PK->RGB888_PK rop=ROP_COPY
RGB565_PK->RGB565_PK rop=ROP_COPY
RGB555_PK->RGB555_PK rop=ROP_COPY
RGBD8888_PK->RGBD8888_PK rop=ROP_COPY
Image RGB_PK to RGB (_DC_ConvetBlt_RGBToRGB_sw)
Image RGB to RGB_PK (_DC_ConvetBlt_RGBToRGB_sw)
//rcDC ->destDC condition
RGB888->RGB888_PK rop=ROP_COPY, same size
RGB888->RGBD8888_PK rop=ROP_COPY, same size
RGB888_PK->RGB888 rop=ROP_COPY, same size
RGBD8888_PK->RGB888 rop=ROP_COPY, same size
ImageScale INDEX to INDEX (_DC_StretchBlt_INDEX)
//rcDC ->destDC condition
INDEX1->INDEX1 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX2 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX2->INDEX2 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX2->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX2->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX4->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX4->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX8->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY,ROP_NOT,ROP_AND,ROP_OR,ROP_XOR,ROP_DESTFILL,ROP_DESTNOT), pTable=0
INDEX1->INDEX2 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX1->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX1->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX2->INDEX4 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX2->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
INDEX4->INDEX8 rop=(ROP_COPY,ROP_KEY,ROP_DESTKEY), pTable=MAPPING
ImageScale INDEX to YUV
(Not support yet)
ImageScale YUV to YUV (_DC_StretchBlt_YUV)
//rcDC ->destDC condition
YUV444->YUV422 rop=ROP_COPY, FILTER_LINEAR
YUV444->YUV420 rop=ROP_COPY, FILTER_LINEAR
YUV444->RGB888 rop=ROP_COPY, FILTER_LINEAR
YUV422->YUV444 rop=ROP_COPY, FILTER_LINEAR
YUV422->YUV420 rop=ROP_COPY, FILTER_LINEAR
YUV422->RGB888 rop=ROP_COPY, FILTER_LINEAR
YUV420->YUV444 rop=ROP_COPY, FILTER_LINEAR
YUV420->YUV422 rop=ROP_COPY, FILTER_LINEAR
YUV420->RGB888 rop=ROP_COPY, FILTER_LINEAR
RGB888->YUV444 rop=ROP_COPY, FILTER_LINEAR
RGB888->YUV422 rop=ROP_COPY, FILTER_LINEAR
RGB888->YUV420 rop=ROP_COPY, FILTER_LINEAR
INTERNAL-PATH
==============================================================================
GxGfx_Convert
GxGfx_Image
//support clipping window
_DC_BitBlt_INDEX --> by GE
_DC_BitBlt_INDEX_sw (if not INDEX8, or special ROP)
_DC_FillRect_INDEX_sw (only DESTFILL and DESTNOT path)
_DC_BitBlt_INDEX2YUV_sw
_DC_BitBlt_YUV --> by GE
_DC_BitBlt_YUV_Jpeg (JPEG2YUV) --> by JPEG->GE
GxGfx_ImageScale
//not support clipping window
_DC_StretchBlt_INDEX (sw) --> by IME ????? (FILTER_NONE)
_DC_StretchBlt_YUV --> by IME (FILTER_LINER or FILTER_NONE)
_DC_StretchBlt_YUV_sw (just for FILTER_NONE)
(六) 對h/w的一些想法???
HW-TODO
==============================================================================
DMA bandwidth
GE :
no word alignment limit in addr
+AOP srckey : dest=(A==cky)?B:A
add format for per-pixel alpha blending
RGB888_PK
RGB565_PK
ARGB8888_PK
ARGB1555_PK
ARGB4444_PK
IME :
no word alignment limit in w,h,addr
filter = none, pixel, linear
IDE :
photoshop-like layer blending
add format.
RGB888_PK,
RGB565_PK,
ARGB8888_PK
ARGB1555_PK
ARGB4444_PK
JPEG :
support decode with pitch setting