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