summaryrefslogtreecommitdiff
path: root/hw/xwin/winsetsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/xwin/winsetsp.c')
-rw-r--r--hw/xwin/winsetsp.c363
1 files changed, 101 insertions, 262 deletions
diff --git a/hw/xwin/winsetsp.c b/hw/xwin/winsetsp.c
index 657a7af50..c0340e47b 100644
--- a/hw/xwin/winsetsp.c
+++ b/hw/xwin/winsetsp.c
@@ -26,8 +26,9 @@
*from the XFree86 Project.
*
* Authors: Harold L Hunt II
+ * Alan Hourihane <alanh@fairlite.demon.co.uk>
*/
-/* $XFree86: xc/programs/Xserver/hw/xwin/winsetsp.c,v 1.7 2001/11/01 12:19:42 alanh Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xwin/winsetsp.c,v 1.8 2003/08/07 23:47:58 alanh Exp $ */
#include "win.h"
@@ -44,22 +45,37 @@ winSetSpansNativeGDI (DrawablePtr pDrawable,
winGCPriv(pGC);
PixmapPtr pPixmap = NULL;
winPrivPixmapPtr pPixmapPriv = NULL;
- int iSpan;
- int *piWidth = NULL;
- DDXPointPtr pPoint = NULL;
- char *pSrc = pSrcs;
- HDC hdcMem;
- BITMAPINFOHEADER *pbmih;
- HBITMAP hBitmap = NULL;
HBITMAP hbmpOrig = NULL;
- DEBUG_FN_NAME("winSetSpans");
- DEBUGVARS;
- DEBUGPROC_MSG;
+ BITMAPINFO bmi;
+ HRGN hrgn = NULL, combined = NULL;
+ int nbox;
+ BoxPtr pbox;
+
+ nbox = REGION_NUM_RECTS (pGC->pCompositeClip);
+ pbox = REGION_RECTS (pGC->pCompositeClip);
+
+ 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++;
+ }
/* Branch on the drawable type */
switch (pDrawable->type)
{
case DRAWABLE_PIXMAP:
+
+ SelectClipRgn (pGCPriv->hdcMem, combined);
+ DeleteObject (combined);
+ combined = NULL;
+
pPixmap = (PixmapPtr) pDrawable;
pPixmapPriv = winGetPixmapPriv (pPixmap);
@@ -69,264 +85,87 @@ winSetSpansNativeGDI (DrawablePtr pDrawable,
FatalError ("winSetSpans - DRAWABLE_PIXMAP - SelectObject () "
"failed on pPixmapPriv->hBitmap\n");
- /* Branch on the raster operation type */
- switch (pGC->alu)
- {
- case GXclear:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXclear\n");
- break;
-
- case GXand:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXand\n");
- break;
-
- case GXandReverse:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXandReverse\n");
- break;
-
- case GXcopy:
- ErrorF ("winSetSpans - DRAWABLE_PIXMAP - GXcopy %08x\n",
- pDrawable);
-
- /* Loop through spans */
- for (iSpan = 0; iSpan < iSpans; ++iSpan)
- {
- piWidth = piWidths + iSpan;
- pPoint = pPoints + iSpan;
-
- /* Blast the bits to the drawable */
- SetDIBits (pGCPriv->hdcMem,
- pPixmapPriv->hBitmap,
- pPoint->y, 1,
- pSrc,
- (BITMAPINFO *) pPixmapPriv->pbmih,
- 0);
-
- /* Display some useful information */
- ErrorF ("(%dx%dx%d) (%d,%d) w: %d ps: %08x\n",
- pDrawable->width, pDrawable->height, pDrawable->depth,
- pPoint->x, pPoint->y, *piWidth, pSrc);
-
- /* Calculate offset of next bit source */
- pSrc += 4 * ((*piWidth + 31) / 32);
- }
-
- /*
- * REMOVE - Visual verification only.
- */
- BitBlt (pGCPriv->hdc,
- pDrawable->width * 2, pDrawable->height,
- pDrawable->width, pDrawable->height,
- pGCPriv->hdcMem,
- 0, 0,
- SRCCOPY);
- DEBUG_MSG ("DRAWABLE_PIXMAP - GXcopy");
- break;
-
- case GXandInverted:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXandInverted\n");
- break;
-
- case GXnoop:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXnoop\n");
- break;
-
- case GXxor:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXxor\n");
- break;
-
- case GXor:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXor\n");
- break;
-
- case GXnor:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXnor\n");
- break;
-
- case GXequiv:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXequiv\n");
- break;
-
- case GXinvert:
- ErrorF ("winSetSpans - DRAWABLE_PIXMAP - GXinvert %08x\n",
- pDrawable);
-
- /* Create a temporary DC */
- hdcMem = CreateCompatibleDC (NULL);
-
- /* Loop through spans */
- for (iSpan = 0; iSpan < iSpans; ++iSpan)
- {
- piWidth = piWidths + iSpan;
- pPoint = pPoints + iSpan;
-
- /* Create a one-line DIB for the bit data */
- hBitmap = winCreateDIBNativeGDI (*piWidth, 1, pDrawable->depth,
- NULL, (BITMAPINFO **) &pbmih);
-
- /* Select the span line line bitmap into the temporary DC */
- hbmpOrig = SelectObject (hdcMem, hBitmap);
-
- /* Blast bit data to the one-line DIB */
- SetDIBits (hdcMem, hBitmap,
- 0, 1,
- pSrc,
- (BITMAPINFO *) pbmih,
- DIB_RGB_COLORS);
-
- /* Blit the span line to the drawable */
- BitBlt (pGCPriv->hdcMem,
- pPoint->x, pPoint->y,
- *piWidth, 1,
- hdcMem,
- 0, 0,
- NOTSRCCOPY);
-
- /*
- * REMOVE - Visual verification only.
- */
- BitBlt (pGCPriv->hdc,
- pDrawable->width, pDrawable->height + pPoint->y,
- *piWidth, 1,
- hdcMem,
- 0, 0,
- SRCCOPY);
-
- /* Display some useful information */
- ErrorF ("(%dx%dx%d) (%d,%d) w: %d ps: %08x\n",
- pDrawable->width, pDrawable->height, pDrawable->depth,
- pPoint->x, pPoint->y, *piWidth, pSrc);
-
- /* Calculate offset of next bit source */
- pSrc += 4 * ((*piWidth + 31) / 32);
-
- /* Pop the span line bitmap out of the memory DC */
- SelectObject (hdcMem, hbmpOrig);
-
- /* Free the temporary bitmap */
- DeleteObject (hBitmap);
- hBitmap = NULL;
- }
-
- /*
- * REMOVE - Visual verification only.
- */
- DEBUG_MSG ("DRAWABLE_PIXMAP - GXinvert - Prior to invert");
- BitBlt (pGCPriv->hdc,
- pDrawable->width * 2, pDrawable->height,
- pDrawable->width, pDrawable->height,
- pGCPriv->hdcMem,
- 0, 0,
- SRCCOPY);
- DEBUG_MSG ("DRAWABLE_PIXMAP - GXinvert - Finished invert");
-
- /* Release the scratch DC */
- DeleteDC (hdcMem);
- break;
-
- case GXorReverse:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXorReverse\n");
- break;
-
- case GXcopyInverted:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXcopyInverted\n");
- break;
-
- case GXorInverted:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXorInverted\n");
- break;
-
- case GXnand:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXnand\n");
- break;
-
- case GXset:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - GXset\n");
- break;
-
- default:
- FatalError ("winSetSpans - DRAWABLE_PIXMAP - Unknown ROP\n");
- break;
- }
+ while (iSpans--)
+ {
+ ZeroMemory (&bmi, sizeof (BITMAPINFO));
+ bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
+ bmi.bmiHeader.biWidth = *piWidths;
+ bmi.bmiHeader.biHeight = 1;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biBitCount = pDrawable->depth;
+ bmi.bmiHeader.biCompression = BI_RGB;
+
+ /* Setup color table for mono DIBs */
+ if (pDrawable->depth == 1)
+ {
+ bmi.bmiColors[1].rgbBlue = 255;
+ bmi.bmiColors[1].rgbGreen = 255;
+ bmi.bmiColors[1].rgbRed = 255;
+ }
+
+ StretchDIBits (pGCPriv->hdcMem,
+ pPoints->x, pPoints->y,
+ *piWidths, 1,
+ 0, 0,
+ *piWidths, 1,
+ pSrcs,
+ (BITMAPINFO *) &bmi,
+ DIB_RGB_COLORS,
+ g_copyROP[pGC->alu]);
+
+ pSrcs += PixmapBytePad (*piWidths, pDrawable->depth);
+ pPoints++;
+ piWidths++;
+ }
+
+ /* Reset the clip region */
+ SelectClipRgn (pGCPriv->hdcMem, NULL);
/* Push the drawable pixmap out of the GC HDC */
SelectObject (pGCPriv->hdcMem, hbmpOrig);
break;
case DRAWABLE_WINDOW:
- FatalError ("\nwinSetSpansNativeGDI - DRAWABLE_WINDOW\n\n");
-
- /* Branch on the raster operation type */
- switch (pGC->alu)
- {
- case GXclear:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXclear\n");
- break;
-
- case GXand:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXand\n");
- break;
-
- case GXandReverse:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXandReverse\n");
- break;
-
- case GXcopy:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXcopy\n");
- break;
-
- case GXandInverted:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXandInverted\n");
- break;
-
- case GXnoop:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXnoop\n");
- break;
-
- case GXxor:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXxor\n");
- break;
-
- case GXor:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXor\n");
- break;
-
- case GXnor:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXnor\n");
- break;
-
- case GXequiv:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXequiv\n");
- break;
-
- case GXinvert:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXinvert\n");
- break;
-
- case GXorReverse:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXorReverse\n");
- break;
-
- case GXcopyInverted:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXcopyInverted\n");
- break;
-
- case GXorInverted:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXorInverted\n");
- break;
-
- case GXnand:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXnand\n");
- break;
-
- case GXset:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - GXset\n");
- break;
- default:
- ErrorF ("winSetSpans () - DRAWABLE_WINDOW - Unknown ROP\n");
- break;
- }
+ SelectClipRgn (pGCPriv->hdc, combined);
+ DeleteObject (combined);
+ combined = NULL;
+
+ while (iSpans--)
+ {
+ ZeroMemory (&bmi, sizeof (BITMAPINFO));
+ bmi.bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
+ bmi.bmiHeader.biWidth = *piWidths;
+ bmi.bmiHeader.biHeight = 1;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biBitCount = pDrawable->depth;
+ bmi.bmiHeader.biCompression = BI_RGB;
+
+ /* Setup color table for mono DIBs */
+ if (pDrawable->depth == 1)
+ {
+ bmi.bmiColors[1].rgbBlue = 255;
+ bmi.bmiColors[1].rgbGreen = 255;
+ bmi.bmiColors[1].rgbRed = 255;
+ }
+
+ StretchDIBits (pGCPriv->hdc,
+ pPoints->x, pPoints->y,
+ *piWidths, 1,
+ 0, 0,
+ *piWidths, 1,
+ pSrcs,
+ (BITMAPINFO *) &bmi,
+ DIB_RGB_COLORS,
+ g_copyROP[pGC->alu]);
+
+ pSrcs += PixmapBytePad (*piWidths, pDrawable->depth);
+ pPoints++;
+ piWidths++;
+ }
+
+ /* Reset the clip region */
+ SelectClipRgn (pGCPriv->hdc, NULL);
break;
case UNDRAWABLE_WINDOW: