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