Clean up devenum and properly implement DllCanUnloadNow ref counting.
[wine/multimedia.git] / dlls / gdi / gdi16.c
bloba1f8f34e064144619057b074ba49e3fb50ef59cb
1 /*
2 * GDI 16-bit functions
4 * Copyright 2002 Alexandre Julliard
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.
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.
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
21 #include <stdarg.h>
23 #include "windef.h"
24 #include "winbase.h"
25 #include "wingdi.h"
26 #include "wownt32.h"
27 #include "wine/wingdi16.h"
28 #include "gdi.h"
29 #include "gdi_private.h"
30 #include "wine/debug.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(gdi);
34 #define HGDIOBJ_32(handle16) ((HGDIOBJ)(ULONG_PTR)(handle16))
35 #define HGDIOBJ_16(handle32) ((HGDIOBJ16)(ULONG_PTR)(handle32))
37 struct callback16_info
39 FARPROC16 proc;
40 LPARAM param;
43 /* callback for LineDDA16 */
44 static void CALLBACK linedda_callback( INT x, INT y, LPARAM param )
46 const struct callback16_info *info = (struct callback16_info *)param;
47 WORD args[4];
49 args[3] = x;
50 args[2] = y;
51 args[1] = HIWORD(info->param);
52 args[0] = LOWORD(info->param);
53 WOWCallback16Ex( (DWORD)info->proc, WCB16_PASCAL, sizeof(args), args, NULL );
56 /* callback for EnumObjects16 */
57 static INT CALLBACK enum_pens_callback( void *ptr, LPARAM param )
59 const struct callback16_info *info = (struct callback16_info *)param;
60 LOGPEN *pen = ptr;
61 LOGPEN16 pen16;
62 SEGPTR segptr;
63 DWORD ret;
64 WORD args[4];
66 pen16.lopnStyle = pen->lopnStyle;
67 pen16.lopnWidth.x = pen->lopnWidth.x;
68 pen16.lopnWidth.y = pen->lopnWidth.y;
69 pen16.lopnColor = pen->lopnColor;
70 segptr = MapLS( &pen16 );
71 args[3] = SELECTOROF(segptr);
72 args[2] = OFFSETOF(segptr);
73 args[1] = HIWORD(info->param);
74 args[0] = LOWORD(info->param);
75 WOWCallback16Ex( (DWORD)info->proc, WCB16_PASCAL, sizeof(args), args, &ret );
76 UnMapLS( segptr );
77 return LOWORD(ret);
80 /* callback for EnumObjects16 */
81 static INT CALLBACK enum_brushes_callback( void *ptr, LPARAM param )
83 const struct callback16_info *info = (struct callback16_info *)param;
84 LOGBRUSH *brush = ptr;
85 LOGBRUSH16 brush16;
86 SEGPTR segptr;
87 DWORD ret;
88 WORD args[4];
90 brush16.lbStyle = brush->lbStyle;
91 brush16.lbColor = brush->lbColor;
92 brush16.lbHatch = brush->lbHatch;
93 segptr = MapLS( &brush16 );
94 args[3] = SELECTOROF(segptr);
95 args[2] = OFFSETOF(segptr);
96 args[1] = HIWORD(info->param);
97 args[0] = LOWORD(info->param);
98 WOWCallback16Ex( (DWORD)info->proc, WCB16_PASCAL, sizeof(args), args, &ret );
99 UnMapLS( segptr );
100 return ret;
103 /* convert a LOGFONT16 to a LOGFONTW */
104 static void logfont_16_to_W( const LOGFONT16 *font16, LPLOGFONTW font32 )
106 font32->lfHeight = font16->lfHeight;
107 font32->lfWidth = font16->lfWidth;
108 font32->lfEscapement = font16->lfEscapement;
109 font32->lfOrientation = font16->lfOrientation;
110 font32->lfWeight = font16->lfWeight;
111 font32->lfItalic = font16->lfItalic;
112 font32->lfUnderline = font16->lfUnderline;
113 font32->lfStrikeOut = font16->lfStrikeOut;
114 font32->lfCharSet = font16->lfCharSet;
115 font32->lfOutPrecision = font16->lfOutPrecision;
116 font32->lfClipPrecision = font16->lfClipPrecision;
117 font32->lfQuality = font16->lfQuality;
118 font32->lfPitchAndFamily = font16->lfPitchAndFamily;
119 MultiByteToWideChar( CP_ACP, 0, font16->lfFaceName, -1, font32->lfFaceName, LF_FACESIZE );
120 font32->lfFaceName[LF_FACESIZE-1] = 0;
124 /***********************************************************************
125 * SetBkColor (GDI.1)
127 COLORREF WINAPI SetBkColor16( HDC16 hdc, COLORREF color )
129 return SetBkColor( HDC_32(hdc), color );
133 /***********************************************************************
134 * SetBkMode (GDI.2)
136 INT16 WINAPI SetBkMode16( HDC16 hdc, INT16 mode )
138 return SetBkMode( HDC_32(hdc), mode );
142 /***********************************************************************
143 * SetMapMode (GDI.3)
145 INT16 WINAPI SetMapMode16( HDC16 hdc, INT16 mode )
147 return SetMapMode( HDC_32(hdc), mode );
151 /***********************************************************************
152 * SetROP2 (GDI.4)
154 INT16 WINAPI SetROP216( HDC16 hdc, INT16 mode )
156 return SetROP2( HDC_32(hdc), mode );
160 /***********************************************************************
161 * SetRelAbs (GDI.5)
163 INT16 WINAPI SetRelAbs16( HDC16 hdc, INT16 mode )
165 return SetRelAbs( HDC_32(hdc), mode );
169 /***********************************************************************
170 * SetPolyFillMode (GDI.6)
172 INT16 WINAPI SetPolyFillMode16( HDC16 hdc, INT16 mode )
174 return SetPolyFillMode( HDC_32(hdc), mode );
178 /***********************************************************************
179 * SetStretchBltMode (GDI.7)
181 INT16 WINAPI SetStretchBltMode16( HDC16 hdc, INT16 mode )
183 return SetStretchBltMode( HDC_32(hdc), mode );
187 /***********************************************************************
188 * SetTextCharacterExtra (GDI.8)
190 INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
192 return SetTextCharacterExtra( HDC_32(hdc), extra );
196 /***********************************************************************
197 * SetTextColor (GDI.9)
199 COLORREF WINAPI SetTextColor16( HDC16 hdc, COLORREF color )
201 return SetTextColor( HDC_32(hdc), color );
205 /***********************************************************************
206 * SetTextJustification (GDI.10)
208 INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
210 return SetTextJustification( HDC_32(hdc), extra, breaks );
214 /***********************************************************************
215 * SetWindowOrg (GDI.11)
217 DWORD WINAPI SetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
219 POINT pt;
220 if (!SetWindowOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
221 return MAKELONG( pt.x, pt.y );
225 /***********************************************************************
226 * SetWindowExt (GDI.12)
228 DWORD WINAPI SetWindowExt16( HDC16 hdc, INT16 x, INT16 y )
230 SIZE size;
231 if (!SetWindowExtEx( HDC_32(hdc), x, y, &size )) return 0;
232 return MAKELONG( size.cx, size.cy );
236 /***********************************************************************
237 * SetViewportOrg (GDI.13)
239 DWORD WINAPI SetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
241 POINT pt;
242 if (!SetViewportOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
243 return MAKELONG( pt.x, pt.y );
247 /***********************************************************************
248 * SetViewportExt (GDI.14)
250 DWORD WINAPI SetViewportExt16( HDC16 hdc, INT16 x, INT16 y )
252 SIZE size;
253 if (!SetViewportExtEx( HDC_32(hdc), x, y, &size )) return 0;
254 return MAKELONG( size.cx, size.cy );
258 /***********************************************************************
259 * OffsetWindowOrg (GDI.15)
261 DWORD WINAPI OffsetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
263 POINT pt;
264 if (!OffsetWindowOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
265 return MAKELONG( pt.x, pt.y );
269 /***********************************************************************
270 * ScaleWindowExt (GDI.16)
272 DWORD WINAPI ScaleWindowExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
273 INT16 yNum, INT16 yDenom )
275 SIZE size;
276 if (!ScaleWindowExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom, &size ))
277 return FALSE;
278 return MAKELONG( size.cx, size.cy );
282 /***********************************************************************
283 * OffsetViewportOrg (GDI.17)
285 DWORD WINAPI OffsetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
287 POINT pt;
288 if (!OffsetViewportOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
289 return MAKELONG( pt.x, pt.y );
293 /***********************************************************************
294 * ScaleViewportExt (GDI.18)
296 DWORD WINAPI ScaleViewportExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
297 INT16 yNum, INT16 yDenom )
299 SIZE size;
300 if (!ScaleViewportExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom, &size ))
301 return FALSE;
302 return MAKELONG( size.cx, size.cy );
306 /***********************************************************************
307 * LineTo (GDI.19)
309 BOOL16 WINAPI LineTo16( HDC16 hdc, INT16 x, INT16 y )
311 return LineTo( HDC_32(hdc), x, y );
315 /***********************************************************************
316 * MoveTo (GDI.20)
318 DWORD WINAPI MoveTo16( HDC16 hdc, INT16 x, INT16 y )
320 POINT pt;
322 if (!MoveToEx( HDC_32(hdc), x, y, &pt )) return 0;
323 return MAKELONG(pt.x,pt.y);
327 /***********************************************************************
328 * ExcludeClipRect (GDI.21)
330 INT16 WINAPI ExcludeClipRect16( HDC16 hdc, INT16 left, INT16 top,
331 INT16 right, INT16 bottom )
333 return ExcludeClipRect( HDC_32(hdc), left, top, right, bottom );
337 /***********************************************************************
338 * IntersectClipRect (GDI.22)
340 INT16 WINAPI IntersectClipRect16( HDC16 hdc, INT16 left, INT16 top,
341 INT16 right, INT16 bottom )
343 return IntersectClipRect( HDC_32(hdc), left, top, right, bottom );
347 /***********************************************************************
348 * Arc (GDI.23)
350 BOOL16 WINAPI Arc16( HDC16 hdc, INT16 left, INT16 top, INT16 right,
351 INT16 bottom, INT16 xstart, INT16 ystart,
352 INT16 xend, INT16 yend )
354 return Arc( HDC_32(hdc), left, top, right, bottom, xstart, ystart, xend, yend );
358 /***********************************************************************
359 * Ellipse (GDI.24)
361 BOOL16 WINAPI Ellipse16( HDC16 hdc, INT16 left, INT16 top,
362 INT16 right, INT16 bottom )
364 return Ellipse( HDC_32(hdc), left, top, right, bottom );
368 /**********************************************************************
369 * FloodFill (GDI.25)
371 BOOL16 WINAPI FloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
373 return ExtFloodFill( HDC_32(hdc), x, y, color, FLOODFILLBORDER );
377 /***********************************************************************
378 * Pie (GDI.26)
380 BOOL16 WINAPI Pie16( HDC16 hdc, INT16 left, INT16 top,
381 INT16 right, INT16 bottom, INT16 xstart, INT16 ystart,
382 INT16 xend, INT16 yend )
384 return Pie( HDC_32(hdc), left, top, right, bottom, xstart, ystart, xend, yend );
388 /***********************************************************************
389 * Rectangle (GDI.27)
391 BOOL16 WINAPI Rectangle16( HDC16 hdc, INT16 left, INT16 top,
392 INT16 right, INT16 bottom )
394 return Rectangle( HDC_32(hdc), left, top, right, bottom );
398 /***********************************************************************
399 * RoundRect (GDI.28)
401 BOOL16 WINAPI RoundRect16( HDC16 hdc, INT16 left, INT16 top, INT16 right,
402 INT16 bottom, INT16 ell_width, INT16 ell_height )
404 return RoundRect( HDC_32(hdc), left, top, right, bottom, ell_width, ell_height );
408 /***********************************************************************
409 * PatBlt (GDI.29)
411 BOOL16 WINAPI PatBlt16( HDC16 hdc, INT16 left, INT16 top,
412 INT16 width, INT16 height, DWORD rop)
414 return PatBlt( HDC_32(hdc), left, top, width, height, rop );
418 /***********************************************************************
419 * SaveDC (GDI.30)
421 INT16 WINAPI SaveDC16( HDC16 hdc )
423 return SaveDC( HDC_32(hdc) );
427 /***********************************************************************
428 * SetPixel (GDI.31)
430 COLORREF WINAPI SetPixel16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
432 return SetPixel( HDC_32(hdc), x, y, color );
436 /***********************************************************************
437 * OffsetClipRgn (GDI.32)
439 INT16 WINAPI OffsetClipRgn16( HDC16 hdc, INT16 x, INT16 y )
441 return OffsetClipRgn( HDC_32(hdc), x, y );
445 /***********************************************************************
446 * TextOut (GDI.33)
448 BOOL16 WINAPI TextOut16( HDC16 hdc, INT16 x, INT16 y, LPCSTR str, INT16 count )
450 return TextOutA( HDC_32(hdc), x, y, str, count );
454 /***********************************************************************
455 * BitBlt (GDI.34)
457 BOOL16 WINAPI BitBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, INT16 width,
458 INT16 height, HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
459 DWORD rop )
461 return BitBlt( HDC_32(hdcDst), xDst, yDst, width, height, HDC_32(hdcSrc), xSrc, ySrc, rop );
465 /***********************************************************************
466 * StretchBlt (GDI.35)
468 BOOL16 WINAPI StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst,
469 INT16 widthDst, INT16 heightDst,
470 HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
471 INT16 widthSrc, INT16 heightSrc, DWORD rop )
473 return StretchBlt( HDC_32(hdcDst), xDst, yDst, widthDst, heightDst,
474 HDC_32(hdcSrc), xSrc, ySrc, widthSrc, heightSrc, rop );
478 /**********************************************************************
479 * Polygon (GDI.36)
481 BOOL16 WINAPI Polygon16( HDC16 hdc, const POINT16* pt, INT16 count )
483 register int i;
484 BOOL ret;
485 LPPOINT pt32 = (LPPOINT)HeapAlloc( GetProcessHeap(), 0,
486 count*sizeof(POINT) );
488 if (!pt32) return FALSE;
489 for (i=count;i--;)
491 pt32[i].x = pt[i].x;
492 pt32[i].y = pt[i].y;
494 ret = Polygon(HDC_32(hdc),pt32,count);
495 HeapFree( GetProcessHeap(), 0, pt32 );
496 return ret;
500 /**********************************************************************
501 * Polyline (GDI.37)
503 BOOL16 WINAPI Polyline16( HDC16 hdc, const POINT16* pt, INT16 count )
505 register int i;
506 BOOL16 ret;
507 LPPOINT pt32 = (LPPOINT)HeapAlloc( GetProcessHeap(), 0,
508 count*sizeof(POINT) );
510 if (!pt32) return FALSE;
511 for (i=count;i--;)
513 pt32[i].x = pt[i].x;
514 pt32[i].y = pt[i].y;
516 ret = Polyline(HDC_32(hdc),pt32,count);
517 HeapFree( GetProcessHeap(), 0, pt32 );
518 return ret;
522 /***********************************************************************
523 * Escape (GDI.38)
525 INT16 WINAPI Escape16( HDC16 hdc, INT16 escape, INT16 in_count, SEGPTR in_data, LPVOID out_data )
527 INT ret;
529 switch(escape)
531 /* Escape(hdc,CLIP_TO_PATH,LPINT16,NULL) */
532 /* Escape(hdc,DRAFTMODE,LPINT16,NULL) */
533 /* Escape(hdc,ENUMPAPERBINS,LPINT16,LPSTR); */
534 /* Escape(hdc,EPSPRINTING,LPINT16,NULL) */
535 /* Escape(hdc,EXT_DEVICE_CAPS,LPINT16,LPDWORD) */
536 /* Escape(hdc,GETCOLORTABLE,LPINT16,LPDWORD) */
537 /* Escape(hdc,MOUSETRAILS,LPINT16,NULL) */
538 /* Escape(hdc,POSTSCRIPT_IGNORE,LPINT16,NULL) */
539 /* Escape(hdc,QUERYESCSUPPORT,LPINT16,NULL) */
540 /* Escape(hdc,SET_ARC_DIRECTION,LPINT16,NULL) */
541 /* Escape(hdc,SET_POLY_MODE,LPINT16,NULL) */
542 /* Escape(hdc,SET_SCREEN_ANGLE,LPINT16,NULL) */
543 /* Escape(hdc,SET_SPREAD,LPINT16,NULL) */
544 case CLIP_TO_PATH:
545 case DRAFTMODE:
546 case ENUMPAPERBINS:
547 case EPSPRINTING:
548 case EXT_DEVICE_CAPS:
549 case GETCOLORTABLE:
550 case MOUSETRAILS:
551 case POSTSCRIPT_IGNORE:
552 case QUERYESCSUPPORT:
553 case SET_ARC_DIRECTION:
554 case SET_POLY_MODE:
555 case SET_SCREEN_ANGLE:
556 case SET_SPREAD:
558 INT16 *ptr = MapSL(in_data);
559 INT data = *ptr;
560 return Escape( HDC_32(hdc), escape, sizeof(data), (LPCSTR)&data, out_data );
563 /* Escape(hdc,ENABLEDUPLEX,LPUINT16,NULL) */
564 case ENABLEDUPLEX:
566 UINT16 *ptr = MapSL(in_data);
567 UINT data = *ptr;
568 return Escape( HDC_32(hdc), escape, sizeof(data), (LPCSTR)&data, NULL );
571 /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT16) */
572 /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT16) */
573 /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT16) */
574 case GETPHYSPAGESIZE:
575 case GETPRINTINGOFFSET:
576 case GETSCALINGFACTOR:
578 POINT16 *ptr = out_data;
579 POINT pt32;
580 ret = Escape( HDC_32(hdc), escape, 0, NULL, &pt32 );
581 ptr->x = pt32.x;
582 ptr->y = pt32.y;
583 return ret;
586 /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
587 /* Escape(hdc,ENABLERELATIVEWIDTHS,LPINT16,LPINT16); */
588 /* Escape(hdc,SETCOPYCOUNT,LPINT16,LPINT16) */
589 /* Escape(hdc,SETKERNTRACK,LPINT16,LPINT16) */
590 /* Escape(hdc,SETLINECAP,LPINT16,LPINT16) */
591 /* Escape(hdc,SETLINEJOIN,LPINT16,LPINT16) */
592 /* Escape(hdc,SETMITERLIMIT,LPINT16,LPINT16) */
593 case ENABLEPAIRKERNING:
594 case ENABLERELATIVEWIDTHS:
595 case SETCOPYCOUNT:
596 case SETKERNTRACK:
597 case SETLINECAP:
598 case SETLINEJOIN:
599 case SETMITERLIMIT:
601 INT16 *new = MapSL(in_data);
602 INT16 *old = out_data;
603 INT out, in = *new;
604 ret = Escape( HDC_32(hdc), escape, sizeof(in), (LPCSTR)&in, &out );
605 *old = out;
606 return ret;
609 /* Escape(hdc,SETABORTPROC,ABORTPROC,NULL); */
610 case SETABORTPROC:
611 return SetAbortProc16( hdc, (ABORTPROC16)in_data );
613 /* Escape(hdc,STARTDOC,LPSTR,LPDOCINFO16);
614 * lpvOutData is actually a pointer to the DocInfo structure and used as
615 * a second input parameter */
616 case STARTDOC:
617 if (out_data)
619 ret = StartDoc16( hdc, out_data );
620 if (ret > 0) ret = StartPage( HDC_32(hdc) );
621 return ret;
623 return Escape( HDC_32(hdc), escape, in_count, MapSL(in_data), NULL );
625 /* Escape(hdc,SET_BOUNDS,LPRECT16,NULL); */
626 /* Escape(hdc,SET_CLIP_BOX,LPRECT16,NULL); */
627 case SET_BOUNDS:
628 case SET_CLIP_BOX:
630 RECT16 *rc16 = MapSL(in_data);
631 RECT rc;
632 rc.left = rc16->left;
633 rc.top = rc16->top;
634 rc.right = rc16->right;
635 rc.bottom = rc16->bottom;
636 return Escape( HDC_32(hdc), escape, sizeof(rc), (LPCSTR)&rc, NULL );
639 /* Escape(hdc,NEXTBAND,NULL,LPRECT16); */
640 case NEXTBAND:
642 RECT rc;
643 RECT16 *rc16 = out_data;
644 ret = Escape( HDC_32(hdc), escape, 0, NULL, &rc );
645 rc16->left = rc.left;
646 rc16->top = rc.top;
647 rc16->right = rc.right;
648 rc16->bottom = rc.bottom;
649 return ret;
652 /* Escape(hdc,ABORTDOC,NULL,NULL); */
653 /* Escape(hdc,BANDINFO,BANDINFOSTRUCT*,BANDINFOSTRUCT*); */
654 /* Escape(hdc,BEGIN_PATH,NULL,NULL); */
655 /* Escape(hdc,DRAWPATTERNRECT,PRECT_STRUCT*,NULL); */
656 /* Escape(hdc,ENDDOC,NULL,NULL); */
657 /* Escape(hdc,END_PATH,PATHINFO,NULL); */
658 /* Escape(hdc,EXTTEXTOUT,EXTTEXT_STRUCT*,NULL); */
659 /* Escape(hdc,FLUSHOUTPUT,NULL,NULL); */
660 /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
661 /* Escape(hdc,GETPAIRKERNTABLE,NULL,KERNPAIR*); */
662 /* Escape(hdc,GETSETPAPERBINS,BinInfo*,BinInfo*); */
663 /* Escape(hdc,GETSETPRINTORIENT,ORIENT*,NULL); */
664 /* Escape(hdc,GETSETSCREENPARAMS,SCREENPARAMS*,SCREENPARAMS*); */
665 /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
666 /* Escape(hdc,GETTRACKKERNTABLE,NULL,KERNTRACK*); */
667 /* Escape(hdc,MFCOMMENT,LPSTR,NULL); */
668 /* Escape(hdc,NEWFRAME,NULL,NULL); */
669 /* Escape(hdc,PASSTHROUGH,LPSTR,NULL); */
670 /* Escape(hdc,RESTORE_CTM,NULL,NULL); */
671 /* Escape(hdc,SAVE_CTM,NULL,NULL); */
672 /* Escape(hdc,SETALLJUSTVALUES,EXTTEXTDATA*,NULL); */
673 /* Escape(hdc,SETCOLORTABLE,COLORTABLE_STRUCT*,LPDWORD); */
674 /* Escape(hdc,SET_BACKGROUND_COLOR,LPDWORD,LPDWORD); */
675 /* Escape(hdc,TRANSFORM_CTM,LPSTR,NULL); */
676 case ABORTDOC:
677 case BANDINFO:
678 case BEGIN_PATH:
679 case DRAWPATTERNRECT:
680 case ENDDOC:
681 case END_PATH:
682 case EXTTEXTOUT:
683 case FLUSHOUTPUT:
684 case GETFACENAME:
685 case GETPAIRKERNTABLE:
686 case GETSETPAPERBINS:
687 case GETSETPRINTORIENT:
688 case GETSETSCREENPARAMS:
689 case GETTECHNOLOGY:
690 case GETTRACKKERNTABLE:
691 case MFCOMMENT:
692 case NEWFRAME:
693 case PASSTHROUGH:
694 case RESTORE_CTM:
695 case SAVE_CTM:
696 case SETALLJUSTVALUES:
697 case SETCOLORTABLE:
698 case SET_BACKGROUND_COLOR:
699 case TRANSFORM_CTM:
700 /* pass it unmodified to the 32-bit function */
701 return Escape( HDC_32(hdc), escape, in_count, MapSL(in_data), out_data );
703 /* Escape(hdc,ENUMPAPERMETRICS,LPINT16,LPRECT16); */
704 /* Escape(hdc,GETEXTENDEDTEXTMETRICS,LPUINT16,EXTTEXTMETRIC*); */
705 /* Escape(hdc,GETEXTENTTABLE,LPSTR,LPINT16); */
706 /* Escape(hdc,GETSETPAPERMETRICS,LPRECT16,LPRECT16); */
707 /* Escape(hdc,GETVECTORBRUSHSIZE,LPLOGBRUSH16,LPPOINT16); */
708 /* Escape(hdc,GETVECTORPENSIZE,LPLOGPEN16,LPPOINT16); */
709 case ENUMPAPERMETRICS:
710 case GETEXTENDEDTEXTMETRICS:
711 case GETEXTENTTABLE:
712 case GETSETPAPERMETRICS:
713 case GETVECTORBRUSHSIZE:
714 case GETVECTORPENSIZE:
715 default:
716 FIXME("unknown/unsupported 16-bit escape %x (%d,%p,%p\n",
717 escape, in_count, MapSL(in_data), out_data );
718 return Escape( HDC_32(hdc), escape, in_count, MapSL(in_data), out_data );
723 /***********************************************************************
724 * RestoreDC (GDI.39)
726 BOOL16 WINAPI RestoreDC16( HDC16 hdc, INT16 level )
728 return RestoreDC( HDC_32(hdc), level );
732 /***********************************************************************
733 * FillRgn (GDI.40)
735 BOOL16 WINAPI FillRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush )
737 return FillRgn( HDC_32(hdc), HRGN_32(hrgn), HBRUSH_32(hbrush) );
741 /***********************************************************************
742 * FrameRgn (GDI.41)
744 BOOL16 WINAPI FrameRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush,
745 INT16 nWidth, INT16 nHeight )
747 return FrameRgn( HDC_32(hdc), HRGN_32(hrgn), HBRUSH_32(hbrush), nWidth, nHeight );
751 /***********************************************************************
752 * InvertRgn (GDI.42)
754 BOOL16 WINAPI InvertRgn16( HDC16 hdc, HRGN16 hrgn )
756 return InvertRgn( HDC_32(hdc), HRGN_32(hrgn) );
760 /***********************************************************************
761 * PaintRgn (GDI.43)
763 BOOL16 WINAPI PaintRgn16( HDC16 hdc, HRGN16 hrgn )
765 return PaintRgn( HDC_32(hdc), HRGN_32(hrgn) );
769 /***********************************************************************
770 * SelectClipRgn (GDI.44)
772 INT16 WINAPI SelectClipRgn16( HDC16 hdc, HRGN16 hrgn )
774 return SelectClipRgn( HDC_32(hdc), HRGN_32(hrgn) );
778 /***********************************************************************
779 * SelectObject (GDI.45)
781 HGDIOBJ16 WINAPI SelectObject16( HDC16 hdc, HGDIOBJ16 handle )
783 return HGDIOBJ_16( SelectObject( HDC_32(hdc), HGDIOBJ_32(handle) ) );
787 /***********************************************************************
788 * CombineRgn (GDI.47)
790 INT16 WINAPI CombineRgn16(HRGN16 hDest, HRGN16 hSrc1, HRGN16 hSrc2, INT16 mode)
792 return CombineRgn( HRGN_32(hDest), HRGN_32(hSrc1), HRGN_32(hSrc2), mode );
796 /***********************************************************************
797 * CreateBitmap (GDI.48)
799 HBITMAP16 WINAPI CreateBitmap16( INT16 width, INT16 height, UINT16 planes,
800 UINT16 bpp, LPCVOID bits )
802 return HBITMAP_16( CreateBitmap( width, height, planes, bpp, bits ) );
806 /***********************************************************************
807 * CreateBitmapIndirect (GDI.49)
809 HBITMAP16 WINAPI CreateBitmapIndirect16( const BITMAP16 * bmp )
811 return CreateBitmap16( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
812 bmp->bmBitsPixel, MapSL( bmp->bmBits ) );
816 /***********************************************************************
817 * CreateBrushIndirect (GDI.50)
819 HBRUSH16 WINAPI CreateBrushIndirect16( const LOGBRUSH16 * brush )
821 LOGBRUSH brush32;
823 if (brush->lbStyle == BS_DIBPATTERN || brush->lbStyle == BS_DIBPATTERN8X8)
824 return CreateDIBPatternBrush16( brush->lbHatch, brush->lbColor );
826 brush32.lbStyle = brush->lbStyle;
827 brush32.lbColor = brush->lbColor;
828 brush32.lbHatch = brush->lbHatch;
829 return HBRUSH_16( CreateBrushIndirect(&brush32) );
833 /***********************************************************************
834 * CreateCompatibleBitmap (GDI.51)
836 HBITMAP16 WINAPI CreateCompatibleBitmap16( HDC16 hdc, INT16 width, INT16 height )
838 return HBITMAP_16( CreateCompatibleBitmap( HDC_32(hdc), width, height ) );
842 /***********************************************************************
843 * CreateCompatibleDC (GDI.52)
845 HDC16 WINAPI CreateCompatibleDC16( HDC16 hdc )
847 return HDC_16( CreateCompatibleDC( HDC_32(hdc) ) );
851 /***********************************************************************
852 * CreateDC (GDI.53)
854 HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output,
855 const DEVMODEA *initData )
857 return HDC_16( CreateDCA( driver, device, output, initData ) );
861 /***********************************************************************
862 * CreateEllipticRgn (GDI.54)
864 HRGN16 WINAPI CreateEllipticRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom )
866 return HRGN_16( CreateEllipticRgn( left, top, right, bottom ) );
870 /***********************************************************************
871 * CreateEllipticRgnIndirect (GDI.55)
873 HRGN16 WINAPI CreateEllipticRgnIndirect16( const RECT16 *rect )
875 return HRGN_16( CreateEllipticRgn( rect->left, rect->top, rect->right, rect->bottom ) );
879 /***********************************************************************
880 * CreateFont (GDI.56)
882 HFONT16 WINAPI CreateFont16(INT16 height, INT16 width, INT16 esc, INT16 orient,
883 INT16 weight, BYTE italic, BYTE underline,
884 BYTE strikeout, BYTE charset, BYTE outpres,
885 BYTE clippres, BYTE quality, BYTE pitch,
886 LPCSTR name )
888 return HFONT_16( CreateFontA( height, width, esc, orient, weight, italic, underline,
889 strikeout, charset, outpres, clippres, quality, pitch, name ));
892 /***********************************************************************
893 * CreateFontIndirect (GDI.57)
895 HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *plf16 )
897 HFONT ret;
899 if (plf16)
901 LOGFONTW lfW;
902 logfont_16_to_W( plf16, &lfW );
903 ret = CreateFontIndirectW( &lfW );
905 else ret = CreateFontIndirectW( NULL );
906 return HFONT_16(ret);
910 /***********************************************************************
911 * CreateHatchBrush (GDI.58)
913 HBRUSH16 WINAPI CreateHatchBrush16( INT16 style, COLORREF color )
915 return HBRUSH_16( CreateHatchBrush( style, color ) );
919 /***********************************************************************
920 * CreatePatternBrush (GDI.60)
922 HBRUSH16 WINAPI CreatePatternBrush16( HBITMAP16 hbitmap )
924 return HBRUSH_16( CreatePatternBrush( HBITMAP_32(hbitmap) ));
928 /***********************************************************************
929 * CreatePen (GDI.61)
931 HPEN16 WINAPI CreatePen16( INT16 style, INT16 width, COLORREF color )
933 LOGPEN logpen;
935 logpen.lopnStyle = style;
936 logpen.lopnWidth.x = width;
937 logpen.lopnWidth.y = 0;
938 logpen.lopnColor = color;
939 return HPEN_16( CreatePenIndirect( &logpen ) );
943 /***********************************************************************
944 * CreatePenIndirect (GDI.62)
946 HPEN16 WINAPI CreatePenIndirect16( const LOGPEN16 * pen )
948 LOGPEN logpen;
950 if (pen->lopnStyle > PS_INSIDEFRAME) return 0;
951 logpen.lopnStyle = pen->lopnStyle;
952 logpen.lopnWidth.x = pen->lopnWidth.x;
953 logpen.lopnWidth.y = pen->lopnWidth.y;
954 logpen.lopnColor = pen->lopnColor;
955 return HPEN_16( CreatePenIndirect( &logpen ) );
959 /***********************************************************************
960 * CreatePolygonRgn (GDI.63)
962 HRGN16 WINAPI CreatePolygonRgn16( const POINT16 * points, INT16 count, INT16 mode )
964 return CreatePolyPolygonRgn16( points, &count, 1, mode );
968 /***********************************************************************
969 * CreateRectRgn (GDI.64)
971 * NOTE: cf. SetRectRgn16
973 HRGN16 WINAPI CreateRectRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom )
975 HRGN hrgn;
977 if (left < right) hrgn = CreateRectRgn( left, top, right, bottom );
978 else hrgn = CreateRectRgn( 0, 0, 0, 0 );
979 return HRGN_16(hrgn);
983 /***********************************************************************
984 * CreateRectRgnIndirect (GDI.65)
986 HRGN16 WINAPI CreateRectRgnIndirect16( const RECT16* rect )
988 return CreateRectRgn16( rect->left, rect->top, rect->right, rect->bottom );
992 /***********************************************************************
993 * CreateSolidBrush (GDI.66)
995 HBRUSH16 WINAPI CreateSolidBrush16( COLORREF color )
997 return HBRUSH_16( CreateSolidBrush( color ) );
1001 /***********************************************************************
1002 * DeleteDC (GDI.68)
1004 BOOL16 WINAPI DeleteDC16( HDC16 hdc )
1006 return DeleteDC( HDC_32(hdc) );
1010 /***********************************************************************
1011 * DeleteObject (GDI.69)
1012 * SysDeleteObject (GDI.605)
1014 BOOL16 WINAPI DeleteObject16( HGDIOBJ16 obj )
1016 return DeleteObject( HGDIOBJ_32(obj) );
1020 /***********************************************************************
1021 * EnumObjects (GDI.71)
1023 INT16 WINAPI EnumObjects16( HDC16 hdc, INT16 obj, GOBJENUMPROC16 proc, LPARAM lParam )
1025 struct callback16_info info;
1027 info.proc = (FARPROC16)proc;
1028 info.param = lParam;
1029 switch(obj)
1031 case OBJ_PEN:
1032 return EnumObjects( HDC_32(hdc), OBJ_PEN, enum_pens_callback, (LPARAM)&info );
1033 case OBJ_BRUSH:
1034 return EnumObjects( HDC_32(hdc), OBJ_BRUSH, enum_brushes_callback, (LPARAM)&info );
1036 return 0;
1040 /***********************************************************************
1041 * EqualRgn (GDI.72)
1043 BOOL16 WINAPI EqualRgn16( HRGN16 rgn1, HRGN16 rgn2 )
1045 return EqualRgn( HRGN_32(rgn1), HRGN_32(rgn2) );
1049 /***********************************************************************
1050 * GetBitmapBits (GDI.74)
1052 LONG WINAPI GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
1054 return GetBitmapBits( HBITMAP_32(hbitmap), count, buffer );
1058 /***********************************************************************
1059 * GetBkColor (GDI.75)
1061 COLORREF WINAPI GetBkColor16( HDC16 hdc )
1063 return GetBkColor( HDC_32(hdc) );
1067 /***********************************************************************
1068 * GetBkMode (GDI.76)
1070 INT16 WINAPI GetBkMode16( HDC16 hdc )
1072 return GetBkMode( HDC_32(hdc) );
1076 /***********************************************************************
1077 * GetClipBox (GDI.77)
1079 INT16 WINAPI GetClipBox16( HDC16 hdc, LPRECT16 rect )
1081 RECT rect32;
1082 INT ret = GetClipBox( HDC_32(hdc), &rect32 );
1084 if (ret != ERROR)
1086 rect->left = rect32.left;
1087 rect->top = rect32.top;
1088 rect->right = rect32.right;
1089 rect->bottom = rect32.bottom;
1091 return ret;
1095 /***********************************************************************
1096 * GetCurrentPosition (GDI.78)
1098 DWORD WINAPI GetCurrentPosition16( HDC16 hdc )
1100 POINT pt32;
1101 if (!GetCurrentPositionEx( HDC_32(hdc), &pt32 )) return 0;
1102 return MAKELONG( pt32.x, pt32.y );
1106 /***********************************************************************
1107 * GetDCOrg (GDI.79)
1109 DWORD WINAPI GetDCOrg16( HDC16 hdc )
1111 POINT pt;
1112 if (GetDCOrgEx( HDC_32(hdc), &pt )) return MAKELONG( pt.x, pt.y );
1113 return 0;
1117 /***********************************************************************
1118 * GetDeviceCaps (GDI.80)
1120 INT16 WINAPI GetDeviceCaps16( HDC16 hdc, INT16 cap )
1122 INT16 ret = GetDeviceCaps( HDC_32(hdc), cap );
1123 /* some apps don't expect -1 and think it's a B&W screen */
1124 if ((cap == NUMCOLORS) && (ret == -1)) ret = 2048;
1125 return ret;
1129 /***********************************************************************
1130 * GetMapMode (GDI.81)
1132 INT16 WINAPI GetMapMode16( HDC16 hdc )
1134 return GetMapMode( HDC_32(hdc) );
1138 /***********************************************************************
1139 * GetPixel (GDI.83)
1141 COLORREF WINAPI GetPixel16( HDC16 hdc, INT16 x, INT16 y )
1143 return GetPixel( HDC_32(hdc), x, y );
1147 /***********************************************************************
1148 * GetPolyFillMode (GDI.84)
1150 INT16 WINAPI GetPolyFillMode16( HDC16 hdc )
1152 return GetPolyFillMode( HDC_32(hdc) );
1156 /***********************************************************************
1157 * GetROP2 (GDI.85)
1159 INT16 WINAPI GetROP216( HDC16 hdc )
1161 return GetROP2( HDC_32(hdc) );
1165 /***********************************************************************
1166 * GetRelAbs (GDI.86)
1168 INT16 WINAPI GetRelAbs16( HDC16 hdc )
1170 return GetRelAbs( HDC_32(hdc), 0 );
1174 /***********************************************************************
1175 * GetStockObject (GDI.87)
1177 HGDIOBJ16 WINAPI GetStockObject16( INT16 obj )
1179 return HGDIOBJ_16( GetStockObject( obj ) );
1183 /***********************************************************************
1184 * GetStretchBltMode (GDI.88)
1186 INT16 WINAPI GetStretchBltMode16( HDC16 hdc )
1188 return GetStretchBltMode( HDC_32(hdc) );
1192 /***********************************************************************
1193 * GetTextCharacterExtra (GDI.89)
1195 INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
1197 return GetTextCharacterExtra( HDC_32(hdc) );
1201 /***********************************************************************
1202 * GetTextColor (GDI.90)
1204 COLORREF WINAPI GetTextColor16( HDC16 hdc )
1206 return GetTextColor( HDC_32(hdc) );
1210 /***********************************************************************
1211 * GetTextExtent (GDI.91)
1213 DWORD WINAPI GetTextExtent16( HDC16 hdc, LPCSTR str, INT16 count )
1215 SIZE size;
1216 if (!GetTextExtentPoint32A( HDC_32(hdc), str, count, &size )) return 0;
1217 return MAKELONG( size.cx, size.cy );
1221 /***********************************************************************
1222 * GetTextFace (GDI.92)
1224 INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
1226 return GetTextFaceA( HDC_32(hdc), count, name );
1230 /***********************************************************************
1231 * GetTextMetrics (GDI.93)
1233 BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *tm )
1235 TEXTMETRICW tm32;
1237 if (!GetTextMetricsW( HDC_32(hdc), &tm32 )) return FALSE;
1239 tm->tmHeight = tm32.tmHeight;
1240 tm->tmAscent = tm32.tmAscent;
1241 tm->tmDescent = tm32.tmDescent;
1242 tm->tmInternalLeading = tm32.tmInternalLeading;
1243 tm->tmExternalLeading = tm32.tmExternalLeading;
1244 tm->tmAveCharWidth = tm32.tmAveCharWidth;
1245 tm->tmMaxCharWidth = tm32.tmMaxCharWidth;
1246 tm->tmWeight = tm32.tmWeight;
1247 tm->tmOverhang = tm32.tmOverhang;
1248 tm->tmDigitizedAspectX = tm32.tmDigitizedAspectX;
1249 tm->tmDigitizedAspectY = tm32.tmDigitizedAspectY;
1250 tm->tmFirstChar = tm32.tmFirstChar;
1251 tm->tmLastChar = tm32.tmLastChar;
1252 tm->tmDefaultChar = tm32.tmDefaultChar;
1253 tm->tmBreakChar = tm32.tmBreakChar;
1254 tm->tmItalic = tm32.tmItalic;
1255 tm->tmUnderlined = tm32.tmUnderlined;
1256 tm->tmStruckOut = tm32.tmStruckOut;
1257 tm->tmPitchAndFamily = tm32.tmPitchAndFamily;
1258 tm->tmCharSet = tm32.tmCharSet;
1259 return TRUE;
1263 /***********************************************************************
1264 * GetViewportExt (GDI.94)
1266 DWORD WINAPI GetViewportExt16( HDC16 hdc )
1268 SIZE size;
1269 if (!GetViewportExtEx( HDC_32(hdc), &size )) return 0;
1270 return MAKELONG( size.cx, size.cy );
1274 /***********************************************************************
1275 * GetViewportOrg (GDI.95)
1277 DWORD WINAPI GetViewportOrg16( HDC16 hdc )
1279 POINT pt;
1280 if (!GetViewportOrgEx( HDC_32(hdc), &pt )) return 0;
1281 return MAKELONG( pt.x, pt.y );
1285 /***********************************************************************
1286 * GetWindowExt (GDI.96)
1288 DWORD WINAPI GetWindowExt16( HDC16 hdc )
1290 SIZE size;
1291 if (!GetWindowExtEx( HDC_32(hdc), &size )) return 0;
1292 return MAKELONG( size.cx, size.cy );
1296 /***********************************************************************
1297 * GetWindowOrg (GDI.97)
1299 DWORD WINAPI GetWindowOrg16( HDC16 hdc )
1301 POINT pt;
1302 if (!GetWindowOrgEx( HDC_32(hdc), &pt )) return 0;
1303 return MAKELONG( pt.x, pt.y );
1309 /**********************************************************************
1310 * LineDDA (GDI.100)
1312 void WINAPI LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd,
1313 INT16 nYEnd, LINEDDAPROC16 proc, LPARAM lParam )
1315 struct callback16_info info;
1316 info.proc = (FARPROC16)proc;
1317 info.param = lParam;
1318 LineDDA( nXStart, nYStart, nXEnd, nYEnd, linedda_callback, (LPARAM)&info );
1322 /***********************************************************************
1323 * OffsetRgn (GDI.101)
1325 INT16 WINAPI OffsetRgn16( HRGN16 hrgn, INT16 x, INT16 y )
1327 return OffsetRgn( HRGN_32(hrgn), x, y );
1331 /***********************************************************************
1332 * PtVisible (GDI.103)
1334 BOOL16 WINAPI PtVisible16( HDC16 hdc, INT16 x, INT16 y )
1336 return PtVisible( HDC_32(hdc), x, y );
1340 /***********************************************************************
1341 * SetBitmapBits (GDI.106)
1343 LONG WINAPI SetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPCVOID buffer )
1345 return SetBitmapBits( HBITMAP_32(hbitmap), count, buffer );
1349 /***********************************************************************
1350 * AddFontResource (GDI.119)
1352 INT16 WINAPI AddFontResource16( LPCSTR filename )
1354 return AddFontResourceA( filename );
1358 /***********************************************************************
1359 * Death (GDI.121)
1361 * Disables GDI, switches back to text mode.
1362 * We don't have to do anything here,
1363 * just let console support handle everything
1365 void WINAPI Death16(HDC16 hdc)
1367 MESSAGE("Death(%04x) called. Application enters text mode...\n", hdc);
1371 /***********************************************************************
1372 * Resurrection (GDI.122)
1374 * Restores GDI functionality
1376 void WINAPI Resurrection16(HDC16 hdc,
1377 WORD w1, WORD w2, WORD w3, WORD w4, WORD w5, WORD w6)
1379 MESSAGE("Resurrection(%04x, %04x, %04x, %04x, %04x, %04x, %04x) called. Application left text mode.\n",
1380 hdc, w1, w2, w3, w4, w5, w6);
1384 /**********************************************************************
1385 * CreateMetaFile (GDI.125)
1387 HDC16 WINAPI CreateMetaFile16( LPCSTR filename )
1389 return HDC_16( CreateMetaFileA( filename ) );
1393 /***********************************************************************
1394 * MulDiv (GDI.128)
1396 INT16 WINAPI MulDiv16( INT16 nMultiplicand, INT16 nMultiplier, INT16 nDivisor)
1398 INT ret;
1399 if (!nDivisor) return -32768;
1400 /* We want to deal with a positive divisor to simplify the logic. */
1401 if (nDivisor < 0)
1403 nMultiplicand = - nMultiplicand;
1404 nDivisor = -nDivisor;
1406 /* If the result is positive, we "add" to round. else,
1407 * we subtract to round. */
1408 if ( ( (nMultiplicand < 0) && (nMultiplier < 0) ) ||
1409 ( (nMultiplicand >= 0) && (nMultiplier >= 0) ) )
1410 ret = (((int)nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
1411 else
1412 ret = (((int)nMultiplicand * nMultiplier) - (nDivisor/2)) / nDivisor;
1413 if ((ret > 32767) || (ret < -32767)) return -32768;
1414 return (INT16) ret;
1418 /***********************************************************************
1419 * GetRgnBox (GDI.134)
1421 INT16 WINAPI GetRgnBox16( HRGN16 hrgn, LPRECT16 rect )
1423 RECT r;
1424 INT16 ret = GetRgnBox( HRGN_32(hrgn), &r );
1425 rect->left = r.left;
1426 rect->top = r.top;
1427 rect->right = r.right;
1428 rect->bottom = r.bottom;
1429 return ret;
1433 /***********************************************************************
1434 * RemoveFontResource (GDI.136)
1436 BOOL16 WINAPI RemoveFontResource16( LPCSTR str )
1438 return RemoveFontResourceA(str);
1442 /***********************************************************************
1443 * SetBrushOrg (GDI.148)
1445 DWORD WINAPI SetBrushOrg16( HDC16 hdc, INT16 x, INT16 y )
1447 POINT pt;
1449 if (!SetBrushOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
1450 return MAKELONG( pt.x, pt.y );
1454 /***********************************************************************
1455 * GetBrushOrg (GDI.149)
1457 DWORD WINAPI GetBrushOrg16( HDC16 hdc )
1459 POINT pt;
1460 if (!GetBrushOrgEx( HDC_32(hdc), &pt )) return 0;
1461 return MAKELONG( pt.x, pt.y );
1465 /***********************************************************************
1466 * UnrealizeObject (GDI.150)
1468 BOOL16 WINAPI UnrealizeObject16( HGDIOBJ16 obj )
1470 return UnrealizeObject( HGDIOBJ_32(obj) );
1474 /***********************************************************************
1475 * CreateIC (GDI.153)
1477 HDC16 WINAPI CreateIC16( LPCSTR driver, LPCSTR device, LPCSTR output,
1478 const DEVMODEA* initData )
1480 return HDC_16( CreateICA( driver, device, output, initData ) );
1484 /***********************************************************************
1485 * GetNearestColor (GDI.154)
1487 COLORREF WINAPI GetNearestColor16( HDC16 hdc, COLORREF color )
1489 return GetNearestColor( HDC_32(hdc), color );
1493 /***********************************************************************
1494 * CreateDiscardableBitmap (GDI.156)
1496 HBITMAP16 WINAPI CreateDiscardableBitmap16( HDC16 hdc, INT16 width, INT16 height )
1498 return HBITMAP_16( CreateDiscardableBitmap( HDC_32(hdc), width, height ) );
1502 /***********************************************************************
1503 * PtInRegion (GDI.161)
1505 BOOL16 WINAPI PtInRegion16( HRGN16 hrgn, INT16 x, INT16 y )
1507 return PtInRegion( HRGN_32(hrgn), x, y );
1511 /***********************************************************************
1512 * GetBitmapDimension (GDI.162)
1514 DWORD WINAPI GetBitmapDimension16( HBITMAP16 hbitmap )
1516 SIZE16 size;
1517 if (!GetBitmapDimensionEx16( hbitmap, &size )) return 0;
1518 return MAKELONG( size.cx, size.cy );
1522 /***********************************************************************
1523 * SetBitmapDimension (GDI.163)
1525 DWORD WINAPI SetBitmapDimension16( HBITMAP16 hbitmap, INT16 x, INT16 y )
1527 SIZE16 size;
1528 if (!SetBitmapDimensionEx16( hbitmap, x, y, &size )) return 0;
1529 return MAKELONG( size.cx, size.cy );
1533 /***********************************************************************
1534 * SetRectRgn (GDI.172)
1536 * NOTE: Win 3.1 sets region to empty if left > right
1538 void WINAPI SetRectRgn16( HRGN16 hrgn, INT16 left, INT16 top, INT16 right, INT16 bottom )
1540 if (left < right) SetRectRgn( HRGN_32(hrgn), left, top, right, bottom );
1541 else SetRectRgn( HRGN_32(hrgn), 0, 0, 0, 0 );
1545 /******************************************************************
1546 * PlayMetaFileRecord (GDI.176)
1548 void WINAPI PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr, UINT16 handles )
1550 HANDLETABLE *ht32 = HeapAlloc( GetProcessHeap(), 0, handles * sizeof(*ht32) );
1551 unsigned int i;
1553 for (i = 0; i < handles; i++) ht32->objectHandle[i] = (HGDIOBJ)(ULONG_PTR)ht->objectHandle[i];
1554 PlayMetaFileRecord( HDC_32(hdc), ht32, mr, handles );
1555 for (i = 0; i < handles; i++) ht->objectHandle[i] = LOWORD(ht32->objectHandle[i]);
1556 HeapFree( GetProcessHeap(), 0, ht32 );
1560 /***********************************************************************
1561 * SetBoundsRect (GDI.193)
1563 UINT16 WINAPI SetBoundsRect16( HDC16 hdc, const RECT16* rect, UINT16 flags )
1565 if (rect)
1567 RECT rect32;
1568 rect32.left = rect->left;
1569 rect32.top = rect->top;
1570 rect32.right = rect->right;
1571 rect32.bottom = rect->bottom;
1572 return SetBoundsRect( HDC_32( hdc ), &rect32, flags );
1574 else return SetBoundsRect( HDC_32( hdc ), NULL, flags );
1578 /***********************************************************************
1579 * GetBoundsRect (GDI.194)
1581 UINT16 WINAPI GetBoundsRect16( HDC16 hdc, LPRECT16 rect, UINT16 flags)
1583 RECT rect32;
1584 UINT ret = GetBoundsRect( HDC_32( hdc ), &rect32, flags );
1585 if (rect)
1587 rect->left = rect32.left;
1588 rect->top = rect32.top;
1589 rect->right = rect32.right;
1590 rect->bottom = rect32.bottom;
1592 return ret;
1596 /***********************************************************************
1597 * EngineEnumerateFont (GDI.300)
1599 WORD WINAPI EngineEnumerateFont16(LPSTR fontname, FARPROC16 proc, DWORD data )
1601 FIXME("(%s,%p,%lx),stub\n",fontname,proc,data);
1602 return 0;
1606 /***********************************************************************
1607 * EngineDeleteFont (GDI.301)
1609 WORD WINAPI EngineDeleteFont16(LPFONTINFO16 lpFontInfo)
1611 WORD handle;
1613 /* untested, don't know if it works.
1614 We seem to access some structure that is located after the
1615 FONTINFO. The FONTINFO documentation says that there may
1616 follow some char-width table or font bitmap or vector info.
1617 I think it is some kind of font bitmap that begins at offset 0x52,
1618 as FONTINFO goes up to 0x51.
1619 If this is correct, everything should be implemented correctly.
1621 if ( ((lpFontInfo->dfType & (RASTER_FONTTYPE|DEVICE_FONTTYPE)) == (RASTER_FONTTYPE|DEVICE_FONTTYPE))
1622 && (LOWORD(lpFontInfo->dfFace) == LOWORD(lpFontInfo)+0x6e)
1623 && (handle = *(WORD *)(lpFontInfo+0x54)) )
1625 *(WORD *)(lpFontInfo+0x54) = 0;
1626 GlobalFree16(handle);
1628 return 1;
1632 /***********************************************************************
1633 * EngineRealizeFont (GDI.302)
1635 WORD WINAPI EngineRealizeFont16(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo)
1637 FIXME("(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo);
1639 return 0;
1643 /***********************************************************************
1644 * EngineRealizeFontExt (GDI.315)
1646 WORD WINAPI EngineRealizeFontExt16(LONG l1, LONG l2, LONG l3, LONG l4)
1648 FIXME("(%08lx,%08lx,%08lx,%08lx),stub\n",l1,l2,l3,l4);
1650 return 0;
1654 /***********************************************************************
1655 * EngineGetCharWidth (GDI.303)
1657 WORD WINAPI EngineGetCharWidth16(LPFONTINFO16 lpFontInfo, BYTE firstChar, BYTE lastChar, LPINT16 buffer)
1659 int i;
1661 for (i = firstChar; i <= lastChar; i++)
1662 FIXME(" returns font's average width for range %d to %d\n", firstChar, lastChar);
1663 *buffer++ = lpFontInfo->dfAvgWidth; /* insert some charwidth functionality here; use average width for now */
1664 return 1;
1668 /***********************************************************************
1669 * EngineSetFontContext (GDI.304)
1671 WORD WINAPI EngineSetFontContext(LPFONTINFO16 lpFontInfo, WORD data)
1673 FIXME("stub?\n");
1674 return 0;
1677 /***********************************************************************
1678 * EngineGetGlyphBMP (GDI.305)
1680 WORD WINAPI EngineGetGlyphBMP(WORD word, LPFONTINFO16 lpFontInfo, WORD w1, WORD w2,
1681 LPSTR string, DWORD dword, /*LPBITMAPMETRICS16*/ LPVOID metrics)
1683 FIXME("stub?\n");
1684 return 0;
1688 /***********************************************************************
1689 * EngineMakeFontDir (GDI.306)
1691 DWORD WINAPI EngineMakeFontDir(HDC16 hdc, LPFONTDIR16 fontdir, LPCSTR string)
1693 FIXME(" stub! (always fails)\n");
1694 return ~0UL; /* error */
1698 /***********************************************************************
1699 * GetCharABCWidths (GDI.307)
1701 BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar, LPABC16 abc )
1703 BOOL ret;
1704 UINT i;
1705 LPABC abc32 = HeapAlloc( GetProcessHeap(), 0, sizeof(ABC) * (lastChar - firstChar + 1) );
1707 if ((ret = GetCharABCWidthsA( HDC_32(hdc), firstChar, lastChar, abc32 )))
1709 for (i = firstChar; i <= lastChar; i++)
1711 abc[i-firstChar].abcA = abc32[i-firstChar].abcA;
1712 abc[i-firstChar].abcB = abc32[i-firstChar].abcB;
1713 abc[i-firstChar].abcC = abc32[i-firstChar].abcC;
1716 HeapFree( GetProcessHeap(), 0, abc32 );
1717 return ret;
1721 /***********************************************************************
1722 * CreateScalableFontResource (GDI.310)
1724 BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden, LPCSTR lpszResourceFile,
1725 LPCSTR fontFile, LPCSTR path )
1727 return CreateScalableFontResourceA( fHidden, lpszResourceFile, fontFile, path );
1731 /*************************************************************************
1732 * GetFontData (GDI.311)
1735 DWORD WINAPI GetFontData16( HDC16 hdc, DWORD table, DWORD offset, LPVOID buffer, DWORD count )
1737 return GetFontData( HDC_32(hdc), table, offset, buffer, count );
1741 /*************************************************************************
1742 * GetRasterizerCaps (GDI.313)
1744 BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes )
1746 return GetRasterizerCaps( lprs, cbNumBytes );
1750 /*************************************************************************
1751 * GetKerningPairs (GDI.332)
1754 INT16 WINAPI GetKerningPairs16( HDC16 hdc, INT16 count, LPKERNINGPAIR16 pairs )
1756 KERNINGPAIR *pairs32;
1757 INT i, ret;
1759 if (!count) return 0;
1761 if (!(pairs32 = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*pairs32) ))) return 0;
1762 if ((ret = GetKerningPairsA( HDC_32(hdc), count, pairs32 )))
1764 for (i = 0; i < ret; i++)
1766 pairs->wFirst = pairs32->wFirst;
1767 pairs->wSecond = pairs32->wSecond;
1768 pairs->iKernAmount = pairs32->iKernAmount;
1771 HeapFree( GetProcessHeap(), 0, pairs32 );
1772 return ret;
1777 /***********************************************************************
1778 * GetTextAlign (GDI.345)
1780 UINT16 WINAPI GetTextAlign16( HDC16 hdc )
1782 return GetTextAlign( HDC_32(hdc) );
1786 /***********************************************************************
1787 * SetTextAlign (GDI.346)
1789 UINT16 WINAPI SetTextAlign16( HDC16 hdc, UINT16 align )
1791 return SetTextAlign( HDC_32(hdc), align );
1795 /***********************************************************************
1796 * Chord (GDI.348)
1798 BOOL16 WINAPI Chord16( HDC16 hdc, INT16 left, INT16 top,
1799 INT16 right, INT16 bottom, INT16 xstart, INT16 ystart,
1800 INT16 xend, INT16 yend )
1802 return Chord( HDC_32(hdc), left, top, right, bottom, xstart, ystart, xend, yend );
1806 /***********************************************************************
1807 * SetMapperFlags (GDI.349)
1809 DWORD WINAPI SetMapperFlags16( HDC16 hdc, DWORD flags )
1811 return SetMapperFlags( HDC_32(hdc), flags );
1815 /***********************************************************************
1816 * GetCharWidth (GDI.350)
1818 BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar, LPINT16 buffer )
1820 BOOL retVal = FALSE;
1822 if( firstChar != lastChar )
1824 LPINT buf32 = HeapAlloc(GetProcessHeap(), 0, sizeof(INT)*(1 + (lastChar - firstChar)));
1825 if( buf32 )
1827 LPINT obuf32 = buf32;
1828 int i;
1830 retVal = GetCharWidth32A( HDC_32(hdc), firstChar, lastChar, buf32);
1831 if (retVal)
1833 for (i = firstChar; i <= lastChar; i++) *buffer++ = *buf32++;
1835 HeapFree(GetProcessHeap(), 0, obuf32);
1838 else /* happens quite often to warrant a special treatment */
1840 INT chWidth;
1841 retVal = GetCharWidth32A( HDC_32(hdc), firstChar, lastChar, &chWidth );
1842 *buffer = chWidth;
1844 return retVal;
1848 /***********************************************************************
1849 * ExtTextOut (GDI.351)
1851 BOOL16 WINAPI ExtTextOut16( HDC16 hdc, INT16 x, INT16 y, UINT16 flags,
1852 const RECT16 *lprect, LPCSTR str, UINT16 count,
1853 const INT16 *lpDx )
1855 BOOL ret;
1856 int i;
1857 RECT rect32;
1858 LPINT lpdx32 = NULL;
1860 if (lpDx) {
1861 lpdx32 = (LPINT)HeapAlloc( GetProcessHeap(),0, sizeof(INT)*count );
1862 if(lpdx32 == NULL) return FALSE;
1863 for (i=count;i--;) lpdx32[i]=lpDx[i];
1865 if (lprect)
1867 rect32.left = lprect->left;
1868 rect32.top = lprect->top;
1869 rect32.right = lprect->right;
1870 rect32.bottom = lprect->bottom;
1872 ret = ExtTextOutA(HDC_32(hdc),x,y,flags,lprect?&rect32:NULL,str,count,lpdx32);
1873 if (lpdx32) HeapFree( GetProcessHeap(), 0, lpdx32 );
1874 return ret;
1878 /***********************************************************************
1879 * CreatePalette (GDI.360)
1881 HPALETTE16 WINAPI CreatePalette16( const LOGPALETTE* palette )
1883 return HPALETTE_16( CreatePalette( palette ) );
1887 /***********************************************************************
1888 * GDISelectPalette (GDI.361)
1890 HPALETTE16 WINAPI GDISelectPalette16( HDC16 hdc, HPALETTE16 hpalette, WORD wBkg )
1892 return HPALETTE_16( GDISelectPalette( HDC_32(hdc), HPALETTE_32(hpalette), wBkg ));
1896 /***********************************************************************
1897 * GDIRealizePalette (GDI.362)
1899 UINT16 WINAPI GDIRealizePalette16( HDC16 hdc )
1901 return GDIRealizePalette( HDC_32(hdc) );
1905 /***********************************************************************
1906 * GetPaletteEntries (GDI.363)
1908 UINT16 WINAPI GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start,
1909 UINT16 count, LPPALETTEENTRY entries )
1911 return GetPaletteEntries( HPALETTE_32(hpalette), start, count, entries );
1915 /***********************************************************************
1916 * SetPaletteEntries (GDI.364)
1918 UINT16 WINAPI SetPaletteEntries16( HPALETTE16 hpalette, UINT16 start,
1919 UINT16 count, const PALETTEENTRY *entries )
1921 return SetPaletteEntries( HPALETTE_32(hpalette), start, count, entries );
1925 /**********************************************************************
1926 * UpdateColors (GDI.366)
1928 INT16 WINAPI UpdateColors16( HDC16 hdc )
1930 UpdateColors( HDC_32(hdc) );
1931 return TRUE;
1935 /***********************************************************************
1936 * AnimatePalette (GDI.367)
1938 void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex,
1939 UINT16 NumEntries, const PALETTEENTRY* PaletteColors)
1941 AnimatePalette( HPALETTE_32(hpalette), StartIndex, NumEntries, PaletteColors );
1945 /***********************************************************************
1946 * ResizePalette (GDI.368)
1948 BOOL16 WINAPI ResizePalette16( HPALETTE16 hpalette, UINT16 cEntries )
1950 return ResizePalette( HPALETTE_32(hpalette), cEntries );
1954 /***********************************************************************
1955 * GetNearestPaletteIndex (GDI.370)
1957 UINT16 WINAPI GetNearestPaletteIndex16( HPALETTE16 hpalette, COLORREF color )
1959 return GetNearestPaletteIndex( HPALETTE_32(hpalette), color );
1963 /**********************************************************************
1964 * ExtFloodFill (GDI.372)
1966 BOOL16 WINAPI ExtFloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color,
1967 UINT16 fillType )
1969 return ExtFloodFill( HDC_32(hdc), x, y, color, fillType );
1973 /***********************************************************************
1974 * SetSystemPaletteUse (GDI.373)
1976 UINT16 WINAPI SetSystemPaletteUse16( HDC16 hdc, UINT16 use )
1978 return SetSystemPaletteUse( HDC_32(hdc), use );
1982 /***********************************************************************
1983 * GetSystemPaletteUse (GDI.374)
1985 UINT16 WINAPI GetSystemPaletteUse16( HDC16 hdc )
1987 return GetSystemPaletteUse( HDC_32(hdc) );
1991 /***********************************************************************
1992 * GetSystemPaletteEntries (GDI.375)
1994 UINT16 WINAPI GetSystemPaletteEntries16( HDC16 hdc, UINT16 start, UINT16 count,
1995 LPPALETTEENTRY entries )
1997 return GetSystemPaletteEntries( HDC_32(hdc), start, count, entries );
2001 /***********************************************************************
2002 * ResetDC (GDI.376)
2004 HDC16 WINAPI ResetDC16( HDC16 hdc, const DEVMODEA *devmode )
2006 return HDC_16( ResetDCA(HDC_32(hdc), devmode) );
2010 /******************************************************************
2011 * StartDoc (GDI.377)
2013 INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc )
2015 DOCINFOA docA;
2017 docA.cbSize = lpdoc->cbSize;
2018 docA.lpszDocName = MapSL(lpdoc->lpszDocName);
2019 docA.lpszOutput = MapSL(lpdoc->lpszOutput);
2020 if(lpdoc->cbSize > offsetof(DOCINFO16,lpszDatatype))
2021 docA.lpszDatatype = MapSL(lpdoc->lpszDatatype);
2022 else
2023 docA.lpszDatatype = NULL;
2024 if(lpdoc->cbSize > offsetof(DOCINFO16,fwType))
2025 docA.fwType = lpdoc->fwType;
2026 else
2027 docA.fwType = 0;
2028 return StartDocA( HDC_32(hdc), &docA );
2032 /******************************************************************
2033 * EndDoc (GDI.378)
2035 INT16 WINAPI EndDoc16( HDC16 hdc )
2037 return EndDoc( HDC_32(hdc) );
2041 /******************************************************************
2042 * StartPage (GDI.379)
2044 INT16 WINAPI StartPage16( HDC16 hdc )
2046 return StartPage( HDC_32(hdc) );
2050 /******************************************************************
2051 * EndPage (GDI.380)
2053 INT16 WINAPI EndPage16( HDC16 hdc )
2055 return EndPage( HDC_32(hdc) );
2059 /******************************************************************************
2060 * AbortDoc (GDI.382)
2062 INT16 WINAPI AbortDoc16( HDC16 hdc )
2064 return AbortDoc( HDC_32(hdc) );
2068 /***********************************************************************
2069 * FastWindowFrame (GDI.400)
2071 BOOL16 WINAPI FastWindowFrame16( HDC16 hdc, const RECT16 *rect,
2072 INT16 width, INT16 height, DWORD rop )
2074 HDC hdc32 = HDC_32(hdc);
2075 HBRUSH hbrush = SelectObject( hdc32, GetStockObject( GRAY_BRUSH ) );
2076 PatBlt( hdc32, rect->left, rect->top,
2077 rect->right - rect->left - width, height, rop );
2078 PatBlt( hdc32, rect->left, rect->top + height, width,
2079 rect->bottom - rect->top - height, rop );
2080 PatBlt( hdc32, rect->left + width, rect->bottom - 1,
2081 rect->right - rect->left - width, -height, rop );
2082 PatBlt( hdc32, rect->right - 1, rect->top, -width,
2083 rect->bottom - rect->top - height, rop );
2084 SelectObject( hdc32, hbrush );
2085 return TRUE;
2089 /***********************************************************************
2090 * CreateUserBitmap (GDI.407)
2092 HBITMAP16 WINAPI CreateUserBitmap16( INT16 width, INT16 height, UINT16 planes,
2093 UINT16 bpp, LPCVOID bits )
2095 return CreateBitmap16( width, height, planes, bpp, bits );
2099 /***********************************************************************
2100 * CreateUserDiscardableBitmap (GDI.409)
2102 HBITMAP16 WINAPI CreateUserDiscardableBitmap16( WORD dummy, INT16 width, INT16 height )
2104 HDC hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
2105 HBITMAP ret = CreateCompatibleBitmap( hdc, width, height );
2106 DeleteDC( hdc );
2107 return HBITMAP_16(ret);
2111 /***********************************************************************
2112 * GetCurLogFont (GDI.411)
2114 HFONT16 WINAPI GetCurLogFont16( HDC16 hdc )
2116 return HFONT_16( GetCurrentObject( HDC_32(hdc), OBJ_FONT ) );
2120 /***********************************************************************
2121 * StretchDIBits (GDI.439)
2123 INT16 WINAPI StretchDIBits16( HDC16 hdc, INT16 xDst, INT16 yDst, INT16 widthDst,
2124 INT16 heightDst, INT16 xSrc, INT16 ySrc, INT16 widthSrc,
2125 INT16 heightSrc, const VOID *bits,
2126 const BITMAPINFO *info, UINT16 wUsage, DWORD dwRop )
2128 return StretchDIBits( HDC_32(hdc), xDst, yDst, widthDst, heightDst,
2129 xSrc, ySrc, widthSrc, heightSrc, bits,
2130 info, wUsage, dwRop );
2134 /***********************************************************************
2135 * SetDIBits (GDI.440)
2137 INT16 WINAPI SetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
2138 UINT16 lines, LPCVOID bits, const BITMAPINFO *info,
2139 UINT16 coloruse )
2141 return SetDIBits( HDC_32(hdc), HBITMAP_32(hbitmap), startscan, lines, bits, info, coloruse );
2145 /***********************************************************************
2146 * GetDIBits (GDI.441)
2148 INT16 WINAPI GetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
2149 UINT16 lines, LPVOID bits, BITMAPINFO * info,
2150 UINT16 coloruse )
2152 return GetDIBits( HDC_32(hdc), HBITMAP_32(hbitmap), startscan, lines, bits, info, coloruse );
2156 /***********************************************************************
2157 * CreateDIBitmap (GDI.442)
2159 HBITMAP16 WINAPI CreateDIBitmap16( HDC16 hdc, const BITMAPINFOHEADER * header,
2160 DWORD init, LPCVOID bits, const BITMAPINFO * data,
2161 UINT16 coloruse )
2163 return HBITMAP_16( CreateDIBitmap( HDC_32(hdc), header, init, bits, data, coloruse ) );
2167 /***********************************************************************
2168 * SetDIBitsToDevice (GDI.443)
2170 INT16 WINAPI SetDIBitsToDevice16( HDC16 hdc, INT16 xDest, INT16 yDest, INT16 cx,
2171 INT16 cy, INT16 xSrc, INT16 ySrc, UINT16 startscan,
2172 UINT16 lines, LPCVOID bits, const BITMAPINFO *info,
2173 UINT16 coloruse )
2175 return SetDIBitsToDevice( HDC_32(hdc), xDest, yDest, cx, cy, xSrc, ySrc,
2176 startscan, lines, bits, info, coloruse );
2180 /***********************************************************************
2181 * CreateRoundRectRgn (GDI.444)
2183 * If either ellipse dimension is zero we call CreateRectRgn16 for its
2184 * `special' behaviour. -ve ellipse dimensions can result in GPFs under win3.1
2185 * we just let CreateRoundRectRgn convert them to +ve values.
2188 HRGN16 WINAPI CreateRoundRectRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom,
2189 INT16 ellipse_width, INT16 ellipse_height )
2191 if( ellipse_width == 0 || ellipse_height == 0 )
2192 return CreateRectRgn16( left, top, right, bottom );
2193 else
2194 return HRGN_16( CreateRoundRectRgn( left, top, right, bottom,
2195 ellipse_width, ellipse_height ));
2199 /***********************************************************************
2200 * CreateDIBPatternBrush (GDI.445)
2202 HBRUSH16 WINAPI CreateDIBPatternBrush16( HGLOBAL16 hbitmap, UINT16 coloruse )
2204 BITMAPINFO *bmi;
2205 HBRUSH16 ret;
2207 if (!(bmi = GlobalLock16( hbitmap ))) return 0;
2208 ret = HBRUSH_16( CreateDIBPatternBrushPt( bmi, coloruse ));
2209 GlobalUnlock16( hbitmap );
2210 return ret;
2214 /**********************************************************************
2215 * PolyPolygon (GDI.450)
2217 BOOL16 WINAPI PolyPolygon16( HDC16 hdc, const POINT16* pt, const INT16* counts,
2218 UINT16 polygons )
2220 int i,nrpts;
2221 LPPOINT pt32;
2222 LPINT counts32;
2223 BOOL16 ret;
2225 nrpts=0;
2226 for (i=polygons;i--;)
2227 nrpts+=counts[i];
2228 pt32 = (LPPOINT)HeapAlloc( GetProcessHeap(), 0, sizeof(POINT)*nrpts);
2229 if(pt32 == NULL) return FALSE;
2230 for (i=nrpts;i--;)
2232 pt32[i].x = pt[i].x;
2233 pt32[i].y = pt[i].y;
2235 counts32 = (LPINT)HeapAlloc( GetProcessHeap(), 0, polygons*sizeof(INT) );
2236 if(counts32 == NULL) {
2237 HeapFree( GetProcessHeap(), 0, pt32 );
2238 return FALSE;
2240 for (i=polygons;i--;) counts32[i]=counts[i];
2242 ret = PolyPolygon(HDC_32(hdc),pt32,counts32,polygons);
2243 HeapFree( GetProcessHeap(), 0, counts32 );
2244 HeapFree( GetProcessHeap(), 0, pt32 );
2245 return ret;
2249 /***********************************************************************
2250 * CreatePolyPolygonRgn (GDI.451)
2252 HRGN16 WINAPI CreatePolyPolygonRgn16( const POINT16 *points,
2253 const INT16 *count, INT16 nbpolygons, INT16 mode )
2255 HRGN hrgn;
2256 int i, npts = 0;
2257 INT *count32;
2258 POINT *points32;
2260 for (i = 0; i < nbpolygons; i++) npts += count[i];
2261 points32 = HeapAlloc( GetProcessHeap(), 0, npts * sizeof(POINT) );
2262 for (i = 0; i < npts; i++)
2264 points32[i].x = points[i].x;
2265 points32[i].y = points[i].y;
2268 count32 = HeapAlloc( GetProcessHeap(), 0, nbpolygons * sizeof(INT) );
2269 for (i = 0; i < nbpolygons; i++) count32[i] = count[i];
2270 hrgn = CreatePolyPolygonRgn( points32, count32, nbpolygons, mode );
2271 HeapFree( GetProcessHeap(), 0, count32 );
2272 HeapFree( GetProcessHeap(), 0, points32 );
2273 return HRGN_16(hrgn);
2277 /***********************************************************************
2278 * SetObjectOwner (GDI.461)
2280 void WINAPI SetObjectOwner16( HGDIOBJ16 handle, HANDLE16 owner )
2282 /* Nothing to do */
2286 /***********************************************************************
2287 * RectVisible (GDI.465)
2288 * RectVisibleOld (GDI.104)
2290 BOOL16 WINAPI RectVisible16( HDC16 hdc, const RECT16* rect16 )
2292 RECT rect;
2294 rect.left = rect16->left;
2295 rect.top = rect16->top;
2296 rect.right = rect16->right;
2297 rect.bottom = rect16->bottom;
2298 return RectVisible( HDC_32(hdc), &rect );
2302 /***********************************************************************
2303 * RectInRegion (GDI.466)
2304 * RectInRegionOld (GDI.181)
2306 BOOL16 WINAPI RectInRegion16( HRGN16 hrgn, const RECT16 *rect )
2308 RECT r32;
2310 r32.left = rect->left;
2311 r32.top = rect->top;
2312 r32.right = rect->right;
2313 r32.bottom = rect->bottom;
2314 return RectInRegion( HRGN_32(hrgn), &r32 );
2318 /***********************************************************************
2319 * GetBitmapDimensionEx (GDI.468)
2321 BOOL16 WINAPI GetBitmapDimensionEx16( HBITMAP16 hbitmap, LPSIZE16 size )
2323 SIZE size32;
2324 BOOL ret = GetBitmapDimensionEx( HBITMAP_32(hbitmap), &size32 );
2326 if (ret)
2328 size->cx = size32.cx;
2329 size->cy = size32.cy;
2331 return ret;
2335 /***********************************************************************
2336 * GetBrushOrgEx (GDI.469)
2338 BOOL16 WINAPI GetBrushOrgEx16( HDC16 hdc, LPPOINT16 pt )
2340 POINT pt32;
2341 if (!GetBrushOrgEx( HDC_32(hdc), &pt32 )) return FALSE;
2342 pt->x = pt32.x;
2343 pt->y = pt32.y;
2344 return TRUE;
2348 /***********************************************************************
2349 * GetCurrentPositionEx (GDI.470)
2351 BOOL16 WINAPI GetCurrentPositionEx16( HDC16 hdc, LPPOINT16 pt )
2353 POINT pt32;
2354 if (!GetCurrentPositionEx( HDC_32(hdc), &pt32 )) return FALSE;
2355 pt->x = pt32.x;
2356 pt->y = pt32.y;
2357 return TRUE;
2361 /***********************************************************************
2362 * GetTextExtentPoint (GDI.471)
2364 * FIXME: Should this have a bug for compatibility?
2365 * Original Windows versions of GetTextExtentPoint{A,W} have documented
2366 * bugs (-> MSDN KB q147647.txt).
2368 BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count, LPSIZE16 size )
2370 SIZE size32;
2371 BOOL ret = GetTextExtentPoint32A( HDC_32(hdc), str, count, &size32 );
2373 if (ret)
2375 size->cx = size32.cx;
2376 size->cy = size32.cy;
2378 return ret;
2382 /***********************************************************************
2383 * GetViewportExtEx (GDI.472)
2385 BOOL16 WINAPI GetViewportExtEx16( HDC16 hdc, LPSIZE16 size )
2387 SIZE size32;
2388 if (!GetViewportExtEx( HDC_32(hdc), &size32 )) return FALSE;
2389 size->cx = size32.cx;
2390 size->cy = size32.cy;
2391 return TRUE;
2395 /***********************************************************************
2396 * GetViewportOrgEx (GDI.473)
2398 BOOL16 WINAPI GetViewportOrgEx16( HDC16 hdc, LPPOINT16 pt )
2400 POINT pt32;
2401 if (!GetViewportOrgEx( HDC_32(hdc), &pt32 )) return FALSE;
2402 pt->x = pt32.x;
2403 pt->y = pt32.y;
2404 return TRUE;
2408 /***********************************************************************
2409 * GetWindowExtEx (GDI.474)
2411 BOOL16 WINAPI GetWindowExtEx16( HDC16 hdc, LPSIZE16 size )
2413 SIZE size32;
2414 if (!GetWindowExtEx( HDC_32(hdc), &size32 )) return FALSE;
2415 size->cx = size32.cx;
2416 size->cy = size32.cy;
2417 return TRUE;
2421 /***********************************************************************
2422 * GetWindowOrgEx (GDI.475)
2424 BOOL16 WINAPI GetWindowOrgEx16( HDC16 hdc, LPPOINT16 pt )
2426 POINT pt32;
2427 if (!GetWindowOrgEx( HDC_32(hdc), &pt32 )) return FALSE;
2428 pt->x = pt32.x;
2429 pt->y = pt32.y;
2430 return TRUE;
2434 /***********************************************************************
2435 * OffsetViewportOrgEx (GDI.476)
2437 BOOL16 WINAPI OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt)
2439 POINT pt32;
2440 BOOL16 ret = OffsetViewportOrgEx( HDC_32(hdc), x, y, &pt32 );
2441 if (pt)
2443 pt->x = pt32.x;
2444 pt->y = pt32.y;
2446 return ret;
2450 /***********************************************************************
2451 * OffsetWindowOrgEx (GDI.477)
2453 BOOL16 WINAPI OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2455 POINT pt32;
2456 BOOL16 ret = OffsetWindowOrgEx( HDC_32(hdc), x, y, &pt32 );
2457 if (pt)
2459 pt->x = pt32.x;
2460 pt->y = pt32.y;
2462 return ret;
2466 /***********************************************************************
2467 * SetBitmapDimensionEx (GDI.478)
2469 BOOL16 WINAPI SetBitmapDimensionEx16( HBITMAP16 hbitmap, INT16 x, INT16 y, LPSIZE16 prevSize )
2471 SIZE size32;
2472 BOOL ret = SetBitmapDimensionEx( HBITMAP_32(hbitmap), x, y, &size32 );
2474 if (ret && prevSize)
2476 prevSize->cx = size32.cx;
2477 prevSize->cy = size32.cy;
2479 return ret;
2483 /***********************************************************************
2484 * SetViewportExtEx (GDI.479)
2486 BOOL16 WINAPI SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
2488 SIZE size32;
2489 BOOL16 ret = SetViewportExtEx( HDC_32(hdc), x, y, &size32 );
2490 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2491 return ret;
2495 /***********************************************************************
2496 * SetViewportOrgEx (GDI.480)
2498 BOOL16 WINAPI SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2500 POINT pt32;
2501 BOOL16 ret = SetViewportOrgEx( HDC_32(hdc), x, y, &pt32 );
2502 if (pt)
2504 pt->x = pt32.x;
2505 pt->y = pt32.y;
2507 return ret;
2511 /***********************************************************************
2512 * SetWindowExtEx (GDI.481)
2514 BOOL16 WINAPI SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
2516 SIZE size32;
2517 BOOL16 ret = SetWindowExtEx( HDC_32(hdc), x, y, &size32 );
2518 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2519 return ret;
2523 /***********************************************************************
2524 * SetWindowOrgEx (GDI.482)
2526 BOOL16 WINAPI SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2528 POINT pt32;
2529 BOOL16 ret = SetWindowOrgEx( HDC_32(hdc), x, y, &pt32 );
2530 if (pt)
2532 pt->x = pt32.x;
2533 pt->y = pt32.y;
2535 return ret;
2539 /***********************************************************************
2540 * MoveToEx (GDI.483)
2542 BOOL16 WINAPI MoveToEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2544 POINT pt32;
2546 if (!MoveToEx( HDC_32(hdc), x, y, &pt32 )) return FALSE;
2547 if (pt)
2549 pt->x = pt32.x;
2550 pt->y = pt32.y;
2552 return TRUE;
2556 /***********************************************************************
2557 * ScaleViewportExtEx (GDI.484)
2559 BOOL16 WINAPI ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
2560 INT16 yNum, INT16 yDenom, LPSIZE16 size )
2562 SIZE size32;
2563 BOOL16 ret = ScaleViewportExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom,
2564 &size32 );
2565 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2566 return ret;
2570 /***********************************************************************
2571 * ScaleWindowExtEx (GDI.485)
2573 BOOL16 WINAPI ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
2574 INT16 yNum, INT16 yDenom, LPSIZE16 size )
2576 SIZE size32;
2577 BOOL16 ret = ScaleWindowExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom,
2578 &size32 );
2579 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2580 return ret;
2584 /******************************************************************************
2585 * PolyBezier (GDI.502)
2587 BOOL16 WINAPI PolyBezier16( HDC16 hdc, const POINT16* lppt, INT16 cPoints )
2589 int i;
2590 BOOL16 ret;
2591 LPPOINT pt32 = (LPPOINT)HeapAlloc( GetProcessHeap(), 0,
2592 cPoints*sizeof(POINT) );
2593 if(!pt32) return FALSE;
2594 for (i=cPoints;i--;)
2596 pt32[i].x = lppt[i].x;
2597 pt32[i].y = lppt[i].y;
2599 ret= PolyBezier(HDC_32(hdc), pt32, cPoints);
2600 HeapFree( GetProcessHeap(), 0, pt32 );
2601 return ret;
2605 /******************************************************************************
2606 * PolyBezierTo (GDI.503)
2608 BOOL16 WINAPI PolyBezierTo16( HDC16 hdc, const POINT16* lppt, INT16 cPoints )
2610 int i;
2611 BOOL16 ret;
2612 LPPOINT pt32 = (LPPOINT)HeapAlloc( GetProcessHeap(), 0,
2613 cPoints*sizeof(POINT) );
2614 if(!pt32) return FALSE;
2615 for (i=cPoints;i--;)
2617 pt32[i].x = lppt[i].x;
2618 pt32[i].y = lppt[i].y;
2620 ret= PolyBezierTo(HDC_32(hdc), pt32, cPoints);
2621 HeapFree( GetProcessHeap(), 0, pt32 );
2622 return ret;
2626 /******************************************************************************
2627 * ExtSelectClipRgn (GDI.508)
2629 INT16 WINAPI ExtSelectClipRgn16( HDC16 hdc, HRGN16 hrgn, INT16 fnMode )
2631 return ExtSelectClipRgn( HDC_32(hdc), HRGN_32(hrgn), fnMode);
2635 /***********************************************************************
2636 * AbortPath (GDI.511)
2638 BOOL16 WINAPI AbortPath16(HDC16 hdc)
2640 return AbortPath( HDC_32(hdc) );
2644 /***********************************************************************
2645 * BeginPath (GDI.512)
2647 BOOL16 WINAPI BeginPath16(HDC16 hdc)
2649 return BeginPath( HDC_32(hdc) );
2653 /***********************************************************************
2654 * CloseFigure (GDI.513)
2656 BOOL16 WINAPI CloseFigure16(HDC16 hdc)
2658 return CloseFigure( HDC_32(hdc) );
2662 /***********************************************************************
2663 * EndPath (GDI.514)
2665 BOOL16 WINAPI EndPath16(HDC16 hdc)
2667 return EndPath( HDC_32(hdc) );
2671 /***********************************************************************
2672 * FillPath (GDI.515)
2674 BOOL16 WINAPI FillPath16(HDC16 hdc)
2676 return FillPath( HDC_32(hdc) );
2680 /*******************************************************************
2681 * FlattenPath (GDI.516)
2683 BOOL16 WINAPI FlattenPath16(HDC16 hdc)
2685 return FlattenPath( HDC_32(hdc) );
2689 /***********************************************************************
2690 * GetPath (GDI.517)
2692 INT16 WINAPI GetPath16(HDC16 hdc, LPPOINT16 pPoints, LPBYTE pTypes, INT16 nSize)
2694 FIXME("(%d,%p,%p): stub\n",hdc,pPoints,pTypes);
2695 return 0;
2699 /***********************************************************************
2700 * PathToRegion (GDI.518)
2702 HRGN16 WINAPI PathToRegion16(HDC16 hdc)
2704 return HRGN_16( PathToRegion( HDC_32(hdc) ));
2708 /***********************************************************************
2709 * SelectClipPath (GDI.519)
2711 BOOL16 WINAPI SelectClipPath16(HDC16 hdc, INT16 iMode)
2713 return SelectClipPath( HDC_32(hdc), iMode );
2717 /*******************************************************************
2718 * StrokeAndFillPath (GDI.520)
2720 BOOL16 WINAPI StrokeAndFillPath16(HDC16 hdc)
2722 return StrokeAndFillPath( HDC_32(hdc) );
2726 /*******************************************************************
2727 * StrokePath (GDI.521)
2729 BOOL16 WINAPI StrokePath16(HDC16 hdc)
2731 return StrokePath( HDC_32(hdc) );
2735 /*******************************************************************
2736 * WidenPath (GDI.522)
2738 BOOL16 WINAPI WidenPath16(HDC16 hdc)
2740 return WidenPath( HDC_32(hdc) );
2744 /***********************************************************************
2745 * GetArcDirection (GDI.524)
2747 INT16 WINAPI GetArcDirection16( HDC16 hdc )
2749 return GetArcDirection( HDC_32(hdc) );
2753 /***********************************************************************
2754 * SetArcDirection (GDI.525)
2756 INT16 WINAPI SetArcDirection16( HDC16 hdc, INT16 nDirection )
2758 return SetArcDirection( HDC_32(hdc), (INT)nDirection );
2762 /***********************************************************************
2763 * CreateHalftonePalette (GDI.529)
2765 HPALETTE16 WINAPI CreateHalftonePalette16( HDC16 hdc )
2767 return HPALETTE_16( CreateHalftonePalette( HDC_32(hdc) ));
2771 /***********************************************************************
2772 * SetDIBColorTable (GDI.602)
2774 UINT16 WINAPI SetDIBColorTable16( HDC16 hdc, UINT16 startpos, UINT16 entries, RGBQUAD *colors )
2776 return SetDIBColorTable( HDC_32(hdc), startpos, entries, colors );
2780 /***********************************************************************
2781 * GetDIBColorTable (GDI.603)
2783 UINT16 WINAPI GetDIBColorTable16( HDC16 hdc, UINT16 startpos, UINT16 entries, RGBQUAD *colors )
2785 return GetDIBColorTable( HDC_32(hdc), startpos, entries, colors );
2789 /***********************************************************************
2790 * GetRegionData (GDI.607)
2792 * FIXME: is LPRGNDATA the same in Win16 and Win32 ?
2794 DWORD WINAPI GetRegionData16( HRGN16 hrgn, DWORD count, LPRGNDATA rgndata )
2796 return GetRegionData( HRGN_32(hrgn), count, rgndata );
2800 /***********************************************************************
2801 * GetTextCharset (GDI.612)
2803 UINT16 WINAPI GetTextCharset16( HDC16 hdc )
2805 return GetTextCharset( HDC_32(hdc) );
2809 /*************************************************************************
2810 * GetFontLanguageInfo (GDI.616)
2812 DWORD WINAPI GetFontLanguageInfo16( HDC16 hdc )
2814 return GetFontLanguageInfo( HDC_32(hdc) );
2818 /***********************************************************************
2819 * SetLayout (GDI.1000)
2821 * Sets left->right or right->left text layout flags of a dc.
2823 BOOL16 WINAPI SetLayout16( HDC16 hdc, DWORD layout )
2825 return SetLayout( HDC_32(hdc), layout );