📄 haigdi.c
字号:
S_BOOL hai_ReleaseDC(SH_DC hDC)
{
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return S_FALSE;
return hai_MemFree(hDC);
}
SH_DC hai_SceneDC2ClientDC(SH_DC hDC, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h)
{
_SP_BITMAP pbmp = (_SP_BITMAP)((SP_DC)hDC)->hBitmap;
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return S_NULL;
if (!pbmp)
return S_NULL;
if (x < 0) x = 0;
if (y < 0) y = 0;
if (x >= pbmp->width) x = pbmp->width - 1;
if (y >= pbmp->height) y = pbmp->height - 1;
if (w <= 0 || w > pbmp->width-x) w = pbmp->width - x;
if (h <= 0 || h > pbmp->height-y) h = pbmp->height - y;
((SP_DC)hDC)->x = x;
((SP_DC)hDC)->y = y;
((SP_DC)hDC)->cx = w;
((SP_DC)hDC)->cy = h;
return hDC;
}
SH_GDIOBJ hai_SelectObject(SH_DC hDC, SH_GDIOBJ hobj)
{
SH_GDIOBJ htmp;
if (!hobj || !hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return S_NULL;
switch (HAI_GETHDLTYPE(hobj))
{
case HT_PEN:
htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hPen);
((SP_DC)hDC)->hPen = (SH_PEN)hobj;
return htmp;
case HT_BITMAP:
htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hBitmap);
((SP_DC)hDC)->hBitmap = (SH_BITMAP)hobj;
((SP_DC)hDC)->lpImage = ((_SP_BITMAP)hobj)->lpImage;
((SP_DC)hDC)->OrgX = 0;
((SP_DC)hDC)->OrgY = 0;
((SP_DC)hDC)->x = 0;
((SP_DC)hDC)->y = 0;
((SP_DC)hDC)->cx = ((_SP_BITMAP)hobj)->width;
((SP_DC)hDC)->cy = ((_SP_BITMAP)hobj)->height;
((SP_DC)hDC)->ColorKey = 0;
((SP_DC)hDC)->TextColor = 0;
((SP_DC)hDC)->BkColor = ((0xFFFFFFU)<<(sizeof(S_COLOR)-((_SP_BITMAP)hobj)->BitsPixel))>>(sizeof(S_COLOR)-((_SP_BITMAP)hobj)->BitsPixel);
return htmp;
case HT_BRUSH:
htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hBrush);
((SP_DC)hDC)->hBrush = (SH_BRUSH)hobj;
return htmp;
case HT_FONT:
htmp = (SH_GDIOBJ)(((SP_DC)hDC)->hFont);
((SP_DC)hDC)->hFont = (SH_FONT)hobj;
return htmp;
default:
return S_NULL;
}
}
S_WORD hai_GetObject(SH_GDIOBJ hobj, S_WORD cbBuffer, S_VOID *pObject)
{
if (!hobj)
return 0;
switch (HAI_GETHDLTYPE(hobj))
{
case HT_PEN:
if (pObject && cbBuffer >= sizeof(S_PEN))
{
_SP_PEN pobj = (_SP_PEN)hobj;
SP_PEN pPen = (SP_PEN)pObject;
pPen->width = pobj->width;
pPen->color = pobj->color;
pPen->style = pobj->style;
}
return sizeof(S_PEN);
case HT_BITMAP:
if (pObject && cbBuffer >= sizeof(S_BITMAP))
{
_SP_BITMAP pobj = (_SP_BITMAP)hobj;
SP_BITMAP pBmp = (SP_BITMAP)pObject;
pBmp->width = pobj->width;
pBmp->height = pobj->height;
pBmp->BitsPixel = pobj->BitsPixel;
pBmp->WidthBytes = pobj->WidthBytes;
pBmp->lpImage = pobj->lpImage;
}
return sizeof(S_BITMAP);
case HT_BRUSH:
if (pObject && cbBuffer >= sizeof(S_BRUSH))
{
_SP_BRUSH pobj = (_SP_BRUSH)hobj;
SP_BRUSH pBrush = (SP_BRUSH)pObject;
pBrush->style = pobj->style;
pBrush->color = pobj->color;
pBrush->hatch = pobj->hatch;
}
return sizeof(S_BRUSH);
case HT_FONT:
if (pObject && cbBuffer >= sizeof(S_FONT))
{
_SP_FONT pobj = (_SP_FONT)hobj;
SP_FONT pFont = (SP_FONT)pObject;
pFont->FontID = pobj->FontID;
pFont->style = pobj->style;
pFont->width = pobj->width;
pFont->height = pobj->height;
}
return sizeof(S_FONT);
case HT_ICON:
if (pObject && cbBuffer >= sizeof(S_FONT))
{
_SP_ICON pobj = (_SP_ICON)hobj;
SP_ICON pIcon = (SP_ICON)pObject;
pIcon->width = pobj->width;
pIcon->height = pobj->height;
pIcon->BitsPixel = pobj->BitsPixel;
pIcon->WidthBytes = pobj->WidthBytes;
pIcon->lpImage = pobj->lpImage;
pIcon->lpMask = pobj->lpMask;
}
return sizeof(S_ICON);
default:
return 0;
}
return 0;
}
S_BOOL hai_DeleteObject(SH_GDIOBJ hObj)
{
if (hObj == (SH_GDIOBJ)&_gPen || hObj == (SH_GDIOBJ)&_gBrush
|| hObj == (SH_GDIOBJ)&_gFont || hObj == (SH_GDIOBJ)&_gBitmap)
return S_FALSE;
return hai_MemFree(hObj);
}
SH_DC hai_CreateCompatibleDC(SH_DC hDC)
{
SP_DC pDC;
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return S_NULL;
pDC = (SP_DC)hai_MemAlloc(sizeof(S_DC));
if (!pDC)
return S_NULL;
*pDC = *((SP_DC)hDC);
// pDC->lpImage = S_NULL;
return (SH_DC)pDC;
}
S_BOOL hai_DeleteDC(SH_DC hDC)
{
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return S_FALSE;
return hai_MemFree(hDC);
}
SH_DC hai_BeginPaint(SP_PAINTSTRUCT pPaint)
{
SH_DC hDC = hai_GetSceneDC();
SP_RECT pRect = hai_GetInvalidRect();
pPaint->hDC = hDC;
pPaint->rcPaint.x = pRect->x;
pPaint->rcPaint.y = pRect->y;
pPaint->rcPaint.w = pRect->w;
pPaint->rcPaint.h = pRect->h;
pPaint->CaretShow = _hai_HideCaret();//hai_HideCaret();
return hDC;
}
S_BOOL hai_EndPaint(SP_PAINTSTRUCT pPaint)
{
SP_SCENE pScene = hai_GetCurSceneAddr();
SP_CTRL pCtrl = hai_GetCurSceneCtrlListEnd();
hai_ReleaseDC(pPaint->hDC);
while (pCtrl)
{
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_PAINT, 0, 0);
pCtrl = pCtrl->prev;
}
if (pCtrl = pScene->pInputMethod)
pCtrl->CtrlProc((SH_CTRL)pCtrl, EVT_PAINT, 0, 0);
if (pPaint->CaretShow)
_hai_ShowCaret();//hai_ShowCaret();
_hai_UpdateRect();
return S_TRUE;
}
S_COLOR hai_SetPixel(SH_DC hDC, S_SHORT x, S_SHORT y, S_COLOR color)
{
S_COLOR c;
_SP_BITMAP pbmp;
S_BYTE *pImage;
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return 0x0;
pbmp = (_SP_BITMAP)(((SP_DC)hDC)->hBitmap);
pImage = (S_BYTE *)(((SP_DC)hDC)->lpImage);
if (!pImage || !pbmp)
return 0x00;
if (x < 0 || x >= ((SP_DC)hDC)->cx || y < 0 || y >= ((SP_DC)hDC)->cy)
return 0x00;
x += ((SP_DC)hDC)->x;//conver absolute
y += ((SP_DC)hDC)->y;
switch (pbmp->BitsPixel)
{
case 4:
color &= 0xF;
pImage += y * pbmp->WidthBytes+ (x>>1);
c = (S_COLOR)*pImage;
*pImage = (S_BYTE)((x&0x1) ? (c&0xF0 | color) : (c&0xF | color<<4));
c = (S_COLOR)((x&0x1) ? (c&0xF) : (c>>4&0xF));
break;
case 8:
color &= 0xFF;
pImage += y * pbmp->WidthBytes+ x;
c = (S_COLOR)*pImage;
*pImage = (S_BYTE)color;
break;
case 16:
color &= 0xFFFF;
pImage += y * pbmp->WidthBytes+ (x<<1);
c = (S_COLOR)*(S_WORD *)pImage;
*(S_WORD *)pImage = (S_WORD)color;
break;
case 24:
color &= 0xFFFFFF;
pImage += y * pbmp->WidthBytes+ x*3;
c = (S_COLOR)(*pImage | (*(pImage+1)<<8) | (*(pImage+2)<<16));
*(pImage+0) = (S_BYTE)color;
*(pImage+1) = (S_BYTE)(color>>8);
*(pImage+1) = (S_BYTE)(color>>16);
break;
default:
c = 0x00;
break;
}
return c;
}
S_COLOR hai_GetPixel(SH_DC hDC, S_SHORT x, S_SHORT y)
{
S_COLOR c;
_SP_BITMAP pbmp;
S_BYTE *pImage;
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return 0x00;
pbmp = (_SP_BITMAP)(((SP_DC)hDC)->hBitmap);
pImage = (S_BYTE *)(((SP_DC)hDC)->lpImage);
if (!pImage || !pbmp)
return 0x00;
if (x < 0 || x >= ((SP_DC)hDC)->cx || y < 0 || y >= ((SP_DC)hDC)->cy)
return 0x00;
x += ((SP_DC)hDC)->x;
y += ((SP_DC)hDC)->y;
switch (pbmp->BitsPixel)
{
case 4:
c = (S_COLOR)*(pImage + y * pbmp->WidthBytes + (x>>1));
c = (x&0x1) ? (c&0xF) : (c>>4&0xF);
break;
case 8:
c = (S_COLOR)*(pImage + y * pbmp->WidthBytes + x);
break;
case 16:
pImage += y * pbmp->WidthBytes+ (x<<1);
c = (S_COLOR)*(S_WORD *)pImage;
break;
case 24:
pImage += y * pbmp->WidthBytes+ x*3;
c = (S_COLOR)(*pImage | (*(pImage+1)<<8) | (*(pImage+2)<<16));
break;
default:
c = 0x00;
break;
}
return c;
}
S_BOOL hai_MoveTo(SH_DC hDC,S_SHORT x, S_SHORT y, SP_POINT pPoint)
{
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return S_FALSE;
if (x < 0 || x >= ((SP_DC)hDC)->cx || y < 0 || y >= ((SP_DC)hDC)->cy)
return S_FALSE;
if (pPoint)
{
pPoint->x = ((SP_DC)hDC)->OrgX;
pPoint->y = ((SP_DC)hDC)->OrgY;
}
((SP_DC)hDC)->OrgX = x;
((SP_DC)hDC)->OrgY = y;
return S_TRUE;
}
#define HAI_DRAWPIXEL(pImage, x, y, bits, width, color, color4b) \
{\
S_BYTE *pTemp;\
switch (bits)\
{\
case 4:\
pTemp = pImage+y*width+(x>>1);\
*pTemp = *pTemp&mask[x&0x1] | color4b[x&0x1];\
break;\
case 8:\
*(pImage+y*width+x) = (S_BYTE)color;\
break;\
case 16:\
*((S_WORD*)(pImage+y*width+(x<<1))) = (S_WORD)color;\
break;\
case 24:\
pTemp = pImage+y*width+x*3;\
*(pTemp+0) = (S_BYTE)color;\
*(pTemp+1) = (S_BYTE)(color>>8);\
*(pTemp+2) = (S_BYTE)(color>>16);\
break;\
default:\
break;\
}\
}
S_BOOL hai_LineTo(SH_DC hDC, S_SHORT EX, S_SHORT EY)
{
S_BYTE style;
S_BYTE mode;
S_SHORT W,H,Ha,dY,f;
S_SHORT SX, SY;
S_BYTE fgcolor4bit[2], bkcolor4bit[2], mask[2] = {0xF, 0xF0};
S_WORD BitsPixel, BmpWidth;
S_COLOR fgcolor, bkcolor;
S_BYTE *pDis;
if (!hDC || HAI_GETHDLTYPE(hDC) != HT_DC)
return S_FALSE;
if (!((SP_DC)hDC)->lpImage || !((SP_DC)hDC)->hBitmap)
return S_FALSE;
if (EX < 0) EX = 0;//revise coordinate
if (EX >= ((SP_DC)hDC)->cx) EX = ((SP_DC)hDC)->cx-1;
if (EY < 0) EY = 0;
if (EY >= ((SP_DC)hDC)->cy) EY = ((SP_DC)hDC)->cy-1;
SX = ((SP_DC)hDC)->OrgX + ((SP_DC)hDC)->x;//client to screen
SY = ((SP_DC)hDC)->OrgY + ((SP_DC)hDC)->y;
((SP_DC)hDC)->OrgX = EX;
((SP_DC)hDC)->OrgY = EY;
EX = EX + ((SP_DC)hDC)->x;//client to screen
EY = EY + ((SP_DC)hDC)->y;
style = ((_SP_PEN)(((SP_DC)hDC)->hPen))->style;
mode = ((SP_DC)hDC)->BkMode;
pDis = (S_BYTE*)(((SP_DC)hDC)->lpImage);
BmpWidth = ((_SP_BITMAP)(((SP_DC)hDC)->hBitmap))->WidthBytes;
BitsPixel = ((_SP_BITMAP)(((SP_DC)hDC)->hBitmap))->BitsPixel;
fgcolor = ((_SP_PEN)(((SP_DC)hDC)->hPen))->color;
bkcolor = ((SP_DC)hDC)->BkColor;
fgcolor4bit[1] = (S_BYTE)fgcolor;
fgcolor4bit[0] = fgcolor4bit[1]<<4;
bkcolor4bit[1] = (S_BYTE)bkcolor;
bkcolor4bit[0] = bkcolor4bit[1]<<4;
if (SX>EX)
{
f=EX, EX=SX, SX=f;
f=EY, EY=SY, SY=f;
}
W = (EX-SX); H = (EY-SY);
Ha= H<0 ? -H : H;
dY= H<0 ? -1 : 1;
if (Ha>W)
{
/* Y-majored */
f = Ha>>1;
while (1)
{
switch (style)
{
case PS_NONE:
break;
case PS_DOT://broken line
if (SY % 2)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
else if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
case PS_DASH://两点实,一点虚
if (SY % 3)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
else if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
case PS_DASHDOT:
switch (SY % 5)
{
case 0:
case 1:
case 3:
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
break;
default:
if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
}
break;
case PS_DASHDOTDOT:
switch (SY % 7)
{
case 0:
case 1:
case 3:
case 5:
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
break;
default:
if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
}
break;
case PS_DASHDASHDOT:
switch (SY % 9)
{
case 0:
case 1:
case 2:
case 3:
case 6:
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
break;
default:
if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
}
break;
default:
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
break;
}
if (SY==EY) break;
if ((f+=W)>=Ha)
f-=Ha,SX++;
SY+=dY;
}
}
else
{
/* X-majored */
f = W>>1;
while (1)
{
switch (style)
{
case PS_NONE:
break;
case PS_DOT:
if (SX % 2)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
else if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
case PS_DASH:
if (SX % 3)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
else if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
case PS_DASHDOT:
switch (SX % 5)
{
case 0:
case 1:
case 3:
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
break;
default:
if (mode == BKM_OPAQUE)
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, bkcolor, bkcolor4bit)
break;
}
break;
case PS_DASHDOTDOT:
switch (SX % 7)
{
case 0:
case 1:
case 3:
case 5:
HAI_DRAWPIXEL(pDis, SX, SY, BitsPixel, BmpWidth, fgcolor, fgcolor4bit)
break;
default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -