1 namespace gfx::drivers;
7 #define WIN32_LEAN_AND_MEAN
16 class CONDisplay : LFBDisplay
21 class Win32ConsoleDisplayDriver : DisplayDriver
23 class_property(name) = "Win32Console";
25 bool CreateDisplaySystem(DisplaySystem displaySystem)
27 displaySystem.flags.text = true;
31 void DestroyDisplaySystem(DisplaySystem displaySystem)
36 void DestroyDisplay(Display display)
38 CONDisplay conDisplay = display.driverData;
40 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DestroyDisplay(display);
41 delete conDisplay.charInfo;
43 display.driverData = null;
46 void SetPalette(Display display, ColorAlpha * palette, bool colorMatch)
51 bool CreateDisplay(Display display)
54 CONDisplay conDisplay = display.driverData = CONDisplay { };
58 if(((subclass(DisplayDriver))class(LFBDisplayDriver)).CreateDisplay(display))
61 conDisplay.bitmap.pixelFormat = pixelFormatText;
68 bool DisplaySize(Display display, int width, int height)
70 CONDisplay conDisplay = display.driverData;
73 delete conDisplay.charInfo;
75 if((conDisplay.charInfo = new CHAR_INFO[width/textCellW * height/textCellH]))
77 display.width = width;
78 display.height = height;
85 void DisplayPosition(Display display, int x, int y)
90 void RestorePalette(Display display)
95 void StartUpdate(Display display)
99 void EndUpdate(Display display)
103 void Scroll(Display display, Box scroll, int x, int y, Extent dirty)
107 void Update(Display display, Box updateBox)
109 CONDisplay conDisplay = display.driverData;
111 Box * box = updateBox;// ? updateBox : &conDisplay.updateBox;
115 size.X = (short)(display.width / textCellW);
116 size.Y = (short)(display.height / textCellH);
117 coord.X = (short)(box->left / textCellW);
118 coord.Y = (short)(box->top / textCellH);
119 rect.Left = (short)(box->left / textCellW);
120 rect.Top = (short)(box->top / textCellH);
121 rect.Right = (short)(box->right / textCellW);
122 rect.Bottom = (short)(box->bottom / textCellH);
124 WriteConsoleOutput(display.window, conDisplay.charInfo,size,coord,&rect);
126 //((subclass(DisplayDriver))class(LFBDisplayDriver)).DisplayScreen(display, updateBox);
129 void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
134 bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps)
139 bool GetSurface(Display display, Surface surface, int x,int y, Box clip)
141 if((surface.driverData = LFBSurface { }))
142 return ((subclass(DisplayDriver))class(LFBDisplayDriver)).GetSurface(display, surface, x, y, clip);
146 bool GetBitmapSurface(DisplaySystem displaySystem, Surface surface, Bitmap bitmap, int x,int y,Box clip)
151 void ReleaseSurface(Display display, Surface surface)
153 ((subclass(DisplayDriver))class(LFBDisplayDriver)).ReleaseSurface(display, surface);
156 void Clip(Display display, Surface surface, Box clip)
158 ((subclass(DisplayDriver))class(LFBDisplayDriver)).Clip(display, surface, clip);
161 bool GrabScreen(Display display, Bitmap bitmap, int x, int y, unsigned int w, unsigned int h)
166 void SetForeground(Display display, Surface surface, ColorAlpha color)
168 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetForeground(display, surface, color);
171 void SetBackground(Display display, Surface surface, ColorAlpha color)
173 ((subclass(DisplayDriver))class(LFBDisplayDriver)).SetBackground(display, surface, color);
176 ColorAlpha GetPixel(Display display, Surface surface, int x,int y)
181 void PutPixel(Display display, Surface surface, int x,int y)
183 CONDisplay conDisplay = display.driverData;
184 LFBSurface conSurface = surface.driverData;
188 if((x<=surface.box.right)&&(y<=surface.box.bottom)&&(x>=surface.box.left)&&(y>=surface.box.top))
190 ((uint*)conDisplay.charInfo)[(y+surface.offset.y)*display.width / textCellW+x+surface.offset.x] =
191 ((conSurface.background|conSurface.foreground)<<8) | conSurface.drawingChar;
195 void DrawLine(Display display, Surface surface, int x1, int y1, int x2, int y2)
197 CONDisplay conDisplay = display.driverData;
198 LFBSurface conSurface = surface.driverData;
209 if(y1>y2) { int tmp = y2; y2 = y1; y1 = tmp; }
211 if((x1>surface.box.right)||(x1<surface.box.left))return;
212 if((y1>surface.box.bottom)||(y2<surface.box.top))return;
213 if(y1<surface.box.top)y1=surface.box.top;
214 if(y2>surface.box.bottom)y2=surface.box.bottom;
217 lfbPtr = conDisplay.charInfo +
218 (y1+surface.offset.y)*display.width / textCellW+x1+surface.offset.x;
219 for(y = y1; y <= y2; y++)
221 if(conSurface.opaqueText)
222 lfbPtr->Attributes = (uint16)((conSurface.background | conSurface.foreground) >> 8);
224 lfbPtr->Attributes = (uint16)((conSurface.foreground >> 8) | (lfbPtr->Attributes & 0xF0));
225 lfbPtr->Char.AsciiChar = conSurface.drawingChar;
226 lfbPtr += display.width / textCellW;
233 if(x1>x2) { int tmp = x2; x2 = x1; x1 = tmp; }
235 if((y1>surface.box.bottom)||(y1<surface.box.top))return;
236 if((x1>surface.box.right)||(x2<surface.box.left))return;
237 if(x1<surface.box.left)x1=surface.box.left;
238 if(x2>surface.box.right)x2=surface.box.right;
241 lfbPtr = conDisplay.charInfo +
242 (y1+surface.offset.y)*display.width / textCellW+x1+surface.offset.x;
244 if(conSurface.opaqueText)
245 FillBytesBy4((DWORD*) lfbPtr,
246 ((conSurface.background | conSurface.foreground) << 8) | conSurface.drawingChar,
251 for(x=x1;x<=x2; x++, lfbPtr++)
253 lfbPtr->Attributes = (uint16)((conSurface.foreground >> 8) | (lfbPtr->Attributes & 0xF0));
254 lfbPtr->Char.AsciiChar = conSurface.drawingChar;
260 void Rectangle(Display display, Surface surface,int x1,int y1,int x2,int y2)
265 void Area(Display display, Surface surface,int x1,int y1,int x2,int y2)
267 CONDisplay conDisplay = display.driverData;
268 LFBSurface conSurface = surface.driverData;
275 if(x1>x2) { int tmp = x2; x2 = x1; x1 = tmp; }
277 if(x1<surface.box.left) x1=surface.box.left;
278 if(x2>surface.box.right) x2=surface.box.right;
279 if(y1<surface.box.top) y1=surface.box.top;
280 if(y2>surface.box.bottom) y2=surface.box.bottom;
284 CHAR_INFO *lfbPtr = conDisplay.charInfo +
285 (y1+surface.offset.y)*display.width / textCellW+x1+surface.offset.x;
289 FillBytesBy4((DWORD *)lfbPtr,((conSurface.background | conSurface.foreground)<<8)|conSurface.drawingChar,x2-x1+1);
290 lfbPtr+=display.width / textCellW;
295 void Clear(Display display, Surface surface, ClearType flags)
297 Area(display, surface, 0, 0, surface.width - 1, surface.height - 1);
300 bool ConvertBitmap(DisplaySystem displaySystem, Bitmap src, PixelFormat format, ColorAlpha * palette)
305 bool AllocateBitmap(DisplaySystem displaySystem, Bitmap bitmap, int width, int height, int stride, PixelFormat format, bool allocatePalette)
310 void Blit(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h)
315 void Stretch(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
320 void Filter(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
325 void BlitDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h)
330 void StretchDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
335 void FilterDI(Display display, Surface surface, Bitmap src, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
340 Font LoadFont(DisplaySystem displaySystem, const char * string, float size, FontFlags flags)
342 return (void *) bool::true;
345 void UnloadFont(DisplaySystem displaySystem, Font font)
350 void TextFont(Display display, Surface surface, void * font)
354 void TextOpacity(Display display, Surface surface, bool opaque)
356 ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextOpacity(display, surface, opaque);
359 void WriteText(Display display, Surface surface, int x, int y, const char * text, int len)
361 CONDisplay conDisplay = display.driverData;
362 LFBSurface conSurface = surface.driverData;
363 CHAR_INFO * lfbPtr = conDisplay.charInfo;
369 if(y > surface.box.bottom || y < surface.box.top)
371 lfbPtr += (y+surface.offset.y) * display.width / textCellW + x + surface.offset.x;
372 for(c=0; (c<len && x < surface.box.left); c++, x++,lfbPtr++);
373 for(; (c<len && x <= surface.box.right); c++, x++,lfbPtr++)
375 if(!conSurface.opaqueText)
377 lfbPtr->Attributes = (uint16)((conSurface.foreground >> 8) | (lfbPtr->Attributes & 0xF0));
378 lfbPtr->Char.AsciiChar = text[c];
382 lfbPtr->Attributes = (uint16)((conSurface.background|conSurface.foreground) >> 8);
383 lfbPtr->Char.AsciiChar = text[c];
388 void FontExtent(DisplaySystem displaySystem, void * font, const char * text, int len, int * width, int * height)
390 ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height);
393 void TextExtent(Display display, Surface surface, const char * text, int len, int * width, int * height)
395 FontExtent(display.displaySystem, null, text, len, width, height);
398 void DrawingChar(Display display, Surface surface, char character)
400 ((subclass(DisplayDriver))class(LFBDisplayDriver)).DrawingChar(display, surface, character);
403 void LineStipple(Display display, Surface surface, uint stipple)
408 bool Lock(Display display)
413 void Unlock(Display display)