static void windrv_SetDeviceClipping( PHYSDEV dev, HRGN rgn ) { dev = GET_NEXT_PHYSDEV( dev, pSetDeviceClipping ); dev->funcs->pSetDeviceClipping( dev, rgn ); /* also forward to the graphics driver for the OpenGL case */ if (dev->funcs == &dib_driver) { dev = GET_NEXT_PHYSDEV( dev, pSetDeviceClipping ); dev->funcs->pSetDeviceClipping( dev, rgn ); } }
INT EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pExtSelectClipRgn ); EMREXTSELECTCLIPRGN *emr; DWORD size, rgnsize; BOOL ret; if (!hrgn) { if (mode != RGN_COPY) return ERROR; rgnsize = 0; } else rgnsize = GetRegionData( hrgn, 0, NULL ); size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData); emr = HeapAlloc( GetProcessHeap(), 0, size ); if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData ); emr->emr.iType = EMR_EXTSELECTCLIPRGN; emr->emr.nSize = size; emr->cbRgnData = rgnsize; emr->iMode = mode; ret = EMFDRV_WriteRecord( dev, &emr->emr ); HeapFree( GetProcessHeap(), 0, emr ); return ret ? next->funcs->pExtSelectClipRgn( next, hrgn, mode ) : ERROR; }
static DWORD windrv_GetImage( PHYSDEV dev, BITMAPINFO *info, struct gdi_image_bits *bits, struct bitblt_coords *src ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); DWORD ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pGetImage ); ret = dev->funcs->pGetImage( dev, info, bits, src ); /* don't return alpha if original surface doesn't support it */ if (info->bmiHeader.biBitCount == 32 && info->bmiHeader.biCompression == BI_RGB && physdev->dibdrv->dib.compression == BI_BITFIELDS) { DWORD *colors = (DWORD *)info->bmiColors; colors[0] = 0xff0000; colors[1] = 0x00ff00; colors[2] = 0x0000ff; info->bmiHeader.biCompression = BI_BITFIELDS; } if (!bits->is_copy) { /* use the freeing callback to unlock the surface */ assert( !bits->free ); bits->free = unlock_bits_surface; bits->param = physdev->surface; } else unlock_surface( physdev->surface ); return ret; }
/*********************************************************************** * 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_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_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_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 ); }
INT EMFDRV_SetMapMode( PHYSDEV dev, INT mode ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetMapMode ); EMRSETMAPMODE emr; emr.emr.iType = EMR_SETMAPMODE; emr.emr.nSize = sizeof(emr); emr.iMode = mode; if (!EMFDRV_WriteRecord( dev, &emr.emr )) return 0; return next->funcs->pSetMapMode( next, mode ); }
/********************************************************************** * X11DRV_wine_get_d3dadapter_driver */ static struct d3dadapter_funcs * X11DRV_wine_get_d3dadapter_driver( PHYSDEV dev, UINT version ) { struct d3dadapter_funcs *ret; if (!(ret = get_d3d_dri2_driver( version ))) { dev = GET_NEXT_PHYSDEV( dev, wine_get_d3dadapter_driver ); ret = dev->funcs->wine_get_d3dadapter_driver( dev, version ); } return ret; }
static BOOL windrv_Polyline( PHYSDEV dev, const POINT *points, INT count ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pPolyline ); ret = dev->funcs->pPolyline( dev, points, count ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_PaintRgn( PHYSDEV dev, HRGN rgn ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pPaintRgn ); ret = dev->funcs->pPaintRgn( dev, rgn ); unlock_surface( physdev->surface ); return ret; }
static COLORREF windrv_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); COLORREF ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pSetPixel ); ret = dev->funcs->pSetPixel( dev, x, y, color ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_PolyPolygon( PHYSDEV dev, const POINT *points, const INT *counts, UINT polygons ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pPolyPolygon ); ret = dev->funcs->pPolyPolygon( dev, points, counts, polygons ); unlock_surface( physdev->surface ); return ret; }
/********************************************************************** * X11DRV_wine_get_wgl_driver */ static struct opengl_funcs * X11DRV_wine_get_wgl_driver( PHYSDEV dev, UINT version ) { struct opengl_funcs *ret; if (!(ret = get_glx_driver( version ))) { dev = GET_NEXT_PHYSDEV( dev, wine_get_wgl_driver ); ret = dev->funcs->wine_get_wgl_driver( dev, version ); } return ret; }
static BOOL windrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pRectangle ); ret = dev->funcs->pRectangle( dev, left, top, right, bottom ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT type ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pExtFloodFill ); ret = dev->funcs->pExtFloodFill( dev, x, y, color, type ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pPatBlt ); ret = dev->funcs->pPatBlt( dev, dst, rop ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_LineTo( PHYSDEV dev, INT x, INT y ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pLineTo ); ret = dev->funcs->pLineTo( dev, x, y ); unlock_surface( physdev->surface ); return ret; }
BOOL EMFDRV_SetWorldTransform( PHYSDEV dev, const XFORM *xform) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSetWorldTransform ); EMRSETWORLDTRANSFORM emr; emr.emr.iType = EMR_SETWORLDTRANSFORM; emr.emr.nSize = sizeof(emr); emr.xform = *xform; if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE; return next->funcs->pSetWorldTransform( next, xform ); }
static BOOL windrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst, PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop ) { struct windrv_physdev *physdev = get_windrv_physdev( dst_dev ); BOOL ret; lock_surface( physdev->surface ); dst_dev = GET_NEXT_PHYSDEV( dst_dev, pStretchBlt ); ret = dst_dev->funcs->pStretchBlt( dst_dev, dst, src_dev, src, rop ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT ell_width, INT ell_height ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pRoundRect ); ret = dev->funcs->pRoundRect( dev, left, top, right, bottom, ell_width, ell_height ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_AlphaBlend( PHYSDEV dst_dev, struct bitblt_coords *dst, PHYSDEV src_dev, struct bitblt_coords *src, BLENDFUNCTION func ) { struct windrv_physdev *physdev = get_windrv_physdev( dst_dev ); BOOL ret; lock_surface( physdev->surface ); dst_dev = GET_NEXT_PHYSDEV( dst_dev, pAlphaBlend ); ret = dst_dev->funcs->pAlphaBlend( dst_dev, dst, src_dev, src, func ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_Pie( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pPie ); ret = dev->funcs->pPie( dev, left, top, right, bottom, xstart, ystart, xend, yend ); unlock_surface( physdev->surface ); return ret; }
BOOL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectClipPath ); EMRSELECTCLIPPATH emr; emr.emr.iType = EMR_SELECTCLIPPATH; emr.emr.nSize = sizeof(emr); emr.iMode = iMode; if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE; return next->funcs->pSelectClipPath( next, iMode ); }
static BOOL windrv_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert, void * grad_array, ULONG ngrad, ULONG mode ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pGradientFill ); ret = dev->funcs->pGradientFill( dev, vert_array, nvert, grad_array, ngrad, mode ); unlock_surface( physdev->surface ); return ret; }
INT EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetClipRgn ); EMROFFSETCLIPRGN emr; emr.emr.iType = EMR_OFFSETCLIPRGN; emr.emr.nSize = sizeof(emr); emr.ptlOffset.x = x; emr.ptlOffset.y = y; if (!EMFDRV_WriteRecord( dev, &emr.emr )) return ERROR; return next->funcs->pOffsetClipRgn( next, x, y ); }
static DWORD windrv_BlendImage( PHYSDEV dev, BITMAPINFO *info, const struct gdi_image_bits *bits, struct bitblt_coords *src, struct bitblt_coords *dst, BLENDFUNCTION blend ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); DWORD ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pBlendImage ); ret = dev->funcs->pBlendImage( dev, info, bits, src, dst, blend ); unlock_surface( physdev->surface ); return ret; }
static BOOL windrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *rect, LPCWSTR str, UINT count, const INT *dx ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); BOOL ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pExtTextOut ); ret = dev->funcs->pExtTextOut( dev, x, y, flags, rect, str, count, dx ); unlock_surface( physdev->surface ); return ret; }
static DWORD windrv_PutImage( PHYSDEV dev, HRGN clip, BITMAPINFO *info, const struct gdi_image_bits *bits, struct bitblt_coords *src, struct bitblt_coords *dst, DWORD rop ) { struct windrv_physdev *physdev = get_windrv_physdev( dev ); DWORD ret; lock_surface( physdev->surface ); dev = GET_NEXT_PHYSDEV( dev, pPutImage ); ret = dev->funcs->pPutImage( dev, clip, info, bits, src, dst, rop ); unlock_surface( physdev->surface ); return ret; }
BOOL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD mode) { PHYSDEV next = GET_NEXT_PHYSDEV( dev, pModifyWorldTransform ); EMRMODIFYWORLDTRANSFORM emr; emr.emr.iType = EMR_MODIFYWORLDTRANSFORM; emr.emr.nSize = sizeof(emr); emr.xform = *xform; emr.iMode = mode; if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE; return next->funcs->pModifyWorldTransform( next, xform, mode ); }