Moved server.h to include/wine.
[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 "winnls.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   DWORD len;
369
370   TRACE("(%p, %d, %d, 0x%08x, %p, %s, %d, %p)\n",
371         dc, x, y, flags, lpRect, debugstr_wn(str, count), count, lpDx);
372
373   if(!physDev->window)
374     return FALSE;
375
376   /* FIXME: Is this really correct? */
377   if(dc->textAlign & TA_UPDATECP) {
378     x = dc->CursPosX;
379     y = dc->CursPosY;
380   }
381
382   x = XLPTODP(dc, x);
383   y = YLPTODP(dc, y);
384   
385   row = (dc->DCOrgY + y) / physDev->cellHeight;
386   col = (dc->DCOrgX + x) / physDev->cellWidth;
387   len = WideCharToMultiByte( CP_ACP, 0, str, count, NULL, 0, NULL, NULL );
388   ascii = HeapAlloc( GetProcessHeap(), 0, len );
389   WideCharToMultiByte( CP_ACP, 0, str, count, ascii, len, NULL, NULL );
390   mvwaddnstr(physDev->window, row, col, ascii, len);
391   HeapFree( GetProcessHeap(), 0, ascii );
392   wrefresh(physDev->window);
393
394   if(dc->textAlign & TA_UPDATECP) {
395     dc->CursPosX += count * physDev->cellWidth;
396     dc->CursPosY += physDev->cellHeight;
397   }
398
399   return TRUE;
400 #else /* defined(WINE_CURSES) */
401   FIXME("(%p, %d, %d, 0x%08x, %p, %s, %d, %p): stub\n",
402         dc, x, y, flags, lpRect, debugstr_wn(str,count), count, lpDx);
403
404   return TRUE;
405 #endif /* defined(WINE_CURSES) */
406 }
407
408 /***********************************************************************
409  *              TTYDRV_DC_GetCharWidth
410  */
411 BOOL TTYDRV_DC_GetCharWidth(DC *dc, UINT firstChar, UINT lastChar,
412                             LPINT buffer)
413 {
414   UINT c;
415   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
416
417   FIXME("(%p, %u, %u, %p): semistub\n", dc, firstChar, lastChar, buffer);
418
419   for(c=firstChar; c<=lastChar; c++) {
420     buffer[c-firstChar] = physDev->cellWidth;
421   }
422
423   return TRUE;
424 }
425
426 /***********************************************************************
427  *              TTYDRV_DC_GetTextExtentPoint
428  */
429 BOOL TTYDRV_DC_GetTextExtentPoint(DC *dc, LPCWSTR str, INT count,
430                                   LPSIZE size)
431 {
432   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
433
434   TRACE("(%p, %s, %d, %p)\n", dc, debugstr_wn(str, count), count, size);
435
436   size->cx = count * physDev->cellWidth;
437   size->cy = physDev->cellHeight;
438
439   return TRUE;
440 }
441
442 /***********************************************************************
443  *              TTYDRV_DC_GetTextMetrics
444  */
445 BOOL TTYDRV_DC_GetTextMetrics(DC *dc, LPTEXTMETRICW lptm)
446 {
447   TTYDRV_PDEVICE *physDev = (TTYDRV_PDEVICE *) dc->physDev;
448
449   TRACE("(%p, %p)\n", dc, lptm);
450
451   lptm->tmHeight = physDev->cellHeight;
452   lptm->tmAscent = 0;
453   lptm->tmDescent = 0;
454   lptm->tmInternalLeading = 0;
455   lptm->tmExternalLeading = 0;
456   lptm->tmAveCharWidth = physDev->cellWidth; 
457   lptm->tmMaxCharWidth = physDev->cellWidth;
458   lptm->tmWeight = FW_MEDIUM;
459   lptm->tmOverhang = 0;
460   lptm->tmDigitizedAspectX = physDev->cellWidth;
461   lptm->tmDigitizedAspectY = physDev->cellHeight;
462   lptm->tmFirstChar = 32;
463   lptm->tmLastChar = 255;
464   lptm->tmDefaultChar = 0;
465   lptm->tmBreakChar = 32;
466   lptm->tmItalic = FALSE;
467   lptm->tmUnderlined = FALSE;
468   lptm->tmStruckOut = FALSE;
469   lptm->tmPitchAndFamily = TMPF_FIXED_PITCH|TMPF_DEVICE;
470   lptm->tmCharSet = ANSI_CHARSET;
471
472   return TRUE;
473 }