Changed the CreateDC driver entry point to use an HDC instead of a DC
[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, INT breakExtra )
342 {
343 #ifdef WINE_CURSES
344   INT row, col;
345   LPSTR ascii;
346   DWORD len;
347   POINT pt;
348   UINT text_align = GetTextAlign( physDev->hdc );
349
350   TRACE("(%p, %d, %d, 0x%08x, %p, %s, %d, %p)\n",
351         physDev->hdc, x, y, flags, lpRect, debugstr_wn(str, count), count, lpDx);
352
353   if(!physDev->window)
354     return FALSE;
355
356   pt.x = x;
357   pt.y = y;
358   /* FIXME: Is this really correct? */
359   if(text_align & TA_UPDATECP) GetCurrentPositionEx( physDev->hdc, &pt );
360
361   LPtoDP( physDev->hdc, &pt, 1 );
362   row = (physDev->org.y + pt.y) / physDev->cellHeight;
363   col = (physDev->org.x + pt.x) / physDev->cellWidth;
364   len = WideCharToMultiByte( CP_ACP, 0, str, count, NULL, 0, NULL, NULL );
365   ascii = HeapAlloc( GetProcessHeap(), 0, len );
366   WideCharToMultiByte( CP_ACP, 0, str, count, ascii, len, NULL, NULL );
367   mvwaddnstr(physDev->window, row, col, ascii, len);
368   HeapFree( GetProcessHeap(), 0, ascii );
369   wrefresh(physDev->window);
370
371   if(text_align & TA_UPDATECP)
372   {
373       pt.x += count * physDev->cellWidth;
374       pt.y += physDev->cellHeight;
375       DPtoLP( physDev->hdc, &pt, 1 );
376       MoveToEx( physDev->hdc, pt.x, pt.y, NULL );
377   }
378
379   return TRUE;
380 #else /* defined(WINE_CURSES) */
381   FIXME("(%p, %d, %d, 0x%08x, %p, %s, %d, %p): stub\n",
382         physDev->hdc, x, y, flags, lpRect, debugstr_wn(str,count), count, lpDx);
383
384   return TRUE;
385 #endif /* defined(WINE_CURSES) */
386 }
387
388 /***********************************************************************
389  *              TTYDRV_DC_GetCharWidth
390  */
391 BOOL TTYDRV_DC_GetCharWidth(TTYDRV_PDEVICE *physDev, UINT firstChar, UINT lastChar,
392                             LPINT buffer)
393 {
394   UINT c;
395
396   FIXME("(%p, %u, %u, %p): semistub\n", physDev->hdc, firstChar, lastChar, buffer);
397
398   for(c=firstChar; c<=lastChar; c++) {
399     buffer[c-firstChar] = physDev->cellWidth;
400   }
401
402   return TRUE;
403 }
404
405 /***********************************************************************
406  *              TTYDRV_DC_GetTextExtentPoint
407  */
408 BOOL TTYDRV_DC_GetTextExtentPoint(TTYDRV_PDEVICE *physDev, LPCWSTR str, INT count,
409                                   LPSIZE size)
410 {
411   TRACE("(%p, %s, %d, %p)\n", physDev->hdc, debugstr_wn(str, count), count, size);
412
413   size->cx = count * physDev->cellWidth;
414   size->cy = physDev->cellHeight;
415
416   return TRUE;
417 }
418
419 /***********************************************************************
420  *              TTYDRV_DC_GetTextMetrics
421  */
422 BOOL TTYDRV_DC_GetTextMetrics(TTYDRV_PDEVICE *physDev, LPTEXTMETRICW lptm)
423 {
424   TRACE("(%p, %p)\n", physDev->hdc, lptm);
425
426   lptm->tmHeight = physDev->cellHeight;
427   lptm->tmAscent = 0;
428   lptm->tmDescent = 0;
429   lptm->tmInternalLeading = 0;
430   lptm->tmExternalLeading = 0;
431   lptm->tmAveCharWidth = physDev->cellWidth;
432   lptm->tmMaxCharWidth = physDev->cellWidth;
433   lptm->tmWeight = FW_MEDIUM;
434   lptm->tmOverhang = 0;
435   lptm->tmDigitizedAspectX = physDev->cellWidth;
436   lptm->tmDigitizedAspectY = physDev->cellHeight;
437   lptm->tmFirstChar = 32;
438   lptm->tmLastChar = 255;
439   lptm->tmDefaultChar = 0;
440   lptm->tmBreakChar = 32;
441   lptm->tmItalic = FALSE;
442   lptm->tmUnderlined = FALSE;
443   lptm->tmStruckOut = FALSE;
444   lptm->tmPitchAndFamily = TMPF_FIXED_PITCH|TMPF_DEVICE;
445   lptm->tmCharSet = ANSI_CHARSET;
446
447   return TRUE;
448 }