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