21 #include "../../SDL_internal.h"
22 #include "../SDL_sysvideo.h"
34 typedef struct _VODATA {
49 HRGN hrgnShape, BOOL fVisible);
51 ULONG ulBPP, ULONG fccColorEncoding,
52 PULONG pulScanLineSize);
70 DIVE_CAPS sDiveCaps = { 0 };
71 FOURCC fccFormats[100] = { 0 };
74 sDiveCaps.pFormatData = fccFormats;
75 sDiveCaps.ulFormatLength = 100;
76 sDiveCaps.ulStructLen =
sizeof(DIVE_CAPS);
78 if (DiveQueryCaps(&sDiveCaps, DIVE_BUFFER_SCREEN)) {
83 if (sDiveCaps.ulDepth < 8) {
84 debug_os2(
"Not enough screen colors to run DIVE. "
85 "Must be at least 256 colors.");
89 pInfo->
ulBPP = sDiveCaps.ulDepth;
102 if (pVOData ==
NULL) {
107 if (DiveOpen(&pVOData->hDive,
FALSE,
NULL) != DIVE_SUCCESS) {
109 SDL_SetError(
"DIVE: A display engine instance open failed");
119 DiveClose(pVOData->hDive);
125 HRGN hrgnShape, BOOL fVisible)
130 PRECTL prectl =
NULL;
134 if (pVOData->fBlitterReady) {
135 pVOData->fBlitterReady =
FALSE;
136 DiveSetupBlitter(pVOData->hDive, 0);
143 hps = WinGetPS(hwnd);
144 hrgn = GpiCreateRegion(hps, 0,
NULL);
145 if (hrgn == NULLHANDLE) {
149 WinQueryVisibleRegion(hwnd, hrgn);
150 if (hrgnShape != NULLHANDLE)
151 GpiCombineRegion(hps, hrgn, hrgn, hrgnShape, CRGN_AND);
155 rgnCtl.ulDirection = 1;
156 GpiQueryRegionRects(hps, hrgn,
NULL, &rgnCtl,
NULL);
157 if (rgnCtl.crcReturned != 0) {
158 prectl =
SDL_malloc(rgnCtl.crcReturned *
sizeof(RECTL));
159 if (prectl !=
NULL) {
161 rgnCtl.crc = rgnCtl.crcReturned;
162 rgnCtl.ulDirection = 1;
163 GpiQueryRegionRects(hps, hrgn,
NULL, &rgnCtl, prectl);
168 GpiDestroyRegion(hps, hrgn);
171 if (prectl !=
NULL) {
173 SETUP_BLITTER sSetupBlitter;
175 POINTL pointl = { 0 };
177 WinQueryWindowPos(hwnd, &swp);
178 WinMapWindowPoints(hwnd, HWND_DESKTOP, &pointl, 1);
180 sSetupBlitter.ulStructLen =
sizeof(SETUP_BLITTER);
181 sSetupBlitter.fccSrcColorFormat = pVOData->fccColorEncoding;
182 sSetupBlitter.fInvert =
FALSE;
183 sSetupBlitter.ulSrcWidth = pVOData->ulWidth;
184 sSetupBlitter.ulSrcHeight = pVOData->ulHeight;
185 sSetupBlitter.ulSrcPosX = 0;
186 sSetupBlitter.ulSrcPosY = 0;
187 sSetupBlitter.ulDitherType = 0;
188 sSetupBlitter.fccDstColorFormat = FOURCC_SCRN;
189 sSetupBlitter.ulDstWidth = swp.cx;
190 sSetupBlitter.ulDstHeight = swp.cy;
191 sSetupBlitter.lDstPosX = 0;
192 sSetupBlitter.lDstPosY = 0;
193 sSetupBlitter.lScreenPosX = pointl.x;
194 sSetupBlitter.lScreenPosY = pointl.y;
196 sSetupBlitter.ulNumDstRects = rgnCtl.crcReturned;
197 sSetupBlitter.pVisDstRects = prectl;
199 ulRC = DiveSetupBlitter(pVOData->hDive, &sSetupBlitter);
202 if (ulRC == DIVE_SUCCESS) {
203 pVOData->fBlitterReady =
TRUE;
204 WinInvalidateRect(hwnd,
NULL,
TRUE);
213 pVOData->fBlitterReady =
FALSE;
214 DiveSetupBlitter(pVOData->hDive, 0);
219 ULONG ulBPP, FOURCC fccColorEncoding,
220 PULONG pulScanLineSize)
223 ULONG ulScanLineSize = ulWidth * (ulBPP >> 3);
228 if (ulWidth == 0 || ulHeight == 0 || ulBPP == 0)
232 ulScanLineSize = (ulScanLineSize + 3) & ~3;
233 *pulScanLineSize = ulScanLineSize;
235 ulRC = DosAllocMem(&pVOData->pBuffer,
236 (ulHeight * ulScanLineSize) +
sizeof(ULONG),
237 PAG_COMMIT | PAG_EXECUTE | PAG_READ | PAG_WRITE);
238 if (ulRC != NO_ERROR) {
239 debug_os2(
"DosAllocMem(), rc = %u", ulRC);
243 ulRC = DiveAllocImageBuffer(pVOData->hDive, &pVOData->ulDIVEBufNum,
244 fccColorEncoding, ulWidth, ulHeight,
245 ulScanLineSize, pVOData->pBuffer);
246 if (ulRC != DIVE_SUCCESS) {
247 debug_os2(
"DiveAllocImageBuffer(), rc = 0x%X", ulRC);
248 DosFreeMem(pVOData->pBuffer);
249 pVOData->pBuffer =
NULL;
250 pVOData->ulDIVEBufNum = 0;
254 pVOData->fccColorEncoding = fccColorEncoding;
255 pVOData->ulWidth = ulWidth;
256 pVOData->ulHeight = ulHeight;
258 debug_os2(
"buffer: 0x%P, DIVE buffer number: %u",
259 pVOData->pBuffer, pVOData->ulDIVEBufNum);
261 return pVOData->pBuffer;
268 if (pVOData->ulDIVEBufNum != 0) {
269 ulRC = DiveFreeImageBuffer(pVOData->hDive, pVOData->ulDIVEBufNum);
270 if (ulRC != DIVE_SUCCESS) {
271 debug_os2(
"DiveFreeImageBuffer(,%u), rc = %u", pVOData->ulDIVEBufNum, ulRC);
273 debug_os2(
"DIVE buffer %u destroyed", pVOData->ulDIVEBufNum);
275 pVOData->ulDIVEBufNum = 0;
278 if (pVOData->pBuffer !=
NULL) {
279 ulRC = DosFreeMem(pVOData->pBuffer);
280 if (ulRC != NO_ERROR) {
281 debug_os2(
"DosFreeMem(), rc = %u", ulRC);
283 pVOData->pBuffer =
NULL;
292 if (!pVOData->fBlitterReady || (pVOData->ulDIVEBufNum == 0)) {
297 if (pSDLRects != 0) {
301 if (pbLineMask ==
NULL) {
305 memset(pbLineMask, 0, pVOData->ulHeight);
307 for ( ; ((LONG)cSDLRects) > 0; cSDLRects--, pSDLRects++) {
308 memset(&pbLineMask[pSDLRects->
y], 1, pSDLRects->
h);
311 ulRC = DiveBlitImageLines(pVOData->hDive, pVOData->ulDIVEBufNum,
312 DIVE_BUFFER_SCREEN, pbLineMask);
315 if (ulRC != DIVE_SUCCESS) {
316 debug_os2(
"DiveBlitImageLines(), rc = 0x%X", ulRC);
319 ulRC = DiveBlitImage(pVOData->hDive, pVOData->ulDIVEBufNum,
321 if (ulRC != DIVE_SUCCESS) {
322 debug_os2(
"DiveBlitImage(), rc = 0x%X", ulRC);
326 return ulRC == DIVE_SUCCESS;
#define SDL_OutOfMemory()
static PVODATA voOpen(void)
static BOOL voSetVisibleRegion(PVODATA pVOData, HWND hwnd, SDL_DisplayMode *pSDLDisplayMode, HRGN hrgnShape, BOOL fVisible)
static BOOL voQueryInfo(VIDEOOUTPUTINFO *pInfo)
static BOOL voUpdate(PVODATA pVOData, HWND hwnd, SDL_Rect *pSDLRects, ULONG cSDLRects)
static VOID voClose(PVODATA pVOData)
static PVOID voVideoBufAlloc(PVODATA pVOData, ULONG ulWidth, ULONG ulHeight, ULONG ulBPP, ULONG fccColorEncoding, PULONG pulScanLineSize)
static VOID voVideoBufFree(PVODATA pVOData)
#define SDL_stack_alloc(type, count)
#define SDL_stack_free(data)
The structure that defines a display mode.
A rectangle, with the origin at the upper left (integer).