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; }
static BOOL BitBlt_PATCOPY_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight) { int x, y, xOffset, yOffset; 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 { /* 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 = (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+xOffset, y+yOffset); *dstp = *patp; dstp++; } } } } return TRUE; }
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 int BitBlt_PSDPxax_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; /* D = (S & D) | (~S & P) */ 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 & *dstp) | (~(*srcp) & *patp); 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 & *dstp) | (~(*srcp) & *patp); srcp++; 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_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 BOOL BitBlt_DSPDxax_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; BYTE* srcp8; UINT32 src32; UINT32 color32; HGDI_BITMAP hSrcBmp; if (!hdcDest || !hdcSrc) return FALSE; /* D = (S & P) | (~S & D) */ color32 = gdi_get_color_32bpp(hdcDest, hdcDest->textColor); patp = (UINT32*) &color32; hSrcBmp = (HGDI_BITMAP) hdcSrc->selectedObject; if (hdcSrc->bytesPerPixel == 1) { /* DSPDxax, used to draw glyphs */ srcp = (UINT32*) & src32; for (y = 0; y < nHeight; y++) { srcp8 = (BYTE*) 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++) { *srcp = ((*srcp8) | (*srcp8 << 8) | (*srcp8 << 16) | (*srcp8 << 24)); *dstp = (*srcp & *patp) | (~(*srcp) & *dstp); dstp++; srcp8++; } } } } 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++) { *dstp = (*srcp & *patp) | (~(*srcp) & *dstp); srcp++; dstp++; } } } } return TRUE; }