diff options
Diffstat (limited to 'hw/xwin/winfillsp.c')
-rw-r--r-- | hw/xwin/winfillsp.c | 1535 |
1 files changed, 773 insertions, 762 deletions
diff --git a/hw/xwin/winfillsp.c b/hw/xwin/winfillsp.c index 80f53155d..f2432ed23 100644 --- a/hw/xwin/winfillsp.c +++ b/hw/xwin/winfillsp.c @@ -34,7 +34,6 @@ #endif #include "win.h" - extern void ROP16(HDC hdc, int rop); #define TRANSLATE_COLOR(color) \ @@ -52,780 +51,792 @@ extern void ROP16(HDC hdc, int rop); /* See Porting Layer Definition - p. 54 */ void -winFillSpansNativeGDI (DrawablePtr pDrawable, - GCPtr pGC, - int iSpans, - DDXPointPtr pPoints, - int *piWidths, - int fSorted) +winFillSpansNativeGDI(DrawablePtr pDrawable, + GCPtr pGC, + int iSpans, + DDXPointPtr pPoints, int *piWidths, int fSorted) { - winGCPriv(pGC); - HBITMAP hbmpOrig = NULL, hbmpOrigStipple = NULL; - HBITMAP hPenOrig = NULL; - HBITMAP hBitmap = NULL; - PixmapPtr pPixmap = NULL; - winPrivPixmapPtr pPixmapPriv = NULL; - PixmapPtr pStipple = NULL; - winPrivPixmapPtr pStipplePriv = NULL; - PixmapPtr pTile = NULL; - winPrivPixmapPtr pTilePriv = NULL; - HDC hdcStipple = NULL, hdcTile = NULL; - HPEN hPen = NULL; - int iX; - int fg, bg; - RegionPtr pClip = pGC->pCompositeClip; - BoxPtr pextent, pbox; - int nbox; - int extentX1, extentX2, extentY1, extentY2; - int fullX1, fullX2, fullY1; - HRGN hrgn = NULL, combined = NULL; - - nbox = RegionNumRects (pClip); - pbox = RegionRects (pClip); - - if (!nbox) return; - - combined = CreateRectRgn (pbox->x1, pbox->y1, pbox->x2, pbox->y2); - nbox--; pbox++; - - while (nbox--) - { - hrgn = CreateRectRgn (pbox->x1, pbox->y1, pbox->x2, pbox->y2); - CombineRgn (combined, combined, hrgn, RGN_OR); - DeleteObject (hrgn); - hrgn = NULL; - pbox++; + winGCPriv(pGC); + HBITMAP hbmpOrig = NULL, hbmpOrigStipple = NULL; + HBITMAP hPenOrig = NULL; + HBITMAP hBitmap = NULL; + PixmapPtr pPixmap = NULL; + winPrivPixmapPtr pPixmapPriv = NULL; + PixmapPtr pStipple = NULL; + winPrivPixmapPtr pStipplePriv = NULL; + PixmapPtr pTile = NULL; + winPrivPixmapPtr pTilePriv = NULL; + HDC hdcStipple = NULL, hdcTile = NULL; + HPEN hPen = NULL; + int iX; + int fg, bg; + RegionPtr pClip = pGC->pCompositeClip; + BoxPtr pextent, pbox; + int nbox; + int extentX1, extentX2, extentY1, extentY2; + int fullX1, fullX2, fullY1; + HRGN hrgn = NULL, combined = NULL; + + nbox = RegionNumRects(pClip); + pbox = RegionRects(pClip); + + if (!nbox) + return; + + combined = CreateRectRgn(pbox->x1, pbox->y1, pbox->x2, pbox->y2); + nbox--; + pbox++; + + while (nbox--) { + hrgn = CreateRectRgn(pbox->x1, pbox->y1, pbox->x2, pbox->y2); + CombineRgn(combined, combined, hrgn, RGN_OR); + DeleteObject(hrgn); + hrgn = NULL; + pbox++; } - pextent = RegionExtents(pClip); - extentX1 = pextent->x1; - extentY1 = pextent->y1; - extentX2 = pextent->x2; - extentY2 = pextent->y2; + pextent = RegionExtents(pClip); + extentX1 = pextent->x1; + extentY1 = pextent->y1; + extentX2 = pextent->x2; + extentY2 = pextent->y2; - /* Branch on the type of drawable we have */ - switch (pDrawable->type) - { + /* Branch on the type of drawable we have */ + switch (pDrawable->type) { case DRAWABLE_PIXMAP: - SelectClipRgn (pGCPriv->hdcMem, combined); - DeleteObject (combined); - combined = NULL; - - /* Get a pixmap pointer from the drawable pointer, and fetch privates */ - pPixmap = (PixmapPtr) pDrawable; - pPixmapPriv = winGetPixmapPriv (pPixmap); - - /* Select the drawable pixmap into memory hdc */ - hbmpOrig = SelectObject (pGCPriv->hdcMem, pPixmapPriv->hBitmap); - if (hbmpOrig == NULL) - FatalError ("winFillSpans - DRAWABLE_PIXMAP - " - "SelectObject () failed on\n\tpPixmapPriv->hBitmap: " - "%08x\n", (unsigned int) pPixmapPriv->hBitmap); - - /* Branch on the fill type */ - switch (pGC->fillStyle) - { - case FillSolid: - - ROP16 (pGCPriv->hdcMem, pGC->alu); - - if (pDrawable->depth == 1) - { - if (pGC->fgPixel == 0) - hPenOrig = SelectObject (pGCPriv->hdcMem, - GetStockObject (BLACK_PEN)); - else - hPenOrig = SelectObject (pGCPriv->hdcMem, - GetStockObject (WHITE_PEN)); - } - else - { - fg = pGC->fgPixel; - TRANSLATE_COLOR (fg); - hPen = CreatePen (PS_SOLID, 0, fg); - hPenOrig = SelectObject (pGCPriv->hdcMem, hPen); - } - - while (iSpans--) - { - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - MoveToEx (pGCPriv->hdcMem, fullX1, fullY1, NULL); - LineTo (pGCPriv->hdcMem, fullX2, fullY1); - } - - SetROP2 (pGCPriv->hdcMem, R2_COPYPEN); - - /* Give back the Pen */ - SelectObject (pGCPriv->hdcMem, hPenOrig); - - if (pDrawable->depth != 1) - DeleteObject (hPen); - break; - - case FillOpaqueStippled: - - pStipple = pGC->stipple; - pStipplePriv = winGetPixmapPriv (pStipple); - - /* Create a device-dependent bitmap for the stipple */ - hBitmap = CreateDIBitmap (pGCPriv->hdcMem, - (BITMAPINFOHEADER *)pStipplePriv->pbmih, - CBM_INIT, - pStipplePriv->pbBits, - (BITMAPINFO *)pStipplePriv->pbmih, - DIB_RGB_COLORS); - - /* Create a memory DC to hold the stipple */ - hdcStipple = CreateCompatibleDC (pGCPriv->hdcMem); - - /* Select the stipple bitmap into the stipple DC */ - hbmpOrigStipple = SelectObject (hdcStipple, hBitmap); - if (hbmpOrigStipple == NULL) - FatalError ("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " - "SelectObject () failed on hbmpOrigStipple\n"); - - /* Make a temporary copy of the foreground and background colors */ - bg = pGC->bgPixel; - fg = pGC->fgPixel; - - /* Translate the depth-dependent colors to Win32 COLORREFs */ - TRANSLATE_COLOR (fg); - TRANSLATE_COLOR (bg); - SetTextColor (pGCPriv->hdcMem, fg); - SetBkColor (pGCPriv->hdcMem, bg); - - while (iSpans--) - { - int width = pStipple->drawable.width; - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - for (iX = fullX1; iX < fullX2; iX += width) - { - int xoffset; - - if ((iX + pStipple->drawable.width) > fullX2) - width = fullX2 - iX; - else - width = pStipple->drawable.width; - - if (iX == fullX1) - xoffset = (fullX1 - (pDrawable->x + (pGC->patOrg.x % pStipple->drawable.width) - pStipple->drawable.width)) % pStipple->drawable.width; - else - xoffset = 0; - - if (xoffset + width > pStipple->drawable.width) - width = pStipple->drawable.width - xoffset; - - BitBlt (pGCPriv->hdcMem, - iX, fullY1, - width, 1, - hdcStipple, - xoffset, - (fullY1 - (pDrawable->y + (pGC->patOrg.y % pStipple->drawable.height) - pStipple->drawable.height)) % pStipple->drawable.height, - g_copyROP[pGC->alu]); - } - } - - /* Clear the stipple HDC */ - SelectObject (hdcStipple, hbmpOrigStipple); - DeleteDC (hdcStipple); - - /* Delete the device dependent stipple bitmap */ - DeleteObject (hBitmap); - - break; - case FillStippled: - - pStipple = pGC->stipple; - pStipplePriv = winGetPixmapPriv (pStipple); - - /* Create a device-dependent bitmap for the stipple */ - hBitmap = CreateDIBitmap (pGCPriv->hdcMem, - (BITMAPINFOHEADER *)pStipplePriv->pbmih, - CBM_INIT, - pStipplePriv->pbBits, - (BITMAPINFO *)pStipplePriv->pbmih, - DIB_RGB_COLORS); - - /* Create a memory DC to hold the stipple */ - hdcStipple = CreateCompatibleDC (pGCPriv->hdcMem); - - /* Select the stipple bitmap into the stipple DC */ - hbmpOrigStipple = SelectObject (hdcStipple, hBitmap); - if (hbmpOrigStipple == NULL) - FatalError ("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " - "SelectObject () failed on hbmpOrigStipple\n"); - - /* Make a temporary copy of the foreground and background colors */ - bg = pGC->bgPixel; - fg = pGC->fgPixel; - - /* Translate the depth-dependent colors to Win32 COLORREFs */ - TRANSLATE_COLOR (fg); - TRANSLATE_COLOR (bg); - - /* this is fudgy, we should only invert on the last one - * We need to get the black/white pixels right in the - * colormap. But yeah ! it's working.. - */ - if (pGC->bgPixel != -1 && pGC->fgPixel != -1) - { - SetTextColor (pGCPriv->hdcMem, fg); - SetBkColor (pGCPriv->hdcMem, bg); - BitBlt (hdcStipple, - 0, 0, - pStipple->drawable.width, pStipple->drawable.height, - hdcStipple, - 0, 0, - 0x330008); - } - else if (pGC->bgPixel == -1) - { - SetTextColor (pGCPriv->hdcMem, fg); - SetBkMode (pGCPriv->hdcMem, TRANSPARENT); - BitBlt (hdcStipple, - 0, 0, - pStipple->drawable.width, pStipple->drawable.height, - hdcStipple, - 0, 0, - 0x330008); - } - else if (pGC->fgPixel == -1) - { - SetTextColor (pGCPriv->hdcMem, bg); - SetBkMode (pGCPriv->hdcMem, TRANSPARENT); + SelectClipRgn(pGCPriv->hdcMem, combined); + DeleteObject(combined); + combined = NULL; + + /* Get a pixmap pointer from the drawable pointer, and fetch privates */ + pPixmap = (PixmapPtr) pDrawable; + pPixmapPriv = winGetPixmapPriv(pPixmap); + + /* Select the drawable pixmap into memory hdc */ + hbmpOrig = SelectObject(pGCPriv->hdcMem, pPixmapPriv->hBitmap); + if (hbmpOrig == NULL) + FatalError("winFillSpans - DRAWABLE_PIXMAP - " + "SelectObject () failed on\n\tpPixmapPriv->hBitmap: " + "%08x\n", (unsigned int) pPixmapPriv->hBitmap); + + /* Branch on the fill type */ + switch (pGC->fillStyle) { + case FillSolid: + + ROP16(pGCPriv->hdcMem, pGC->alu); + + if (pDrawable->depth == 1) { + if (pGC->fgPixel == 0) + hPenOrig = SelectObject(pGCPriv->hdcMem, + GetStockObject(BLACK_PEN)); + else + hPenOrig = SelectObject(pGCPriv->hdcMem, + GetStockObject(WHITE_PEN)); + } + else { + fg = pGC->fgPixel; + TRANSLATE_COLOR(fg); + hPen = CreatePen(PS_SOLID, 0, fg); + hPenOrig = SelectObject(pGCPriv->hdcMem, hPen); + } + + while (iSpans--) { + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + MoveToEx(pGCPriv->hdcMem, fullX1, fullY1, NULL); + LineTo(pGCPriv->hdcMem, fullX2, fullY1); + } + + SetROP2(pGCPriv->hdcMem, R2_COPYPEN); + + /* Give back the Pen */ + SelectObject(pGCPriv->hdcMem, hPenOrig); + + if (pDrawable->depth != 1) + DeleteObject(hPen); + break; + + case FillOpaqueStippled: + + pStipple = pGC->stipple; + pStipplePriv = winGetPixmapPriv(pStipple); + + /* Create a device-dependent bitmap for the stipple */ + hBitmap = CreateDIBitmap(pGCPriv->hdcMem, + (BITMAPINFOHEADER *) pStipplePriv->pbmih, + CBM_INIT, + pStipplePriv->pbBits, + (BITMAPINFO *) pStipplePriv->pbmih, + DIB_RGB_COLORS); + + /* Create a memory DC to hold the stipple */ + hdcStipple = CreateCompatibleDC(pGCPriv->hdcMem); + + /* Select the stipple bitmap into the stipple DC */ + hbmpOrigStipple = SelectObject(hdcStipple, hBitmap); + if (hbmpOrigStipple == NULL) + FatalError("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " + "SelectObject () failed on hbmpOrigStipple\n"); + + /* Make a temporary copy of the foreground and background colors */ + bg = pGC->bgPixel; + fg = pGC->fgPixel; + + /* Translate the depth-dependent colors to Win32 COLORREFs */ + TRANSLATE_COLOR(fg); + TRANSLATE_COLOR(bg); + SetTextColor(pGCPriv->hdcMem, fg); + SetBkColor(pGCPriv->hdcMem, bg); + + while (iSpans--) { + int width = pStipple->drawable.width; + + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + for (iX = fullX1; iX < fullX2; iX += width) { + int xoffset; + + if ((iX + pStipple->drawable.width) > fullX2) + width = fullX2 - iX; + else + width = pStipple->drawable.width; + + if (iX == fullX1) + xoffset = + (fullX1 - + (pDrawable->x + + (pGC->patOrg.x % pStipple->drawable.width) - + pStipple->drawable.width)) % + pStipple->drawable.width; + else + xoffset = 0; + + if (xoffset + width > pStipple->drawable.width) + width = pStipple->drawable.width - xoffset; + + BitBlt(pGCPriv->hdcMem, + iX, fullY1, + width, 1, + hdcStipple, + xoffset, + (fullY1 - + (pDrawable->y + + (pGC->patOrg.y % pStipple->drawable.height) - + pStipple->drawable.height)) % + pStipple->drawable.height, g_copyROP[pGC->alu]); + } + } + + /* Clear the stipple HDC */ + SelectObject(hdcStipple, hbmpOrigStipple); + DeleteDC(hdcStipple); + + /* Delete the device dependent stipple bitmap */ + DeleteObject(hBitmap); + + break; + case FillStippled: + + pStipple = pGC->stipple; + pStipplePriv = winGetPixmapPriv(pStipple); + + /* Create a device-dependent bitmap for the stipple */ + hBitmap = CreateDIBitmap(pGCPriv->hdcMem, + (BITMAPINFOHEADER *) pStipplePriv->pbmih, + CBM_INIT, + pStipplePriv->pbBits, + (BITMAPINFO *) pStipplePriv->pbmih, + DIB_RGB_COLORS); + + /* Create a memory DC to hold the stipple */ + hdcStipple = CreateCompatibleDC(pGCPriv->hdcMem); + + /* Select the stipple bitmap into the stipple DC */ + hbmpOrigStipple = SelectObject(hdcStipple, hBitmap); + if (hbmpOrigStipple == NULL) + FatalError("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " + "SelectObject () failed on hbmpOrigStipple\n"); + + /* Make a temporary copy of the foreground and background colors */ + bg = pGC->bgPixel; + fg = pGC->fgPixel; + + /* Translate the depth-dependent colors to Win32 COLORREFs */ + TRANSLATE_COLOR(fg); + TRANSLATE_COLOR(bg); + + /* this is fudgy, we should only invert on the last one + * We need to get the black/white pixels right in the + * colormap. But yeah ! it's working.. + */ + if (pGC->bgPixel != -1 && pGC->fgPixel != -1) { + SetTextColor(pGCPriv->hdcMem, fg); + SetBkColor(pGCPriv->hdcMem, bg); + BitBlt(hdcStipple, + 0, 0, + pStipple->drawable.width, pStipple->drawable.height, + hdcStipple, 0, 0, 0x330008); + } + else if (pGC->bgPixel == -1) { + SetTextColor(pGCPriv->hdcMem, fg); + SetBkMode(pGCPriv->hdcMem, TRANSPARENT); + BitBlt(hdcStipple, + 0, 0, + pStipple->drawable.width, pStipple->drawable.height, + hdcStipple, 0, 0, 0x330008); + } + else if (pGC->fgPixel == -1) { + SetTextColor(pGCPriv->hdcMem, bg); + SetBkMode(pGCPriv->hdcMem, TRANSPARENT); #if 0 - BitBlt (hdcStipple, - 0, 0, - pStipple->drawable.width, pStipple->drawable.height, - hdcStipple, - 0, 0, - 0x330008); + BitBlt(hdcStipple, + 0, 0, + pStipple->drawable.width, pStipple->drawable.height, + hdcStipple, 0, 0, 0x330008); #endif - } - - while (iSpans--) - { - int width = pStipple->drawable.width; - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - for (iX = fullX1; iX < fullX2; iX += width) - { - int xoffset; - - if ((iX + pStipple->drawable.width) > fullX2) - width = fullX2 - iX; - else - width = pStipple->drawable.width; - - if (iX == fullX1) - xoffset = (fullX1 - (pDrawable->x + (pGC->patOrg.x % pStipple->drawable.width) - pStipple->drawable.width)) % pStipple->drawable.width; - else - xoffset = 0; - - if (xoffset + width > pStipple->drawable.width) - width = pStipple->drawable.width - xoffset; - - BitBlt (pGCPriv->hdcMem, - iX, fullY1, - width, 1, - hdcStipple, - xoffset, - (fullY1 - (pDrawable->y + (pGC->patOrg.y % pStipple->drawable.height) - pStipple->drawable.height)) % pStipple->drawable.height, - g_copyROP[pGC->alu]); - } - } - - /* Clear the stipple HDC */ - SelectObject (hdcStipple, hbmpOrigStipple); - DeleteDC (hdcStipple); - - /* Delete the device dependent stipple bitmap */ - DeleteObject (hBitmap); - - /* Restore the background mode */ - SetBkMode (pGCPriv->hdcMem, OPAQUE); - break; - - case FillTiled: - - /* Get a pixmap pointer from the tile pointer, and fetch privates */ - pTile = (PixmapPtr) pGC->tile.pixmap; - pTilePriv = winGetPixmapPriv (pTile); - - /* Create a memory DC to hold the tile */ - hdcTile = CreateCompatibleDC (pGCPriv->hdcMem); - - /* Select the tile into a DC */ - hbmpOrig = SelectObject (hdcTile, pTilePriv->hBitmap); - if (hbmpOrig == NULL) - FatalError ("winFillSpans - DRAWABLE_PIXMAP - FillTiled - " - "SelectObject () failed on pTilePriv->hBitmap\n"); - - while (iSpans--) - { - int width = pTile->drawable.width; - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - for (iX = fullX1; iX < fullX2; iX += width) - { - int xoffset; - - if ((iX + pTile->drawable.width) > fullX2) - width = fullX2 - iX; - else - width = pTile->drawable.width; - - if (iX == fullX1) - xoffset = (fullX1 - (pDrawable->x + (pGC->patOrg.x % pTile->drawable.width) - pTile->drawable.width)) % pTile->drawable.width; - else - xoffset = 0; - - if (xoffset + width > pTile->drawable.width) - width = pTile->drawable.width - xoffset; - - BitBlt (pGCPriv->hdcMem, - iX, fullY1, - width, 1, - hdcTile, - xoffset, - (fullY1 - (pDrawable->y + (pGC->patOrg.y % pTile->drawable.height) - pTile->drawable.height)) % pTile->drawable.height, - g_copyROP[pGC->alu]); - } - } - - /* Push the tile pixmap out of the memory HDC */ - SelectObject (hdcTile, hbmpOrig); - - /* Delete the tile */ - DeleteDC (hdcTile); - break; - - default: - ErrorF ("winFillSpans - DRAWABLE_PIXMAP - Unknown fillStyle\n"); - break; - } - - /* Reset clip region */ - SelectClipRgn (pGCPriv->hdcMem, NULL); - - /* Push the drawable pixmap out of the GC HDC */ - SelectObject (pGCPriv->hdcMem, hbmpOrig); - break; - + } + + while (iSpans--) { + int width = pStipple->drawable.width; + + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + for (iX = fullX1; iX < fullX2; iX += width) { + int xoffset; + + if ((iX + pStipple->drawable.width) > fullX2) + width = fullX2 - iX; + else + width = pStipple->drawable.width; + + if (iX == fullX1) + xoffset = + (fullX1 - + (pDrawable->x + + (pGC->patOrg.x % pStipple->drawable.width) - + pStipple->drawable.width)) % + pStipple->drawable.width; + else + xoffset = 0; + + if (xoffset + width > pStipple->drawable.width) + width = pStipple->drawable.width - xoffset; + + BitBlt(pGCPriv->hdcMem, + iX, fullY1, + width, 1, + hdcStipple, + xoffset, + (fullY1 - + (pDrawable->y + + (pGC->patOrg.y % pStipple->drawable.height) - + pStipple->drawable.height)) % + pStipple->drawable.height, g_copyROP[pGC->alu]); + } + } + + /* Clear the stipple HDC */ + SelectObject(hdcStipple, hbmpOrigStipple); + DeleteDC(hdcStipple); + + /* Delete the device dependent stipple bitmap */ + DeleteObject(hBitmap); + + /* Restore the background mode */ + SetBkMode(pGCPriv->hdcMem, OPAQUE); + break; + + case FillTiled: + + /* Get a pixmap pointer from the tile pointer, and fetch privates */ + pTile = (PixmapPtr) pGC->tile.pixmap; + pTilePriv = winGetPixmapPriv(pTile); + + /* Create a memory DC to hold the tile */ + hdcTile = CreateCompatibleDC(pGCPriv->hdcMem); + + /* Select the tile into a DC */ + hbmpOrig = SelectObject(hdcTile, pTilePriv->hBitmap); + if (hbmpOrig == NULL) + FatalError("winFillSpans - DRAWABLE_PIXMAP - FillTiled - " + "SelectObject () failed on pTilePriv->hBitmap\n"); + + while (iSpans--) { + int width = pTile->drawable.width; + + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + for (iX = fullX1; iX < fullX2; iX += width) { + int xoffset; + + if ((iX + pTile->drawable.width) > fullX2) + width = fullX2 - iX; + else + width = pTile->drawable.width; + + if (iX == fullX1) + xoffset = + (fullX1 - + (pDrawable->x + + (pGC->patOrg.x % pTile->drawable.width) - + pTile->drawable.width)) % pTile->drawable.width; + else + xoffset = 0; + + if (xoffset + width > pTile->drawable.width) + width = pTile->drawable.width - xoffset; + + BitBlt(pGCPriv->hdcMem, + iX, fullY1, + width, 1, + hdcTile, + xoffset, + (fullY1 - + (pDrawable->y + + (pGC->patOrg.y % pTile->drawable.height) - + pTile->drawable.height)) % pTile->drawable.height, + g_copyROP[pGC->alu]); + } + } + + /* Push the tile pixmap out of the memory HDC */ + SelectObject(hdcTile, hbmpOrig); + + /* Delete the tile */ + DeleteDC(hdcTile); + break; + + default: + ErrorF("winFillSpans - DRAWABLE_PIXMAP - Unknown fillStyle\n"); + break; + } + + /* Reset clip region */ + SelectClipRgn(pGCPriv->hdcMem, NULL); + + /* Push the drawable pixmap out of the GC HDC */ + SelectObject(pGCPriv->hdcMem, hbmpOrig); + break; + case DRAWABLE_WINDOW: - SelectClipRgn (pGCPriv->hdc, combined); - DeleteObject (combined); - combined = NULL; - - /* Branch on fill style */ - switch (pGC->fillStyle) - { - case FillSolid: - - ROP16 (pGCPriv->hdc, pGC->alu); - - if (pDrawable->depth == 1) - { - if (pGC->fgPixel == 0) - hPenOrig = SelectObject (pGCPriv->hdc, - GetStockObject (BLACK_PEN)); - else - hPenOrig = SelectObject (pGCPriv->hdc, - GetStockObject (WHITE_PEN)); - } - else - { - fg = pGC->fgPixel; - TRANSLATE_COLOR (fg); - hPen = CreatePen (PS_SOLID, 0, fg); - hPenOrig = SelectObject (pGCPriv->hdc, hPen); - } - - while (iSpans--) - { - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - MoveToEx (pGCPriv->hdc, fullX1, fullY1, NULL); - LineTo (pGCPriv->hdc, fullX2, fullY1); - } - - SetROP2 (pGCPriv->hdc, R2_COPYPEN); - - /* Give back the Brush */ - SelectObject (pGCPriv->hdc, hPenOrig); - - if (pDrawable->depth != 1) - DeleteObject (hPen); - break; - - case FillOpaqueStippled: - - pStipple = pGC->stipple; - pStipplePriv = winGetPixmapPriv (pStipple); - - /* Create a device-dependent bitmap for the stipple */ - hBitmap = CreateDIBitmap (pGCPriv->hdc, - (BITMAPINFOHEADER *)pStipplePriv->pbmih, - CBM_INIT, - pStipplePriv->pbBits, - (BITMAPINFO *)pStipplePriv->pbmih, - DIB_RGB_COLORS); - - /* Create a memory DC to hold the stipple */ - hdcStipple = CreateCompatibleDC (pGCPriv->hdc); - - /* Select the stipple bitmap into the stipple DC */ - hbmpOrigStipple = SelectObject (hdcStipple, hBitmap); - if (hbmpOrigStipple == NULL) - FatalError ("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " - "SelectObject () failed on hbmpOrigStipple\n"); - - /* Make a temporary copy of the foreground and background colors */ - bg = pGC->bgPixel; - fg = pGC->fgPixel; - - /* Translate the depth-dependent colors to Win32 COLORREFs */ - TRANSLATE_COLOR (fg); - TRANSLATE_COLOR (bg); - SetTextColor (pGCPriv->hdc, fg); - SetBkColor (pGCPriv->hdc, bg); - - while (iSpans--) - { - int width = pStipple->drawable.width; - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - for (iX = fullX1; iX < fullX2; iX += width) - { - int xoffset; - - if ((iX + pStipple->drawable.width) > fullX2) - width = fullX2 - iX; - else - width = pStipple->drawable.width; - - if (iX == fullX1) - xoffset = (fullX1 - (pDrawable->x + (pGC->patOrg.x % pStipple->drawable.width) - pStipple->drawable.width)) % pStipple->drawable.width; - else - xoffset = 0; - - if (xoffset + width > pStipple->drawable.width) - width = pStipple->drawable.width - xoffset; - - BitBlt (pGCPriv->hdc, - iX, fullY1, - width, 1, - hdcStipple, - xoffset, - (fullY1 - (pDrawable->y + (pGC->patOrg.y % pStipple->drawable.height) - pStipple->drawable.height)) % pStipple->drawable.height, - g_copyROP[pGC->alu]); - } - } - - /* Clear the stipple HDC */ - SelectObject (hdcStipple, hbmpOrigStipple); - DeleteDC (hdcStipple); - - /* Delete the device dependent stipple bitmap */ - DeleteObject (hBitmap); - - break; - - case FillStippled: - pStipple = pGC->stipple; - pStipplePriv = winGetPixmapPriv (pStipple); - - /* Create a device-dependent bitmap for the stipple */ - hBitmap = CreateDIBitmap (pGCPriv->hdcMem, - (BITMAPINFOHEADER *)pStipplePriv->pbmih, - CBM_INIT, - pStipplePriv->pbBits, - (BITMAPINFO *)pStipplePriv->pbmih, - DIB_RGB_COLORS); - - /* Create a memory DC to hold the stipple */ - hdcStipple = CreateCompatibleDC (pGCPriv->hdc); - - /* Select the stipple bitmap into the stipple DC */ - hbmpOrigStipple = SelectObject (hdcStipple, hBitmap); - if (hbmpOrigStipple == NULL) - FatalError ("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " - "SelectObject () failed on hbmpOrigStipple\n"); - - /* Make a temporary copy of the foreground and background colors */ - bg = pGC->bgPixel; - fg = pGC->fgPixel; - - /* Translate the depth-dependent colors to Win32 COLORREFs */ - TRANSLATE_COLOR (fg); - TRANSLATE_COLOR (bg); - - /* this is fudgy, we should only invert on the last one - * We need to get the black/white pixels right in the - * colormap. But yeah ! it's working.. - */ - if (pGC->bgPixel != -1 && pGC->fgPixel != -1) - { - SetTextColor (pGCPriv->hdc, fg); - SetBkColor (pGCPriv->hdc, bg); - BitBlt (hdcStipple, - 0, 0, - pStipple->drawable.width, pStipple->drawable.height, - hdcStipple, - 0,0, - 0x330008); - } - else if (pGC->bgPixel == -1) - { - SetTextColor (pGCPriv->hdc, fg); - SetBkMode (pGCPriv->hdc, TRANSPARENT); - BitBlt (hdcStipple, - 0, 0, - pStipple->drawable.width, pStipple->drawable.height, - hdcStipple, - 0,0, - 0x330008); - } - else if (pGC->fgPixel == -1) - { - SetTextColor (pGCPriv->hdc, bg); - SetBkMode (pGCPriv->hdc, TRANSPARENT); + SelectClipRgn(pGCPriv->hdc, combined); + DeleteObject(combined); + combined = NULL; + + /* Branch on fill style */ + switch (pGC->fillStyle) { + case FillSolid: + + ROP16(pGCPriv->hdc, pGC->alu); + + if (pDrawable->depth == 1) { + if (pGC->fgPixel == 0) + hPenOrig = SelectObject(pGCPriv->hdc, + GetStockObject(BLACK_PEN)); + else + hPenOrig = SelectObject(pGCPriv->hdc, + GetStockObject(WHITE_PEN)); + } + else { + fg = pGC->fgPixel; + TRANSLATE_COLOR(fg); + hPen = CreatePen(PS_SOLID, 0, fg); + hPenOrig = SelectObject(pGCPriv->hdc, hPen); + } + + while (iSpans--) { + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + MoveToEx(pGCPriv->hdc, fullX1, fullY1, NULL); + LineTo(pGCPriv->hdc, fullX2, fullY1); + } + + SetROP2(pGCPriv->hdc, R2_COPYPEN); + + /* Give back the Brush */ + SelectObject(pGCPriv->hdc, hPenOrig); + + if (pDrawable->depth != 1) + DeleteObject(hPen); + break; + + case FillOpaqueStippled: + + pStipple = pGC->stipple; + pStipplePriv = winGetPixmapPriv(pStipple); + + /* Create a device-dependent bitmap for the stipple */ + hBitmap = CreateDIBitmap(pGCPriv->hdc, + (BITMAPINFOHEADER *) pStipplePriv->pbmih, + CBM_INIT, + pStipplePriv->pbBits, + (BITMAPINFO *) pStipplePriv->pbmih, + DIB_RGB_COLORS); + + /* Create a memory DC to hold the stipple */ + hdcStipple = CreateCompatibleDC(pGCPriv->hdc); + + /* Select the stipple bitmap into the stipple DC */ + hbmpOrigStipple = SelectObject(hdcStipple, hBitmap); + if (hbmpOrigStipple == NULL) + FatalError("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " + "SelectObject () failed on hbmpOrigStipple\n"); + + /* Make a temporary copy of the foreground and background colors */ + bg = pGC->bgPixel; + fg = pGC->fgPixel; + + /* Translate the depth-dependent colors to Win32 COLORREFs */ + TRANSLATE_COLOR(fg); + TRANSLATE_COLOR(bg); + SetTextColor(pGCPriv->hdc, fg); + SetBkColor(pGCPriv->hdc, bg); + + while (iSpans--) { + int width = pStipple->drawable.width; + + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + for (iX = fullX1; iX < fullX2; iX += width) { + int xoffset; + + if ((iX + pStipple->drawable.width) > fullX2) + width = fullX2 - iX; + else + width = pStipple->drawable.width; + + if (iX == fullX1) + xoffset = + (fullX1 - + (pDrawable->x + + (pGC->patOrg.x % pStipple->drawable.width) - + pStipple->drawable.width)) % + pStipple->drawable.width; + else + xoffset = 0; + + if (xoffset + width > pStipple->drawable.width) + width = pStipple->drawable.width - xoffset; + + BitBlt(pGCPriv->hdc, + iX, fullY1, + width, 1, + hdcStipple, + xoffset, + (fullY1 - + (pDrawable->y + + (pGC->patOrg.y % pStipple->drawable.height) - + pStipple->drawable.height)) % + pStipple->drawable.height, g_copyROP[pGC->alu]); + } + } + + /* Clear the stipple HDC */ + SelectObject(hdcStipple, hbmpOrigStipple); + DeleteDC(hdcStipple); + + /* Delete the device dependent stipple bitmap */ + DeleteObject(hBitmap); + + break; + + case FillStippled: + pStipple = pGC->stipple; + pStipplePriv = winGetPixmapPriv(pStipple); + + /* Create a device-dependent bitmap for the stipple */ + hBitmap = CreateDIBitmap(pGCPriv->hdcMem, + (BITMAPINFOHEADER *) pStipplePriv->pbmih, + CBM_INIT, + pStipplePriv->pbBits, + (BITMAPINFO *) pStipplePriv->pbmih, + DIB_RGB_COLORS); + + /* Create a memory DC to hold the stipple */ + hdcStipple = CreateCompatibleDC(pGCPriv->hdc); + + /* Select the stipple bitmap into the stipple DC */ + hbmpOrigStipple = SelectObject(hdcStipple, hBitmap); + if (hbmpOrigStipple == NULL) + FatalError("winFillSpans () - DRAWABLE_PIXMAP - FillStippled - " + "SelectObject () failed on hbmpOrigStipple\n"); + + /* Make a temporary copy of the foreground and background colors */ + bg = pGC->bgPixel; + fg = pGC->fgPixel; + + /* Translate the depth-dependent colors to Win32 COLORREFs */ + TRANSLATE_COLOR(fg); + TRANSLATE_COLOR(bg); + + /* this is fudgy, we should only invert on the last one + * We need to get the black/white pixels right in the + * colormap. But yeah ! it's working.. + */ + if (pGC->bgPixel != -1 && pGC->fgPixel != -1) { + SetTextColor(pGCPriv->hdc, fg); + SetBkColor(pGCPriv->hdc, bg); + BitBlt(hdcStipple, + 0, 0, + pStipple->drawable.width, pStipple->drawable.height, + hdcStipple, 0, 0, 0x330008); + } + else if (pGC->bgPixel == -1) { + SetTextColor(pGCPriv->hdc, fg); + SetBkMode(pGCPriv->hdc, TRANSPARENT); + BitBlt(hdcStipple, + 0, 0, + pStipple->drawable.width, pStipple->drawable.height, + hdcStipple, 0, 0, 0x330008); + } + else if (pGC->fgPixel == -1) { + SetTextColor(pGCPriv->hdc, bg); + SetBkMode(pGCPriv->hdc, TRANSPARENT); #if 0 - BitBlt (hdcStipple, - 0, 0, - pStipple->drawable.width, pStipple->drawable.height, - hdcStipple, - 0, 0, - 0x330008); + BitBlt(hdcStipple, + 0, 0, + pStipple->drawable.width, pStipple->drawable.height, + hdcStipple, 0, 0, 0x330008); #endif - } - - while (iSpans--) - { - int width = pStipple->drawable.width; - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - for (iX = fullX1; iX < fullX2; iX += width) - { - int xoffset; - - if ((iX + pStipple->drawable.width) > fullX2) - width = fullX2 - iX; - else - width = pStipple->drawable.width; - - if (iX == fullX1) - xoffset = (fullX1 - (pDrawable->x + (pGC->patOrg.x % pStipple->drawable.width) - pStipple->drawable.width)) % pStipple->drawable.width; - else - xoffset = 0; - - if (xoffset + width > pStipple->drawable.width) - width = pStipple->drawable.width - xoffset; - - BitBlt (pGCPriv->hdc, - iX, fullY1, - width, 1, - hdcStipple, - xoffset, - (fullY1 - (pDrawable->y + (pGC->patOrg.y % pStipple->drawable.height) - pStipple->drawable.height)) % pStipple->drawable.height, - g_copyROP[pGC->alu]); - } - } - - /* Clear the stipple HDC */ - SelectObject (hdcStipple, hbmpOrigStipple); - DeleteDC (hdcStipple); - - /* Delete the device dependent stipple bitmap */ - DeleteObject (hBitmap); - - /* Restore the background mode */ - SetBkMode (pGCPriv->hdc, OPAQUE); - break; - - case FillTiled: - - /* Get a pixmap pointer from the tile pointer, and fetch privates */ - pTile = (PixmapPtr) pGC->tile.pixmap; - pTilePriv = winGetPixmapPriv (pTile); - - /* Select the tile into a DC */ - hbmpOrig = SelectObject (pGCPriv->hdcMem, pTilePriv->hBitmap); - if (hbmpOrig == NULL) - FatalError ("winFillSpans - DRAWABLE_WINDOW - FillTiled - " - "SelectObject () failed on pTilePriv->hBitmap\n"); - - while (iSpans--) - { - int width = pTile->drawable.width; - fullX1 = pPoints->x; - fullY1 = pPoints->y; - fullX2 = fullX1 + (int) *piWidths; - pPoints++; - piWidths++; - - if (fullY1 < extentY1 || extentY2 <= fullY1) - continue; - - if (fullX1 < extentX1) - fullX1 = extentX1; - if (fullX2 > extentX2) - fullX2 = extentX2; - - if (fullX1 >= fullX2) - continue; - - for (iX = fullX1; iX < fullX2; iX += width) - { - int xoffset; - - if ((iX + pTile->drawable.width) > fullX2) - width = fullX2 - iX; - else - width = pTile->drawable.width; - - if (iX == fullX1) - xoffset = (fullX1 - (pDrawable->x + (pGC->patOrg.x % pTile->drawable.width) - pTile->drawable.width)) % pTile->drawable.width; - else - xoffset = 0; - - if (xoffset + width > pTile->drawable.width) - width = pTile->drawable.width - xoffset; - - BitBlt (pGCPriv->hdc, - iX, fullY1, - width, 1, - pGCPriv->hdcMem, - xoffset, - (fullY1 - (pDrawable->y + (pGC->patOrg.y % pTile->drawable.height) - pTile->drawable.height)) % pTile->drawable.height, - g_copyROP[pGC->alu]); - } - } - - /* Push the tile pixmap out of the memory HDC */ - SelectObject (pGCPriv->hdcMem, hbmpOrig); - break; - - default: - ErrorF ("winFillSpans - DRAWABLE_WINDOW - Unknown fillStyle\n"); - break; - } - - /* Reset clip region */ - SelectClipRgn (pGCPriv->hdc, NULL); - break; + } + + while (iSpans--) { + int width = pStipple->drawable.width; + + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + for (iX = fullX1; iX < fullX2; iX += width) { + int xoffset; + + if ((iX + pStipple->drawable.width) > fullX2) + width = fullX2 - iX; + else + width = pStipple->drawable.width; + + if (iX == fullX1) + xoffset = + (fullX1 - + (pDrawable->x + + (pGC->patOrg.x % pStipple->drawable.width) - + pStipple->drawable.width)) % + pStipple->drawable.width; + else + xoffset = 0; + + if (xoffset + width > pStipple->drawable.width) + width = pStipple->drawable.width - xoffset; + + BitBlt(pGCPriv->hdc, + iX, fullY1, + width, 1, + hdcStipple, + xoffset, + (fullY1 - + (pDrawable->y + + (pGC->patOrg.y % pStipple->drawable.height) - + pStipple->drawable.height)) % + pStipple->drawable.height, g_copyROP[pGC->alu]); + } + } + + /* Clear the stipple HDC */ + SelectObject(hdcStipple, hbmpOrigStipple); + DeleteDC(hdcStipple); + + /* Delete the device dependent stipple bitmap */ + DeleteObject(hBitmap); + + /* Restore the background mode */ + SetBkMode(pGCPriv->hdc, OPAQUE); + break; + + case FillTiled: + + /* Get a pixmap pointer from the tile pointer, and fetch privates */ + pTile = (PixmapPtr) pGC->tile.pixmap; + pTilePriv = winGetPixmapPriv(pTile); + + /* Select the tile into a DC */ + hbmpOrig = SelectObject(pGCPriv->hdcMem, pTilePriv->hBitmap); + if (hbmpOrig == NULL) + FatalError("winFillSpans - DRAWABLE_WINDOW - FillTiled - " + "SelectObject () failed on pTilePriv->hBitmap\n"); + + while (iSpans--) { + int width = pTile->drawable.width; + + fullX1 = pPoints->x; + fullY1 = pPoints->y; + fullX2 = fullX1 + (int) *piWidths; + pPoints++; + piWidths++; + + if (fullY1 < extentY1 || extentY2 <= fullY1) + continue; + + if (fullX1 < extentX1) + fullX1 = extentX1; + if (fullX2 > extentX2) + fullX2 = extentX2; + + if (fullX1 >= fullX2) + continue; + + for (iX = fullX1; iX < fullX2; iX += width) { + int xoffset; + + if ((iX + pTile->drawable.width) > fullX2) + width = fullX2 - iX; + else + width = pTile->drawable.width; + + if (iX == fullX1) + xoffset = + (fullX1 - + (pDrawable->x + + (pGC->patOrg.x % pTile->drawable.width) - + pTile->drawable.width)) % pTile->drawable.width; + else + xoffset = 0; + + if (xoffset + width > pTile->drawable.width) + width = pTile->drawable.width - xoffset; + + BitBlt(pGCPriv->hdc, + iX, fullY1, + width, 1, + pGCPriv->hdcMem, + xoffset, + (fullY1 - + (pDrawable->y + + (pGC->patOrg.y % pTile->drawable.height) - + pTile->drawable.height)) % pTile->drawable.height, + g_copyROP[pGC->alu]); + } + } + + /* Push the tile pixmap out of the memory HDC */ + SelectObject(pGCPriv->hdcMem, hbmpOrig); + break; + + default: + ErrorF("winFillSpans - DRAWABLE_WINDOW - Unknown fillStyle\n"); + break; + } + + /* Reset clip region */ + SelectClipRgn(pGCPriv->hdc, NULL); + break; default: - ErrorF ("winFillSpans - Unknown drawable type\n"); - break; + ErrorF("winFillSpans - Unknown drawable type\n"); + break; } } |