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