INT nulldrv_SetMapMode( PHYSDEV dev, INT mode ) { DC *dc = get_nulldrv_dc( dev ); INT ret = dc->MapMode; INT horzSize, vertSize, horzRes, vertRes; if (mode == dc->MapMode && (mode == MM_ISOTROPIC || mode == MM_ANISOTROPIC)) return ret; horzSize = dc->virtual_size.cx; vertSize = dc->virtual_size.cy; horzRes = dc->virtual_res.cx; vertRes = dc->virtual_res.cy; switch (mode) { case MM_TEXT: dc->wndExtX = 1; dc->wndExtY = 1; dc->vportExtX = 1; dc->vportExtY = 1; break; case MM_LOMETRIC: case MM_ISOTROPIC: dc->wndExtX = horzSize * 10; dc->wndExtY = vertSize * 10; dc->vportExtX = horzRes; dc->vportExtY = -vertRes; break; case MM_HIMETRIC: dc->wndExtX = horzSize * 100; dc->wndExtY = vertSize * 100; dc->vportExtX = horzRes; dc->vportExtY = -vertRes; break; case MM_LOENGLISH: dc->wndExtX = MulDiv(1000, horzSize, 254); dc->wndExtY = MulDiv(1000, vertSize, 254); dc->vportExtX = horzRes; dc->vportExtY = -vertRes; break; case MM_HIENGLISH: dc->wndExtX = MulDiv(10000, horzSize, 254); dc->wndExtY = MulDiv(10000, vertSize, 254); dc->vportExtX = horzRes; dc->vportExtY = -vertRes; break; case MM_TWIPS: dc->wndExtX = MulDiv(14400, horzSize, 254); dc->wndExtY = MulDiv(14400, vertSize, 254); dc->vportExtX = horzRes; dc->vportExtY = -vertRes; break; case MM_ANISOTROPIC: break; default: return 0; } /* RTL layout is always MM_ANISOTROPIC */ if (!(dc->layout & LAYOUT_RTL)) dc->MapMode = mode; DC_UpdateXforms( dc ); return ret; }
/*********************************************************************** * SetMapMode (GDI32.@) */ INT WINAPI SetMapMode( HDC hdc, INT mode ) { INT prevMode; INT horzSize, vertSize, horzRes, vertRes; DC * dc = DC_GetDCPtr( hdc ); if (!dc) return 0; if (dc->funcs->pSetMapMode) { prevMode = dc->funcs->pSetMapMode( dc, mode ); goto done; } TRACE("%04x %d\n", hdc, mode ); prevMode = dc->MapMode; horzSize = GetDeviceCaps( hdc, HORZSIZE ); vertSize = GetDeviceCaps( hdc, VERTSIZE ); horzRes = GetDeviceCaps( hdc, HORZRES ); vertRes = GetDeviceCaps( hdc, VERTRES ); switch(mode) { case MM_TEXT: dc->wndExtX = 1; dc->wndExtY = 1; dc->vportExtX = 1; dc->vportExtY = 1; break; case MM_LOMETRIC: case MM_ISOTROPIC: dc->wndExtX = horzSize; dc->wndExtY = vertSize; dc->vportExtX = horzRes / 10; dc->vportExtY = vertRes / -10; break; case MM_HIMETRIC: dc->wndExtX = horzSize * 10; dc->wndExtY = vertSize * 10; dc->vportExtX = horzRes / 10; dc->vportExtY = vertRes / -10; break; case MM_LOENGLISH: dc->wndExtX = horzSize; dc->wndExtY = vertSize; dc->vportExtX = 254L * horzRes / 1000; dc->vportExtY = -254L * vertRes / 1000; break; case MM_HIENGLISH: dc->wndExtX = horzSize * 10; dc->wndExtY = vertSize * 10; dc->vportExtX = 254L * horzRes / 1000; dc->vportExtY = -254L * vertRes / 1000; break; case MM_TWIPS: dc->wndExtX = 144L * horzSize / 10; dc->wndExtY = 144L * vertSize / 10; dc->vportExtX = 254L * horzRes / 1000; dc->vportExtY = -254L * vertRes / 1000; break; case MM_ANISOTROPIC: break; default: goto done; } dc->MapMode = mode; DC_UpdateXforms( dc ); done: GDI_ReleaseObj( hdc ); return prevMode; }