1 namespace gfx::drivers;
7 #if defined(__MINGW32__)
9 #undef DECLARE_INTERFACE
10 # define DECLARE_INTERFACE(i) \
11 interface i { CONST_VTABLE struct i##Vtbl *lpVtbl; }; \
12 typedef CONST_VTABLE struct i##Vtbl i##Vtbl; \
13 CONST_VTABLE struct i##Vtbl
17 // #define HRESULT int
18 #define Method _Method
34 class DDrawDisplay : LFBDisplay
36 IDirectDrawSurface * front;
37 IDirectDrawSurface * back;
38 IDirectDrawPalette * palette;
39 DDSURFACEDESC frontDesc, backDesc;
40 IDirectDraw * directDraw;
45 if(backDesc.lpSurface && bitmap.picture)
47 IDirectDrawSurface_Unlock(back, backDesc.lpSurface);
48 bitmap.picture = null;
55 if(!back || bitmap.picture)
59 uint ddrawResult = IDirectDrawSurface_Lock(back, null, &backDesc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, null);
60 if(ddrawResult == DDERR_SURFACELOST) // !display.full_screen
63 IDirectDrawSurface_Restore(back);
64 ddrawResult = IDirectDrawSurface_Lock(back, null, &backDesc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, null);
68 bool validFormat = true;
69 switch(backDesc.ddpfPixelFormat.dwRGBBitCount)
71 case 8: bitmap.pixelFormat = pixelFormat8; break;
72 case 15: bitmap.pixelFormat = pixelFormat555; break;
74 if(backDesc.ddpfPixelFormat.dwGBitMask == 0x3E0)
75 bitmap.pixelFormat = pixelFormat555;
77 bitmap.pixelFormat = pixelFormat565;
80 bitmap.pixelFormat = pixelFormat888; break;
88 bitmap.picture = (byte *)backDesc.lpSurface;
89 bitmap.stride = backDesc.lPitch;
90 bitmap.stride >>= GetColorDepthShifts(bitmap.pixelFormat);
91 bitmap.size = bitmap.stride * bitmap.height;
104 static byte defaultRGBLookup[32768];
105 static bool rgbLookupSet = false;
107 // #define USE_GDI_FONT
109 static bool CALLBACK DeviceCallBack(GUID FAR * guid, char * description, char * driverName, IDirectDraw ** directDraw)
111 if(!DirectDrawCreate( guid, directDraw, null ))
116 class DirectDrawDisplayDriver : DisplayDriver
118 class_property(name) = "DirectDraw";
120 void ReleaseSurface(Display display, Surface surface)
122 DDrawDisplay ddrawDisplay = display.driverData;
123 ((subclass(DisplayDriver))class(LFBDisplayDriver)).ReleaseSurface(display, surface);
124 ddrawDisplay.Unlock();
125 IDirectDrawSurface_ReleaseDC(ddrawDisplay.back, ddrawDisplay.hdc);
126 ddrawDisplay.hdc = null;
129 bool GetSurface(Display display, Surface surface, int x,int y, Box clip)
131 DDrawDisplay ddrawDisplay = display.driverData;
132 LFBSurface lfbSurface;
135 if((surface.driverData = lfbSurface = LFBSurface { }))
137 surface.offset.x = x;
138 surface.offset.y = y;
139 //surface.unclippedBox = surface.box = clip;
142 IDirectDrawSurface_GetDC(ddrawDisplay.back, &ddrawDisplay.hdc);
143 result = ((subclass(DisplayDriver))class(LFBDisplayDriver)).GetSurface(display, surface, x, y, clip);
149 bool GetBitmapSurface(DisplaySystem displaySystem, Surface surface, Bitmap bitmap, int x, int y, Box clip)
151 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).GetBitmapSurface(displaySystem, surface, bitmap, x, y, clip);
154 void Clip(Display display, Surface surface, Box clip)
156 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Clip(display, surface, clip);
159 void DestroyDisplay(Display display)
161 DDrawDisplay ddrawDisplay = display.driverData;
162 IDirectDraw * directDraw = ddrawDisplay.directDraw;
164 if(ddrawDisplay.back)
165 IDirectDrawSurface_Release(ddrawDisplay.back);
166 if(ddrawDisplay.front)
167 IDirectDrawSurface_Release(ddrawDisplay.front);
168 if(ddrawDisplay.palette)
169 IDirectDrawPalette_Release(ddrawDisplay.palette);
173 IDirectDraw_SetCooperativeLevel(directDraw, display.window, DDSCL_NORMAL );
177 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DestroyDisplay(display);
181 if(display.displaySystem.flags.fullScreen)
182 IDirectDraw_RestoreDisplayMode(directDraw);
183 IDirectDraw_Release(directDraw);
187 display.driverData = null;
190 void SetPalette(Display display, ColorAlpha * palette, bool colorMatch)
192 DDrawDisplay ddrawDisplay = display.driverData;
193 IDirectDraw * directDraw = ddrawDisplay.directDraw;
194 if(ddrawDisplay.bitmap.pixelFormat == pixelFormat8)
197 ColorAlpha realPalette[256];
198 PALETTEENTRY ddPalette[256];
199 int reserved = (display.displaySystem.flags.fullScreen) ? 0 : 10;
203 HDC hdc = GetDC(display.window);
204 GetSystemPaletteEntries(hdc,0,256,(PALETTEENTRY *)realPalette);
206 realPalette[c] = ColorAlpha { 255, { realPalette[c].color.b, realPalette[c].color.g, realPalette[c].color.r } };
207 ReleaseDC(display.window,hdc);
209 // *** Reserved Palette Handling ***
212 palette = GetDefaultPalette();
213 CopyBytesBy4(realPalette+reserved,palette+reserved,256-2*reserved);
216 for(c = 0; c<32768; c++)
217 defaultRGBLookup[c] = (byte)BestColorMatch(realPalette, 0, 255, (Color555)c);
220 CopyBytes(ddrawDisplay.rgbLookup, defaultRGBLookup, 32768);
224 for(i=0; i<LIGHTSTEPS; i++)
226 ddrawDisplay.lightTable[c][i]=ddrawDisplay.rgbLookup[
229 (byte)(((uint16)realPalette[c].color.r*i) >>LIGHTSHIFT),
230 (byte)(((uint16)realPalette[c].color.g*i) >>LIGHTSHIFT),
231 (byte)(((uint16)realPalette[c].color.b*i) >>LIGHTSHIFT) }];
234 CopyBytesBy4(ddrawDisplay.bitmap.palette, realPalette, 256);
238 CopyBytesBy4(realPalette+reserved,palette+reserved,256-2*reserved);
239 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetPalette(display, realPalette, colorMatch);
243 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetPalette(display, palette, colorMatch);
244 // *********************************
246 for (c = 0; c<reserved; c++)
248 ddPalette[c].peFlags = PC_EXPLICIT;
249 ddPalette[c].peRed = (byte)c;
250 ddPalette[c].peGreen = 0;
251 ddPalette[c].peBlue = 0;
253 ddPalette[c+256-reserved].peFlags = PC_EXPLICIT;
254 ddPalette[c+256-reserved].peRed = (byte)(c+256-reserved);
255 ddPalette[c+256-reserved].peGreen = 0;
256 ddPalette[c+256-reserved].peBlue = 0;
258 for(c = reserved; c < 256 - reserved; c++)
260 ddPalette[c].peFlags = PC_NOCOLLAPSE;
261 ddPalette[c].peRed = ddrawDisplay.bitmap.palette[c].color.r;
262 ddPalette[c].peGreen = ddrawDisplay.bitmap.palette[c].color.g;
263 ddPalette[c].peBlue = ddrawDisplay.bitmap.palette[c].color.b;
266 if(!ddrawDisplay.palette)
268 IDirectDraw_CreatePalette(directDraw, DDPCAPS_8BIT, ddPalette, &ddrawDisplay.palette, null);
269 IDirectDrawSurface_SetPalette(ddrawDisplay.front, ddrawDisplay.palette);
272 IDirectDrawPalette_SetEntries(ddrawDisplay.palette,0,0,256,ddPalette);
275 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetPalette(display, palette, colorMatch);
278 bool CreateDisplaySystem(DisplaySystem displaySystem)
281 displaySystem.flags.memBackBuffer = true;
287 void DestroyDisplaySystem(DisplaySystem displaySystem)
292 bool DisplaySize(Display display, int width, int height)
294 DDrawDisplay ddrawDisplay = display.driverData;
296 IDirectDraw * directDraw = ddrawDisplay.directDraw;
298 if(ddrawDisplay.back)
299 IDirectDrawSurface_Release(ddrawDisplay.back);
301 ddrawDisplay.backDesc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
302 ddrawDisplay.backDesc.dwWidth = width;
303 ddrawDisplay.backDesc.dwHeight = height;
304 ddrawDisplay.backDesc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; // = DDSCAPS_OFFSCREENPLAIN;
305 //ddrawDisplay.backDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
307 if(!IDirectDraw_CreateSurface(directDraw, &ddrawDisplay.backDesc, &ddrawDisplay.back, null))
309 IDirectDrawClipper * clipper;
310 if(!IDirectDraw_CreateClipper(directDraw, 0, &clipper, null))
312 IDirectDrawClipper_SetHWnd(clipper, 0, display.window);
313 IDirectDrawSurface_SetClipper(ddrawDisplay.front, clipper);
314 IDirectDrawClipper_Release(clipper);
316 // Set up format by locking / unlocking
317 if(ddrawDisplay.Lock())
319 display.displaySystem.pixelFormat = ddrawDisplay.bitmap.pixelFormat;
320 ddrawDisplay.Unlock();
326 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DisplaySize(display, width, height);
328 display.width = width;
329 display.height = height;
334 bool CreateDisplay(Display display)
337 DDrawDisplay ddrawDisplay = display.driverData = DDrawDisplay { };
340 IDirectDraw * directDraw = null;
341 DirectDrawEnumerateA(DeviceCallBack, &directDraw);
344 DirectDrawCreate(null, &directDraw, null);
345 ddrawDisplay.directDraw = directDraw;
346 if(((subclass(DisplayDriver))class(LFBDisplayDriver)).CreateDisplay(display))
348 ddrawDisplay.frontDesc.dwSize = ddrawDisplay.backDesc.dwSize = sizeof(DDSURFACEDESC);
350 if(!IDirectDraw_SetCooperativeLevel( directDraw, display.window,
351 (display.displaySystem.flags.fullScreen) ? (DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) : DDSCL_NORMAL))
353 ddrawDisplay.frontDesc.dwFlags = DDSD_CAPS;
354 ddrawDisplay.frontDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
355 if(!IDirectDraw_CreateSurface( directDraw, &ddrawDisplay.frontDesc, &ddrawDisplay.front, null ))
357 // To find out the format...
358 DisplaySize(display, 1, 1);
368 void DisplayPosition(Display display, int x, int y)
370 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DisplayPosition(display, x, y);
373 void RestorePalette(Display display)
375 DDrawDisplay ddrawDisplay = display.driverData;
376 IDirectDrawSurface_SetPalette(ddrawDisplay.front, ddrawDisplay.palette);
379 void StartUpdate(Display display)
381 DDrawDisplay ddrawDisplay = display.driverData;
382 ddrawDisplay.Unlock();
385 void EndUpdate(Display display)
387 DDrawDisplay ddrawDisplay = display.driverData;
391 void Scroll(Display display, Box scroll, int x, int y, Extent dirty)
395 void Update(Display display, Box updateBox)
397 DDrawDisplay ddrawDisplay = display.driverData;
399 // TODO: (Compiler) Shouldn't &updateBox be the same as updateBox in this assignment?
400 Box * box = updateBox; // ? updateBox : &ddrawDisplay.updateBox;
403 r.left = ddrawDisplay.x + box->left;
404 r.top = ddrawDisplay.y + box->top;
405 r.right = ddrawDisplay.x + box->right+1;
406 r.bottom= ddrawDisplay.y + box->bottom+1;
410 br.right = box->right+1;
411 br.bottom= box->bottom+1;
413 if(r.right > r.left && r.bottom > r.top)
415 if(IDirectDrawSurface_Blt(ddrawDisplay.front, &r, ddrawDisplay.back, &br, DDBLT_WAIT,null) == DDERR_SURFACELOST)
417 IDirectDrawSurface_Restore(ddrawDisplay.front);
418 IDirectDrawSurface_Blt(ddrawDisplay.front, &r, ddrawDisplay.back, &br, DDBLT_WAIT,null);
421 // ((subclass(DisplayDriver))class(LFBDisplayDriver)).DisplayScreen(display, updateBox);
424 bool GrabScreen(Display display, Bitmap bitmap, int x, int y, unsigned int w, unsigned int h)
427 DDrawDisplay ddrawDisplay = display.driverData;
428 if(ddrawDisplay.Lock())
430 display.displaySystem.pixelFormat = ddrawDisplay.bitmap.pixelFormat;
431 result = ((subclass(DisplayDriver))class(LFBDisplayDriver)).GrabScreen(display, bitmap, x,y, w,h);
432 ddrawDisplay.Unlock();
437 bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps)
439 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).MakeDDBitmap(displaySystem, bitmap, mipMaps);
442 void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
444 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FreeBitmap(displaySystem, bitmap);
447 void SetForeground(Display display, Surface surface, ColorAlpha color)
450 DDrawDisplay ddrawDisplay = display.driverData;
451 SetTextColor(ddrawDisplay.hdc, RGB(color.color.r, color.color.g, color.color.b));
453 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetForeground(display, surface, color);
456 void SetBackground(Display display, Surface surface, ColorAlpha color)
459 DDrawDisplay ddrawDisplay = display.driverData;
462 if(ddrawDisplay.bitmap.pixelFormat == pixelFormat8)
463 color = ddrawDisplay.bitmap.palette[ddrawDisplay.rgbLookup[(uint16)(Color555) color]];
464 rgb = RGB(color.color.r, color.color.g, color.color.b);
465 SetBkColor(ddrawDisplay.hdc, rgb);
467 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetBackground(display, surface, color);
470 ColorAlpha GetPixel(Display display, Surface surface,int x,int y)
475 void PutPixel(Display display, Surface surface, int x, int y)
477 ((subclass(DisplayDriver))class(LFBDisplayDriver)).PutPixel(display, surface, x,y);
480 void DrawLine(Display display, Surface surface, int x1, int y1, int x2, int y2)
482 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DrawLine(display, surface, x1,y1,x2,y2);
485 void Rectangle(Display display, Surface surface, int x1, int y1, int x2, int y2)
487 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Rectangle(display, surface, x1,y1,x2,y2);
490 void Area(Display display, Surface surface,int x1,int y1,int x2,int y2)
492 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Area(display, surface, x1,y1,x2,y2);
495 void Clear(Display display, Surface surface, ClearType flags)
497 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Clear(display, surface, flags);
500 bool ConvertBitmap(DisplaySystem displaySystem, Bitmap src, PixelFormat format, ColorAlpha * palette)
502 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).ConvertBitmap(displaySystem, src, format, palette);
505 bool AllocateBitmap(DisplaySystem displaySystem, Bitmap bitmap, int width, int height, int stride, PixelFormat format, bool allocatePalette)
507 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).AllocateBitmap(displaySystem, bitmap, width, height, stride, format, allocatePalette);
510 void Blit(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h)
512 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Blit(display, surface, src, dx, dy, sx, sy, w, h);
515 void Stretch(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
517 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Stretch(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
520 void Filter(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
522 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Filter(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
525 void BlitDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h)
527 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Blit(display, surface, src, dx, dy, sx, sy, w, h);
530 void StretchDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
532 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Stretch(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
535 void FilterDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
537 Filter(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
540 void TextFont(Display display, Surface surface, Font font)
543 DDrawDisplay ddrawDisplay = display.driverData;
544 /*if(display.alphaBlend)
548 gdiFont.font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(display.displaySystem,
549 gdiFont.faceName, gdiFont.size, gdiFont.flags);
551 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextFont(display, surface, gdiFont.font);
554 SelectObject(ddrawDisplay.hdc, font);
556 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextFont(display, surface, font);
557 SetForeground(display, surface, surface.foreground);
561 void TextOpacity(Display display, Surface surface, bool opaque)
564 DDrawDisplay ddrawDisplay = display.driverData;
565 SetBkMode(ddrawDisplay.hdc, surface.textOpacity ? OPAQUE : TRANSPARENT);
567 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextOpacity(display, surface, opaque);
571 Font LoadFont(DisplaySystem displaySystem, char * faceName, float size, FontFlags flags)
575 HDC hdc = GetDC(null);
576 font = CreateFont(-(int)((float)size * GetDeviceCaps(hdc, LOGPIXELSY) / 72 + 0.5),
577 0,0,0, (flags.bold) ? FW_BOLD : FW_NORMAL, flags.italic,
578 flags.underline,0,DEFAULT_CHARSET,
579 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
580 DEFAULT_PITCH|FF_DONTCARE,faceName);
581 ReleaseDC(null, hdc);
584 Font font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags);
587 font.bitmap.pixelFormat = C8;
588 font.bitmap.transparent = true;
589 font.bitmap.allocatePalette = false;
590 delete font.bitmap.palette;
591 font.bitmap.shadeShift = 8-LIGHTSHIFT;
593 // Tune the bitmap a bit until we decide to do alpha blending...
595 Bitmap bitmap = font.bitmap;
597 for(y = 0; y<bitmap.height; y++)
599 byte * picture = bitmap.picture + bitmap.stride * y;
600 for(x = 0; x<bitmap.width; x++, picture++)
603 *picture = Max(*picture, 150);
610 LFBDisplay lfbDisplay = display.driverData;
612 font.bitmap.palette = lfbDisplay.bitmap.palette;
614 font.bitmap.palette = GetDefaultPalette();
621 void UnloadFont(DisplaySystem displaySystem, Font font)
627 ((subclass(DisplayDriver))class(LFBDisplayDriver)).UnloadFont(displaySystem, font);
631 void WriteText(Display display, Surface surface, int x, int y, byte * text, int len)
634 DDrawDisplay ddrawDisplay = display.driverData;
636 /*if(display.alphaBlend)
638 GDIFont gdiFont = (GDIFont)surface.font;
641 gdiFont.font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(display.displaySystem,
642 gdiFont.faceName, gdiFont.size, gdiFont.flags);
644 if(surface.textOpacity)
647 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(display.displaySystem, gdiFont.font, text, len, &w, &h);
648 Area(display, surface, x, y, x+w-1, y+h-1);
650 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len);
655 uint16 * u16text = UTF8toUTF16Len(text, len, &wordCount);
657 TextOut(ddrawDisplay.hdc, x + surface.offset.x, y + surface.offset.y, u16text, wordCount);
658 if(display.alphaBlend)
661 FontExtent(display.displaySystem, surface.font, text, len, &w, &h);
662 surface.writeColor = false;
663 SetBackground(display, surface, surface.foreground);
664 Area(display, surface,x-2,y-2,x+w+1,y+h+1);
665 SetBackground(display, surface, surface.background);
666 surface.writeColor = true;
671 TextOut(ddrawDisplay.hdc, x+surface.offset.x,y+surface.offset.y, text,len);
674 if(surface.textOpacity)
677 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(display.displaySystem, surface.font, text, len, &w, &h);
678 Area(display, surface, x, y, x+w-1, y+h-1);
680 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x,y, text, len);
684 void FontExtent(DisplaySystem displaySystem, Font font, byte * text, int len, int * width, int * height)
687 if(false) //display.alphaBlend)
688 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height);
693 SelectObject(tmpDC, font);
694 TextExtent(null, null, text, len, width, height);
698 if(width) *width = 0;
699 if(height) *height = 0;
707 SelectObject(hdc, font);
708 for(realLen = 0; realLen<len && text[realLen]; realLen++);
709 GetTextExtentPoint32(hdc," ",1,&space);
710 GetTextExtentPoint32(hdc,text,realLen,&size);
712 if(width) *width = size.cx + (len - realLen) * space.cx;
718 *height = len ? space.cy : 0;
722 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height);
726 void TextExtent(Display display, Surface surface, byte * text, int len, int * width, int * height)
729 /*if(display && display.alphaBlend)
730 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextExtent(display, surface, text, len, width, height);
734 DDrawDisplay ddrawDisplay = display ? display.driverData : null;
735 HDC hdc = ddrawDisplay ? ddrawDisplay.hdc : tmpDC;
739 uint16 * u16text = UTF8toUTF16Len(text, len, &wordCount);
741 for(realLen = 0; realLen<wordCount && u16text[realLen]; realLen++);
742 GetTextExtentPoint32A(hdc, " ", 1, &space);
743 GetTextExtentPoint32(hdc, u16text, realLen, &size);
746 // UNICODE FIX: proper space computation
747 if(width) *width = size.cx + (wordCount - realLen) * space.cx;
753 *height = wordCount ? space.cy : 0;
757 HDC hdc = ddrawDisplay.hdc;
761 for(realLen = 0; realLen<len && text[realLen]; realLen++);
762 GetTextExtentPoint32(hdc," ",1,&space);
763 GetTextExtentPoint32(hdc,text,realLen,&size);
765 if(width) *width = size.cx + (len - realLen) * space.cx;
771 *height = len ? space.cy : 0;
775 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextExtent(display, surface, text, len, width, height);
779 void DrawingChar(Display display, Surface surface, byte character)
784 void LineStipple(Display display, Surface surface, uint stipple)
786 ((subclass(DisplayDriver))class(LFBDisplayDriver)).LineStipple(display, surface, stipple);
789 bool Lock(Display display)
791 DDrawDisplay ddrawDisplay = display.driverData;
792 /*if(ddrawDisplay.Lock())
794 display.displaySystem.pixelFormat = ddrawDisplay.bitmap.pixelFormat;
795 IDirectDrawSurface_GetDC(ddrawDisplay.back, &ddrawDisplay.hdc);
800 void Unlock(Display display)
802 DDrawDisplay ddrawDisplay = display.driverData;
803 /*IDirectDrawSurface_ReleaseDC(ddrawDisplay.back, ddrawDisplay.hdc);
804 ddrawDisplay.Unlock(); */