static int BitBlt_PATCOPY_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y, xOffset, yOffset; UINT16* dstp; UINT16* patp; UINT16 color16; if (hdcDest->brush->style == GDI_BS_SOLID) { color16 = gdi_get_color_16bpp(hdcDest, hdcDest->brush->color); for (y = 0; y < nHeight; y++) { dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = color16; dstp++; } } } } else { /* align pattern to 8x8 grid to make sure transition between different pattern blocks are smooth */ if (hdcDest->brush->style == GDI_BS_HATCHED) { xOffset = nXDest % 8; yOffset = nYDest % 8 + 2; // +2 added after comparison to mstsc } else { xOffset = 0; yOffset = 0; } for (y = 0; y < nHeight; y++) { dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (UINT16*) gdi_get_brush_pointer(hdcDest, x+xOffset, y+yOffset); *dstp = *patp; dstp++; } } } } return 0; }
static BOOL BitBlt_PSDPxax_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; BYTE* srcp; BYTE* dstp; BYTE* patp; BYTE color8; if (!hdcSrc || !hdcDest) return FALSE; /* D = (S & D) | (~S & P) */ if (hdcDest->brush->style == GDI_BS_SOLID) { color8 = gdi_get_color_8bpp(hdcDest, hdcDest->brush->color); patp = (BYTE*) &color8; for (y = 0; y < nHeight; y++) { srcp = (BYTE*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (BYTE*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = (*srcp & *dstp) | (~(*srcp) & *patp); srcp++; dstp++; } } } } else { for (y = 0; y < nHeight; y++) { srcp = (BYTE*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (BYTE*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (BYTE*) gdi_get_brush_pointer(hdcDest, nXDest + x, nYDest + y); *dstp = (*srcp & *dstp) | (~(*srcp) & *patp); srcp++; dstp++; } } } } return TRUE; }
static int BitBlt_PSDPxax_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; UINT16* srcp; UINT16* dstp; UINT16* patp; UINT16 color16; if (!hdcSrc || !hdcDest) return 1; /* D = (S & D) | (~S & P) */ if (hdcDest->brush->style == GDI_BS_SOLID) { color16 = gdi_get_color_16bpp(hdcDest, hdcDest->brush->color); patp = (UINT16*) &color16; for (y = 0; y < nHeight; y++) { srcp = (UINT16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = (*srcp & *dstp) | (~(*srcp) & *patp); srcp++; dstp++; } } } } else { for (y = 0; y < nHeight; y++) { srcp = (UINT16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (UINT16*) gdi_get_brush_pointer(hdcDest, x, y); *dstp = (*srcp & *dstp) | (~(*srcp) & *patp); srcp++; dstp++; } } } } return 0; }
static BOOL BitBlt_SPDSxax_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; UINT32* srcp; UINT32* dstp; UINT32* patp; UINT32 color32; if (!hdcDest || !hdcSrc) return FALSE; /* D = S ^ (P & (D ^ S)) */ if (hdcDest->brush->style == GDI_BS_SOLID) { color32 = gdi_get_color_32bpp(hdcDest, hdcDest->brush->color); patp = (UINT32*) &color32; for (y = 0; y < nHeight; y++) { srcp = (UINT32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (UINT32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = *srcp ^ (*patp & (*dstp ^ *srcp)); srcp++; dstp++; } } } } else { for (y = 0; y < nHeight; y++) { srcp = (UINT32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (UINT32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (UINT32*) gdi_get_brush_pointer(hdcDest, x, y); *dstp = *srcp ^ (*patp & (*dstp ^ *srcp)); srcp++; dstp++; } } } } return TRUE; }
static BOOL BitBlt_PATCOPY_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y, xOffset, yOffset; UINT16* dstp; UINT16* patp; UINT16 color16; if (hdcDest->brush->style == GDI_BS_SOLID) { color16 = gdi_get_color_16bpp(hdcDest, hdcDest->brush->color); for (y = 0; y < nHeight; y++) { dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = color16; dstp++; } } } } else { if (hdcDest->brush->style == GDI_BS_HATCHED) { xOffset = 0; yOffset = 2; // +2 added after comparison to mstsc } else { xOffset = 0; yOffset = 0; } for (y = 0; y < nHeight; y++) { dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (UINT16*) gdi_get_brush_pointer(hdcDest, nXDest + x + xOffset, nYDest + y + yOffset); *dstp = *patp; dstp++; } } } } return TRUE; }
static int BitBlt_PATINVERT_16bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y; uint8 *dstp; uint8 *patp; uint8 colR, colG, colB; uint16 col; uint16 *dstp16; if(hdcDest->brush->style == BS_SOLID) { GetRGB(colR, colG, colB, hdcDest->brush->color); RGB_888_565(colR, colG, colB); col = RGB16(colR, colG, colB); for (y = 0; y < nHeight; y++) { dstp16 = (uint16*)gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp16 != 0) { for (x = 0; x < nWidth; x++) { *dstp16 ^= col; dstp16++; } } } } else { for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = gdi_get_brush_pointer(hdcDest, x, y); *dstp = *patp ^ *dstp; patp++; dstp++; *dstp = *patp ^ *dstp; patp++; dstp++; } } } } return 0; }
static int BitBlt_PATCOPY_16bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y; uint8 *dstp; uint8 *patp; uint16 color16; uint16 *dstp16; if(hdcDest->brush->style == BS_SOLID) { color16 = gdi_get_color_16bpp(hdcDest, hdcDest->brush->color); for (y = 0; y < nHeight; y++) { dstp16 = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp16 != 0) { for (x = 0; x < nWidth; x++) { *dstp16 = color16; dstp16++; } } } } else { for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = gdi_get_brush_pointer(hdcDest, x, y); *dstp = *patp; patp++; dstp++; *dstp = *patp; patp++; dstp++; } } } } return 0; }
static int BitBlt_DSPDxax_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; uint8* srcp; uint8* dstp; uint8* patp; uint32 color32; HGDI_BITMAP hSrcBmp; /* D = (S & P) | (~S & D) */ /* DSPDxax, used to draw glyphs */ color32 = gdi_get_color_32bpp(hdcDest, hdcDest->textColor); hSrcBmp = (HGDI_BITMAP) hdcSrc->selectedObject; srcp = hSrcBmp->data; if (hdcSrc->bytesPerPixel != 1) { printf("BitBlt_DSPDxax expects 1 bpp, unimplemented for %d\n", hdcSrc->bytesPerPixel); return 0; } for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (uint8*) &color32; *dstp = (*srcp & *patp) | (~(*srcp) & *dstp); dstp++; patp++; *dstp = (*srcp & *patp) | (~(*srcp) & *dstp); dstp++; patp++; *dstp = (*srcp & *patp) | (~(*srcp) & *dstp); dstp += 2; srcp++; } } } return 0; }
static int BitBlt_SRCCOPY_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int y; uint8* srcp; uint8* dstp; if ((hdcDest->selectedObject != hdcSrc->selectedObject) || gdi_CopyOverlap(nXDest, nYDest, nWidth, nHeight, nXSrc, nYSrc) == 0) { for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (srcp != 0 && dstp != 0) memcpy(dstp, srcp, nWidth * hdcDest->bytesPerPixel); } return 0; } if (nYSrc < nYDest) { /* copy down (bottom to top) */ for (y = nHeight - 1; y >= 0; y--) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (srcp != 0 && dstp != 0) memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel); } } else if (nYSrc > nYDest || nXSrc > nXDest) { /* copy up or left (top top bottom) */ for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (srcp != 0 && dstp != 0) memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel); } } else { /* copy straight right */ for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (srcp != 0 && dstp != 0) memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel); } } return 0; }
static int BitBlt_PDxn_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y; uint8* dstp; uint8* patp; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = gdi_get_brush_pointer(hdcDest, x, y); *dstp = *dstp ^ ~(*patp); patp++; dstp++; } } } return 0; }
int FillRect_16bpp(HDC hdc, HRECT rect, HBRUSH hbr) { int x, y; uint16 *dstp; int nXDest, nYDest; int nWidth, nHeight; uint16 color16; RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight); if (ClipCoords(hdc, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL) == 0) return 0; color16 = gdi_get_color_16bpp(hdc, hbr->color); for (y = 0; y < nHeight; y++) { dstp = (uint16*) gdi_get_bitmap_pointer(hdc, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = color16; dstp++; } } } InvalidateRegion(hdc, nXDest, nYDest, nWidth, nHeight); return 0; }
static int BitBlt_PATINVERT_16bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y; char *dstp; char *patp; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = gdi_get_brush_pointer(hdcDest, x, y); *dstp = *patp ^ *dstp; patp++; dstp++; *dstp = *patp ^ *dstp; patp++; dstp++; } } } return 0; }
int FillRect_32bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr) { int x, y; uint32 *dstp; uint32 color32; int nXDest, nYDest; int nWidth, nHeight; gdi_RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight); if (gdi_ClipCoords(hdc, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL) == 0) return 0; color32 = gdi_get_color_32bpp(hdc, hbr->color); for (y = 0; y < nHeight; y++) { dstp = (uint32*) gdi_get_bitmap_pointer(hdc, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = color32; dstp++; } } } gdi_InvalidateRegion(hdc, nXDest, nYDest, nWidth, nHeight); return 0; }
BOOL FillRect_16bpp(HGDI_DC hdc, HGDI_RECT rect, HGDI_BRUSH hbr) { int x, y; UINT16 *dstp; int nXDest, nYDest; int nWidth, nHeight; UINT16 color16; gdi_RectToCRgn(rect, &nXDest, &nYDest, &nWidth, &nHeight); if (!gdi_ClipCoords(hdc, &nXDest, &nYDest, &nWidth, &nHeight, NULL, NULL)) return TRUE; color16 = gdi_get_color_16bpp(hdc, hbr->color); for (y = 0; y < nHeight; y++) { dstp = (UINT16*) gdi_get_bitmap_pointer(hdc, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = color16; dstp++; } } } if (!gdi_InvalidateRegion(hdc, nXDest, nYDest, nWidth, nHeight)) return FALSE; return TRUE; }
static int BitBlt_DSTINVERT_32bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y; uint8 *dstp; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = ~(*dstp); dstp++; *dstp = ~(*dstp); dstp++; *dstp = ~(*dstp); dstp += 2; } } } return 0; }
static int BitBlt_BLACKNESS_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { if (hdcDest->alpha) { int x, y; uint8* dstp; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = 0; dstp++; *dstp = 0; dstp++; *dstp = 0; dstp++; *dstp = 0xFF; dstp++; } } } } else { int y; uint8* dstp; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) memset(dstp, 0, nWidth * hdcDest->bytesPerPixel); } } return 0; }
static BOOL BitBlt_PATINVERT_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y; UINT16* dstp; UINT16* patp; UINT16 color16; if (hdcDest->brush->style == GDI_BS_SOLID) { color16 = gdi_get_color_16bpp(hdcDest, hdcDest->brush->color); for (y = 0; y < nHeight; y++) { dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp ^= color16; dstp++; } } } } else { for (y = 0; y < nHeight; y++) { dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (UINT16*) gdi_get_brush_pointer(hdcDest, nXDest + x, nYDest + y); *dstp = *patp ^ *dstp; dstp++; } } } } return TRUE; }
static int BitBlt_DSPDxax_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; BYTE* srcp; UINT16* dstp; UINT16 src16; UINT16 color16; HGDI_BITMAP hSrcBmp; if (!hdcDest || !hdcSrc) return 1; /* D = (S & P) | (~S & D) */ /* DSPDxax, used to draw glyphs */ color16 = gdi_get_color_16bpp(hdcDest, hdcDest->textColor); hSrcBmp = (HGDI_BITMAP) hdcSrc->selectedObject; if (hdcSrc->bytesPerPixel != 1) { WLog_ERR(TAG, "BitBlt_DSPDxax expects 1 bpp, unimplemented for %d", hdcSrc->bytesPerPixel); return 0; } for (y = 0; y < nHeight; y++) { srcp = (BYTE*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (UINT16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { src16 = (*srcp << 8) | *srcp; *dstp = (src16 & color16) | (~src16 & *dstp); srcp++; dstp++; } } } return 0; }
static int BitBlt_PATINVERT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y; uint32* dstp; uint32* patp; uint32 color32; if(hdcDest->brush->style == GDI_BS_SOLID) { color32 = gdi_get_color_32bpp(hdcDest, hdcDest->brush->color); for (y = 0; y < nHeight; y++) { dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp ^= color32; dstp++; } } } } else { for (y = 0; y < nHeight; y++) { dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y); *dstp = *patp ^ *dstp; dstp++; } } } } return 0; }
static int BitBlt_DSPDxax_16bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc) { int x, y; char *srcp; char *dstp; char r, g, b; HBITMAP hSrcBmp; /* D = (S & P) | (~S & D) */ /* DSPDxax, used to draw glyphs */ GetRGB(r, g, b, hdcDest->textColor); hSrcBmp = (HBITMAP) hdcSrc->selectedObject; srcp = hSrcBmp->data; if (hdcSrc->bytesPerPixel != 1) { printf("BitBlt_DSPDxax expects 1 bpp, unimplemented for %d\n", hdcSrc->bytesPerPixel); return 0; } for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = (*srcp & g) | (~(*srcp) & *dstp); dstp++; *dstp = (*srcp & g) | (~(*srcp) & *dstp); dstp++; srcp++; } } } return 0; }
BOOL gdi_Rectangle(HGDI_DC hdc, UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight) { UINT32 x, y; UINT32 color; if (!gdi_ClipCoords(hdc, &nXDst, &nYDst, &nWidth, &nHeight, NULL, NULL)) return TRUE; color = hdc->textColor; color = GetColor(hdc->format, 0, 0xFF, 0, 0xFF); for (y = 0; y < nHeight; y++) { BYTE* dstLeft = gdi_get_bitmap_pointer(hdc, nXDst, nYDst + y); BYTE* dstRight = gdi_get_bitmap_pointer(hdc, nXDst + nWidth - 1, nYDst + y); if (dstLeft) WriteColor(dstLeft, hdc->format, color); if (dstRight) WriteColor(dstRight, hdc->format, color); } for (x = 0; x < nWidth; x++) { BYTE* dstTop = gdi_get_bitmap_pointer(hdc, nXDst + x, nYDst); BYTE* dstBottom = gdi_get_bitmap_pointer(hdc, nXDst + x, nYDst + nHeight - 1); if (dstTop) WriteColor(dstTop, hdc->format, color); if (dstBottom) WriteColor(dstBottom, hdc->format, color); } return FALSE; }
static int BitBlt_BLACKNESS_32bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int y; uint8 *dstp; #ifdef USE_ALPHA int x; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = 0; dstp++; *dstp = 0; dstp++; *dstp = 0; dstp++; *dstp = 0xFF; dstp++; } } } #else for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) memset(dstp, 0, nWidth * hdcDest->bytesPerPixel); } #endif return 0; }
static int BitBlt_DSPDxax_16bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc) { int x, y; uint8 *srcp; uint16 *dstp; uint8 r, g, b; HBITMAP hSrcBmp; /* D = (S & P) | (~S & D) */ /* DSPDxax, used to draw glyphs */ uint32 pixelColor = hdcDest->textColor; RGB32_RGB16(r, g, b, pixelColor); hSrcBmp = (HBITMAP) hdcSrc->selectedObject; srcp = hSrcBmp->data; if (hdcSrc->bytesPerPixel != 1) { printf("BitBlt_DSPDxax expects 1 bpp, unimplemented for %d\n", hdcSrc->bytesPerPixel); return 0; } for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (uint16*)gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { /* we need the char* cast here so that 0xFF becomes 0xFFFF and not 0x00FF */ *dstp = (*((char*)srcp) & pixelColor) | (~(*((char*)srcp)) & *dstp); dstp++; srcp++; } } } return 0; }
static int BitBlt_PATPAINT_32bpp(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc) { int x, y; uint8 *srcp; uint8 *dstp; uint8 *patp; for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { patp = gdi_get_brush_pointer(hdcDest, x, y); *dstp = *dstp | (*patp | ~(*srcp)); patp++; srcp++; dstp++; *dstp = *dstp | (*patp | ~(*srcp)); patp++; srcp++; dstp++; *dstp = *dstp | (*patp | ~(*srcp)); dstp += 2; srcp += 2; } } } return 0; }
static int BitBlt_MERGEPAINT_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; uint32* srcp; uint32* dstp; for (y = 0; y < nHeight; y++) { srcp = (uint32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = ~(*srcp) | *dstp; srcp++; dstp++; } } } return 0; }
static int BitBlt_WHITENESS_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int y; uint8* dstp; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) memset(dstp, 0xFF, nWidth * hdcDest->bytesPerPixel); } return 0; }
static int BitBlt_NOTSRCERASE_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; UINT32* srcp; UINT32* dstp; for (y = 0; y < nHeight; y++) { srcp = (UINT32*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (UINT32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = ~(*srcp) & ~(*dstp); srcp++; dstp++; } } } return 0; }
static int BitBlt_SRCAND_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; uint16* srcp; uint16* dstp; for (y = 0; y < nHeight; y++) { srcp = (uint16*) gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp &= *srcp; srcp++; dstp++; } } } return 0; }
static int BitBlt_DSna_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HGDI_DC hdcSrc, int nXSrc, int nYSrc) { int x, y; uint8* srcp; uint8* dstp; for (y = 0; y < nHeight; y++) { srcp = gdi_get_bitmap_pointer(hdcSrc, nXSrc, nYSrc + y); dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) { for (x = 0; x < nWidth; x++) { *dstp = ~(*srcp) & (*dstp); srcp++; dstp++; } } } return 0; }
static BOOL BitBlt_BLACKNESS_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int y; BYTE* dstp; for (y = 0; y < nHeight; y++) { dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (dstp != 0) memset(dstp, 0, nWidth * hdcDest->bytesPerPixel); } return TRUE; }