Add some specific afmdirs as examples.
[wine/testsucceed.git] / dlls / ttydrv / graphics.c
blob082080c7c6f4b2e33004b11102640356fe3259f1
1 /*
2 * TTY DC graphics
4 * Copyright 1999 Patrik Stridvall
5 */
7 #include "config.h"
9 #include "winnls.h"
10 #include "gdi.h"
11 #include "heap.h"
12 #include "debugtools.h"
13 #include "ttydrv.h"
15 DEFAULT_DEBUG_CHANNEL(ttydrv);
17 /***********************************************************************
18 * TTYDRV_DC_Arc
20 BOOL TTYDRV_DC_Arc(DC *dc, INT left, INT top, INT right, INT bottom,
21 INT xstart, INT ystart, INT xend, INT yend)
23 FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
24 dc, left, top, right, bottom, xstart, ystart, xend, yend);
26 return TRUE;
29 /***********************************************************************
30 * TTYDRV_DC_Chord
32 BOOL TTYDRV_DC_Chord(DC *dc, INT left, INT top, INT right, INT bottom,
33 INT xstart, INT ystart, INT xend, INT yend)
35 FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
36 dc, left, top, right, bottom, xstart, ystart, xend, yend);
38 return TRUE;
41 /***********************************************************************
42 * TTYDRV_DC_Ellipse
44 BOOL TTYDRV_DC_Ellipse(DC *dc, INT left, INT top, INT right, INT bottom)
46 FIXME("(%p, %d, %d, %d, %d): stub\n",
47 dc, left, top, right, bottom);
49 return TRUE;
52 /***********************************************************************
53 * TTYDRV_DC_ExtFloodFill
55 BOOL TTYDRV_DC_ExtFloodFill(DC *dc, INT x, INT y,
56 COLORREF color, UINT fillType)
58 FIXME("(%p, %d, %d, 0x%08lx, %u): stub\n", dc, x, y, color, fillType);
60 return TRUE;
63 /***********************************************************************
64 * TTYDRV_DC_GetPixel
66 COLORREF TTYDRV_DC_GetPixel(DC *dc, INT x, INT y)
68 FIXME("(%p, %d, %d): stub\n", dc, x, y);
70 return RGB(0,0,0); /* FIXME: Always returns black */
73 /***********************************************************************
74 * TTYDRV_DC_LineTo
76 BOOL TTYDRV_DC_LineTo(DC *dc, INT x, INT y)
78 #ifdef WINE_CURSES
79 TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
80 INT row1, col1, row2, col2;
82 TRACE("(%p, %d, %d)\n", dc, x, y);
84 if(!physDev->window)
85 return FALSE;
87 row1 = (dc->DCOrgY + XLPTODP(dc, dc->CursPosY)) / physDev->cellHeight;
88 col1 = (dc->DCOrgX + XLPTODP(dc, dc->CursPosX)) / physDev->cellWidth;
89 row2 = (dc->DCOrgY + XLPTODP(dc, y)) / physDev->cellHeight;
90 col2 = (dc->DCOrgX + XLPTODP(dc, x)) / physDev->cellWidth;
92 if(row1 > row2) {
93 INT tmp = row1;
94 row1 = row2;
95 row2 = tmp;
98 if(col1 > col2) {
99 INT tmp = col1;
100 col1 = col2;
101 col2 = tmp;
104 wmove(physDev->window, row1, col1);
105 if(col1 == col2) {
106 wvline(physDev->window, ACS_VLINE, row2-row1);
107 } else if(row1 == row2) {
108 whline(physDev->window, ACS_HLINE, col2-col1);
109 } else {
110 FIXME("Diagonal line drawing not yet supported\n");
112 wrefresh(physDev->window);
114 return TRUE;
115 #else /* defined(WINE_CURSES) */
116 FIXME("(%p, %d, %d): stub\n", dc, x, y);
118 return TRUE;
119 #endif /* defined(WINE_CURSES) */
122 /***********************************************************************
123 * TTYDRV_DC_PaintRgn
125 BOOL TTYDRV_DC_PaintRgn(DC *dc, HRGN hrgn)
127 FIXME("(%p, 0x%04x): stub\n", dc, hrgn);
129 return TRUE;
132 /***********************************************************************
133 * TTYDRV_DC_Pie
135 BOOL TTYDRV_DC_Pie(DC *dc, INT left, INT top, INT right, INT bottom,
136 INT xstart, INT ystart, INT xend, INT yend)
138 FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
139 dc, left, top, right, bottom, xstart, ystart, xend, yend);
141 return TRUE;
144 /***********************************************************************
145 * TTYDRV_DC_Polygon
147 BOOL TTYDRV_DC_Polygon(DC *dc, const POINT* pt, INT count)
149 FIXME("(%p, %p, %d): stub\n", dc, pt, count);
151 return TRUE;
154 /***********************************************************************
155 * TTYDRV_DC_Polyline
157 BOOL TTYDRV_DC_Polyline(DC *dc, const POINT* pt, INT count)
159 FIXME("(%p, %p, %d): stub\n", dc, pt, count);
161 return TRUE;
164 /***********************************************************************
165 * TTYDRV_DC_PolyPolygon
167 BOOL TTYDRV_DC_PolyPolygon(DC *dc, const POINT* pt, const INT* counts, UINT polygons)
169 FIXME("(%p, %p, %p, %u): stub\n", dc, pt, counts, polygons);
171 return TRUE;
174 /***********************************************************************
175 * TTYDRV_DC_PolyPolyline
177 BOOL TTYDRV_DC_PolyPolyline(DC *dc, const POINT* pt, const DWORD* counts, DWORD polylines)
179 FIXME("(%p, %p, %p, %lu): stub\n", dc, pt, counts, polylines);
181 return TRUE;
184 /***********************************************************************
185 * TTYDRV_DC_Rectangle
187 BOOL TTYDRV_DC_Rectangle(DC *dc, INT left, INT top, INT right, INT bottom)
189 #ifdef WINE_CURSES
190 TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
191 INT row1, col1, row2, col2;
193 TRACE("(%p, %d, %d, %d, %d)\n", dc, left, top, right, bottom);
195 if(!physDev->window)
196 return FALSE;
198 row1 = (dc->DCOrgY + XLPTODP(dc, top)) / physDev->cellHeight;
199 col1 = (dc->DCOrgX + XLPTODP(dc, left)) / physDev->cellWidth;
200 row2 = (dc->DCOrgY + XLPTODP(dc, bottom)) / physDev->cellHeight;
201 col2 = (dc->DCOrgX + XLPTODP(dc, right)) / physDev->cellWidth;
203 if(row1 > row2) {
204 INT tmp = row1;
205 row1 = row2;
206 row2 = tmp;
208 if(col1 > col2) {
209 INT tmp = col1;
210 col1 = col2;
211 col2 = tmp;
214 wmove(physDev->window, row1, col1);
215 whline(physDev->window, ACS_HLINE, col2-col1);
217 wmove(physDev->window, row1, col2);
218 wvline(physDev->window, ACS_VLINE, row2-row1);
220 wmove(physDev->window, row2, col1);
221 whline(physDev->window, ACS_HLINE, col2-col1);
223 wmove(physDev->window, row1, col1);
224 wvline(physDev->window, ACS_VLINE, row2-row1);
226 mvwaddch(physDev->window, row1, col1, ACS_ULCORNER);
227 mvwaddch(physDev->window, row1, col2, ACS_URCORNER);
228 mvwaddch(physDev->window, row2, col2, ACS_LRCORNER);
229 mvwaddch(physDev->window, row2, col1, ACS_LLCORNER);
231 wrefresh(physDev->window);
233 return TRUE;
234 #else /* defined(WINE_CURSES) */
235 FIXME("(%p, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom);
237 return TRUE;
238 #endif /* defined(WINE_CURSES) */
241 /***********************************************************************
242 * TTYDRV_DC_RoundRect
244 BOOL TTYDRV_DC_RoundRect(DC *dc, INT left, INT top, INT right,
245 INT bottom, INT ell_width, INT ell_height)
247 FIXME("(%p, %d, %d, %d, %d, %d, %d): stub\n",
248 dc, left, top, right, bottom, ell_width, ell_height);
250 return TRUE;
253 /***********************************************************************
254 * TTYDRV_DC_SetBkColor
256 COLORREF TTYDRV_DC_SetBkColor(DC *dc, COLORREF color)
258 COLORREF oldColor;
260 TRACE("(%p, 0x%08lx)\n", dc, color);
262 oldColor = dc->backgroundColor;
263 dc->backgroundColor = color;
265 return oldColor;
268 /***********************************************************************
269 * TTYDRV_DC_SetPixel
271 COLORREF TTYDRV_DC_SetPixel(DC *dc, INT x, INT y, COLORREF color)
273 #ifdef WINE_CURSES
274 TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
275 INT row, col;
277 TRACE("(%p, %d, %d, 0x%08lx)\n", dc, x, y, color);
279 if(!physDev->window)
280 return FALSE;
282 row = (dc->DCOrgY + XLPTODP(dc, y)) / physDev->cellHeight;
283 col = (dc->DCOrgX + XLPTODP(dc, x)) / physDev->cellWidth;
285 mvwaddch(physDev->window, row, col, ACS_BULLET);
286 wrefresh(physDev->window);
288 return RGB(0,0,0); /* FIXME: Always returns black */
289 #else /* defined(WINE_CURSES) */
290 FIXME("(%p, %d, %d, 0x%08lx): stub\n", dc, x, y, color);
292 return RGB(0,0,0); /* FIXME: Always returns black */
293 #endif /* defined(WINE_CURSES) */
296 /***********************************************************************
297 * TTYDRV_DC_SetTextColor
299 COLORREF TTYDRV_DC_SetTextColor(DC *dc, COLORREF color)
301 COLORREF oldColor;
303 TRACE("(%p, 0x%08lx)\n", dc, color);
305 oldColor = dc->textColor;
306 dc->textColor = color;
308 return oldColor;
312 /***********************************************************************
313 * TTYDRV_DC_BitBlt
315 BOOL TTYDRV_DC_BitBlt(DC *dcDst, INT xDst, INT yDst,
316 INT width, INT height, DC *dcSrc,
317 INT xSrc, INT ySrc, DWORD rop)
319 FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %lu): stub\n",
320 dcDst, xDst, yDst, width, height,
321 dcSrc, xSrc, ySrc, rop
324 return TRUE;
327 /***********************************************************************
328 * TTYDRV_DC_PatBlt
330 BOOL TTYDRV_DC_PatBlt(DC *dc, INT left, INT top,
331 INT width, INT height, DWORD rop)
333 FIXME("(%p, %d, %d, %d, %d, %lu): stub\n",
334 dc, left, top, width, height, rop
338 return TRUE;
341 /***********************************************************************
342 * TTYDRV_DC_StretchBlt
344 BOOL TTYDRV_DC_StretchBlt(DC *dcDst, INT xDst, INT yDst,
345 INT widthDst, INT heightDst,
346 DC *dcSrc, INT xSrc, INT ySrc,
347 INT widthSrc, INT heightSrc, DWORD rop)
349 FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %d, %d, %lu): stub\n",
350 dcDst, xDst, yDst, widthDst, heightDst,
351 dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop
354 return TRUE;
357 /***********************************************************************
358 * TTYDRV_DC_ExtTextOut
360 BOOL TTYDRV_DC_ExtTextOut(DC *dc, INT x, INT y, UINT flags,
361 const RECT *lpRect, LPCWSTR str, UINT count,
362 const INT *lpDx)
364 #ifdef WINE_CURSES
365 TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
366 INT row, col;
367 LPSTR ascii;
368 DWORD len;
370 TRACE("(%p, %d, %d, 0x%08x, %p, %s, %d, %p)\n",
371 dc, x, y, flags, lpRect, debugstr_wn(str, count), count, lpDx);
373 if(!physDev->window)
374 return FALSE;
376 /* FIXME: Is this really correct? */
377 if(dc->textAlign & TA_UPDATECP) {
378 x = dc->CursPosX;
379 y = dc->CursPosY;
382 x = XLPTODP(dc, x);
383 y = YLPTODP(dc, y);
385 row = (dc->DCOrgY + y) / physDev->cellHeight;
386 col = (dc->DCOrgX + x) / physDev->cellWidth;
387 len = WideCharToMultiByte( CP_ACP, 0, str, count, NULL, 0, NULL, NULL );
388 ascii = HeapAlloc( GetProcessHeap(), 0, len );
389 WideCharToMultiByte( CP_ACP, 0, str, count, ascii, len, NULL, NULL );
390 mvwaddnstr(physDev->window, row, col, ascii, len);
391 HeapFree( GetProcessHeap(), 0, ascii );
392 wrefresh(physDev->window);
394 if(dc->textAlign & TA_UPDATECP) {
395 dc->CursPosX += count * physDev->cellWidth;
396 dc->CursPosY += physDev->cellHeight;
399 return TRUE;
400 #else /* defined(WINE_CURSES) */
401 FIXME("(%p, %d, %d, 0x%08x, %p, %s, %d, %p): stub\n",
402 dc, x, y, flags, lpRect, debugstr_wn(str,count), count, lpDx);
404 return TRUE;
405 #endif /* defined(WINE_CURSES) */
408 /***********************************************************************
409 * TTYDRV_DC_GetCharWidth
411 BOOL TTYDRV_DC_GetCharWidth(DC *dc, UINT firstChar, UINT lastChar,
412 LPINT buffer)
414 UINT c;
415 TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
417 FIXME("(%p, %u, %u, %p): semistub\n", dc, firstChar, lastChar, buffer);
419 for(c=firstChar; c<=lastChar; c++) {
420 buffer[c-firstChar] = physDev->cellWidth;
423 return TRUE;
426 /***********************************************************************
427 * TTYDRV_DC_GetTextExtentPoint
429 BOOL TTYDRV_DC_GetTextExtentPoint(DC *dc, LPCWSTR str, INT count,
430 LPSIZE size)
432 TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
434 TRACE("(%p, %s, %d, %p)\n", dc, debugstr_wn(str, count), count, size);
436 size->cx = count * physDev->cellWidth;
437 size->cy = physDev->cellHeight;
439 return TRUE;
442 /***********************************************************************
443 * TTYDRV_DC_GetTextMetrics
445 BOOL TTYDRV_DC_GetTextMetrics(DC *dc, LPTEXTMETRICA lptm)
447 TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
449 TRACE("(%p, %p)\n", dc, lptm);
451 lptm->tmHeight = physDev->cellHeight;
452 lptm->tmAscent = 0;
453 lptm->tmDescent = 0;
454 lptm->tmInternalLeading = 0;
455 lptm->tmExternalLeading = 0;
456 lptm->tmAveCharWidth = physDev->cellWidth;
457 lptm->tmMaxCharWidth = physDev->cellWidth;
458 lptm->tmWeight = FW_MEDIUM;
459 lptm->tmOverhang = 0;
460 lptm->tmDigitizedAspectX = physDev->cellWidth;
461 lptm->tmDigitizedAspectY = physDev->cellHeight;
462 lptm->tmFirstChar = 32;
463 lptm->tmLastChar = 255;
464 lptm->tmDefaultChar = 0;
465 lptm->tmBreakChar = 32;
466 lptm->tmItalic = FALSE;
467 lptm->tmUnderlined = FALSE;
468 lptm->tmStruckOut = FALSE;
469 lptm->tmPitchAndFamily = TMPF_FIXED_PITCH|TMPF_DEVICE;
470 lptm->tmCharSet = ANSI_CHARSET;
472 return TRUE;