Added LGPL standard comment, and copyright notices where necessary.
[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 "winnls.h"
24 #include "gdi.h"
25 #include "wine/debug.h"
26 #include "ttydrv.h"
27
28 WINE_DEFAULT_DEBUG_CHANNEL(ttydrv);
29
30 /***********************************************************************
31  *              TTYDRV_DC_Arc
32  */
33 BOOL TTYDRV_DC_Arc(DC *dc, INT left, INT top, INT right, INT bottom,
34                    INT xstart, INT ystart, INT xend, INT yend)
35 {
36   FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
37         dc, left, top, right, bottom, xstart, ystart, xend, yend);
38
39   return TRUE;
40 }
41
42 /***********************************************************************
43  *              TTYDRV_DC_Chord
44  */
45 BOOL TTYDRV_DC_Chord(DC *dc, INT left, INT top, INT right, INT bottom,
46                      INT xstart, INT ystart, INT xend, INT yend)
47 {
48   FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
49         dc, left, top, right, bottom, xstart, ystart, xend, yend);
50
51   return TRUE;
52 }
53
54 /***********************************************************************
55  *              TTYDRV_DC_Ellipse
56  */
57 BOOL TTYDRV_DC_Ellipse(DC *dc, INT left, INT top, INT right, INT bottom)
58 {
59   FIXME("(%p, %d, %d, %d, %d): stub\n",
60         dc, left, top, right, bottom);
61
62   return TRUE;
63 }
64
65 /***********************************************************************
66  *              TTYDRV_DC_ExtFloodFill
67  */
68 BOOL TTYDRV_DC_ExtFloodFill(DC *dc, INT x, INT y,
69                             COLORREF color, UINT fillType)
70 {
71   FIXME("(%p, %d, %d, 0x%08lx, %u): stub\n", dc, x, y, color, fillType);
72
73   return TRUE;
74 }
75
76 /***********************************************************************
77  *              TTYDRV_DC_GetPixel
78  */
79 COLORREF TTYDRV_DC_GetPixel(DC *dc, INT x, INT y)
80 {
81   FIXME("(%p, %d, %d): stub\n", dc, x, y);
82
83   return RGB(0,0,0); /* FIXME: Always returns black */
84 }
85
86 /***********************************************************************
87  *              TTYDRV_DC_LineTo
88  */
89 BOOL TTYDRV_DC_LineTo(DC *dc, INT x, INT y)
90 {
91 #ifdef WINE_CURSES
92   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
93   INT row1, col1, row2, col2;
94
95   TRACE("(%p, %d, %d)\n", dc, x, y);
96
97   if(!physDev->window)
98     return FALSE;
99
100   row1 = (dc->DCOrgY + XLPTODP(dc, dc->CursPosY)) / physDev->cellHeight;
101   col1 = (dc->DCOrgX + XLPTODP(dc, dc->CursPosX)) / physDev->cellWidth;
102   row2 = (dc->DCOrgY + XLPTODP(dc, y)) / physDev->cellHeight;
103   col2 = (dc->DCOrgX + XLPTODP(dc, x)) / physDev->cellWidth;
104
105   if(row1 > row2) {
106     INT tmp = row1;
107     row1 = row2;
108     row2 = tmp; 
109   } 
110
111   if(col1 > col2) {
112     INT tmp = col1;
113     col1 = col2;
114     col2 = tmp; 
115   } 
116
117   wmove(physDev->window, row1, col1);
118   if(col1 == col2) {
119     wvline(physDev->window, ACS_VLINE, row2-row1);
120   } else if(row1 == row2) {
121     whline(physDev->window, ACS_HLINE, col2-col1);
122   } else {
123     FIXME("Diagonal line drawing not yet supported\n");
124   }
125   wrefresh(physDev->window);
126
127   return TRUE;
128 #else /* defined(WINE_CURSES) */
129   FIXME("(%p, %d, %d): stub\n", dc, x, y);
130
131   return TRUE;
132 #endif /* defined(WINE_CURSES) */
133 }
134
135 /***********************************************************************
136  *              TTYDRV_DC_PaintRgn
137  */
138 BOOL TTYDRV_DC_PaintRgn(DC *dc, HRGN hrgn)
139 {
140   FIXME("(%p, 0x%04x): stub\n", dc, hrgn);
141
142   return TRUE;
143 }
144
145 /***********************************************************************
146  *              TTYDRV_DC_Pie
147  */
148 BOOL TTYDRV_DC_Pie(DC *dc, INT left, INT top, INT right, INT bottom,
149                    INT xstart, INT ystart, INT xend, INT yend)
150 {
151   FIXME("(%p, %d, %d, %d, %d, %d, %d, %d, %d): stub\n",
152         dc, left, top, right, bottom, xstart, ystart, xend, yend);
153
154   return TRUE;
155 }
156
157 /***********************************************************************
158  *              TTYDRV_DC_Polygon
159  */
160 BOOL TTYDRV_DC_Polygon(DC *dc, const POINT* pt, INT count)
161 {
162   FIXME("(%p, %p, %d): stub\n", dc, pt, count);
163
164   return TRUE;
165 }
166
167 /***********************************************************************
168  *              TTYDRV_DC_Polyline
169  */
170 BOOL TTYDRV_DC_Polyline(DC *dc, const POINT* pt, INT count)
171 {
172   FIXME("(%p, %p, %d): stub\n", dc, pt, count);
173
174   return TRUE;
175 }
176
177 /***********************************************************************
178  *              TTYDRV_DC_PolyPolygon
179  */
180 BOOL TTYDRV_DC_PolyPolygon(DC *dc, const POINT* pt, const INT* counts, UINT polygons)
181 {
182   FIXME("(%p, %p, %p, %u): stub\n", dc, pt, counts, polygons);
183
184   return TRUE;
185 }
186
187 /***********************************************************************
188  *              TTYDRV_DC_PolyPolyline
189  */
190 BOOL TTYDRV_DC_PolyPolyline(DC *dc, const POINT* pt, const DWORD* counts, DWORD polylines)
191 {
192   FIXME("(%p, %p, %p, %lu): stub\n", dc, pt, counts, polylines);
193   
194   return TRUE;
195 }
196
197 /***********************************************************************
198  *              TTYDRV_DC_Rectangle
199  */
200 BOOL TTYDRV_DC_Rectangle(DC *dc, INT left, INT top, INT right, INT bottom)
201 {
202 #ifdef WINE_CURSES
203   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
204   INT row1, col1, row2, col2;
205
206   TRACE("(%p, %d, %d, %d, %d)\n", dc, left, top, right, bottom);
207
208   if(!physDev->window)
209     return FALSE;
210
211   row1 = (dc->DCOrgY + XLPTODP(dc, top)) / physDev->cellHeight;
212   col1 = (dc->DCOrgX + XLPTODP(dc, left)) / physDev->cellWidth;
213   row2 = (dc->DCOrgY + XLPTODP(dc, bottom)) / physDev->cellHeight;
214   col2 = (dc->DCOrgX + XLPTODP(dc, right)) / physDev->cellWidth;
215
216   if(row1 > row2) {
217     INT tmp = row1;
218     row1 = row2;
219     row2 = tmp; 
220   } 
221   if(col1 > col2) {
222     INT tmp = col1;
223     col1 = col2;
224     col2 = tmp; 
225   } 
226
227   wmove(physDev->window, row1, col1);
228   whline(physDev->window, ACS_HLINE, col2-col1);
229
230   wmove(physDev->window, row1, col2);
231   wvline(physDev->window, ACS_VLINE, row2-row1);
232
233   wmove(physDev->window, row2, col1);
234   whline(physDev->window, ACS_HLINE, col2-col1);
235
236   wmove(physDev->window, row1, col1);
237   wvline(physDev->window, ACS_VLINE, row2-row1);
238
239   mvwaddch(physDev->window, row1, col1, ACS_ULCORNER);
240   mvwaddch(physDev->window, row1, col2, ACS_URCORNER);
241   mvwaddch(physDev->window, row2, col2, ACS_LRCORNER);
242   mvwaddch(physDev->window, row2, col1, ACS_LLCORNER);
243
244   wrefresh(physDev->window);
245
246   return TRUE;
247 #else /* defined(WINE_CURSES) */
248   FIXME("(%p, %d, %d, %d, %d): stub\n", dc, left, top, right, bottom);
249
250   return TRUE;
251 #endif /* defined(WINE_CURSES) */
252 }
253
254 /***********************************************************************
255  *              TTYDRV_DC_RoundRect
256  */
257 BOOL TTYDRV_DC_RoundRect(DC *dc, INT left, INT top, INT right,
258                          INT bottom, INT ell_width, INT ell_height)
259 {
260   FIXME("(%p, %d, %d, %d, %d, %d, %d): stub\n", 
261         dc, left, top, right, bottom, ell_width, ell_height);
262   
263   return TRUE;
264 }
265
266 /***********************************************************************
267  *              TTYDRV_DC_SetBkColor
268  */
269 COLORREF TTYDRV_DC_SetBkColor(DC *dc, COLORREF color)
270 {
271   COLORREF oldColor;
272
273   TRACE("(%p, 0x%08lx)\n", dc, color);  
274
275   oldColor = dc->backgroundColor;
276   dc->backgroundColor = color;
277
278   return oldColor;
279 }
280
281 /***********************************************************************
282  *              TTYDRV_DC_SetPixel
283  */
284 COLORREF TTYDRV_DC_SetPixel(DC *dc, INT x, INT y, COLORREF color)
285 {
286 #ifdef WINE_CURSES
287   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
288   INT row, col;
289
290   TRACE("(%p, %d, %d, 0x%08lx)\n", dc, x, y, color);
291
292   if(!physDev->window)
293     return FALSE;
294
295   row = (dc->DCOrgY + XLPTODP(dc, y)) / physDev->cellHeight;
296   col = (dc->DCOrgX + XLPTODP(dc, x)) / physDev->cellWidth;
297
298   mvwaddch(physDev->window, row, col, ACS_BULLET);
299   wrefresh(physDev->window);
300
301   return RGB(0,0,0); /* FIXME: Always returns black */
302 #else /* defined(WINE_CURSES) */
303   FIXME("(%p, %d, %d, 0x%08lx): stub\n", dc, x, y, color);
304
305   return RGB(0,0,0); /* FIXME: Always returns black */
306 #endif /* defined(WINE_CURSES) */
307 }
308
309 /***********************************************************************
310  *              TTYDRV_DC_SetTextColor
311  */
312 COLORREF TTYDRV_DC_SetTextColor(DC *dc, COLORREF color)
313 {
314   COLORREF oldColor;
315
316   TRACE("(%p, 0x%08lx)\n", dc, color);
317   
318   oldColor = dc->textColor;
319   dc->textColor = color;
320   
321   return oldColor;
322 }
323
324
325 /***********************************************************************
326  *              TTYDRV_DC_BitBlt
327  */
328 BOOL TTYDRV_DC_BitBlt(DC *dcDst, INT xDst, INT yDst,
329                       INT width, INT height, DC *dcSrc,
330                       INT xSrc, INT ySrc, DWORD rop)
331 {
332   FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %lu): stub\n",
333         dcDst, xDst, yDst, width, height, 
334         dcSrc, xSrc, ySrc, rop
335   );
336
337   return TRUE;
338 }
339
340 /***********************************************************************
341  *              TTYDRV_DC_PatBlt
342  */
343 BOOL TTYDRV_DC_PatBlt(DC *dc, INT left, INT top,
344                       INT width, INT height, DWORD rop)
345 {
346   FIXME("(%p, %d, %d, %d, %d, %lu): stub\n",
347         dc, left, top, width, height, rop
348   );
349
350
351   return TRUE;
352 }
353
354 /***********************************************************************
355  *              TTYDRV_DC_StretchBlt
356  */
357 BOOL TTYDRV_DC_StretchBlt(DC *dcDst, INT xDst, INT yDst,
358                           INT widthDst, INT heightDst,
359                           DC *dcSrc, INT xSrc, INT ySrc,
360                           INT widthSrc, INT heightSrc, DWORD rop)
361 {
362   FIXME("(%p, %d, %d, %d, %d, %p, %d, %d, %d, %d, %lu): stub\n",
363         dcDst, xDst, yDst, widthDst, heightDst,
364         dcSrc, xSrc, ySrc, widthSrc, heightSrc, rop
365   );
366
367   return TRUE;
368 }
369
370 /***********************************************************************
371  *              TTYDRV_DC_ExtTextOut
372  */
373 BOOL TTYDRV_DC_ExtTextOut(DC *dc, INT x, INT y, UINT flags,
374                           const RECT *lpRect, LPCWSTR str, UINT count,
375                           const INT *lpDx)
376 {
377 #ifdef WINE_CURSES
378   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
379   INT row, col;
380   LPSTR ascii;
381   DWORD len;
382
383   TRACE("(%p, %d, %d, 0x%08x, %p, %s, %d, %p)\n",
384         dc, x, y, flags, lpRect, debugstr_wn(str, count), count, lpDx);
385
386   if(!physDev->window)
387     return FALSE;
388
389   /* FIXME: Is this really correct? */
390   if(dc->textAlign & TA_UPDATECP) {
391     x = dc->CursPosX;
392     y = dc->CursPosY;
393   }
394
395   x = XLPTODP(dc, x);
396   y = YLPTODP(dc, y);
397   
398   row = (dc->DCOrgY + y) / physDev->cellHeight;
399   col = (dc->DCOrgX + x) / physDev->cellWidth;
400   len = WideCharToMultiByte( CP_ACP, 0, str, count, NULL, 0, NULL, NULL );
401   ascii = HeapAlloc( GetProcessHeap(), 0, len );
402   WideCharToMultiByte( CP_ACP, 0, str, count, ascii, len, NULL, NULL );
403   mvwaddnstr(physDev->window, row, col, ascii, len);
404   HeapFree( GetProcessHeap(), 0, ascii );
405   wrefresh(physDev->window);
406
407   if(dc->textAlign & TA_UPDATECP) {
408     dc->CursPosX += count * physDev->cellWidth;
409     dc->CursPosY += physDev->cellHeight;
410   }
411
412   return TRUE;
413 #else /* defined(WINE_CURSES) */
414   FIXME("(%p, %d, %d, 0x%08x, %p, %s, %d, %p): stub\n",
415         dc, x, y, flags, lpRect, debugstr_wn(str,count), count, lpDx);
416
417   return TRUE;
418 #endif /* defined(WINE_CURSES) */
419 }
420
421 /***********************************************************************
422  *              TTYDRV_DC_GetCharWidth
423  */
424 BOOL TTYDRV_DC_GetCharWidth(DC *dc, UINT firstChar, UINT lastChar,
425                             LPINT buffer)
426 {
427   UINT c;
428   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
429
430   FIXME("(%p, %u, %u, %p): semistub\n", dc, firstChar, lastChar, buffer);
431
432   for(c=firstChar; c<=lastChar; c++) {
433     buffer[c-firstChar] = physDev->cellWidth;
434   }
435
436   return TRUE;
437 }
438
439 /***********************************************************************
440  *              TTYDRV_DC_GetTextExtentPoint
441  */
442 BOOL TTYDRV_DC_GetTextExtentPoint(DC *dc, LPCWSTR str, INT count,
443                                   LPSIZE size)
444 {
445   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
446
447   TRACE("(%p, %s, %d, %p)\n", dc, debugstr_wn(str, count), count, size);
448
449   size->cx = count * physDev->cellWidth;
450   size->cy = physDev->cellHeight;
451
452   return TRUE;
453 }
454
455 /***********************************************************************
456  *              TTYDRV_DC_GetTextMetrics
457  */
458 BOOL TTYDRV_DC_GetTextMetrics(DC *dc, LPTEXTMETRICW lptm)
459 {
460   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
461
462   TRACE("(%p, %p)\n", dc, lptm);
463
464   lptm->tmHeight = physDev->cellHeight;
465   lptm->tmAscent = 0;
466   lptm->tmDescent = 0;
467   lptm->tmInternalLeading = 0;
468   lptm->tmExternalLeading = 0;
469   lptm->tmAveCharWidth = physDev->cellWidth; 
470   lptm->tmMaxCharWidth = physDev->cellWidth;
471   lptm->tmWeight = FW_MEDIUM;
472   lptm->tmOverhang = 0;
473   lptm->tmDigitizedAspectX = physDev->cellWidth;
474   lptm->tmDigitizedAspectY = physDev->cellHeight;
475   lptm->tmFirstChar = 32;
476   lptm->tmLastChar = 255;
477   lptm->tmDefaultChar = 0;
478   lptm->tmBreakChar = 32;
479   lptm->tmItalic = FALSE;
480   lptm->tmUnderlined = FALSE;
481   lptm->tmStruckOut = FALSE;
482   lptm->tmPitchAndFamily = TMPF_FIXED_PITCH|TMPF_DEVICE;
483   lptm->tmCharSet = ANSI_CHARSET;
484
485   return TRUE;
486 }