1 | /***************************************************************************\
|
---|
2 | *
|
---|
3 | * Module Name: DIVE.H
|
---|
4 | *
|
---|
5 | * OS/2 2.1 Multimedia Extensions Display Engine API data structures
|
---|
6 | *
|
---|
7 | * Copyright (c) International Business Machines Corporation 1993, 1994
|
---|
8 | * All Rights Reserved
|
---|
9 | *
|
---|
10 | *
|
---|
11 | \****************************************************************************/
|
---|
12 | #ifdef __cplusplus
|
---|
13 | extern "C" {
|
---|
14 | #endif
|
---|
15 |
|
---|
16 | #ifndef _DIVE_H_
|
---|
17 | #define _DIVE_H_
|
---|
18 |
|
---|
19 | #define MAX_DIVE_INSTANCES 64
|
---|
20 |
|
---|
21 | #define FOURCC ULONG
|
---|
22 | #define HDIVE ULONG
|
---|
23 |
|
---|
24 | #define DIVE_SUCCESS 0x00000000
|
---|
25 | #define DIVE_ERR_INVALID_INSTANCE 0x00001000
|
---|
26 | #define DIVE_ERR_SOURCE_FORMAT 0x00001001
|
---|
27 | #define DIVE_ERR_DESTINATION_FORMAT 0x00001002
|
---|
28 | #define DIVE_ERR_BLITTER_NOT_SETUP 0x00001003
|
---|
29 | #define DIVE_ERR_INSUFFICIENT_LENGTH 0x00001004
|
---|
30 | #define DIVE_ERR_TOO_MANY_INSTANCES 0x00001005
|
---|
31 | #define DIVE_ERR_NO_DIRECT_ACCESS 0x00001006
|
---|
32 | #define DIVE_ERR_NOT_BANK_SWITCHED 0x00001007
|
---|
33 | #define DIVE_ERR_INVALID_BANK_NUMBER 0x00001008
|
---|
34 | #define DIVE_ERR_FB_NOT_ACQUIRED 0x00001009
|
---|
35 | #define DIVE_ERR_FB_ALREADY_ACQUIRED 0x0000100a
|
---|
36 | #define DIVE_ERR_ACQUIRE_FAILED 0x0000100b
|
---|
37 | #define DIVE_ERR_BANK_SWITCH_FAILED 0x0000100c
|
---|
38 | #define DIVE_ERR_DEACQUIRE_FAILED 0x0000100d
|
---|
39 | #define DIVE_ERR_INVALID_PALETTE 0x0000100e
|
---|
40 | #define DIVE_ERR_INVALID_DESTINATION_RECTL 0x0000100f
|
---|
41 | #define DIVE_ERR_INVALID_BUFFER_NUMBER 0x00001010
|
---|
42 | #define DIVE_ERR_SSMDD_NOT_INSTALLED 0x00001011
|
---|
43 | #define DIVE_ERR_BUFFER_ALREADY_ACCESSED 0x00001012
|
---|
44 | #define DIVE_ERR_BUFFER_NOT_ACCESSED 0x00001013
|
---|
45 | #define DIVE_ERR_TOO_MANY_BUFFERS 0x00001014
|
---|
46 | #define DIVE_ERR_ALLOCATION_ERROR 0x00001015
|
---|
47 | #define DIVE_ERR_INVALID_LINESIZE 0x00001016
|
---|
48 | #define DIVE_ERR_FATAL_EXCEPTION 0x00001017
|
---|
49 | #define DIVE_ERR_INVALID_CONVERSION 0x00001018
|
---|
50 | #define DIVE_ERR_VSD_ERROR 0x00001019
|
---|
51 | #define DIVE_ERR_COLOR_SUPPORT 0x0000101a
|
---|
52 | #define DIVE_ERR_OUT_OF_RANGE 0x0000101b
|
---|
53 | #define DIVE_WARN_NO_SIZE 0x00001100
|
---|
54 |
|
---|
55 | #define DIVE_BUFFER_SCREEN 0x00000000
|
---|
56 | #define DIVE_BUFFER_GRAPHICS_PLANE 0x00000001
|
---|
57 | #define DIVE_BUFFER_ALTERNATE_PLANE 0x00000002
|
---|
58 |
|
---|
59 | #define DIVE_FULLY_VISIBLE 0xffffffff
|
---|
60 |
|
---|
61 |
|
---|
62 | /* Notes:
|
---|
63 | Associated/Allocated memory buffers start at: 0x00000010
|
---|
64 |
|
---|
65 | Specifing DIVE_BUFFER_GRAPHICS_PLANE results in the image being
|
---|
66 | transferred to the graphics plane.
|
---|
67 | Specifing DIVE_BUFFER_ALTERNATE_PLANE results in the image being
|
---|
68 | transferred to the alternate (e.g. overlay) plane. If your
|
---|
69 | hardware doesn't support such a plane, this is an error.
|
---|
70 | Specifing DIVE_BUFFER_SCREEN will result in the image being
|
---|
71 | transferred to either the graphics plane buffer or the alternate
|
---|
72 | plane buffer based on if an alternate buffer exists and based on
|
---|
73 | the suitability the overlay plane to accelerate the scaling of
|
---|
74 | the image. If DIVE chooses to use the alternate buffer, it
|
---|
75 | will also paint the overlay "key" color on the graphics plane.
|
---|
76 | This automatic painting does not occur if the alternate plane
|
---|
77 | is explicitly specified.
|
---|
78 | */
|
---|
79 |
|
---|
80 |
|
---|
81 |
|
---|
82 | typedef struct _DIVE_CAPS {
|
---|
83 |
|
---|
84 | ULONG ulStructLen; /* Set equal to sizeof(DIVE_CAPS) */
|
---|
85 | ULONG ulPlaneCount; /* Number of defined planes. */
|
---|
86 |
|
---|
87 | /* Info returned in the following fields pertains to ulPlaneID. */
|
---|
88 | BOOL fScreenDirect; /* TRUE if can get addressability to vram. */
|
---|
89 | BOOL fBankSwitched; /* TRUE if vram is bank-switched. */
|
---|
90 | ULONG ulDepth; /* Number of bits per pixel. */
|
---|
91 | ULONG ulHorizontalResolution; /* Screen width in pixels. */
|
---|
92 | ULONG ulVerticalResolution; /* Screen height in pixels. */
|
---|
93 | ULONG ulScanLineBytes; /* Screen scan line size in bytes. */
|
---|
94 | FOURCC fccColorEncoding; /* Colorspace encoding of the screen. */
|
---|
95 | ULONG ulApertureSize; /* Size of vram aperture in bytes. */
|
---|
96 |
|
---|
97 | ULONG ulInputFormats; /* Number of input color formats. */
|
---|
98 | ULONG ulOutputFormats; /* Number of output color formats. */
|
---|
99 | ULONG ulFormatLength; /* Length of format buffer. */
|
---|
100 | PVOID pFormatData; /* Pointer to color format buffer FOURCC's.*/
|
---|
101 |
|
---|
102 | } DIVE_CAPS;
|
---|
103 | typedef DIVE_CAPS *PDIVE_CAPS;
|
---|
104 |
|
---|
105 |
|
---|
106 |
|
---|
107 |
|
---|
108 | typedef struct _SETUP_BLITTER {
|
---|
109 |
|
---|
110 | /* Set the ulStructLen field equal to the amount of the structure used. */
|
---|
111 | /* allowable: blank lines below mark sizes of 8, 28, 32, 52, 60, or 68. */
|
---|
112 | ULONG ulStructLen;
|
---|
113 | /* Set the ulInvert flags based on the following: */
|
---|
114 | /* b0001 = d01 = h01 = flip the image in the horizontal direction. */
|
---|
115 | /* b0010 = d02 = h02 = flip the image in the vertical direction. */
|
---|
116 | /* All other bits ignored. */
|
---|
117 | ULONG fInvert;
|
---|
118 |
|
---|
119 | /* This is the color format of the source data. See "FOURCC.H" */
|
---|
120 | FOURCC fccSrcColorFormat;
|
---|
121 | /* This is the width of the source image in pixels. */
|
---|
122 | ULONG ulSrcWidth;
|
---|
123 | /* This is the height of the source image in pixels. */
|
---|
124 | ULONG ulSrcHeight;
|
---|
125 | /* This is the horizontal offset from which to start displaying for */
|
---|
126 | /* use in displaying a sub-portion of the source image. */
|
---|
127 | ULONG ulSrcPosX;
|
---|
128 | /* This is the vertical offset from which to start displaying. */
|
---|
129 | ULONG ulSrcPosY;
|
---|
130 |
|
---|
131 | /* This is the dither type to use. 0 defines no dither and 1 */
|
---|
132 | /* defines 2x2 dither (all others ignored). Note: dithering is only */
|
---|
133 | /* supported in direct color to LUT8 conversions. */
|
---|
134 | ULONG ulDitherType;
|
---|
135 |
|
---|
136 | /* This is the color format of the destinaion data. See "FOURCC.H" */
|
---|
137 | FOURCC fccDstColorFormat;
|
---|
138 | /* This is the width of the destination image in pixels. */
|
---|
139 | ULONG ulDstWidth;
|
---|
140 | /* This is the height of the destination image in pixels. */
|
---|
141 | ULONG ulDstHeight;
|
---|
142 | /* This is the horizontal offset from which to start displaying for */
|
---|
143 | /* use in displaying to sub-portion of the destination image. */
|
---|
144 | LONG lDstPosX;
|
---|
145 | /* This is the vertical offset from which to start displaying. */
|
---|
146 | LONG lDstPosY;
|
---|
147 |
|
---|
148 | /* This is the world screen horizontal position, where 0 is left. */
|
---|
149 | /* These are ignored if the destination is not the screen. */
|
---|
150 | LONG lScreenPosX;
|
---|
151 | /* This is the world screen vertical position, where 0 is bottom. */
|
---|
152 | LONG lScreenPosY;
|
---|
153 |
|
---|
154 | /* This is the number of visible rectangular regions being passed in. */
|
---|
155 | /* These are ignored if the destination is not the screen. */
|
---|
156 | /* Also, if you application *KNOWS* that the region is fully visible */
|
---|
157 | /* (like not going to the screen), the you can use DIVE_FULLY_VISIBLE */
|
---|
158 | /* instead of making up a bogus visible region structure. */
|
---|
159 | ULONG ulNumDstRects;
|
---|
160 | /* This points to an array of visible regions which defines what */
|
---|
161 | /* portions of the source image are to be displayed. */
|
---|
162 | PRECTL pVisDstRects; /* Pointer to array of visible rectangles. */
|
---|
163 |
|
---|
164 | } SETUP_BLITTER;
|
---|
165 | typedef SETUP_BLITTER *PSETUP_BLITTER;
|
---|
166 |
|
---|
167 |
|
---|
168 |
|
---|
169 | ULONG APIENTRY DiveQueryCaps ( PDIVE_CAPS pDiveCaps,
|
---|
170 | ULONG ulPlaneBufNum );
|
---|
171 |
|
---|
172 | ULONG APIENTRY DiveOpen ( HDIVE *phDiveInst,
|
---|
173 | BOOL fNonScreenInstance,
|
---|
174 | PVOID ppFrameBuffer );
|
---|
175 |
|
---|
176 | ULONG APIENTRY DiveSetupBlitter ( HDIVE hDiveInst,
|
---|
177 | PSETUP_BLITTER pSetupBlitter );
|
---|
178 |
|
---|
179 | ULONG APIENTRY DiveBlitImage ( HDIVE hDiveInst,
|
---|
180 | ULONG ulSrcBufNumber,
|
---|
181 | ULONG ulDstBufNumber );
|
---|
182 |
|
---|
183 | #ifdef INCL_MM_OS2
|
---|
184 | /* Same as DiveBlitImage, except pbLineMask points to one byte per line */
|
---|
185 | /* in source image buffer such that 0: unchanged, 0xFF: changed */
|
---|
186 | ULONG APIENTRY DiveBlitImageLines ( HDIVE hDiveInst,
|
---|
187 | ULONG ulSrcBufNumber,
|
---|
188 | ULONG ulDstBufNumber,
|
---|
189 | PBYTE pbLineMask );
|
---|
190 | #endif
|
---|
191 |
|
---|
192 | ULONG APIENTRY DiveClose ( HDIVE hDiveInst );
|
---|
193 |
|
---|
194 | ULONG APIENTRY DiveAcquireFrameBuffer ( HDIVE hDiveInst,
|
---|
195 | PRECTL prectlDst );
|
---|
196 |
|
---|
197 | ULONG APIENTRY DiveSwitchBank ( HDIVE hDiveInst,
|
---|
198 | ULONG ulBankNumber );
|
---|
199 |
|
---|
200 | ULONG APIENTRY DiveDeacquireFrameBuffer ( HDIVE hDiveInst );
|
---|
201 |
|
---|
202 | ULONG APIENTRY DiveCalcFrameBufferAddress ( HDIVE hDiveInst,
|
---|
203 | PRECTL prectlDest,
|
---|
204 | PBYTE *ppDestinationAddress,
|
---|
205 | PULONG pulBankNumber,
|
---|
206 | PULONG pulRemLinesInBank );
|
---|
207 |
|
---|
208 | /* Notes on DiveAllocImageBuffer:
|
---|
209 | If pbImageBuffer is not NULL, the buffer is associated rather than
|
---|
210 | allocated. If pbImageBuffer is not NULL and the buffer number
|
---|
211 | pointed to by pulBufferNumber is non-zero, a new buffer pointer is
|
---|
212 | associated with the buffer number. Even though no memory is
|
---|
213 | allocated by DiveAllocImageBuffer when user-allocated buffers are
|
---|
214 | associated, DiveFreeImageBuffer should be called to release the
|
---|
215 | buffer association to avoid using up available buffer indexes.
|
---|
216 | The specified line size will be used if a buffer is allocated in
|
---|
217 | system memory, or if a user buffer is associated. If the
|
---|
218 | specified line size is zero, the allocated line size is rounded up
|
---|
219 | to the nearest DWORD boundry.
|
---|
220 | */
|
---|
221 |
|
---|
222 | ULONG APIENTRY DiveAllocImageBuffer ( HDIVE hDiveInst,
|
---|
223 | PULONG pulBufferNumber,
|
---|
224 | FOURCC fccColorSpace,
|
---|
225 | ULONG ulWidth,
|
---|
226 | ULONG ulHeight,
|
---|
227 | ULONG ulLineSizeBytes,
|
---|
228 | PBYTE pbImageBuffer );
|
---|
229 |
|
---|
230 | ULONG APIENTRY DiveFreeImageBuffer ( HDIVE hDiveInst,
|
---|
231 | ULONG ulBufferNumber );
|
---|
232 |
|
---|
233 | ULONG APIENTRY DiveBeginImageBufferAccess ( HDIVE hDiveInst,
|
---|
234 | ULONG ulBufferNumber,
|
---|
235 | PBYTE *ppbImageBuffer,
|
---|
236 | PULONG pulBufferScanLineBytes,
|
---|
237 | PULONG pulBufferScanLines );
|
---|
238 |
|
---|
239 | ULONG APIENTRY DiveEndImageBufferAccess ( HDIVE hDiveInst,
|
---|
240 | ULONG ulBufferNumber );
|
---|
241 |
|
---|
242 |
|
---|
243 |
|
---|
244 | /* Notes on palettes:
|
---|
245 | Neither DiveSetSourcePalette nor DiveSetDestinationPalette API's will set
|
---|
246 | the physical palette. If your application MUST set the PHYSICAL palette,
|
---|
247 | try using no more than 236 entries (the middle 236: 10-245, thus leaving
|
---|
248 | the top and bottom 10 entries for the Workplace Shell). If your
|
---|
249 | application MUST use ALL 256 entries, it must do so as a full-screen
|
---|
250 | (i.e. maximized) application. Remember, No WM_REALIZEPALETTE message
|
---|
251 | will be sent to other running applications, meaning they will not redraw
|
---|
252 | and their colors will be all wrong. It is not recommended that a
|
---|
253 | developer use these commands:
|
---|
254 |
|
---|
255 | To set physical palette, do the following:
|
---|
256 | hps = WinGetPS ( HWND_DESKTOP );
|
---|
257 | hdc = GpiQueryDevice ( hps );
|
---|
258 | GpiCreateLogColorTable ( hps, LCOL_PURECOLOR | LCOL_REALIZABLE,
|
---|
259 | LCOLF_CONSECRGB, 0, 256, (PLONG)plRGB2Entries );
|
---|
260 | Gre32EntrY3 ( hdc, 0L, 0x000060C6L );
|
---|
261 | WinInvalidateRect ( HWND_DESKTOP, (PRECTL)NULL, TRUE );
|
---|
262 | WinReleasePS ( hps );
|
---|
263 |
|
---|
264 | To reset physical palette, do the following:
|
---|
265 | hps = WinGetPS ( HWND_DESKTOP );
|
---|
266 | hdc = GpiQueryDevice ( hps );
|
---|
267 | Gre32EntrY3 ( hdc, 0L, 0x000060C7L );
|
---|
268 | WinInvalidateRect ( HWND_DESKTOP, (PRECTL)NULL, TRUE );
|
---|
269 | WinReleasePS ( hps );
|
---|
270 | */
|
---|
271 |
|
---|
272 |
|
---|
273 | /* Use either of the two defines as the pRGB2Entries pointer to have DIVE */
|
---|
274 | /* query and set the physical or default palette as source or destination. */
|
---|
275 |
|
---|
276 | #define DIVE_PALETTE_PHYSICAL (PBYTE)0x00000000
|
---|
277 | #define DIVE_PALETTE_DEFAULT (PBYTE)0xffffffff
|
---|
278 |
|
---|
279 | ULONG APIENTRY DiveSetDestinationPalette ( HDIVE hDiveInst,
|
---|
280 | ULONG ulStartIndex,
|
---|
281 | ULONG ulNumEntries,
|
---|
282 | PBYTE pbRGB2Entries );
|
---|
283 |
|
---|
284 | ULONG APIENTRY DiveSetSourcePalette ( HDIVE hDiveInst,
|
---|
285 | ULONG ulStartIndex,
|
---|
286 | ULONG ulNumEntries,
|
---|
287 | PBYTE pbRGB2Entries );
|
---|
288 |
|
---|
289 | #ifdef INCL_MM_OS2
|
---|
290 | ULONG APIENTRY DiveSetTransparentBlitMode ( HDIVE hDiveInst,
|
---|
291 | ULONG ulTransBlitMode,
|
---|
292 | ULONG ulValue1,
|
---|
293 | ULONG ulValue2 );
|
---|
294 |
|
---|
295 | /* The following transparent blitting modes are supported: */
|
---|
296 |
|
---|
297 | #define DIVE_TBM_NONE 0x0
|
---|
298 | /* No transparency, i.e. all pixels are transferred (default) */
|
---|
299 |
|
---|
300 | #define DIVE_TBM_EXCLUDE_SOURCE_VALUE 0x01
|
---|
301 | /* Source pixels with values that exactly match the value specified in */
|
---|
302 | /* ulValue1 are not transferred. */
|
---|
303 |
|
---|
304 | #define DIVE_TBM_EXCLUDE_SOURCE_RGB_RANGE 0x02
|
---|
305 | /* Source pixels with values that lie within the range specified in RGB */
|
---|
306 | /* color space specified by ulValue1 (minimum) and ulValue2 (maximum) */
|
---|
307 | /* are not transferred by DiveBlitImage. */
|
---|
308 |
|
---|
309 | #define DIVE_TBM_INCLUDE_SOURCE_RGB_RANGE 0x03
|
---|
310 | /* Source pixels with values that lie outside the range specified in RGB */
|
---|
311 | /* color space specified by ulValue1 (minimum) and ulValue2 (maximum) */
|
---|
312 | /* are not transferred by DiveBlitImage. */
|
---|
313 |
|
---|
314 | #define DIVE_TBM_EXCLUDE_SOURCE_YUV_RANGE 0x04
|
---|
315 | /* Source pixels with values that lie within the range specified in RGB */
|
---|
316 | /* color space specified by ulValue1 (minimum) and ulValue2 (maximum) */
|
---|
317 | /* are not transferred by DiveBlitImage. */
|
---|
318 |
|
---|
319 | #define DIVE_TBM_INCLUDE_SOURCE_YUV_RANGE 0x05
|
---|
320 | /* Source pixels with values that lie outside the range specified in RGB */
|
---|
321 | /* color space specified by ulValue1 (minimum) and ulValue2 (maximum) */
|
---|
322 | /* are not transferred by DiveBlitImage. */
|
---|
323 |
|
---|
324 | /* Notes on transparent blitting:
|
---|
325 | Supported transparent blitting functions are all based on source pixel
|
---|
326 | values. A pixel in the destination image buffer is not modified if the
|
---|
327 | corresponding pixel in the source buffer is "transparent". The color
|
---|
328 | values or color value ranges specified in ulValue1 and ulValue2 are
|
---|
329 | dependent on the source image color format (fccSrcColorFormat) and the
|
---|
330 | color space in which the range comparison is taking place.
|
---|
331 |
|
---|
332 | FOURCC_LUT8:
|
---|
333 | The color value is specified in the low 8 bits of parameter
|
---|
334 |
|
---|
335 | FOURCC_Y888, FOURCC_Y2X2, FOURCC_Y4X4, FOURCC_YUV9, FOURCC_Y644, FOURCC_Y422:
|
---|
336 | 23:8 - Y, 15:8 - U, 7:8 - V (bits 31:8 ignored)
|
---|
337 |
|
---|
338 | FOURCC_R565, FOURCC_R555, FOURCC_R664, FOURCC_RGB3, FOURCC_BGR3, FOURCC_RGB4,
|
---|
339 | FOURCC_BGR4:
|
---|
340 | 23:8 - R, 15:8 - G, 7:8 - B (bits 31:8 ignored)
|
---|
341 | R, G, and B components are specified with 8 bit significance, regardless
|
---|
342 | of significance in the source data.
|
---|
343 |
|
---|
344 | Transparent blitting of other source image formats is not supported.
|
---|
345 |
|
---|
346 | For range comparisons in RGB or YUV, the three components are compared
|
---|
347 | independently against the minimum and maximum values specified by the
|
---|
348 | ulValue1 and ulValue2 parameters respectively. A value is considered to
|
---|
349 | within the specified range if all three components satisfy:
|
---|
350 | min <= value <= max.
|
---|
351 |
|
---|
352 | For EXCLUDE_SOURCE_VALUE tranparent blitting, the specified value in
|
---|
353 | ulValue1 is assumed to be in the source color space as described above.
|
---|
354 | For range comparisons, the values specified in ulValue1 and ulValue2 are
|
---|
355 | assumed to be in the color space in which the range comparison is to be
|
---|
356 | performed, either YUV or RGB.
|
---|
357 |
|
---|
358 | - For range comparisons in YUV where the source data format is a YUV
|
---|
359 | form, the values in ulValue1 and ulValue2 are in the source YUV
|
---|
360 | format.
|
---|
361 |
|
---|
362 | - For range comparisons in YUV where the source data format is RGB,
|
---|
363 | conversion of source data format from RGB to YUV using standard
|
---|
364 | CCIR601 equations is assumed (refer to fourcc.h).
|
---|
365 |
|
---|
366 | - For range comparisons in RGB where the source data format is an RGB
|
---|
367 | form, the values in ulValue1 and ulValue2 specify the RGB range with
|
---|
368 | 5 bits significance in R, 6 bits in G, and 5 bits in B.
|
---|
369 |
|
---|
370 | - For range comparisons in RGB where the source data format is YUV,
|
---|
371 | conversion of source data format from YUV to RGB using standard
|
---|
372 | CCIR601 equations is assumed (refer to fourcc.h).
|
---|
373 |
|
---|
374 |
|
---|
375 |
|
---|
376 | */
|
---|
377 |
|
---|
378 | #endif
|
---|
379 |
|
---|
380 | #endif
|
---|
381 | #ifdef __cplusplus
|
---|
382 | }
|
---|
383 | #endif
|
---|
384 |
|
---|