1 namespace gfx::drivers;
11 #define String _String
14 #define Platform _Platform
16 #if defined(__MINGW32__) && !defined(_W64)
17 #undef DECLARE_INTERFACE
18 #define DECLARE_INTERFACE(i) \
19 interface i { CONST_VTABLE struct i##Vtbl *lpVtbl; }; \
20 typedef CONST_VTABLE struct i##Vtbl i##Vtbl; \
21 CONST_VTABLE struct i##Vtbl
39 class DDrawDisplay : LFBDisplay
41 IDirectDrawSurface * front;
42 IDirectDrawSurface * back;
43 IDirectDrawPalette * palette;
44 DDSURFACEDESC frontDesc, backDesc;
45 IDirectDraw * directDraw;
50 if(backDesc.lpSurface && bitmap.picture)
52 IDirectDrawSurface_Unlock(back, backDesc.lpSurface);
53 bitmap.picture = null;
60 if(!back || bitmap.picture)
64 uint ddrawResult = IDirectDrawSurface_Lock(back, null, &backDesc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, null);
65 if(ddrawResult == DDERR_SURFACELOST) // !display.full_screen
68 IDirectDrawSurface_Restore(back);
69 ddrawResult = IDirectDrawSurface_Lock(back, null, &backDesc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, null);
73 bool validFormat = true;
74 switch(backDesc.ddpfPixelFormat.dwRGBBitCount)
76 case 8: bitmap.pixelFormat = pixelFormat8; break;
77 case 15: bitmap.pixelFormat = pixelFormat555; break;
79 if(backDesc.ddpfPixelFormat.dwGBitMask == 0x3E0)
80 bitmap.pixelFormat = pixelFormat555;
82 bitmap.pixelFormat = pixelFormat565;
85 bitmap.pixelFormat = pixelFormat888; break;
93 bitmap.picture = (byte *)backDesc.lpSurface;
94 bitmap.stride = backDesc.lPitch;
95 bitmap.stride >>= GetColorDepthShifts(bitmap.pixelFormat);
96 bitmap.size = bitmap.stride * bitmap.height;
109 static byte defaultRGBLookup[32768];
110 static bool rgbLookupSet = false;
112 // #define USE_GDI_FONT
114 static bool CALLBACK DeviceCallBack(GUID FAR * guid, char * description, char * driverName, IDirectDraw ** directDraw)
116 if(!DirectDrawCreate( guid, directDraw, null ))
121 class DirectDrawDisplayDriver : DisplayDriver
123 class_property(name) = "DirectDraw";
125 void ReleaseSurface(Display display, Surface surface)
127 DDrawDisplay ddrawDisplay = display.driverData;
128 ((subclass(DisplayDriver))class(LFBDisplayDriver)).ReleaseSurface(display, surface);
129 ddrawDisplay.Unlock();
130 IDirectDrawSurface_ReleaseDC(ddrawDisplay.back, ddrawDisplay.hdc);
131 ddrawDisplay.hdc = null;
134 bool GetSurface(Display display, Surface surface, int x,int y, Box clip)
136 DDrawDisplay ddrawDisplay = display.driverData;
137 LFBSurface lfbSurface;
140 if((surface.driverData = lfbSurface = LFBSurface { }))
142 surface.offset.x = x;
143 surface.offset.y = y;
144 //surface.unclippedBox = surface.box = clip;
147 IDirectDrawSurface_GetDC(ddrawDisplay.back, &ddrawDisplay.hdc);
148 result = ((subclass(DisplayDriver))class(LFBDisplayDriver)).GetSurface(display, surface, x, y, clip);
154 bool GetBitmapSurface(DisplaySystem displaySystem, Surface surface, Bitmap bitmap, int x, int y, Box clip)
156 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).GetBitmapSurface(displaySystem, surface, bitmap, x, y, clip);
159 void Clip(Display display, Surface surface, Box clip)
161 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Clip(display, surface, clip);
164 void DestroyDisplay(Display display)
166 DDrawDisplay ddrawDisplay = display.driverData;
167 IDirectDraw * directDraw = ddrawDisplay.directDraw;
169 if(ddrawDisplay.back)
170 IDirectDrawSurface_Release(ddrawDisplay.back);
171 if(ddrawDisplay.front)
172 IDirectDrawSurface_Release(ddrawDisplay.front);
173 if(ddrawDisplay.palette)
174 IDirectDrawPalette_Release(ddrawDisplay.palette);
178 IDirectDraw_SetCooperativeLevel(directDraw, display.window, DDSCL_NORMAL );
182 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DestroyDisplay(display);
186 if(display.displaySystem.flags.fullScreen)
187 IDirectDraw_RestoreDisplayMode(directDraw);
188 IDirectDraw_Release(directDraw);
192 display.driverData = null;
195 void SetPalette(Display display, ColorAlpha * palette, bool colorMatch)
197 DDrawDisplay ddrawDisplay = display.driverData;
198 IDirectDraw * directDraw = ddrawDisplay.directDraw;
199 if(ddrawDisplay.bitmap.pixelFormat == pixelFormat8)
202 ColorAlpha realPalette[256];
203 PALETTEENTRY ddPalette[256];
204 int reserved = (display.displaySystem.flags.fullScreen) ? 0 : 10;
208 HDC hdc = GetDC(display.window);
209 GetSystemPaletteEntries(hdc,0,256,(PALETTEENTRY *)realPalette);
211 realPalette[c] = ColorAlpha { 255, { realPalette[c].color.b, realPalette[c].color.g, realPalette[c].color.r } };
212 ReleaseDC(display.window,hdc);
214 // *** Reserved Palette Handling ***
217 palette = GetDefaultPalette();
218 CopyBytesBy4(realPalette+reserved,palette+reserved,256-2*reserved);
221 for(c = 0; c<32768; c++)
222 defaultRGBLookup[c] = (byte)BestColorMatch(realPalette, 0, 255, (Color555)c);
225 CopyBytes(ddrawDisplay.rgbLookup, defaultRGBLookup, 32768);
229 for(i=0; i<LIGHTSTEPS; i++)
231 ddrawDisplay.lightTable[c][i]=ddrawDisplay.rgbLookup[
234 (byte)(((uint16)realPalette[c].color.r*i) >>LIGHTSHIFT),
235 (byte)(((uint16)realPalette[c].color.g*i) >>LIGHTSHIFT),
236 (byte)(((uint16)realPalette[c].color.b*i) >>LIGHTSHIFT) }];
239 CopyBytesBy4(ddrawDisplay.bitmap.palette, realPalette, 256);
243 CopyBytesBy4(realPalette+reserved,palette+reserved,256-2*reserved);
244 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetPalette(display, realPalette, colorMatch);
248 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetPalette(display, palette, colorMatch);
249 // *********************************
251 for (c = 0; c<reserved; c++)
253 ddPalette[c].peFlags = PC_EXPLICIT;
254 ddPalette[c].peRed = (byte)c;
255 ddPalette[c].peGreen = 0;
256 ddPalette[c].peBlue = 0;
258 ddPalette[c+256-reserved].peFlags = PC_EXPLICIT;
259 ddPalette[c+256-reserved].peRed = (byte)(c+256-reserved);
260 ddPalette[c+256-reserved].peGreen = 0;
261 ddPalette[c+256-reserved].peBlue = 0;
263 for(c = reserved; c < 256 - reserved; c++)
265 ddPalette[c].peFlags = PC_NOCOLLAPSE;
266 ddPalette[c].peRed = ddrawDisplay.bitmap.palette[c].color.r;
267 ddPalette[c].peGreen = ddrawDisplay.bitmap.palette[c].color.g;
268 ddPalette[c].peBlue = ddrawDisplay.bitmap.palette[c].color.b;
271 if(!ddrawDisplay.palette)
273 IDirectDraw_CreatePalette(directDraw, DDPCAPS_8BIT, ddPalette, &ddrawDisplay.palette, null);
274 IDirectDrawSurface_SetPalette(ddrawDisplay.front, ddrawDisplay.palette);
277 IDirectDrawPalette_SetEntries(ddrawDisplay.palette,0,0,256,ddPalette);
280 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetPalette(display, palette, colorMatch);
283 bool CreateDisplaySystem(DisplaySystem displaySystem)
286 displaySystem.flags.memBackBuffer = true;
292 void DestroyDisplaySystem(DisplaySystem displaySystem)
297 bool DisplaySize(Display display, int width, int height)
299 DDrawDisplay ddrawDisplay = display.driverData;
301 IDirectDraw * directDraw = ddrawDisplay.directDraw;
303 if(ddrawDisplay.back)
304 IDirectDrawSurface_Release(ddrawDisplay.back);
306 ddrawDisplay.backDesc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
307 ddrawDisplay.backDesc.dwWidth = width;
308 ddrawDisplay.backDesc.dwHeight = height;
309 ddrawDisplay.backDesc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; // = DDSCAPS_OFFSCREENPLAIN;
310 //ddrawDisplay.backDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
312 if(!IDirectDraw_CreateSurface(directDraw, &ddrawDisplay.backDesc, &ddrawDisplay.back, null))
314 IDirectDrawClipper * clipper;
315 if(!IDirectDraw_CreateClipper(directDraw, 0, &clipper, null))
317 IDirectDrawClipper_SetHWnd(clipper, 0, display.window);
318 IDirectDrawSurface_SetClipper(ddrawDisplay.front, clipper);
319 IDirectDrawClipper_Release(clipper);
321 // Set up format by locking / unlocking
322 if(ddrawDisplay.Lock())
324 display.displaySystem.pixelFormat = ddrawDisplay.bitmap.pixelFormat;
325 ddrawDisplay.Unlock();
331 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DisplaySize(display, width, height);
333 display.width = width;
334 display.height = height;
339 bool CreateDisplay(Display display)
342 DDrawDisplay ddrawDisplay = display.driverData = DDrawDisplay { };
345 IDirectDraw * directDraw = null;
346 DirectDrawEnumerateA(DeviceCallBack, &directDraw);
349 DirectDrawCreate(null, &directDraw, null);
350 ddrawDisplay.directDraw = directDraw;
351 if(((subclass(DisplayDriver))class(LFBDisplayDriver)).CreateDisplay(display))
353 ddrawDisplay.frontDesc.dwSize = ddrawDisplay.backDesc.dwSize = sizeof(DDSURFACEDESC);
355 if(!IDirectDraw_SetCooperativeLevel( directDraw, display.window,
356 (display.displaySystem.flags.fullScreen) ? (DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) : DDSCL_NORMAL))
358 ddrawDisplay.frontDesc.dwFlags = DDSD_CAPS;
359 ddrawDisplay.frontDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
360 if(!IDirectDraw_CreateSurface( directDraw, &ddrawDisplay.frontDesc, &ddrawDisplay.front, null ))
362 // To find out the format...
363 DisplaySize(display, 1, 1);
373 void DisplayPosition(Display display, int x, int y)
375 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DisplayPosition(display, x, y);
378 void RestorePalette(Display display)
380 DDrawDisplay ddrawDisplay = display.driverData;
381 IDirectDrawSurface_SetPalette(ddrawDisplay.front, ddrawDisplay.palette);
384 void StartUpdate(Display display)
386 DDrawDisplay ddrawDisplay = display.driverData;
387 ddrawDisplay.Unlock();
390 void EndUpdate(Display display)
392 DDrawDisplay ddrawDisplay = display.driverData;
396 void Scroll(Display display, Box scroll, int x, int y, Extent dirty)
400 void Update(Display display, Box updateBox)
402 DDrawDisplay ddrawDisplay = display.driverData;
404 // TODO: (Compiler) Shouldn't &updateBox be the same as updateBox in this assignment?
405 Box * box = updateBox; // ? updateBox : &ddrawDisplay.updateBox;
408 r.left = ddrawDisplay.x + box->left;
409 r.top = ddrawDisplay.y + box->top;
410 r.right = ddrawDisplay.x + box->right+1;
411 r.bottom= ddrawDisplay.y + box->bottom+1;
415 br.right = box->right+1;
416 br.bottom= box->bottom+1;
418 if(r.right > r.left && r.bottom > r.top)
420 if(IDirectDrawSurface_Blt(ddrawDisplay.front, &r, ddrawDisplay.back, &br, DDBLT_WAIT,null) == DDERR_SURFACELOST)
422 IDirectDrawSurface_Restore(ddrawDisplay.front);
423 IDirectDrawSurface_Blt(ddrawDisplay.front, &r, ddrawDisplay.back, &br, DDBLT_WAIT,null);
426 // ((subclass(DisplayDriver))class(LFBDisplayDriver)).DisplayScreen(display, updateBox);
429 bool GrabScreen(Display display, Bitmap bitmap, int x, int y, unsigned int w, unsigned int h)
432 DDrawDisplay ddrawDisplay = display.driverData;
433 if(ddrawDisplay.Lock())
435 display.displaySystem.pixelFormat = ddrawDisplay.bitmap.pixelFormat;
436 result = ((subclass(DisplayDriver))class(LFBDisplayDriver)).GrabScreen(display, bitmap, x,y, w,h);
437 ddrawDisplay.Unlock();
442 bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps)
444 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).MakeDDBitmap(displaySystem, bitmap, mipMaps);
447 void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
449 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FreeBitmap(displaySystem, bitmap);
452 void SetForeground(Display display, Surface surface, ColorAlpha color)
455 DDrawDisplay ddrawDisplay = display.driverData;
456 SetTextColor(ddrawDisplay.hdc, RGB(color.color.r, color.color.g, color.color.b));
458 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetForeground(display, surface, color);
461 void SetBackground(Display display, Surface surface, ColorAlpha color)
464 DDrawDisplay ddrawDisplay = display.driverData;
467 if(ddrawDisplay.bitmap.pixelFormat == pixelFormat8)
468 color = ddrawDisplay.bitmap.palette[ddrawDisplay.rgbLookup[(uint16)(Color555) color]];
469 rgb = RGB(color.color.r, color.color.g, color.color.b);
470 SetBkColor(ddrawDisplay.hdc, rgb);
472 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetBackground(display, surface, color);
475 ColorAlpha GetPixel(Display display, Surface surface,int x,int y)
480 void PutPixel(Display display, Surface surface, int x, int y)
482 ((subclass(DisplayDriver))class(LFBDisplayDriver)).PutPixel(display, surface, x,y);
485 void DrawLine(Display display, Surface surface, int x1, int y1, int x2, int y2)
487 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DrawLine(display, surface, x1,y1,x2,y2);
490 void Rectangle(Display display, Surface surface, int x1, int y1, int x2, int y2)
492 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Rectangle(display, surface, x1,y1,x2,y2);
495 void Area(Display display, Surface surface,int x1,int y1,int x2,int y2)
497 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Area(display, surface, x1,y1,x2,y2);
500 void Clear(Display display, Surface surface, ClearType flags)
502 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Clear(display, surface, flags);
505 bool ConvertBitmap(DisplaySystem displaySystem, Bitmap src, PixelFormat format, ColorAlpha * palette)
507 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).ConvertBitmap(displaySystem, src, format, palette);
510 bool AllocateBitmap(DisplaySystem displaySystem, Bitmap bitmap, int width, int height, int stride, PixelFormat format, bool allocatePalette)
512 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).AllocateBitmap(displaySystem, bitmap, width, height, stride, format, allocatePalette);
515 void Blit(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h)
517 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Blit(display, surface, src, dx, dy, sx, sy, w, h);
520 void Stretch(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)).Stretch(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
525 void Filter(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
527 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Filter(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
530 void BlitDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h)
532 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Blit(display, surface, src, dx, dy, sx, sy, w, h);
535 void StretchDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
537 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Stretch(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
540 void FilterDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
542 Filter(display, surface, src, dx, dy, sx, sy, w, h, sw, sh);
545 void TextFont(Display display, Surface surface, Font font)
548 DDrawDisplay ddrawDisplay = display.driverData;
549 /*if(display.alphaBlend)
553 gdiFont.font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(display.displaySystem,
554 gdiFont.faceName, gdiFont.size, gdiFont.flags);
556 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextFont(display, surface, gdiFont.font);
559 SelectObject(ddrawDisplay.hdc, font);
561 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextFont(display, surface, font);
562 SetForeground(display, surface, surface.foreground);
566 void TextOpacity(Display display, Surface surface, bool opaque)
569 DDrawDisplay ddrawDisplay = display.driverData;
570 SetBkMode(ddrawDisplay.hdc, surface.textOpacity ? OPAQUE : TRANSPARENT);
572 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextOpacity(display, surface, opaque);
576 Font LoadFont(DisplaySystem displaySystem, char * faceName, float size, FontFlags flags)
580 HDC hdc = GetDC(null);
581 font = CreateFont(-(int)((float)size * GetDeviceCaps(hdc, LOGPIXELSY) / 72 + 0.5),
582 0,0,0, (flags.bold) ? FW_BOLD : FW_NORMAL, flags.italic,
583 flags.underline,0,DEFAULT_CHARSET,
584 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
585 DEFAULT_PITCH|FF_DONTCARE,faceName);
586 ReleaseDC(null, hdc);
589 Font font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags);
592 font.bitmap.pixelFormat = C8;
593 font.bitmap.transparent = true;
594 font.bitmap.allocatePalette = false;
595 delete font.bitmap.palette;
596 font.bitmap.shadeShift = 8-LIGHTSHIFT;
598 // Tune the bitmap a bit until we decide to do alpha blending...
600 Bitmap bitmap = font.bitmap;
602 for(y = 0; y<bitmap.height; y++)
604 byte * picture = bitmap.picture + bitmap.stride * y;
605 for(x = 0; x<bitmap.width; x++, picture++)
608 *picture = Max(*picture, 150);
615 LFBDisplay lfbDisplay = display.driverData;
617 font.bitmap.palette = lfbDisplay.bitmap.palette;
619 font.bitmap.palette = GetDefaultPalette();
626 void UnloadFont(DisplaySystem displaySystem, Font font)
632 ((subclass(DisplayDriver))class(LFBDisplayDriver)).UnloadFont(displaySystem, font);
636 void WriteText(Display display, Surface surface, int x, int y, byte * text, int len)
639 DDrawDisplay ddrawDisplay = display.driverData;
641 /*if(display.alphaBlend)
643 GDIFont gdiFont = (GDIFont)surface.font;
646 gdiFont.font = ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(display.displaySystem,
647 gdiFont.faceName, gdiFont.size, gdiFont.flags);
649 if(surface.textOpacity)
652 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(display.displaySystem, gdiFont.font, text, len, &w, &h);
653 Area(display, surface, x, y, x+w-1, y+h-1);
655 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len);
660 uint16 * u16text = UTF8toUTF16Len(text, len, &wordCount);
662 TextOut(ddrawDisplay.hdc, x + surface.offset.x, y + surface.offset.y, u16text, wordCount);
663 if(display.alphaBlend)
666 FontExtent(display.displaySystem, surface.font, text, len, &w, &h);
667 surface.writeColor = false;
668 SetBackground(display, surface, surface.foreground);
669 Area(display, surface,x-2,y-2,x+w+1,y+h+1);
670 SetBackground(display, surface, surface.background);
671 surface.writeColor = true;
676 TextOut(ddrawDisplay.hdc, x+surface.offset.x,y+surface.offset.y, text,len);
679 if(surface.textOpacity)
682 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(display.displaySystem, surface.font, text, len, &w, &h);
683 Area(display, surface, x, y, x+w-1, y+h-1);
685 ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x,y, text, len);
689 void FontExtent(DisplaySystem displaySystem, Font font, byte * text, int len, int * width, int * height)
692 if(false) //display.alphaBlend)
693 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height);
698 SelectObject(tmpDC, font);
699 TextExtent(null, null, text, len, width, height);
703 if(width) *width = 0;
704 if(height) *height = 0;
712 SelectObject(hdc, font);
713 for(realLen = 0; realLen<len && text[realLen]; realLen++);
714 GetTextExtentPoint32(hdc," ",1,&space);
715 GetTextExtentPoint32(hdc,text,realLen,&size);
717 if(width) *width = size.cx + (len - realLen) * space.cx;
723 *height = len ? space.cy : 0;
727 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height);
731 void TextExtent(Display display, Surface surface, byte * text, int len, int * width, int * height)
734 /*if(display && display.alphaBlend)
735 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextExtent(display, surface, text, len, width, height);
739 DDrawDisplay ddrawDisplay = display ? display.driverData : null;
740 HDC hdc = ddrawDisplay ? ddrawDisplay.hdc : tmpDC;
744 uint16 * u16text = UTF8toUTF16Len(text, len, &wordCount);
746 for(realLen = 0; realLen<wordCount && u16text[realLen]; realLen++);
747 GetTextExtentPoint32A(hdc, " ", 1, &space);
748 GetTextExtentPoint32(hdc, u16text, realLen, &size);
751 // UNICODE FIX: proper space computation
752 if(width) *width = size.cx + (wordCount - realLen) * space.cx;
758 *height = wordCount ? space.cy : 0;
762 HDC hdc = ddrawDisplay.hdc;
766 for(realLen = 0; realLen<len && text[realLen]; realLen++);
767 GetTextExtentPoint32(hdc," ",1,&space);
768 GetTextExtentPoint32(hdc,text,realLen,&size);
770 if(width) *width = size.cx + (len - realLen) * space.cx;
776 *height = len ? space.cy : 0;
780 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextExtent(display, surface, text, len, width, height);
784 void DrawingChar(Display display, Surface surface, byte character)
789 void LineStipple(Display display, Surface surface, uint stipple)
791 ((subclass(DisplayDriver))class(LFBDisplayDriver)).LineStipple(display, surface, stipple);
794 bool Lock(Display display)
796 /*DDrawDisplay ddrawDisplay = display.driverData;
797 if(ddrawDisplay.Lock())
799 display.displaySystem.pixelFormat = ddrawDisplay.bitmap.pixelFormat;
800 IDirectDrawSurface_GetDC(ddrawDisplay.back, &ddrawDisplay.hdc);
805 void Unlock(Display display)
807 /*DDrawDisplay ddrawDisplay = display.driverData;
808 IDirectDrawSurface_ReleaseDC(ddrawDisplay.back, ddrawDisplay.hdc);
809 ddrawDisplay.Unlock(); */