EnumThemeColors() and EnumThemeSizes() actually do not return a single
[wine] / dlls / ttydrv / graphics.c
1 /*
2  * TTY DC graphics
3  *
4  * Copyright 1999 Patrik Stridvall
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "config.h"
22
23 #include <stdarg.h>
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winnls.h"
28 #include "wine/debug.h"
29 #include "ttydrv.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(ttydrv);
32
33 /***********************************************************************
34  *              TTYDRV_DC_Arc
35  */
36 BOOL TTYDRV_DC_Arc(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom,
37                    INT xstart, INT ystart, INT xend, INT yend)
38 {
39   FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
40         physDev->hdc, left, top, right, bottom, xstart, ystart, xend, yend);
41   return TRUE;
42 }
43
44 /***********************************************************************
45  *              TTYDRV_DC_Chord
46  */
47 BOOL TTYDRV_DC_Chord(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom,
48                      INT xstart, INT ystart, INT xend, INT yend)
49 {
50   FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
51         physDev->hdc, left, top, right, bottom, xstart, ystart, xend, yend);
52   return TRUE;
53 }
54
55 /***********************************************************************
56  *              TTYDRV_DC_Ellipse
57  */
58 BOOL TTYDRV_DC_Ellipse(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom)
59 {
60   FIXME("(%p, %d, %d, %d, %d): stub\n", physDev->hdc, left, top, right, bottom);
61   return TRUE;
62 }
63
64 /***********************************************************************
65  *              TTYDRV_DC_ExtFloodFill
66  */
67 BOOL TTYDRV_DC_ExtFloodFill(TTYDRV_PDEVICE *physDev, INT x, INT y,
68                             COLORREF color, UINT fillType)
69 {
70   FIXME("(%p, %d, %d, 0x%08lx, %u): stub\n", physDev->hdc, x, y, color, fillType);
71   return TRUE;
72 }
73
74 /***********************************************************************
75  *              TTYDRV_DC_GetPixel
76  */
77 COLORREF TTYDRV_DC_GetPixel(TTYDRV_PDEVICE *physDev, INT x, INT y)
78 {
79   FIXME("(%p, %d, %d): stub\n", physDev->hdc, x, y);
80   return RGB(0,0,0); /* FIXME: Always returns black */
81 }
82
83 /***********************************************************************
84  *              TTYDRV_DC_LineTo
85  */
86 BOOL TTYDRV_DC_LineTo(TTYDRV_PDEVICE *physDev, INT x, INT y)
87 {
88 #ifdef WINE_CURSES
89   INT row1, col1, row2, col2;
90   POINT pt[2];
91
92   TRACE("(%p, %d, %d)\n", physDev->hdc, x, y);
93
94   if(!physDev->window)
95     return FALSE;
96
97   GetCurrentPositionEx( physDev->hdc, &pt[0] );
98   pt[1].x = x;
99   pt[1].y = y;
100   LPtoDP( physDev->hdc, pt, 2 );
101
102   row1 = (physDev->org.y + pt[0].y) / physDev->cellHeight;
103   col1 = (physDev->org.x + pt[0].x) / physDev->cellWidth;
104   row2 = (physDev->org.y + pt[1].y) / physDev->cellHeight;
105   col2 = (physDev->org.x + pt[1].x) / physDev->cellWidth;
106
107   if(row1 > row2) {
108     INT tmp = row1;
109     row1 = row2;
110     row2 = tmp;
111   }
112
113   if(col1 > col2) {
114     INT tmp = col1;
115     col1 = col2;
116     col2 = tmp;
117   }
118
119   wmove(physDev->window, row1, col1);
120   if(col1 == col2) {
121     wvline(physDev->window, ACS_VLINE, row2-row1);
122   } else if(row1 == row2) {
123     whline(physDev->window, ACS_HLINE, col2-col1);
124   } else {
125     FIXME("Diagonal line drawing not yet supported\n");
126   }
127   wrefresh(physDev->window);
128
129   return TRUE;
130 #else /* defined(WINE_CURSES) */
131   FIXME("(%p, %d, %d): stub\n", physDev->hdc, x, y);
132
133   return TRUE;
134 #endif /* defined(WINE_CURSES) */
135 }
136
137 /***********************************************************************
138  *              TTYDRV_DC_PaintRgn
139  */
140 BOOL TTYDRV_DC_PaintRgn(TTYDRV_PDEVICE *physDev, HRGN hrgn)
141 {
142   FIXME("(%p, %p): stub\n", physDev->hdc, hrgn);
143   return TRUE;
144 }
145
146 /***********************************************************************
147  *              TTYDRV_DC_Pie
148  */
149 BOOL TTYDRV_DC_Pie(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom,
150                    INT xstart, INT ystart, INT xend, INT yend)
151 {
152   FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
153         physDev->hdc, left, top, right, bottom, xstart, ystart, xend, yend);
154   return TRUE;
155 }
156
157 /***********************************************************************
158  *              TTYDRV_DC_Polygon
159  */
160 BOOL TTYDRV_DC_Polygon(TTYDRV_PDEVICE *physDev, const POINT* pt, INT count)
161 {
162   FIXME("(%p, %p, %d): stub\n", physDev->hdc, pt, count);
163   return TRUE;
164 }
165
166 /***********************************************************************
167  *              TTYDRV_DC_Polyline
168  */
169 BOOL TTYDRV_DC_Polyline(TTYDRV_PDEVICE *physDev, const POINT* pt, INT count)
170 {
171   FIXME("(%p, %p, %d): stub\n", physDev->hdc, pt, count);
172   return TRUE;
173 }
174
175 /***********************************************************************
176  *              TTYDRV_DC_PolyPolygon
177  */
178 BOOL TTYDRV_DC_PolyPolygon(TTYDRV_PDEVICE *physDev, const POINT* pt, const INT* counts, UINT polygons)
179 {
180   FIXME("(%p, %p, %p, %u): stub\n", physDev->hdc, pt, counts, polygons);
181   return TRUE;
182 }
183
184 /***********************************************************************
185  *              TTYDRV_DC_PolyPolyline
186  */
187 BOOL TTYDRV_DC_PolyPolyline(TTYDRV_PDEVICE *physDev, const POINT* pt, const DWORD* counts, DWORD polylines)
188 {
189   FIXME("(%p, %p, %p, %lu): stub\n", physDev->hdc, pt, counts, polylines);
190
191   return TRUE;
192 }
193
194 /***********************************************************************
195  *              TTYDRV_DC_Rectangle
196  */
197 BOOL TTYDRV_DC_Rectangle(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom)
198 {
199 #ifdef WINE_CURSES
200   INT row1, col1, row2, col2;
201   RECT rect;
202
203   TRACE("(%p, %d, %d, %d, %d)\n", physDev->hdc, left, top, right, bottom);
204
205   if(!physDev->window)
206     return FALSE;
207
208   rect.left   = left;
209   rect.top    = top;
210   rect.right  = right;
211   rect.bottom = bottom;
212   LPtoDP( physDev->hdc, (POINT *)&rect, 2 );
213   row1 = (physDev->org.y + rect.top) / physDev->cellHeight;
214   col1 = (physDev->org.x + rect.left) / physDev->cellWidth;
215   row2 = (physDev->org.y + rect.bottom) / physDev->cellHeight;
216   col2 = (physDev->org.x + rect.right) / physDev->cellWidth;
217
218   if(row1 > row2) {
219     INT tmp = row1;
220     row1 = row2;
221     row2 = tmp;
222   }
223   if(col1 > col2) {
224     INT tmp = col1;
225     col1 = col2;
226     col2 = tmp;
227   }
228
229   wmove(physDev->window, row1, col1);
230   whline(physDev->window, ACS_HLINE, col2-col1);
231
232   wmove(physDev->window, row1, col2);
233   wvline(physDev->window, ACS_VLINE, row2-row1);
234
235   wmove(physDev->window, row2, col1);
236   whline(physDev->window, ACS_HLINE, col2-col1);
237
238   wmove(physDev->window, row1, col1);
239   wvline(physDev->window, ACS_VLINE, row2-row1);
240
241   mvwaddch(physDev->window, row1, col1, ACS_ULCORNER);
242   mvwaddch(physDev->window, row1, col2, ACS_URCORNER);
243   mvwaddch(physDev->window, row2, col2, ACS_LRCORNER);
244   mvwaddch(physDev->window, row2, col1, ACS_LLCORNER);
245
246   wrefresh(physDev->window);
247
248   return TRUE;
249 #else /* defined(WINE_CURSES) */
250   FIXME("(%p, %d, %d, %d, %d): stub\n", physDev->hdc, left, top, right, bottom);
251
252   return TRUE;
253 #endif /* defined(WINE_CURSES) */
254 }
255
256 /***********************************************************************
257  *              TTYDRV_DC_RoundRect
258  */
259 BOOL TTYDRV_DC_RoundRect(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right,
260                          INT bottom, INT ell_width, INT ell_height)
261 {
262   FIXME("(%p, %d, %d, %d, %d, %d, %d): stub\n",
263         physDev->hdc, left, top, right, bottom, ell_width, ell_height);
264
265   return TRUE;
266 }
267
268 /***********************************************************************
269  *              TTYDRV_DC_SetPixel
270  */
271 COLORREF TTYDRV_DC_SetPixel(TTYDRV_PDEVICE *physDev, INT x, INT y, COLORREF color)
272 {
273 #ifdef WINE_CURSES
274   INT row, col;
275   POINT pt;
276
277   TRACE("(%p, %d, %d, 0x%08lx)\n", physDev->hdc, x, y, color);
278
279   if(!physDev->window)
280     return FALSE;
281
282   pt.x = x;
283   pt.y = y;
284   LPtoDP( physDev->hdc, &pt, 1 );
285   row = (physDev->org.y + pt.y) / physDev->cellHeight;
286   col = (physDev->org.x + pt.x) / physDev->cellWidth;
287
288   mvwaddch(physDev->window, row, col, ACS_BULLET);
289   wrefresh(physDev->window);
290
291   return RGB(0,0,0); /* FIXME: Always returns black */
292 #else /* defined(WINE_CURSES) */
293   FIXME("(%p, %d, %d, 0x%08lx): stub\n", physDev->hdc, x, y, color);
294
295   return RGB(0,0,0); /* FIXME: Always returns black */
296 #endif /* defined(WINE_CURSES) */
297 }
298
299 /***********************************************************************
300  *              TTYDRV_DC_BitBlt
301  */
302 BOOL TTYDRV_DC_BitBlt(TTYDRV_PDEVICE *physDevDst, INT xDst, INT yDst,
303                       INT width, INT height, TTYDRV_PDEVICE *physDevSrc,
304                       INT xSrc, INT ySrc, DWORD rop)
305 {
306   FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %lu): stub\n",
307         physDevDst->hdc, xDst, yDst, width, height, physDevSrc->hdc, xSrc, ySrc, rop );
308   return TRUE;
309 }
310
311 /***********************************************************************
312  *              TTYDRV_DC_PatBlt
313  */
314 BOOL TTYDRV_DC_PatBlt(TTYDRV_PDEVICE *physDev, INT left, INT top,
315                       INT width, INT height, DWORD rop)
316 {
317   FIXME("(%p, %d, %d, %d, %d, %lu): stub\n", physDev->hdc, left, top, width, height, rop );
318   return TRUE;
319 }
320
321 /***********************************************************************
322  *              TTYDRV_DC_StretchBlt
323  */
324 BOOL TTYDRV_DC_StretchBlt(TTYDRV_PDEVICE *physDevDst, INT xDst, INT yDst,
325                           INT widthDst, INT heightDst,
326                           TTYDRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
327                           INT widthSrc, INT heightSrc, DWORD rop)
328 {
329   FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %d, %d, %lu): stub\n",
330         physDevDst->hdc, xDst, yDst, widthDst, heightDst,
331         physDevSrc->hdc, xSrc, ySrc, widthSrc, heightSrc, rop );
332
333   return TRUE;
334 }
335
336 /***********************************************************************
337  *              TTYDRV_DC_ExtTextOut
338  */
339 BOOL TTYDRV_DC_ExtTextOut(TTYDRV_PDEVICE *physDev, INT x, INT y, UINT flags,
340                           const RECT *lpRect, LPCWSTR str, UINT count,
341                           const INT *lpDx )
342 {
343 #ifdef WINE_CURSES
344   INT row, col;
345   LPSTR ascii;
346   DWORD len;
347
348   TRACE("(%p, %d, %d, 0x%08x, %p, %s, %d, %p)\n",
349         physDev->hdc, x, y, flags, lpRect, debugstr_wn(str, count), count, lpDx);
350
351   if(!physDev->window)
352     return FALSE;
353
354   row = (physDev->org.y + y) / physDev->cellHeight;
355   col = (physDev->org.x + x) / physDev->cellWidth;
356   len = WideCharToMultiByte( CP_ACP, 0, str, count, NULL, 0, NULL, NULL );
357   ascii = HeapAlloc( GetProcessHeap(), 0, len );
358   WideCharToMultiByte( CP_ACP, 0, str, count, ascii, len, NULL, NULL );
359   mvwaddnstr(physDev->window, row, col, ascii, len);
360   HeapFree( GetProcessHeap(), 0, ascii );
361   wrefresh(physDev->window);
362
363   return TRUE;
364 #else /* defined(WINE_CURSES) */
365   FIXME("(%p, %d, %d, 0x%08x, %p, %s, %d, %p): stub\n",
366         physDev->hdc, x, y, flags, lpRect, debugstr_wn(str,count), count, lpDx);
367
368   return TRUE;
369 #endif /* defined(WINE_CURSES) */
370 }
371
372 /***********************************************************************
373  *              TTYDRV_DC_GetCharWidth
374  */
375 BOOL TTYDRV_DC_GetCharWidth(TTYDRV_PDEVICE *physDev, UINT firstChar, UINT lastChar,
376                             LPINT buffer)
377 {
378   UINT c;
379
380   FIXME("(%p, %u, %u, %p): semistub\n", physDev->hdc, firstChar, lastChar, buffer);
381
382   for(c=firstChar; c<=lastChar; c++) {
383     buffer[c-firstChar] = physDev->cellWidth;
384   }
385
386   return TRUE;
387 }
388
389 /***********************************************************************
390  *              TTYDRV_DC_GetTextExtentPoint
391  */
392 BOOL TTYDRV_DC_GetTextExtentPoint(TTYDRV_PDEVICE *physDev, LPCWSTR str, INT count,
393                                   LPSIZE size)
394 {
395   TRACE("(%p, %s, %d, %p)\n", physDev->hdc, debugstr_wn(str, count), count, size);
396
397   size->cx = count * physDev->cellWidth;
398   size->cy = physDev->cellHeight;
399
400   return TRUE;
401 }
402
403 /***********************************************************************
404  *              TTYDRV_DC_GetTextMetrics
405  */
406 BOOL TTYDRV_DC_GetTextMetrics(TTYDRV_PDEVICE *physDev, LPTEXTMETRICW lptm)
407 {
408   TRACE("(%p, %p)\n", physDev->hdc, lptm);
409
410   lptm->tmHeight = physDev->cellHeight;
411   lptm->tmAscent = 0;
412   lptm->tmDescent = 0;
413   lptm->tmInternalLeading = 0;
414   lptm->tmExternalLeading = 0;
415   lptm->tmAveCharWidth = physDev->cellWidth;
416   lptm->tmMaxCharWidth = physDev->cellWidth;
417   lptm->tmWeight = FW_MEDIUM;
418   lptm->tmOverhang = 0;
419   lptm->tmDigitizedAspectX = physDev->cellWidth;
420   lptm->tmDigitizedAspectY = physDev->cellHeight;
421   lptm->tmFirstChar = 32;
422   lptm->tmLastChar = 255;
423   lptm->tmDefaultChar = 0;
424   lptm->tmBreakChar = 32;
425   lptm->tmItalic = FALSE;
426   lptm->tmUnderlined = FALSE;
427   lptm->tmStruckOut = FALSE;
428   lptm->tmPitchAndFamily = TMPF_FIXED_PITCH|TMPF_DEVICE;
429   lptm->tmCharSet = ANSI_CHARSET;
430
431   return TRUE;
432 }