/****************************************************************** * EMFDRV_SelectPalette */ HPALETTE EMFDRV_SelectPalette( PHYSDEV dev, HPALETTE hPal, BOOL force ) { EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*)dev; EMRSELECTPALETTE emr; DWORD index; if (physDev->restoring) return hPal; /* don't output SelectObject records during RestoreDC */ if (hPal == GetStockObject( DEFAULT_PALETTE )) { index = DEFAULT_PALETTE | 0x80000000; goto found; } if ((index = EMFDRV_FindObject( dev, hPal )) != 0) goto found; if (!(index = EMFDRV_CreatePalette( dev, hPal ))) return 0; GDI_hdc_using_object( hPal, dev->hdc ); found: emr.emr.iType = EMR_SELECTPALETTE; emr.emr.nSize = sizeof(emr); emr.ihPal = index; return EMFDRV_WriteRecord( dev, &emr.emr ) ? hPal : 0; }
/****************************************************************** * EMFDRV_SelectPen */ HPEN EMFDRV_SelectPen(PHYSDEV dev, HPEN hPen, const struct brush_pattern *pattern ) { EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*)dev; EMRSELECTOBJECT emr; DWORD index; int i; if (physDev->restoring) return hPen; /* don't output SelectObject records during RestoreDC */ /* If the object is a stock pen object, do not need to create it. * See definitions in wingdi.h for range of stock pens. * We do however have to handle setting the higher order bit to * designate that this is a stock object. */ for (i = WHITE_PEN; i <= DC_PEN; i++) { if (hPen == GetStockObject(i)) { index = i | 0x80000000; goto found; } } if((index = EMFDRV_FindObject(dev, hPen)) != 0) goto found; if (!(index = EMFDRV_CreatePenIndirect(dev, hPen))) return 0; GDI_hdc_using_object(hPen, dev->hdc); found: emr.emr.iType = EMR_SELECTOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; return EMFDRV_WriteRecord( dev, &emr.emr ) ? hPen : 0; }
/*********************************************************************** * EMFDRV_SelectBrush */ HBRUSH EMFDRV_SelectBrush( PHYSDEV dev, HBRUSH hBrush, HBITMAP bitmap, const BITMAPINFO *info, void *bits, UINT usage ) { EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*)dev; EMRSELECTOBJECT emr; DWORD index; int i; if (physDev->restoring) return hBrush; /* don't output SelectObject records during RestoreDC */ /* If the object is a stock brush object, do not need to create it. * See definitions in wingdi.h for range of stock brushes. * We do however have to handle setting the higher order bit to * designate that this is a stock object. */ for (i = WHITE_BRUSH; i <= DC_BRUSH; i++) { if (hBrush == GetStockObject(i)) { index = i | 0x80000000; goto found; } } if((index = EMFDRV_FindObject(dev, hBrush)) != 0) goto found; if (!(index = EMFDRV_CreateBrushIndirect(dev, hBrush ))) return 0; GDI_hdc_using_object(hBrush, dev->hdc); found: emr.emr.iType = EMR_SELECTOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; return EMFDRV_WriteRecord( dev, &emr.emr ) ? hBrush : 0; }
/*********************************************************************** * EMFDRV_SelectFont */ HFONT EMFDRV_SelectFont( PHYSDEV dev, HFONT hFont, UINT *aa_flags ) { EMFDRV_PDEVICE *physDev = get_emf_physdev( dev ); EMRSELECTOBJECT emr; DWORD index; int i; if (physDev->restoring) goto done; /* don't output SelectObject records during RestoreDC */ /* If the object is a stock font object, do not need to create it. * See definitions in wingdi.h for range of stock fonts. * We do however have to handle setting the higher order bit to * designate that this is a stock object. */ for (i = OEM_FIXED_FONT; i <= DEFAULT_GUI_FONT; i++) { if (i != DEFAULT_PALETTE && hFont == GetStockObject(i)) { index = i | 0x80000000; goto found; } } if((index = EMFDRV_FindObject(dev, hFont)) != 0) goto found; if (!(index = EMFDRV_CreateFontIndirect(dev, hFont ))) return 0; GDI_hdc_using_object(hFont, dev->hdc); found: emr.emr.iType = EMR_SELECTOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; if(!EMFDRV_WriteRecord( dev, &emr.emr )) return 0; done: *aa_flags = GGO_BITMAP; /* no point in anti-aliasing on metafiles */ dev = GET_NEXT_PHYSDEV( dev, pSelectFont ); dev->funcs->pSelectFont( dev, hFont, aa_flags ); return hFont; }
/****************************************************************** * EMFDRV_DeleteObject */ BOOL EMFDRV_DeleteObject( PHYSDEV dev, HGDIOBJ obj ) { EMRDELETEOBJECT emr; EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev; UINT index; BOOL ret = TRUE; if(!(index = EMFDRV_FindObject(dev, obj))) return 0; emr.emr.iType = EMR_DELETEOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; if(!EMFDRV_WriteRecord( dev, &emr.emr )) ret = FALSE; physDev->handles[index - 1] = 0; physDev->cur_handles--; return ret; }
/*********************************************************************** * EMFDRV_SelectFont */ HFONT CDECL EMFDRV_SelectFont( PHYSDEV dev, HFONT hFont, HANDLE gdiFont ) { EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*)dev; EMRSELECTOBJECT emr; DWORD index; int i; if (physDev->restoring) return 0; /* don't output SelectObject records during RestoreDC */ /* If the object is a stock font object, do not need to create it. * See definitions in wingdi.h for range of stock fonts. * We do however have to handle setting the higher order bit to * designate that this is a stock object. */ for (i = OEM_FIXED_FONT; i <= DEFAULT_GUI_FONT; i++) { if (i != DEFAULT_PALETTE && hFont == GetStockObject(i)) { index = i | 0x80000000; goto found; } } if((index = EMFDRV_FindObject(dev, hFont)) != 0) goto found; if (!(index = EMFDRV_CreateFontIndirect(dev, hFont ))) return HGDI_ERROR; GDI_hdc_using_object(hFont, physDev->hdc); found: emr.emr.iType = EMR_SELECTOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; if(!EMFDRV_WriteRecord( dev, &emr.emr )) return HGDI_ERROR; return 0; }