/*********************************************************************** * SetDCPenColor (X11DRV.@) */ COLORREF X11DRV_SetDCPenColor( PHYSDEV dev, COLORREF crColor ) { X11DRV_PDEVICE *physDev = get_x11drv_dev( dev ); if (GetCurrentObject(dev->hdc, OBJ_PEN) == GetStockObject( DC_PEN )) physDev->pen.pixel = X11DRV_PALETTE_ToPhysical( physDev, crColor ); return crColor; }
/*********************************************************************** * SelectBrush (X11DRV.@) */ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush ) { X11DRV_PDEVICE *physDev = get_x11drv_dev( dev ); LOGBRUSH logbrush; if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0; TRACE("hdc=%p hbrush=%p\n", dev->hdc, hbrush); if (physDev->brush.pixmap) { wine_tsx11_lock(); XFreePixmap( gdi_display, physDev->brush.pixmap ); wine_tsx11_unlock(); physDev->brush.pixmap = 0; } physDev->brush.style = logbrush.lbStyle; if (hbrush == GetStockObject( DC_BRUSH )) logbrush.lbColor = GetDCBrushColor( dev->hdc ); switch(logbrush.lbStyle) { case BS_NULL: TRACE("BS_NULL\n" ); break; case BS_SOLID: TRACE("BS_SOLID\n" ); BRUSH_SelectSolidBrush( physDev, logbrush.lbColor ); break; case BS_HATCHED: TRACE("BS_HATCHED\n" ); physDev->brush.pixel = X11DRV_PALETTE_ToPhysical( physDev, logbrush.lbColor ); wine_tsx11_lock(); physDev->brush.pixmap = XCreateBitmapFromData( gdi_display, root_window, HatchBrushes[logbrush.lbHatch], 8, 8 ); wine_tsx11_unlock(); physDev->brush.fillStyle = FillStippled; break; case BS_PATTERN: TRACE("BS_PATTERN\n"); if (!BRUSH_SelectPatternBrush( physDev, (HBITMAP)logbrush.lbHatch )) return 0; break; case BS_DIBPATTERN: TRACE("BS_DIBPATTERN\n"); if (!BRUSH_SelectDIBPatternBrush( physDev, (HGLOBAL)logbrush.lbHatch )) return 0; break; } return hbrush; }
/*********************************************************************** * BRUSH_SelectSolidBrush */ static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color ) { if ((physDev->depth > 1) && (screen_depth <= 8) && !X11DRV_IsSolidColor( color )) { /* Dithered brush */ physDev->brush.pixmap = BRUSH_DitherColor( color, physDev->depth ); physDev->brush.fillStyle = FillTiled; physDev->brush.pixel = 0; } else if (physDev->depth == 1 && color != WHITE && color != BLACK) { physDev->brush.pixel = 0; physDev->brush.pixmap = BRUSH_DitherMono( color ); physDev->brush.fillStyle = FillTiled; } else { /* Solid brush */ physDev->brush.pixel = X11DRV_PALETTE_ToPhysical( physDev, color ); physDev->brush.fillStyle = FillSolid; } }
/*********************************************************************** * SelectPen (X11DRV.@) */ HPEN X11DRV_SelectPen( PHYSDEV dev, HPEN hpen ) { static const char PEN_dash[] = { 16,8 }; static const char PEN_dot[] = { 4,4 }; static const char PEN_dashdot[] = { 12,8,4,8 }; static const char PEN_dashdotdot[] = { 12,4,4,4,4,4 }; static const char PEN_alternate[] = { 1,1 }; static const char EXTPEN_dash[] = { 3,1 }; static const char EXTPEN_dot[] = { 1,1 }; static const char EXTPEN_dashdot[] = { 3,1,1,1 }; static const char EXTPEN_dashdotdot[] = { 3,1,1,1,1,1 }; X11DRV_PDEVICE *physDev = get_x11drv_dev( dev ); LOGPEN logpen; int i; if (!GetObjectW( hpen, sizeof(logpen), &logpen )) { /* must be an extended pen */ EXTLOGPEN *elp; INT size = GetObjectW( hpen, 0, NULL ); if (!size) return 0; physDev->pen.ext = 1; 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 ); } else physDev->pen.ext = 0; physDev->pen.style = logpen.lopnStyle & PS_STYLE_MASK; physDev->pen.type = logpen.lopnStyle & PS_TYPE_MASK; physDev->pen.endcap = logpen.lopnStyle & PS_ENDCAP_MASK; physDev->pen.linejoin = logpen.lopnStyle & PS_JOIN_MASK; physDev->pen.width = logpen.lopnWidth.x; if ((logpen.lopnStyle & PS_GEOMETRIC) || (physDev->pen.width >= 1)) { physDev->pen.width = X11DRV_XWStoDS( dev->hdc, physDev->pen.width ); if (physDev->pen.width < 0) physDev->pen.width = -physDev->pen.width; } if (physDev->pen.width == 1) physDev->pen.width = 0; /* Faster */ if (hpen == GetStockObject( DC_PEN )) logpen.lopnColor = GetDCPenColor( dev->hdc ); physDev->pen.pixel = X11DRV_PALETTE_ToPhysical( physDev, logpen.lopnColor ); switch(logpen.lopnStyle & PS_STYLE_MASK) { case PS_DASH: physDev->pen.dash_len = sizeof(PEN_dash)/sizeof(*PEN_dash); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dash : PEN_dash, physDev->pen.dash_len); break; case PS_DOT: physDev->pen.dash_len = sizeof(PEN_dot)/sizeof(*PEN_dot); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dot : PEN_dot, physDev->pen.dash_len); break; case PS_DASHDOT: physDev->pen.dash_len = sizeof(PEN_dashdot)/sizeof(*PEN_dashdot); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dashdot : PEN_dashdot, physDev->pen.dash_len); break; case PS_DASHDOTDOT: physDev->pen.dash_len = sizeof(PEN_dashdotdot)/sizeof(*PEN_dashdotdot); memcpy(physDev->pen.dashes, physDev->pen.ext ? EXTPEN_dashdotdot : PEN_dashdotdot, physDev->pen.dash_len); break; case PS_ALTERNATE: physDev->pen.dash_len = sizeof(PEN_alternate)/sizeof(*PEN_alternate); memcpy(physDev->pen.dashes, PEN_alternate, physDev->pen.dash_len); break; case PS_USERSTYLE: FIXME("PS_USERSTYLE is not supported\n"); /* fall through */ default: physDev->pen.dash_len = 0; break; } if(physDev->pen.ext && physDev->pen.dash_len && (logpen.lopnStyle & PS_STYLE_MASK) != PS_ALTERNATE) for(i = 0; i < physDev->pen.dash_len; i++) physDev->pen.dashes[i] *= (physDev->pen.width ? physDev->pen.width : 1); return hpen; }
/*********************************************************************** * SelectBrush (X11DRV.@) */ HBRUSH X11DRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct brush_pattern *pattern ) { X11DRV_PDEVICE *physDev = get_x11drv_dev( dev ); LOGBRUSH logbrush; if (pattern) /* pattern brush */ { X_PHYSBITMAP *physbitmap; HBITMAP bitmap = pattern->bitmap; BOOL delete_bitmap = FALSE; if (!bitmap || !(physbitmap = X11DRV_get_phys_bitmap( bitmap ))) { if (!(bitmap = create_brush_bitmap( physDev, pattern ))) return 0; physbitmap = X11DRV_get_phys_bitmap( bitmap ); delete_bitmap = TRUE; } BRUSH_SelectPatternBrush( physDev, bitmap, physbitmap ); TRACE("BS_PATTERN\n"); physDev->brush.style = BS_PATTERN; if (delete_bitmap) DeleteObject( bitmap ); return hbrush; } if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0; TRACE("hdc=%p hbrush=%p\n", dev->hdc, hbrush); if (physDev->brush.pixmap) { wine_tsx11_lock(); XFreePixmap( gdi_display, physDev->brush.pixmap ); wine_tsx11_unlock(); physDev->brush.pixmap = 0; } physDev->brush.style = logbrush.lbStyle; if (hbrush == GetStockObject( DC_BRUSH )) logbrush.lbColor = GetDCBrushColor( dev->hdc ); switch(logbrush.lbStyle) { case BS_NULL: TRACE("BS_NULL\n" ); break; case BS_SOLID: TRACE("BS_SOLID\n" ); BRUSH_SelectSolidBrush( physDev, logbrush.lbColor ); break; case BS_HATCHED: TRACE("BS_HATCHED\n" ); physDev->brush.pixel = X11DRV_PALETTE_ToPhysical( physDev, logbrush.lbColor ); wine_tsx11_lock(); physDev->brush.pixmap = XCreateBitmapFromData( gdi_display, root_window, HatchBrushes[logbrush.lbHatch], 8, 8 ); wine_tsx11_unlock(); physDev->brush.fillStyle = FillStippled; break; } return hbrush; }
/*********************************************************************** * SelectBrush (X11DRV.@) */ HBRUSH CDECL X11DRV_SelectBrush( X11DRV_PDEVICE *physDev, HBRUSH hbrush ) { LOGBRUSH logbrush; HBITMAP hBitmap; BITMAPINFO * bmpInfo; if (!GetObjectA( hbrush, sizeof(logbrush), &logbrush )) return 0; TRACE("hdc=%p hbrush=%p\n", physDev->hdc,hbrush); if (physDev->brush.pixmap) { wine_tsx11_lock(); XFreePixmap( gdi_display, physDev->brush.pixmap ); wine_tsx11_unlock(); physDev->brush.pixmap = 0; } physDev->brush.style = logbrush.lbStyle; if (hbrush == GetStockObject( DC_BRUSH )) logbrush.lbColor = GetDCBrushColor( physDev->hdc ); switch(logbrush.lbStyle) { case BS_NULL: TRACE("BS_NULL\n" ); break; case BS_SOLID: TRACE("BS_SOLID\n" ); BRUSH_SelectSolidBrush( physDev, logbrush.lbColor ); break; case BS_HATCHED: TRACE("BS_HATCHED\n" ); physDev->brush.pixel = X11DRV_PALETTE_ToPhysical( physDev, logbrush.lbColor ); wine_tsx11_lock(); physDev->brush.pixmap = XCreateBitmapFromData( gdi_display, root_window, HatchBrushes[logbrush.lbHatch], 8, 8 ); wine_tsx11_unlock(); physDev->brush.fillStyle = FillStippled; break; case BS_PATTERN: TRACE("BS_PATTERN\n"); if (!BRUSH_SelectPatternBrush( physDev, (HBITMAP)logbrush.lbHatch )) return 0; break; case BS_DIBPATTERN: TRACE("BS_DIBPATTERN\n"); if ((bmpInfo = GlobalLock( (HGLOBAL)logbrush.lbHatch ))) { int size = bitmap_info_size( bmpInfo, logbrush.lbColor ); hBitmap = CreateDIBitmap( physDev->hdc, &bmpInfo->bmiHeader, CBM_INIT, ((char *)bmpInfo) + size, bmpInfo, (WORD)logbrush.lbColor ); BRUSH_SelectPatternBrush( physDev, hBitmap ); DeleteObject( hBitmap ); GlobalUnlock( (HGLOBAL)logbrush.lbHatch ); } break; } return hbrush; }