/*********************************************************************** * PSDRV_DrawLine */ static void PSDRV_DrawLine( PHYSDEV dev ) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); if(physDev->pathdepth) return; if (physDev->pen.style == PS_NULL) PSDRV_WriteNewPath(dev); else PSDRV_WriteStroke(dev); }
/********************************************************************** * * PSDRV_Brush * */ BOOL PSDRV_Brush(PHYSDEV dev, BOOL EO) { PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); LOGBRUSH logbrush; BOOL ret = TRUE; if(physDev->pathdepth) return FALSE; if (!GetObjectA( GetCurrentObject(dev->hdc,OBJ_BRUSH), sizeof(logbrush), &logbrush )) { ERR("Can't get BRUSHOBJ\n"); return FALSE; } switch (logbrush.lbStyle) { case BS_SOLID: PSDRV_WriteGSave(dev); PSDRV_SetBrush(dev); PSDRV_Fill(dev, EO); PSDRV_WriteGRestore(dev); break; case BS_HATCHED: PSDRV_WriteGSave(dev); PSDRV_SetBrush(dev); switch(logbrush.lbHatch) { case HS_VERTICAL: case HS_CROSS: PSDRV_WriteGSave(dev); PSDRV_Clip(dev, EO); PSDRV_WriteHatch(dev); PSDRV_WriteStroke(dev); PSDRV_WriteGRestore(dev); if(logbrush.lbHatch == HS_VERTICAL) break; /* else fallthrough for HS_CROSS */ case HS_HORIZONTAL: PSDRV_WriteGSave(dev); PSDRV_Clip(dev, EO); PSDRV_WriteRotate(dev, 90.0); PSDRV_WriteHatch(dev); PSDRV_WriteStroke(dev); PSDRV_WriteGRestore(dev); break; case HS_FDIAGONAL: case HS_DIAGCROSS: PSDRV_WriteGSave(dev); PSDRV_Clip(dev, EO); PSDRV_WriteRotate(dev, -45.0); PSDRV_WriteHatch(dev); PSDRV_WriteStroke(dev); PSDRV_WriteGRestore(dev); if(logbrush.lbHatch == HS_FDIAGONAL) break; /* else fallthrough for HS_DIAGCROSS */ case HS_BDIAGONAL: PSDRV_WriteGSave(dev); PSDRV_Clip(dev, EO); PSDRV_WriteRotate(dev, 45.0); PSDRV_WriteHatch(dev); PSDRV_WriteStroke(dev); PSDRV_WriteGRestore(dev); break; default: ERR("Unknown hatch style\n"); ret = FALSE; break; } PSDRV_WriteGRestore(dev); break; case BS_NULL: break; case BS_PATTERN: { BITMAP bm; BYTE *bits; GetObjectA( (HBITMAP)logbrush.lbHatch, sizeof(BITMAP), &bm); TRACE("BS_PATTERN %dx%d %d bpp\n", bm.bmWidth, bm.bmHeight, bm.bmBitsPixel); bits = HeapAlloc(PSDRV_Heap, 0, bm.bmWidthBytes * bm.bmHeight); GetBitmapBits( (HBITMAP)logbrush.lbHatch, bm.bmWidthBytes * bm.bmHeight, bits); if(physDev->pi->ppd->LanguageLevel > 1) { PSDRV_WriteGSave(dev); PSDRV_WritePatternDict(dev, &bm, bits); PSDRV_Fill(dev, EO); PSDRV_WriteGRestore(dev); } else { FIXME("Trying to set a pattern brush on a level 1 printer\n"); ret = FALSE; } HeapFree(PSDRV_Heap, 0, bits); } break; case BS_DIBPATTERN: { BITMAPINFO *bmi = (BITMAPINFO *)logbrush.lbHatch; UINT usage = logbrush.lbColor; TRACE("size %dx%dx%d\n", bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, bmi->bmiHeader.biBitCount); if(physDev->pi->ppd->LanguageLevel > 1) { PSDRV_WriteGSave(dev); ret = PSDRV_WriteDIBPatternDict(dev, bmi, usage); PSDRV_Fill(dev, EO); PSDRV_WriteGRestore(dev); } else { FIXME("Trying to set a pattern brush on a level 1 printer\n"); ret = FALSE; } } break; default: ret = FALSE; break; } return ret; }