static BOOL PSDRV_WriteImageMaskHeader(PHYSDEV dev, const BITMAPINFO *info, INT xDst, INT yDst, INT widthDst, INT heightDst, INT widthSrc, INT heightSrc) { PSCOLOR bkgnd, foregnd; assert(info->bmiHeader.biBitCount == 1); /* We'll write the mask with -ve polarity so that the foregnd color corresponds to a bit equal to 0 in the bitmap. */ PSDRV_CreateColor(dev, &foregnd, RGB(info->bmiColors[0].rgbRed, info->bmiColors[0].rgbGreen, info->bmiColors[0].rgbBlue) ); PSDRV_CreateColor(dev, &bkgnd, RGB(info->bmiColors[1].rgbRed, info->bmiColors[1].rgbGreen, info->bmiColors[1].rgbBlue) ); PSDRV_WriteGSave(dev); PSDRV_WriteNewPath(dev); PSDRV_WriteRectangle(dev, xDst, yDst, widthDst, heightDst); PSDRV_WriteSetColor(dev, &bkgnd); PSDRV_WriteFill(dev); PSDRV_WriteGRestore(dev); PSDRV_WriteSetColor(dev, &foregnd); PSDRV_WriteImage(dev, 1, xDst, yDst, widthDst, heightDst, widthSrc, heightSrc, TRUE, info->bmiHeader.biHeight < 0); return TRUE; }
/*********************************************************************** * SetDCBrushColor (WINEPS.@) */ COLORREF CDECL PSDRV_SetDCBrushColor( PSDRV_PDEVICE *physDev, COLORREF color ) { if (GetCurrentObject( physDev->hdc, OBJ_BRUSH ) == GetStockObject( DC_BRUSH )) { PSDRV_CreateColor( physDev, &physDev->brush.color, color ); physDev->brush.set = FALSE; } return color; }
/*********************************************************************** * SetDCBrushColor (WINEPS.@) */ COLORREF PSDRV_SetDCBrushColor( PHYSDEV dev, COLORREF color ) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); if (GetCurrentObject( dev->hdc, OBJ_BRUSH ) == GetStockObject( DC_BRUSH )) { PSDRV_CreateColor( dev, &physDev->brush.color, color ); physDev->brush.set = FALSE; } return color; }
/*********************************************************************** * SelectBrush (WINEPS.@) */ HBRUSH PSDRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap, const BITMAPINFO *info, void *bits, UINT usage ) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); LOGBRUSH logbrush; if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0; TRACE("hbrush = %p\n", hbrush); if (hbrush == GetStockObject( DC_BRUSH )) logbrush.lbColor = GetDCBrushColor( dev->hdc ); switch(logbrush.lbStyle) { case BS_SOLID: PSDRV_CreateColor(dev, &physDev->brush.color, logbrush.lbColor); break; case BS_NULL: break; case BS_HATCHED: PSDRV_CreateColor(dev, &physDev->brush.color, logbrush.lbColor); break; case BS_PATTERN: case BS_DIBPATTERN: break; default: FIXME("Unrecognized brush style %d\n", logbrush.lbStyle); break; } physDev->brush.set = FALSE; return hbrush; }
/*********************************************************************** * SelectBrush (WINEPS.@) */ HBRUSH CDECL PSDRV_SelectBrush( PSDRV_PDEVICE *physDev, HBRUSH hbrush ) { LOGBRUSH logbrush; if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0; TRACE("hbrush = %p\n", hbrush); if (hbrush == GetStockObject( DC_BRUSH )) logbrush.lbColor = GetDCBrushColor( physDev->hdc ); switch(logbrush.lbStyle) { case BS_SOLID: PSDRV_CreateColor(physDev, &physDev->brush.color, logbrush.lbColor); break; case BS_NULL: break; case BS_HATCHED: PSDRV_CreateColor(physDev, &physDev->brush.color, logbrush.lbColor); break; case BS_PATTERN: case BS_DIBPATTERN: break; default: FIXME("Unrecognized brush style %d\n", logbrush.lbStyle); break; } physDev->brush.set = FALSE; return hbrush; }
/*********************************************************************** * PSDRV_SetPixel */ COLORREF PSDRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color ) { PSCOLOR pscolor; POINT pt; pt.x = x; pt.y = y; LPtoDP( dev->hdc, &pt, 1 ); PSDRV_SetClip(dev); /* we bracket the setcolor in gsave/grestore so that we don't trash the current pen colour */ PSDRV_WriteGSave(dev); PSDRV_WriteRectangle( dev, pt.x, pt.y, 0, 0 ); PSDRV_CreateColor( dev, &pscolor, color ); PSDRV_WriteSetColor( dev, &pscolor ); PSDRV_WriteFill( dev ); PSDRV_WriteGRestore(dev); PSDRV_ResetClip(dev); return color; }
/*********************************************************************** * * PSDRV_PatBlt */ BOOL PSDRV_PatBlt(PHYSDEV dev, struct bitblt_coords *dst, DWORD dwRop) { switch(dwRop) { case PATCOPY: PSDRV_SetClip(dev); PSDRV_WriteGSave(dev); PSDRV_WriteRectangle(dev, dst->visrect.left, dst->visrect.top, dst->visrect.right - dst->visrect.left, dst->visrect.bottom - dst->visrect.top ); PSDRV_Brush(dev, FALSE); PSDRV_WriteGRestore(dev); PSDRV_ResetClip(dev); return TRUE; case BLACKNESS: case WHITENESS: { PSCOLOR pscol; PSDRV_SetClip(dev); PSDRV_WriteGSave(dev); PSDRV_WriteRectangle(dev, dst->visrect.left, dst->visrect.top, dst->visrect.right - dst->visrect.left, dst->visrect.bottom - dst->visrect.top ); PSDRV_CreateColor( dev, &pscol, (dwRop == BLACKNESS) ? RGB(0,0,0) : RGB(0xff,0xff,0xff) ); PSDRV_WriteSetColor(dev, &pscol); PSDRV_WriteFill(dev); PSDRV_WriteGRestore(dev); PSDRV_ResetClip(dev); return TRUE; } default: FIXME("Unsupported rop %06x\n", dwRop); return FALSE; } }
/*********************************************************************** * SelectPen (WINEPS.@) */ HPEN CDECL PSDRV_SelectPen( PSDRV_PDEVICE *physDev, HPEN hpen ) { LOGPEN logpen; if (!GetObjectW( hpen, sizeof(logpen), &logpen )) { /* must be an extended pen */ EXTLOGPEN *elp; INT size = GetObjectW( hpen, 0, NULL ); if (!size) return 0; elp = HeapAlloc( GetProcessHeap(), 0, size ); GetObjectW( hpen, size, elp ); /* FIXME: add support for user style pens */ logpen.lopnStyle = elp->elpPenStyle; logpen.lopnWidth.x = elp->elpWidth; logpen.lopnWidth.y = 0; logpen.lopnColor = elp->elpColor; HeapFree( GetProcessHeap(), 0, elp ); } TRACE("hpen = %p colour = %08x\n", hpen, logpen.lopnColor); physDev->pen.width = logpen.lopnWidth.x; if ((logpen.lopnStyle & PS_GEOMETRIC) || (physDev->pen.width > 1)) { physDev->pen.width = PSDRV_XWStoDS( physDev, physDev->pen.width ); if(physDev->pen.width < 0) physDev->pen.width = -physDev->pen.width; } switch (logpen.lopnStyle & PS_JOIN_MASK) { default: case PS_JOIN_ROUND: physDev->pen.join = 1; break; case PS_JOIN_BEVEL: physDev->pen.join = 2; break; case PS_JOIN_MITER: physDev->pen.join = 0; break; } switch (logpen.lopnStyle & PS_ENDCAP_MASK) { default: case PS_ENDCAP_ROUND: physDev->pen.endcap = 1; break; case PS_ENDCAP_SQUARE: physDev->pen.endcap = 2; break; case PS_ENDCAP_FLAT: physDev->pen.endcap = 0; break; } PSDRV_CreateColor(physDev, &physDev->pen.color, logpen.lopnColor); physDev->pen.style = logpen.lopnStyle & PS_STYLE_MASK; switch(physDev->pen.style) { case PS_DASH: physDev->pen.dash = PEN_dash; break; case PS_DOT: physDev->pen.dash = PEN_dot; break; case PS_DASHDOT: physDev->pen.dash = PEN_dashdot; break; case PS_DASHDOTDOT: physDev->pen.dash = PEN_dashdotdot; break; case PS_ALTERNATE: physDev->pen.dash = PEN_alternate; break; default: physDev->pen.dash = NULL; } if ((physDev->pen.width > 1) && (physDev->pen.dash != NULL)) { physDev->pen.style = PS_SOLID; physDev->pen.dash = NULL; } physDev->pen.set = FALSE; return hpen; }