/*********************************************************************** * dibdrv_SetDeviceClipping */ static void dibdrv_SetDeviceClipping( PHYSDEV dev, HRGN rgn ) { dibdrv_physdev *pdev = get_dibdrv_pdev(dev); TRACE("(%p, %p)\n", dev, rgn); pdev->clip = rgn; }
/*********************************************************************** * dibdrv_SelectBrush */ HBRUSH CDECL dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectBrush ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); LOGBRUSH logbrush; TRACE("(%p, %p)\n", dev, hbrush); if (!GetObjectW( hbrush, sizeof(logbrush), &logbrush )) return 0; if (hbrush == GetStockObject( DC_BRUSH )) logbrush.lbColor = GetDCBrushColor( dev->hdc ); pdev->brush_style = logbrush.lbStyle; pdev->defer |= DEFER_BRUSH; free_pattern_brush( pdev ); switch(logbrush.lbStyle) { case BS_SOLID: pdev->brush_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, logbrush.lbColor); calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor); pdev->brush_rects = solid_brush; pdev->defer &= ~DEFER_BRUSH; break; case BS_NULL: pdev->brush_rects = null_brush; pdev->defer &= ~DEFER_BRUSH; break; case BS_DIBPATTERN: { BITMAPINFOHEADER *bi = GlobalLock((HGLOBAL)logbrush.lbHatch); dib_info orig_dib; if(!bi) return NULL; if(init_dib_info_from_packed(&orig_dib, bi, LOWORD(logbrush.lbColor))) { copy_dib_color_info(&pdev->brush_dib, &pdev->dib); if(convert_dib(&pdev->brush_dib, &orig_dib)) { pdev->brush_rects = pattern_brush; pdev->defer &= ~DEFER_BRUSH; } free_dib_info(&orig_dib, FALSE); } GlobalUnlock((HGLOBAL)logbrush.lbHatch); break; } default: break; } return next->funcs->pSelectBrush( next, hbrush ); }
/*********************************************************************** * dibdrv_SetBoundsRect */ static UINT dibdrv_SetBoundsRect( PHYSDEV dev, RECT *rect, UINT flags ) { dibdrv_physdev *pdev = get_dibdrv_pdev( dev ); if (flags & DCB_DISABLE) pdev->bounds = NULL; else if (flags & DCB_ENABLE) pdev->bounds = rect; return DCB_RESET; /* we don't have device-specific bounds */ }
/*********************************************************************** * dibdrv_DeleteDC */ static BOOL dibdrv_DeleteDC( PHYSDEV dev ) { dibdrv_physdev *pdev = get_dibdrv_pdev(dev); TRACE("(%p)\n", dev); free_pattern_brush( &pdev->brush ); free_pattern_brush( &pdev->pen_brush ); HeapFree( GetProcessHeap(), 0, pdev ); return TRUE; }
/*********************************************************************** * dibdrv_SetROP2 */ static INT dibdrv_SetROP2( PHYSDEV dev, INT rop ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetROP2 ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); update_masks( pdev, rop ); return next->funcs->pSetROP2( next, rop ); }
/*********************************************************************** * dibdrv_SetDeviceClipping */ static void dibdrv_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN clip_rgn ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetDeviceClipping ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); TRACE("(%p, %p, %p)\n", dev, vis_rgn, clip_rgn); CombineRgn( pdev->clip, vis_rgn, clip_rgn, clip_rgn ? RGN_AND : RGN_COPY ); return next->funcs->pSetDeviceClipping( next, vis_rgn, clip_rgn); }
/*********************************************************************** * dibdrv_DeleteDC */ static BOOL dibdrv_DeleteDC( PHYSDEV dev ) { dibdrv_physdev *pdev = get_dibdrv_pdev(dev); TRACE("(%p)\n", dev); DeleteObject(pdev->clip); free_pattern_brush(pdev); free_dib_info(&pdev->dib); HeapFree( GetProcessHeap(), 0, pdev ); return TRUE; }
/*********************************************************************** * dibdrv_SetTextColor */ static COLORREF dibdrv_SetTextColor( PHYSDEV dev, COLORREF color ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetTextColor ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); pdev->text_color = get_pixel_color( pdev, color, TRUE ); update_aa_ranges( pdev ); return next->funcs->pSetTextColor( next, color ); }
/*********************************************************************** * dibdrv_SetDCPenColor */ COLORREF CDECL dibdrv_SetDCPenColor( PHYSDEV dev, COLORREF color ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetDCPenColor ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); if (GetCurrentObject(dev->hdc, OBJ_PEN) == GetStockObject( DC_PEN )) { pdev->pen_color = pdev->dib.funcs->colorref_to_pixel(&pdev->dib, color); calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor); } return next->funcs->pSetDCPenColor( next, color ); }
/*********************************************************************** * dibdrv_SetDCBrushColor */ COLORREF CDECL dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetDCBrushColor ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); if (GetCurrentObject(dev->hdc, OBJ_BRUSH) == GetStockObject( DC_BRUSH )) { pdev->brush_colorref = color; pdev->brush_color = get_fg_color( pdev, pdev->brush_colorref ); calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor); } return next->funcs->pSetDCBrushColor( next, color ); }
/*********************************************************************** * dibdrv_SetBkMode */ static INT dibdrv_SetBkMode( PHYSDEV dev, INT mode ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkMode ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); if( mode == OPAQUE ) calc_and_xor_masks( GetROP2(dev->hdc), pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor ); else { pdev->bkgnd_and = ~0u; pdev->bkgnd_xor = 0; } return next->funcs->pSetBkMode( next, mode ); }
static BOOL windrv_CreateDC( PHYSDEV *dev, LPCWSTR driver, LPCWSTR device, LPCWSTR output, const DEVMODEW *devmode ) { struct windrv_physdev *physdev = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*physdev) ); if (!physdev) return FALSE; if (!dib_driver.pCreateDC( dev, NULL, NULL, NULL, NULL )) { HeapFree( GetProcessHeap(), 0, physdev ); return FALSE; } physdev->dibdrv = get_dibdrv_pdev( *dev ); push_dc_driver( dev, &physdev->dev, &window_driver ); return TRUE; }
/*********************************************************************** * dibdrv_SetDIBColorTable */ static UINT dibdrv_SetDIBColorTable( PHYSDEV dev, UINT pos, UINT count, const RGBQUAD *colors ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetDIBColorTable ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); TRACE("(%p, %d, %d, %p)\n", dev, pos, count, colors); if( pdev->dib.color_table && pos < pdev->dib.color_table_size ) { if( pos + count > pdev->dib.color_table_size ) count = pdev->dib.color_table_size - pos; memcpy( pdev->dib.color_table + pos, colors, count * sizeof(RGBQUAD) ); pdev->bkgnd_color = get_pixel_color( pdev, GetBkColor( dev->hdc ), FALSE ); update_fg_colors( pdev ); update_masks( pdev, GetROP2( dev->hdc ) ); } return next->funcs->pSetDIBColorTable( next, pos, count, colors ); }
/*********************************************************************** * dibdrv_SelectBitmap */ static HBITMAP dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectBitmap ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); BITMAPOBJ *bmp = GDI_GetObjPtr( bitmap, OBJ_BITMAP ); TRACE("(%p, %p)\n", dev, bitmap); if (!bmp) return 0; free_dib_info(&pdev->dib); pdev->defer = 0; if(!init_dib_info_from_bitmapobj(&pdev->dib, bmp, private_color_table)) pdev->defer |= DEFER_FORMAT; GDI_ReleaseObj( bitmap ); return next->funcs->pSelectBitmap( next, bitmap ); }
/*********************************************************************** * dibdrv_SetBkColor */ static COLORREF dibdrv_SetBkColor( PHYSDEV dev, COLORREF color ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetBkColor ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); pdev->bkgnd_color = get_pixel_color( pdev, color, FALSE ); if( GetBkMode(dev->hdc) == OPAQUE ) calc_and_xor_masks( GetROP2(dev->hdc), pdev->bkgnd_color, &pdev->bkgnd_and, &pdev->bkgnd_xor ); else { pdev->bkgnd_and = ~0u; pdev->bkgnd_xor = 0; } update_fg_colors( pdev ); /* Only needed in the 1 bpp case */ return next->funcs->pSetBkColor( next, color ); }
/*********************************************************************** * dibdrv_SelectBitmap */ static HBITMAP dibdrv_SelectBitmap( PHYSDEV dev, HBITMAP bitmap ) { dibdrv_physdev *pdev = get_dibdrv_pdev(dev); BITMAPOBJ *bmp = GDI_GetObjPtr( bitmap, OBJ_BITMAP ); dib_info dib; TRACE("(%p, %p)\n", dev, bitmap); if (!bmp) return 0; if (!init_dib_info_from_bitmapobj(&dib, bmp)) { GDI_ReleaseObj( bitmap ); return 0; } pdev->dib = dib; GDI_ReleaseObj( bitmap ); return bitmap; }
/*********************************************************************** * dibdrv_SelectBrush */ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectBrush ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); LOGBRUSH logbrush; TRACE("(%p, %p)\n", dev, hbrush); if (!GetObjectW( hbrush, sizeof(logbrush), &logbrush )) return 0; if (hbrush == GetStockObject( DC_BRUSH )) logbrush.lbColor = GetDCBrushColor( dev->hdc ); pdev->brush_style = logbrush.lbStyle; pdev->defer |= DEFER_BRUSH; free_pattern_brush( pdev ); switch(logbrush.lbStyle) { case BS_SOLID: pdev->brush_colorref = logbrush.lbColor; pdev->brush_color = get_fg_color( pdev, pdev->brush_colorref ); calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor); pdev->brush_rects = solid_brush; pdev->defer &= ~DEFER_BRUSH; break; case BS_NULL: pdev->brush_rects = null_brush; pdev->defer &= ~DEFER_BRUSH; break; case BS_DIBPATTERN: { BITMAPINFOHEADER *bi = GlobalLock((HGLOBAL)logbrush.lbHatch); dib_info orig_dib; WORD usage = LOWORD(logbrush.lbColor); HPALETTE pal = (usage == DIB_PAL_COLORS) ? GetCurrentObject(dev->hdc, OBJ_PAL) : NULL; if(!bi) return NULL; if(init_dib_info_from_packed(&orig_dib, bi, usage, pal)) { copy_dib_color_info(&pdev->brush_dib, &pdev->dib); if(convert_dib(&pdev->brush_dib, &orig_dib)) { pdev->brush_rects = pattern_brush; pdev->defer &= ~DEFER_BRUSH; } free_dib_info(&orig_dib); } GlobalUnlock((HGLOBAL)logbrush.lbHatch); break; } case BS_HATCHED: { if(logbrush.lbHatch > HS_DIAGCROSS) return 0; pdev->brush_hatch = logbrush.lbHatch; pdev->brush_colorref = logbrush.lbColor; pdev->brush_color = get_fg_color( pdev, pdev->brush_colorref ); calc_and_xor_masks(GetROP2(dev->hdc), pdev->brush_color, &pdev->brush_and, &pdev->brush_xor); pdev->brush_rects = pattern_brush; pdev->defer &= ~DEFER_BRUSH; break; } default: break; } return next->funcs->pSelectBrush( next, hbrush ); }
/*********************************************************************** * dibdrv_SelectPen */ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectPen ); dibdrv_physdev *pdev = get_dibdrv_pdev(dev); LOGPEN logpen; DWORD style; TRACE("(%p, %p)\n", dev, hpen); 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 ); } if (hpen == GetStockObject( DC_PEN )) logpen.lopnColor = GetDCPenColor( dev->hdc ); pdev->pen_colorref = logpen.lopnColor; pdev->pen_color = get_fg_color( pdev, pdev->pen_colorref ); calc_and_xor_masks(GetROP2(dev->hdc), pdev->pen_color, &pdev->pen_and, &pdev->pen_xor); pdev->pen_pattern = dash_patterns[PS_SOLID]; pdev->defer |= DEFER_PEN; style = logpen.lopnStyle & PS_STYLE_MASK; switch(style) { case PS_SOLID: if(logpen.lopnStyle & PS_GEOMETRIC) break; if(logpen.lopnWidth.x > 1) break; pdev->pen_line = solid_pen_line; pdev->defer &= ~DEFER_PEN; break; case PS_DASH: case PS_DOT: case PS_DASHDOT: case PS_DASHDOTDOT: if(logpen.lopnStyle & PS_GEOMETRIC) break; if(logpen.lopnWidth.x > 1) break; pdev->pen_line = dashed_pen_line; pdev->pen_pattern = dash_patterns[style]; pdev->defer &= ~DEFER_PEN; break; case PS_NULL: pdev->pen_line = null_pen_line; pdev->defer &= ~DEFER_PEN; break; default: break; } return next->funcs->pSelectPen( next, hpen ); }