1*9f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*9f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*9f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*9f62ea84SAndrew Rist * distributed with this work for additional information 6*9f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*9f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*9f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 9*9f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*9f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*9f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*9f62ea84SAndrew Rist * software distributed under the License is distributed on an 15*9f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 17*9f62ea84SAndrew Rist * specific language governing permissions and limitations 18*9f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*9f62ea84SAndrew Rist *************************************************************/ 21*9f62ea84SAndrew Rist 22*9f62ea84SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include <string.h> 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include <svpm.h> 27cdf0e10cSrcweir 28cdf0e10cSrcweir #define _SV_SALVD_CXX 29cdf0e10cSrcweir #include <saldata.hxx> 30cdf0e10cSrcweir #include <salinst.h> 31cdf0e10cSrcweir #include <salgdi.h> 32cdf0e10cSrcweir #include <salvd.h> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #ifndef __H_FT2LIB 35cdf0e10cSrcweir #include <wingdi.h> 36cdf0e10cSrcweir #include <ft2lib.h> 37cdf0e10cSrcweir #endif 38cdf0e10cSrcweir 39cdf0e10cSrcweir // ======================================================================= 40cdf0e10cSrcweir 41cdf0e10cSrcweir HBITMAP ImplCreateVirDevBitmap( HDC hDC, HPS hPS, long nDX, long nDY, 42cdf0e10cSrcweir USHORT nBitCount ) 43cdf0e10cSrcweir { 44cdf0e10cSrcweir if( !nBitCount ) 45cdf0e10cSrcweir { 46cdf0e10cSrcweir LONG nDevBitCount; 47cdf0e10cSrcweir DevQueryCaps( hDC, CAPS_COLOR_BITCOUNT, 1, &nDevBitCount ); 48cdf0e10cSrcweir nBitCount = nDevBitCount; 49cdf0e10cSrcweir } 50cdf0e10cSrcweir 51cdf0e10cSrcweir LONG nPlanes; 52cdf0e10cSrcweir DevQueryCaps( hDC, CAPS_COLOR_PLANES, 1, &nPlanes ); 53cdf0e10cSrcweir 54cdf0e10cSrcweir // entsprechende Bitmap zum OutputDevice erzeugen 55cdf0e10cSrcweir HBITMAP hBitmap; 56cdf0e10cSrcweir BITMAPINFOHEADER2 aBitmapInfo; 57cdf0e10cSrcweir memset( &aBitmapInfo, 0, sizeof( BITMAPINFOHEADER2 ) ); 58cdf0e10cSrcweir aBitmapInfo.cbFix = sizeof( BITMAPINFOHEADER2 ); 59cdf0e10cSrcweir aBitmapInfo.cx = nDX; 60cdf0e10cSrcweir aBitmapInfo.cy = nDY; 61cdf0e10cSrcweir aBitmapInfo.cPlanes = nPlanes; 62cdf0e10cSrcweir aBitmapInfo.cBitCount = (nBitCount < 4) ? 4 : nBitCount; 63cdf0e10cSrcweir hBitmap = GpiCreateBitmap( hPS, &aBitmapInfo, 0, NULL, NULL ); 64cdf0e10cSrcweir return hBitmap; 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir // ----------------------------------------------------------------------- 68cdf0e10cSrcweir 69cdf0e10cSrcweir SalVirtualDevice* Os2SalInstance::CreateVirtualDevice( SalGraphics* pSGraphics, 70cdf0e10cSrcweir long nDX, long nDY, 71cdf0e10cSrcweir USHORT nBitCount, 72cdf0e10cSrcweir const SystemGraphicsData* pData ) 73cdf0e10cSrcweir { 74cdf0e10cSrcweir Os2SalGraphics* pGraphics = static_cast<Os2SalGraphics*>(pSGraphics); 75cdf0e10cSrcweir HAB hAB = GetSalData()->mhAB; 76cdf0e10cSrcweir SIZEL size; 77cdf0e10cSrcweir 78cdf0e10cSrcweir // create device context (at this time allways display compatible) 79cdf0e10cSrcweir DEVOPENSTRUC aDevOpenStruc = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL }; 80cdf0e10cSrcweir HDC hDC = DevOpenDC( hAB, OD_MEMORY, (PSZ)"*", 5, (PDEVOPENDATA)&aDevOpenStruc, 0 ); 81cdf0e10cSrcweir if ( !hDC ) 82cdf0e10cSrcweir return NULL; 83cdf0e10cSrcweir 84cdf0e10cSrcweir // create presentation space 85cdf0e10cSrcweir size.cx = nDX; 86cdf0e10cSrcweir size.cy = nDY; 87cdf0e10cSrcweir HPS hPS = Ft2CreatePS( hAB, hDC, &size, GPIT_MICRO | GPIA_ASSOC | PU_PELS ); 88cdf0e10cSrcweir if ( !hPS ) 89cdf0e10cSrcweir { 90cdf0e10cSrcweir DevCloseDC( hDC ); 91cdf0e10cSrcweir return NULL; 92cdf0e10cSrcweir } 93cdf0e10cSrcweir 94cdf0e10cSrcweir // create bitmap for the virtual device 95cdf0e10cSrcweir HBITMAP hBmp = ImplCreateVirDevBitmap( hDC, hPS, nDX, nDY, nBitCount ); 96cdf0e10cSrcweir if ( !hBmp ) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir Ft2DestroyPS( hPS ); 99cdf0e10cSrcweir DevCloseDC( hDC ); 100cdf0e10cSrcweir return NULL; 101cdf0e10cSrcweir } 102cdf0e10cSrcweir 103cdf0e10cSrcweir // init data 104cdf0e10cSrcweir Os2SalVirtualDevice* pVDev = new Os2SalVirtualDevice; 105cdf0e10cSrcweir Os2SalGraphics* pVirGraphics = new Os2SalGraphics; 106cdf0e10cSrcweir 107cdf0e10cSrcweir pVirGraphics->mhDC = hDC; 108cdf0e10cSrcweir pVirGraphics->mhPS = hPS; 109cdf0e10cSrcweir pVirGraphics->mhWnd = 0; 110cdf0e10cSrcweir pVirGraphics->mnHeight = nDY; 111cdf0e10cSrcweir pVirGraphics->mbPrinter = FALSE; 112cdf0e10cSrcweir pVirGraphics->mbVirDev = TRUE; 113cdf0e10cSrcweir pVirGraphics->mbWindow = FALSE; 114cdf0e10cSrcweir pVirGraphics->mbScreen = pGraphics->mbScreen; 115cdf0e10cSrcweir ImplSalInitGraphics( pVirGraphics ); 116cdf0e10cSrcweir 117cdf0e10cSrcweir pVDev->mhDC = hDC; 118cdf0e10cSrcweir pVDev->mhPS = hPS; 119cdf0e10cSrcweir pVDev->mhBmp = hBmp; 120cdf0e10cSrcweir pVDev->mhDefBmp = Ft2SetBitmap( hPS, hBmp ); 121cdf0e10cSrcweir pVDev->mpGraphics = pVirGraphics; 122cdf0e10cSrcweir pVDev->mnBitCount = nBitCount; 123cdf0e10cSrcweir pVDev->mbGraphics = FALSE; 124cdf0e10cSrcweir return pVDev; 125cdf0e10cSrcweir } 126cdf0e10cSrcweir 127cdf0e10cSrcweir // ----------------------------------------------------------------------- 128cdf0e10cSrcweir 129cdf0e10cSrcweir void Os2SalInstance::DestroyVirtualDevice( SalVirtualDevice* pDevice ) 130cdf0e10cSrcweir { 131cdf0e10cSrcweir delete pDevice; 132cdf0e10cSrcweir } 133cdf0e10cSrcweir 134cdf0e10cSrcweir // ======================================================================= 135cdf0e10cSrcweir 136cdf0e10cSrcweir Os2SalVirtualDevice::Os2SalVirtualDevice() 137cdf0e10cSrcweir { 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir // ----------------------------------------------------------------------- 141cdf0e10cSrcweir 142cdf0e10cSrcweir Os2SalVirtualDevice::~Os2SalVirtualDevice() 143cdf0e10cSrcweir { 144cdf0e10cSrcweir ImplSalDeInitGraphics( mpGraphics ); 145cdf0e10cSrcweir 146cdf0e10cSrcweir Ft2SetBitmap( mpGraphics->mhPS, mhDefBmp ); 147cdf0e10cSrcweir GpiDeleteBitmap( mhBmp ); 148cdf0e10cSrcweir Ft2DestroyPS( mpGraphics->mhPS ); 149cdf0e10cSrcweir DevCloseDC( mpGraphics->mhDC ); 150cdf0e10cSrcweir delete mpGraphics; 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir // ----------------------------------------------------------------------- 154cdf0e10cSrcweir 155cdf0e10cSrcweir SalGraphics* Os2SalVirtualDevice::GetGraphics() 156cdf0e10cSrcweir { 157cdf0e10cSrcweir if ( mbGraphics ) 158cdf0e10cSrcweir return NULL; 159cdf0e10cSrcweir 160cdf0e10cSrcweir if ( mpGraphics ) 161cdf0e10cSrcweir mbGraphics = TRUE; 162cdf0e10cSrcweir 163cdf0e10cSrcweir return mpGraphics; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir // ----------------------------------------------------------------------- 167cdf0e10cSrcweir 168cdf0e10cSrcweir void Os2SalVirtualDevice::ReleaseGraphics( SalGraphics* ) 169cdf0e10cSrcweir { 170cdf0e10cSrcweir mbGraphics = FALSE; 171cdf0e10cSrcweir } 172cdf0e10cSrcweir 173cdf0e10cSrcweir // ----------------------------------------------------------------------- 174cdf0e10cSrcweir 175cdf0e10cSrcweir BOOL Os2SalVirtualDevice::SetSize( long nDX, long nDY ) 176cdf0e10cSrcweir { 177cdf0e10cSrcweir HBITMAP hNewBmp = ImplCreateVirDevBitmap( mhDC, 178cdf0e10cSrcweir mhPS, nDX, nDY, 179cdf0e10cSrcweir mnBitCount ); 180cdf0e10cSrcweir if ( hNewBmp ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir Ft2SetBitmap( mhPS, hNewBmp ); 183cdf0e10cSrcweir GpiDeleteBitmap( mhBmp ); 184cdf0e10cSrcweir mhBmp = hNewBmp; 185cdf0e10cSrcweir mpGraphics->mnHeight = nDY; 186cdf0e10cSrcweir return TRUE; 187cdf0e10cSrcweir } 188cdf0e10cSrcweir else 189cdf0e10cSrcweir return FALSE; 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir void Os2SalVirtualDevice::GetSize( long& rWidth, long& rHeight ) 193cdf0e10cSrcweir { 194cdf0e10cSrcweir DevQueryCaps( mpGraphics->mhDC, CAPS_WIDTH, CAPS_WIDTH, (LONG*)rWidth ); 195cdf0e10cSrcweir DevQueryCaps( mpGraphics->mhDC, CAPS_HEIGHT, CAPS_HEIGHT, (LONG*)rHeight ); 196cdf0e10cSrcweir } 197