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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include "wine/wingdi16.h"
28 #include "gdi_private.h"
29 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(gdi);
33 #define HGDIOBJ_32(handle16) ((HGDIOBJ)(ULONG_PTR)(handle16))
34 #define HGDIOBJ_16(handle32) ((HGDIOBJ16)(ULONG_PTR)(handle32))
36 struct callback16_info
42 /* callback for LineDDA16 */
43 static void CALLBACK linedda_callback( INT x, INT y, LPARAM param )
45 const struct callback16_info *info = (struct callback16_info *)param;
50 args[1] = HIWORD(info->param);
51 args[0] = LOWORD(info->param);
52 WOWCallback16Ex( (DWORD)info->proc, WCB16_PASCAL, sizeof(args), args, NULL );
55 /* callback for EnumObjects16 */
56 static INT CALLBACK enum_pens_callback( void *ptr, LPARAM param )
58 const struct callback16_info *info = (struct callback16_info *)param;
65 pen16.lopnStyle = pen->lopnStyle;
66 pen16.lopnWidth.x = pen->lopnWidth.x;
67 pen16.lopnWidth.y = pen->lopnWidth.y;
68 pen16.lopnColor = pen->lopnColor;
69 segptr = MapLS( &pen16 );
70 args[3] = SELECTOROF(segptr);
71 args[2] = OFFSETOF(segptr);
72 args[1] = HIWORD(info->param);
73 args[0] = LOWORD(info->param);
74 WOWCallback16Ex( (DWORD)info->proc, WCB16_PASCAL, sizeof(args), args, &ret );
79 /* callback for EnumObjects16 */
80 static INT CALLBACK enum_brushes_callback( void *ptr, LPARAM param )
82 const struct callback16_info *info = (struct callback16_info *)param;
83 LOGBRUSH *brush = ptr;
89 brush16.lbStyle = brush->lbStyle;
90 brush16.lbColor = brush->lbColor;
91 brush16.lbHatch = brush->lbHatch;
92 segptr = MapLS( &brush16 );
93 args[3] = SELECTOROF(segptr);
94 args[2] = OFFSETOF(segptr);
95 args[1] = HIWORD(info->param);
96 args[0] = LOWORD(info->param);
97 WOWCallback16Ex( (DWORD)info->proc, WCB16_PASCAL, sizeof(args), args, &ret );
102 /* convert a LOGFONT16 to a LOGFONTW */
103 static void logfont_16_to_W( const LOGFONT16 *font16, LPLOGFONTW font32 )
105 font32->lfHeight = font16->lfHeight;
106 font32->lfWidth = font16->lfWidth;
107 font32->lfEscapement = font16->lfEscapement;
108 font32->lfOrientation = font16->lfOrientation;
109 font32->lfWeight = font16->lfWeight;
110 font32->lfItalic = font16->lfItalic;
111 font32->lfUnderline = font16->lfUnderline;
112 font32->lfStrikeOut = font16->lfStrikeOut;
113 font32->lfCharSet = font16->lfCharSet;
114 font32->lfOutPrecision = font16->lfOutPrecision;
115 font32->lfClipPrecision = font16->lfClipPrecision;
116 font32->lfQuality = font16->lfQuality;
117 font32->lfPitchAndFamily = font16->lfPitchAndFamily;
118 MultiByteToWideChar( CP_ACP, 0, font16->lfFaceName, -1, font32->lfFaceName, LF_FACESIZE );
119 font32->lfFaceName[LF_FACESIZE-1] = 0;
122 /* convert a LOGFONTW to a LOGFONT16 */
123 static void logfont_W_to_16( const LOGFONTW* font32, LPLOGFONT16 font16 )
125 font16->lfHeight = font32->lfHeight;
126 font16->lfWidth = font32->lfWidth;
127 font16->lfEscapement = font32->lfEscapement;
128 font16->lfOrientation = font32->lfOrientation;
129 font16->lfWeight = font32->lfWeight;
130 font16->lfItalic = font32->lfItalic;
131 font16->lfUnderline = font32->lfUnderline;
132 font16->lfStrikeOut = font32->lfStrikeOut;
133 font16->lfCharSet = font32->lfCharSet;
134 font16->lfOutPrecision = font32->lfOutPrecision;
135 font16->lfClipPrecision = font32->lfClipPrecision;
136 font16->lfQuality = font32->lfQuality;
137 font16->lfPitchAndFamily = font32->lfPitchAndFamily;
138 WideCharToMultiByte( CP_ACP, 0, font32->lfFaceName, -1, font16->lfFaceName, LF_FACESIZE, NULL, NULL );
139 font16->lfFaceName[LF_FACESIZE-1] = 0;
142 /* convert a ENUMLOGFONTEXW to a ENUMLOGFONTEX16 */
143 static void enumlogfontex_W_to_16( const ENUMLOGFONTEXW *fontW,
144 LPENUMLOGFONTEX16 font16 )
146 logfont_W_to_16( (const LOGFONTW *)fontW, (LPLOGFONT16)font16);
148 WideCharToMultiByte( CP_ACP, 0, fontW->elfFullName, -1,
149 (LPSTR) font16->elfFullName, LF_FULLFACESIZE, NULL, NULL );
150 font16->elfFullName[LF_FULLFACESIZE-1] = '\0';
151 WideCharToMultiByte( CP_ACP, 0, fontW->elfStyle, -1,
152 (LPSTR) font16->elfStyle, LF_FACESIZE, NULL, NULL );
153 font16->elfStyle[LF_FACESIZE-1] = '\0';
154 WideCharToMultiByte( CP_ACP, 0, fontW->elfScript, -1,
155 (LPSTR) font16->elfScript, LF_FACESIZE, NULL, NULL );
156 font16->elfScript[LF_FACESIZE-1] = '\0';
159 /* convert a NEWTEXTMETRICEXW to a NEWTEXTMETRICEX16 */
160 static void newtextmetricex_W_to_16( const NEWTEXTMETRICEXW *ptmW,
161 LPNEWTEXTMETRICEX16 ptm16 )
163 ptm16->ntmTm.tmHeight = ptmW->ntmTm.tmHeight;
164 ptm16->ntmTm.tmAscent = ptmW->ntmTm.tmAscent;
165 ptm16->ntmTm.tmDescent = ptmW->ntmTm.tmDescent;
166 ptm16->ntmTm.tmInternalLeading = ptmW->ntmTm.tmInternalLeading;
167 ptm16->ntmTm.tmExternalLeading = ptmW->ntmTm.tmExternalLeading;
168 ptm16->ntmTm.tmAveCharWidth = ptmW->ntmTm.tmAveCharWidth;
169 ptm16->ntmTm.tmMaxCharWidth = ptmW->ntmTm.tmMaxCharWidth;
170 ptm16->ntmTm.tmWeight = ptmW->ntmTm.tmWeight;
171 ptm16->ntmTm.tmOverhang = ptmW->ntmTm.tmOverhang;
172 ptm16->ntmTm.tmDigitizedAspectX = ptmW->ntmTm.tmDigitizedAspectX;
173 ptm16->ntmTm.tmDigitizedAspectY = ptmW->ntmTm.tmDigitizedAspectY;
174 ptm16->ntmTm.tmFirstChar = ptmW->ntmTm.tmFirstChar > 255 ? 255 : ptmW->ntmTm.tmFirstChar;
175 ptm16->ntmTm.tmLastChar = ptmW->ntmTm.tmLastChar > 255 ? 255 : ptmW->ntmTm.tmLastChar;
176 ptm16->ntmTm.tmDefaultChar = ptmW->ntmTm.tmDefaultChar > 255 ? 255 : ptmW->ntmTm.tmDefaultChar;
177 ptm16->ntmTm.tmBreakChar = ptmW->ntmTm.tmBreakChar > 255 ? 255 : ptmW->ntmTm.tmBreakChar;
178 ptm16->ntmTm.tmItalic = ptmW->ntmTm.tmItalic;
179 ptm16->ntmTm.tmUnderlined = ptmW->ntmTm.tmUnderlined;
180 ptm16->ntmTm.tmStruckOut = ptmW->ntmTm.tmStruckOut;
181 ptm16->ntmTm.tmPitchAndFamily = ptmW->ntmTm.tmPitchAndFamily;
182 ptm16->ntmTm.tmCharSet = ptmW->ntmTm.tmCharSet;
183 ptm16->ntmTm.ntmFlags = ptmW->ntmTm.ntmFlags;
184 ptm16->ntmTm.ntmSizeEM = ptmW->ntmTm.ntmSizeEM;
185 ptm16->ntmTm.ntmCellHeight = ptmW->ntmTm.ntmCellHeight;
186 ptm16->ntmTm.ntmAvgWidth = ptmW->ntmTm.ntmAvgWidth;
187 ptm16->ntmFontSig = ptmW->ntmFontSig;
191 * callback for EnumFontFamiliesEx16
192 * Note: plf is really an ENUMLOGFONTEXW, and ptm is a NEWTEXTMETRICEXW.
193 * We have to use other types because of the FONTENUMPROCW definition.
195 static INT CALLBACK enum_font_callback( const LOGFONTW *plf,
196 const TEXTMETRICW *ptm, DWORD fType,
199 const struct callback16_info *info = (struct callback16_info *)param;
200 ENUMLOGFONTEX16 elfe16;
201 NEWTEXTMETRICEX16 ntm16;
207 enumlogfontex_W_to_16((const ENUMLOGFONTEXW *)plf, &elfe16);
208 newtextmetricex_W_to_16((const NEWTEXTMETRICEXW *)ptm, &ntm16);
209 segelfe16 = MapLS( &elfe16 );
210 segntm16 = MapLS( &ntm16 );
211 args[6] = SELECTOROF(segelfe16);
212 args[5] = OFFSETOF(segelfe16);
213 args[4] = SELECTOROF(segntm16);
214 args[3] = OFFSETOF(segntm16);
216 args[1] = HIWORD(info->param);
217 args[0] = LOWORD(info->param);
219 WOWCallback16Ex( (DWORD)info->proc, WCB16_PASCAL, sizeof(args), args, &ret );
220 UnMapLS( segelfe16 );
226 /***********************************************************************
229 COLORREF WINAPI SetBkColor16( HDC16 hdc, COLORREF color )
231 return SetBkColor( HDC_32(hdc), color );
235 /***********************************************************************
238 INT16 WINAPI SetBkMode16( HDC16 hdc, INT16 mode )
240 return SetBkMode( HDC_32(hdc), mode );
244 /***********************************************************************
247 INT16 WINAPI SetMapMode16( HDC16 hdc, INT16 mode )
249 return SetMapMode( HDC_32(hdc), mode );
253 /***********************************************************************
256 INT16 WINAPI SetROP216( HDC16 hdc, INT16 mode )
258 return SetROP2( HDC_32(hdc), mode );
262 /***********************************************************************
265 INT16 WINAPI SetRelAbs16( HDC16 hdc, INT16 mode )
267 return SetRelAbs( HDC_32(hdc), mode );
271 /***********************************************************************
272 * SetPolyFillMode (GDI.6)
274 INT16 WINAPI SetPolyFillMode16( HDC16 hdc, INT16 mode )
276 return SetPolyFillMode( HDC_32(hdc), mode );
280 /***********************************************************************
281 * SetStretchBltMode (GDI.7)
283 INT16 WINAPI SetStretchBltMode16( HDC16 hdc, INT16 mode )
285 return SetStretchBltMode( HDC_32(hdc), mode );
289 /***********************************************************************
290 * SetTextCharacterExtra (GDI.8)
292 INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
294 return SetTextCharacterExtra( HDC_32(hdc), extra );
298 /***********************************************************************
299 * SetTextColor (GDI.9)
301 COLORREF WINAPI SetTextColor16( HDC16 hdc, COLORREF color )
303 return SetTextColor( HDC_32(hdc), color );
307 /***********************************************************************
308 * SetTextJustification (GDI.10)
310 INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
312 return SetTextJustification( HDC_32(hdc), extra, breaks );
316 /***********************************************************************
317 * SetWindowOrg (GDI.11)
319 DWORD WINAPI SetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
322 if (!SetWindowOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
323 return MAKELONG( pt.x, pt.y );
327 /***********************************************************************
328 * SetWindowExt (GDI.12)
330 DWORD WINAPI SetWindowExt16( HDC16 hdc, INT16 x, INT16 y )
333 if (!SetWindowExtEx( HDC_32(hdc), x, y, &size )) return 0;
334 return MAKELONG( size.cx, size.cy );
338 /***********************************************************************
339 * SetViewportOrg (GDI.13)
341 DWORD WINAPI SetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
344 if (!SetViewportOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
345 return MAKELONG( pt.x, pt.y );
349 /***********************************************************************
350 * SetViewportExt (GDI.14)
352 DWORD WINAPI SetViewportExt16( HDC16 hdc, INT16 x, INT16 y )
355 if (!SetViewportExtEx( HDC_32(hdc), x, y, &size )) return 0;
356 return MAKELONG( size.cx, size.cy );
360 /***********************************************************************
361 * OffsetWindowOrg (GDI.15)
363 DWORD WINAPI OffsetWindowOrg16( HDC16 hdc, INT16 x, INT16 y )
366 if (!OffsetWindowOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
367 return MAKELONG( pt.x, pt.y );
371 /***********************************************************************
372 * ScaleWindowExt (GDI.16)
374 DWORD WINAPI ScaleWindowExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
375 INT16 yNum, INT16 yDenom )
378 if (!ScaleWindowExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom, &size ))
380 return MAKELONG( size.cx, size.cy );
384 /***********************************************************************
385 * OffsetViewportOrg (GDI.17)
387 DWORD WINAPI OffsetViewportOrg16( HDC16 hdc, INT16 x, INT16 y )
390 if (!OffsetViewportOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
391 return MAKELONG( pt.x, pt.y );
395 /***********************************************************************
396 * ScaleViewportExt (GDI.18)
398 DWORD WINAPI ScaleViewportExt16( HDC16 hdc, INT16 xNum, INT16 xDenom,
399 INT16 yNum, INT16 yDenom )
402 if (!ScaleViewportExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom, &size ))
404 return MAKELONG( size.cx, size.cy );
408 /***********************************************************************
411 BOOL16 WINAPI LineTo16( HDC16 hdc, INT16 x, INT16 y )
413 return LineTo( HDC_32(hdc), x, y );
417 /***********************************************************************
420 DWORD WINAPI MoveTo16( HDC16 hdc, INT16 x, INT16 y )
424 if (!MoveToEx( HDC_32(hdc), x, y, &pt )) return 0;
425 return MAKELONG(pt.x,pt.y);
429 /***********************************************************************
430 * ExcludeClipRect (GDI.21)
432 INT16 WINAPI ExcludeClipRect16( HDC16 hdc, INT16 left, INT16 top,
433 INT16 right, INT16 bottom )
435 return ExcludeClipRect( HDC_32(hdc), left, top, right, bottom );
439 /***********************************************************************
440 * IntersectClipRect (GDI.22)
442 INT16 WINAPI IntersectClipRect16( HDC16 hdc, INT16 left, INT16 top,
443 INT16 right, INT16 bottom )
445 return IntersectClipRect( HDC_32(hdc), left, top, right, bottom );
449 /***********************************************************************
452 BOOL16 WINAPI Arc16( HDC16 hdc, INT16 left, INT16 top, INT16 right,
453 INT16 bottom, INT16 xstart, INT16 ystart,
454 INT16 xend, INT16 yend )
456 return Arc( HDC_32(hdc), left, top, right, bottom, xstart, ystart, xend, yend );
460 /***********************************************************************
463 BOOL16 WINAPI Ellipse16( HDC16 hdc, INT16 left, INT16 top,
464 INT16 right, INT16 bottom )
466 return Ellipse( HDC_32(hdc), left, top, right, bottom );
470 /**********************************************************************
473 BOOL16 WINAPI FloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
475 return ExtFloodFill( HDC_32(hdc), x, y, color, FLOODFILLBORDER );
479 /***********************************************************************
482 BOOL16 WINAPI Pie16( HDC16 hdc, INT16 left, INT16 top,
483 INT16 right, INT16 bottom, INT16 xstart, INT16 ystart,
484 INT16 xend, INT16 yend )
486 return Pie( HDC_32(hdc), left, top, right, bottom, xstart, ystart, xend, yend );
490 /***********************************************************************
493 BOOL16 WINAPI Rectangle16( HDC16 hdc, INT16 left, INT16 top,
494 INT16 right, INT16 bottom )
496 return Rectangle( HDC_32(hdc), left, top, right, bottom );
500 /***********************************************************************
503 BOOL16 WINAPI RoundRect16( HDC16 hdc, INT16 left, INT16 top, INT16 right,
504 INT16 bottom, INT16 ell_width, INT16 ell_height )
506 return RoundRect( HDC_32(hdc), left, top, right, bottom, ell_width, ell_height );
510 /***********************************************************************
513 BOOL16 WINAPI PatBlt16( HDC16 hdc, INT16 left, INT16 top,
514 INT16 width, INT16 height, DWORD rop)
516 return PatBlt( HDC_32(hdc), left, top, width, height, rop );
520 /***********************************************************************
523 INT16 WINAPI SaveDC16( HDC16 hdc )
525 return SaveDC( HDC_32(hdc) );
529 /***********************************************************************
532 COLORREF WINAPI SetPixel16( HDC16 hdc, INT16 x, INT16 y, COLORREF color )
534 return SetPixel( HDC_32(hdc), x, y, color );
538 /***********************************************************************
539 * OffsetClipRgn (GDI.32)
541 INT16 WINAPI OffsetClipRgn16( HDC16 hdc, INT16 x, INT16 y )
543 return OffsetClipRgn( HDC_32(hdc), x, y );
547 /***********************************************************************
550 BOOL16 WINAPI TextOut16( HDC16 hdc, INT16 x, INT16 y, LPCSTR str, INT16 count )
552 return TextOutA( HDC_32(hdc), x, y, str, count );
556 /***********************************************************************
559 BOOL16 WINAPI BitBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst, INT16 width,
560 INT16 height, HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
563 return BitBlt( HDC_32(hdcDst), xDst, yDst, width, height, HDC_32(hdcSrc), xSrc, ySrc, rop );
567 /***********************************************************************
568 * StretchBlt (GDI.35)
570 BOOL16 WINAPI StretchBlt16( HDC16 hdcDst, INT16 xDst, INT16 yDst,
571 INT16 widthDst, INT16 heightDst,
572 HDC16 hdcSrc, INT16 xSrc, INT16 ySrc,
573 INT16 widthSrc, INT16 heightSrc, DWORD rop )
575 return StretchBlt( HDC_32(hdcDst), xDst, yDst, widthDst, heightDst,
576 HDC_32(hdcSrc), xSrc, ySrc, widthSrc, heightSrc, rop );
580 /**********************************************************************
583 BOOL16 WINAPI Polygon16( HDC16 hdc, const POINT16* pt, INT16 count )
587 LPPOINT pt32 = HeapAlloc( GetProcessHeap(), 0, count*sizeof(POINT) );
589 if (!pt32) return FALSE;
595 ret = Polygon(HDC_32(hdc),pt32,count);
596 HeapFree( GetProcessHeap(), 0, pt32 );
601 /**********************************************************************
604 BOOL16 WINAPI Polyline16( HDC16 hdc, const POINT16* pt, INT16 count )
608 LPPOINT pt32 = HeapAlloc( GetProcessHeap(), 0, count*sizeof(POINT) );
610 if (!pt32) return FALSE;
616 ret = Polyline(HDC_32(hdc),pt32,count);
617 HeapFree( GetProcessHeap(), 0, pt32 );
622 /***********************************************************************
625 INT16 WINAPI Escape16( HDC16 hdc, INT16 escape, INT16 in_count, SEGPTR in_data, LPVOID out_data )
631 /* Escape(hdc,CLIP_TO_PATH,LPINT16,NULL) */
632 /* Escape(hdc,DRAFTMODE,LPINT16,NULL) */
633 /* Escape(hdc,ENUMPAPERBINS,LPINT16,LPSTR); */
634 /* Escape(hdc,EPSPRINTING,LPINT16,NULL) */
635 /* Escape(hdc,EXT_DEVICE_CAPS,LPINT16,LPDWORD) */
636 /* Escape(hdc,GETCOLORTABLE,LPINT16,LPDWORD) */
637 /* Escape(hdc,MOUSETRAILS,LPINT16,NULL) */
638 /* Escape(hdc,POSTSCRIPT_IGNORE,LPINT16,NULL) */
639 /* Escape(hdc,QUERYESCSUPPORT,LPINT16,NULL) */
640 /* Escape(hdc,SET_ARC_DIRECTION,LPINT16,NULL) */
641 /* Escape(hdc,SET_POLY_MODE,LPINT16,NULL) */
642 /* Escape(hdc,SET_SCREEN_ANGLE,LPINT16,NULL) */
643 /* Escape(hdc,SET_SPREAD,LPINT16,NULL) */
648 case EXT_DEVICE_CAPS:
651 case POSTSCRIPT_IGNORE:
652 case QUERYESCSUPPORT:
653 case SET_ARC_DIRECTION:
655 case SET_SCREEN_ANGLE:
658 INT16 *ptr = MapSL(in_data);
660 return Escape( HDC_32(hdc), escape, sizeof(data), (LPCSTR)&data, out_data );
663 /* Escape(hdc,ENABLEDUPLEX,LPUINT16,NULL) */
666 UINT16 *ptr = MapSL(in_data);
668 return Escape( HDC_32(hdc), escape, sizeof(data), (LPCSTR)&data, NULL );
671 /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT16) */
672 /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT16) */
673 /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT16) */
674 case GETPHYSPAGESIZE:
675 case GETPRINTINGOFFSET:
676 case GETSCALINGFACTOR:
678 POINT16 *ptr = out_data;
680 ret = Escape( HDC_32(hdc), escape, 0, NULL, &pt32 );
686 /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
687 /* Escape(hdc,ENABLERELATIVEWIDTHS,LPINT16,LPINT16); */
688 /* Escape(hdc,SETCOPYCOUNT,LPINT16,LPINT16) */
689 /* Escape(hdc,SETKERNTRACK,LPINT16,LPINT16) */
690 /* Escape(hdc,SETLINECAP,LPINT16,LPINT16) */
691 /* Escape(hdc,SETLINEJOIN,LPINT16,LPINT16) */
692 /* Escape(hdc,SETMITERLIMIT,LPINT16,LPINT16) */
693 case ENABLEPAIRKERNING:
694 case ENABLERELATIVEWIDTHS:
701 INT16 *new = MapSL(in_data);
702 INT16 *old = out_data;
704 ret = Escape( HDC_32(hdc), escape, sizeof(in), (LPCSTR)&in, &out );
709 /* Escape(hdc,SETABORTPROC,ABORTPROC,NULL); */
711 return SetAbortProc16( hdc, (ABORTPROC16)in_data );
713 /* Escape(hdc,STARTDOC,LPSTR,LPDOCINFO16);
714 * lpvOutData is actually a pointer to the DocInfo structure and used as
715 * a second input parameter */
719 ret = StartDoc16( hdc, out_data );
720 if (ret > 0) ret = StartPage( HDC_32(hdc) );
723 return Escape( HDC_32(hdc), escape, in_count, MapSL(in_data), NULL );
725 /* Escape(hdc,SET_BOUNDS,LPRECT16,NULL); */
726 /* Escape(hdc,SET_CLIP_BOX,LPRECT16,NULL); */
730 RECT16 *rc16 = MapSL(in_data);
732 rc.left = rc16->left;
734 rc.right = rc16->right;
735 rc.bottom = rc16->bottom;
736 return Escape( HDC_32(hdc), escape, sizeof(rc), (LPCSTR)&rc, NULL );
739 /* Escape(hdc,NEXTBAND,NULL,LPRECT16); */
743 RECT16 *rc16 = out_data;
744 ret = Escape( HDC_32(hdc), escape, 0, NULL, &rc );
745 rc16->left = rc.left;
747 rc16->right = rc.right;
748 rc16->bottom = rc.bottom;
751 /* Escape(hdc,DRAWPATTERNRECT,PRECT_STRUCT*,NULL); */
752 case DRAWPATTERNRECT:
755 DRAWPATRECT16 *pr16 = MapSL(in_data);
757 pr.ptPosition.x = pr16->ptPosition.x;
758 pr.ptPosition.y = pr16->ptPosition.y;
759 pr.ptSize.x = pr16->ptSize.x;
760 pr.ptSize.y = pr16->ptSize.y;
761 pr.wStyle = pr16->wStyle;
762 pr.wPattern = pr16->wPattern;
763 return Escape( HDC_32(hdc), escape, sizeof(pr), (LPCSTR)&pr, NULL );
766 /* Escape(hdc,ABORTDOC,NULL,NULL); */
767 /* Escape(hdc,BANDINFO,BANDINFOSTRUCT*,BANDINFOSTRUCT*); */
768 /* Escape(hdc,BEGIN_PATH,NULL,NULL); */
769 /* Escape(hdc,ENDDOC,NULL,NULL); */
770 /* Escape(hdc,END_PATH,PATHINFO,NULL); */
771 /* Escape(hdc,EXTTEXTOUT,EXTTEXT_STRUCT*,NULL); */
772 /* Escape(hdc,FLUSHOUTPUT,NULL,NULL); */
773 /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
774 /* Escape(hdc,GETPAIRKERNTABLE,NULL,KERNPAIR*); */
775 /* Escape(hdc,GETSETPAPERBINS,BinInfo*,BinInfo*); */
776 /* Escape(hdc,GETSETPRINTORIENT,ORIENT*,NULL); */
777 /* Escape(hdc,GETSETSCREENPARAMS,SCREENPARAMS*,SCREENPARAMS*); */
778 /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
779 /* Escape(hdc,GETTRACKKERNTABLE,NULL,KERNTRACK*); */
780 /* Escape(hdc,MFCOMMENT,LPSTR,NULL); */
781 /* Escape(hdc,NEWFRAME,NULL,NULL); */
782 /* Escape(hdc,PASSTHROUGH,LPSTR,NULL); */
783 /* Escape(hdc,RESTORE_CTM,NULL,NULL); */
784 /* Escape(hdc,SAVE_CTM,NULL,NULL); */
785 /* Escape(hdc,SETALLJUSTVALUES,EXTTEXTDATA*,NULL); */
786 /* Escape(hdc,SETCOLORTABLE,COLORTABLE_STRUCT*,LPDWORD); */
787 /* Escape(hdc,SET_BACKGROUND_COLOR,LPDWORD,LPDWORD); */
788 /* Escape(hdc,TRANSFORM_CTM,LPSTR,NULL); */
797 case GETPAIRKERNTABLE:
798 case GETSETPAPERBINS:
799 case GETSETPRINTORIENT:
800 case GETSETSCREENPARAMS:
802 case GETTRACKKERNTABLE:
808 case SETALLJUSTVALUES:
810 case SET_BACKGROUND_COLOR:
812 /* pass it unmodified to the 32-bit function */
813 return Escape( HDC_32(hdc), escape, in_count, MapSL(in_data), out_data );
815 /* Escape(hdc,ENUMPAPERMETRICS,LPINT16,LPRECT16); */
816 /* Escape(hdc,GETEXTENDEDTEXTMETRICS,LPUINT16,EXTTEXTMETRIC*); */
817 /* Escape(hdc,GETEXTENTTABLE,LPSTR,LPINT16); */
818 /* Escape(hdc,GETSETPAPERMETRICS,LPRECT16,LPRECT16); */
819 /* Escape(hdc,GETVECTORBRUSHSIZE,LPLOGBRUSH16,LPPOINT16); */
820 /* Escape(hdc,GETVECTORPENSIZE,LPLOGPEN16,LPPOINT16); */
821 case ENUMPAPERMETRICS:
822 case GETEXTENDEDTEXTMETRICS:
824 case GETSETPAPERMETRICS:
825 case GETVECTORBRUSHSIZE:
826 case GETVECTORPENSIZE:
828 FIXME("unknown/unsupported 16-bit escape %x (%d,%p,%p\n",
829 escape, in_count, MapSL(in_data), out_data );
830 return Escape( HDC_32(hdc), escape, in_count, MapSL(in_data), out_data );
835 /***********************************************************************
838 BOOL16 WINAPI RestoreDC16( HDC16 hdc, INT16 level )
840 return RestoreDC( HDC_32(hdc), level );
844 /***********************************************************************
847 BOOL16 WINAPI FillRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush )
849 return FillRgn( HDC_32(hdc), HRGN_32(hrgn), HBRUSH_32(hbrush) );
853 /***********************************************************************
856 BOOL16 WINAPI FrameRgn16( HDC16 hdc, HRGN16 hrgn, HBRUSH16 hbrush,
857 INT16 nWidth, INT16 nHeight )
859 return FrameRgn( HDC_32(hdc), HRGN_32(hrgn), HBRUSH_32(hbrush), nWidth, nHeight );
863 /***********************************************************************
866 BOOL16 WINAPI InvertRgn16( HDC16 hdc, HRGN16 hrgn )
868 return InvertRgn( HDC_32(hdc), HRGN_32(hrgn) );
872 /***********************************************************************
875 BOOL16 WINAPI PaintRgn16( HDC16 hdc, HRGN16 hrgn )
877 return PaintRgn( HDC_32(hdc), HRGN_32(hrgn) );
881 /***********************************************************************
882 * SelectClipRgn (GDI.44)
884 INT16 WINAPI SelectClipRgn16( HDC16 hdc, HRGN16 hrgn )
886 return SelectClipRgn( HDC_32(hdc), HRGN_32(hrgn) );
890 /***********************************************************************
891 * SelectObject (GDI.45)
893 HGDIOBJ16 WINAPI SelectObject16( HDC16 hdc, HGDIOBJ16 handle )
895 return HGDIOBJ_16( SelectObject( HDC_32(hdc), HGDIOBJ_32(handle) ) );
899 /***********************************************************************
900 * CombineRgn (GDI.47)
902 INT16 WINAPI CombineRgn16(HRGN16 hDest, HRGN16 hSrc1, HRGN16 hSrc2, INT16 mode)
904 return CombineRgn( HRGN_32(hDest), HRGN_32(hSrc1), HRGN_32(hSrc2), mode );
908 /***********************************************************************
909 * CreateBitmap (GDI.48)
911 HBITMAP16 WINAPI CreateBitmap16( INT16 width, INT16 height, UINT16 planes,
912 UINT16 bpp, LPCVOID bits )
914 return HBITMAP_16( CreateBitmap( width, height, planes & 0xff, bpp & 0xff, bits ) );
918 /***********************************************************************
919 * CreateBitmapIndirect (GDI.49)
921 HBITMAP16 WINAPI CreateBitmapIndirect16( const BITMAP16 * bmp )
923 return CreateBitmap16( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
924 bmp->bmBitsPixel, MapSL( bmp->bmBits ) );
928 /***********************************************************************
929 * CreateBrushIndirect (GDI.50)
931 HBRUSH16 WINAPI CreateBrushIndirect16( const LOGBRUSH16 * brush )
935 if (brush->lbStyle == BS_DIBPATTERN || brush->lbStyle == BS_DIBPATTERN8X8)
936 return CreateDIBPatternBrush16( brush->lbHatch, brush->lbColor );
938 brush32.lbStyle = brush->lbStyle;
939 brush32.lbColor = brush->lbColor;
940 brush32.lbHatch = brush->lbHatch;
941 return HBRUSH_16( CreateBrushIndirect(&brush32) );
945 /***********************************************************************
946 * CreateCompatibleBitmap (GDI.51)
948 HBITMAP16 WINAPI CreateCompatibleBitmap16( HDC16 hdc, INT16 width, INT16 height )
950 return HBITMAP_16( CreateCompatibleBitmap( HDC_32(hdc), width, height ) );
954 /***********************************************************************
955 * CreateCompatibleDC (GDI.52)
957 HDC16 WINAPI CreateCompatibleDC16( HDC16 hdc )
959 return HDC_16( CreateCompatibleDC( HDC_32(hdc) ) );
963 /***********************************************************************
966 HDC16 WINAPI CreateDC16( LPCSTR driver, LPCSTR device, LPCSTR output,
967 const DEVMODEA *initData )
969 return HDC_16( CreateDCA( driver, device, output, initData ) );
973 /***********************************************************************
974 * CreateEllipticRgn (GDI.54)
976 HRGN16 WINAPI CreateEllipticRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom )
978 return HRGN_16( CreateEllipticRgn( left, top, right, bottom ) );
982 /***********************************************************************
983 * CreateEllipticRgnIndirect (GDI.55)
985 HRGN16 WINAPI CreateEllipticRgnIndirect16( const RECT16 *rect )
987 return HRGN_16( CreateEllipticRgn( rect->left, rect->top, rect->right, rect->bottom ) );
991 /***********************************************************************
992 * CreateFont (GDI.56)
994 HFONT16 WINAPI CreateFont16(INT16 height, INT16 width, INT16 esc, INT16 orient,
995 INT16 weight, BYTE italic, BYTE underline,
996 BYTE strikeout, BYTE charset, BYTE outpres,
997 BYTE clippres, BYTE quality, BYTE pitch,
1000 return HFONT_16( CreateFontA( height, width, esc, orient, weight, italic, underline,
1001 strikeout, charset, outpres, clippres, quality, pitch, name ));
1004 /***********************************************************************
1005 * CreateFontIndirect (GDI.57)
1007 HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *plf16 )
1014 logfont_16_to_W( plf16, &lfW );
1015 ret = CreateFontIndirectW( &lfW );
1017 else ret = CreateFontIndirectW( NULL );
1018 return HFONT_16(ret);
1022 /***********************************************************************
1023 * CreateHatchBrush (GDI.58)
1025 HBRUSH16 WINAPI CreateHatchBrush16( INT16 style, COLORREF color )
1027 return HBRUSH_16( CreateHatchBrush( style, color ) );
1031 /***********************************************************************
1032 * CreatePatternBrush (GDI.60)
1034 HBRUSH16 WINAPI CreatePatternBrush16( HBITMAP16 hbitmap )
1036 return HBRUSH_16( CreatePatternBrush( HBITMAP_32(hbitmap) ));
1040 /***********************************************************************
1041 * CreatePen (GDI.61)
1043 HPEN16 WINAPI CreatePen16( INT16 style, INT16 width, COLORREF color )
1047 logpen.lopnStyle = style;
1048 logpen.lopnWidth.x = width;
1049 logpen.lopnWidth.y = 0;
1050 logpen.lopnColor = color;
1051 return HPEN_16( CreatePenIndirect( &logpen ) );
1055 /***********************************************************************
1056 * CreatePenIndirect (GDI.62)
1058 HPEN16 WINAPI CreatePenIndirect16( const LOGPEN16 * pen )
1062 if (pen->lopnStyle > PS_INSIDEFRAME) return 0;
1063 logpen.lopnStyle = pen->lopnStyle;
1064 logpen.lopnWidth.x = pen->lopnWidth.x;
1065 logpen.lopnWidth.y = pen->lopnWidth.y;
1066 logpen.lopnColor = pen->lopnColor;
1067 return HPEN_16( CreatePenIndirect( &logpen ) );
1071 /***********************************************************************
1072 * CreatePolygonRgn (GDI.63)
1074 HRGN16 WINAPI CreatePolygonRgn16( const POINT16 * points, INT16 count, INT16 mode )
1076 return CreatePolyPolygonRgn16( points, &count, 1, mode );
1080 /***********************************************************************
1081 * CreateRectRgn (GDI.64)
1083 * NOTE: cf. SetRectRgn16
1085 HRGN16 WINAPI CreateRectRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom )
1089 if (left < right) hrgn = CreateRectRgn( left, top, right, bottom );
1090 else hrgn = CreateRectRgn( 0, 0, 0, 0 );
1091 return HRGN_16(hrgn);
1095 /***********************************************************************
1096 * CreateRectRgnIndirect (GDI.65)
1098 HRGN16 WINAPI CreateRectRgnIndirect16( const RECT16* rect )
1100 return CreateRectRgn16( rect->left, rect->top, rect->right, rect->bottom );
1104 /***********************************************************************
1105 * CreateSolidBrush (GDI.66)
1107 HBRUSH16 WINAPI CreateSolidBrush16( COLORREF color )
1109 return HBRUSH_16( CreateSolidBrush( color ) );
1113 /***********************************************************************
1116 BOOL16 WINAPI DeleteDC16( HDC16 hdc )
1118 return DeleteDC( HDC_32(hdc) );
1122 /***********************************************************************
1123 * DeleteObject (GDI.69)
1124 * SysDeleteObject (GDI.605)
1126 BOOL16 WINAPI DeleteObject16( HGDIOBJ16 obj )
1128 return DeleteObject( HGDIOBJ_32(obj) );
1132 /***********************************************************************
1133 * EnumFonts (GDI.70)
1135 INT16 WINAPI EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc,
1138 return EnumFontFamilies16( hDC, lpName, efproc, lpData );
1142 /***********************************************************************
1143 * EnumObjects (GDI.71)
1145 INT16 WINAPI EnumObjects16( HDC16 hdc, INT16 obj, GOBJENUMPROC16 proc, LPARAM lParam )
1147 struct callback16_info info;
1149 info.proc = (FARPROC16)proc;
1150 info.param = lParam;
1154 return EnumObjects( HDC_32(hdc), OBJ_PEN, enum_pens_callback, (LPARAM)&info );
1156 return EnumObjects( HDC_32(hdc), OBJ_BRUSH, enum_brushes_callback, (LPARAM)&info );
1162 /***********************************************************************
1165 BOOL16 WINAPI EqualRgn16( HRGN16 rgn1, HRGN16 rgn2 )
1167 return EqualRgn( HRGN_32(rgn1), HRGN_32(rgn2) );
1171 /***********************************************************************
1172 * GetBitmapBits (GDI.74)
1174 LONG WINAPI GetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPVOID buffer )
1176 return GetBitmapBits( HBITMAP_32(hbitmap), count, buffer );
1180 /***********************************************************************
1181 * GetBkColor (GDI.75)
1183 COLORREF WINAPI GetBkColor16( HDC16 hdc )
1185 return GetBkColor( HDC_32(hdc) );
1189 /***********************************************************************
1190 * GetBkMode (GDI.76)
1192 INT16 WINAPI GetBkMode16( HDC16 hdc )
1194 return GetBkMode( HDC_32(hdc) );
1198 /***********************************************************************
1199 * GetClipBox (GDI.77)
1201 INT16 WINAPI GetClipBox16( HDC16 hdc, LPRECT16 rect )
1204 INT ret = GetClipBox( HDC_32(hdc), &rect32 );
1208 rect->left = rect32.left;
1209 rect->top = rect32.top;
1210 rect->right = rect32.right;
1211 rect->bottom = rect32.bottom;
1217 /***********************************************************************
1218 * GetCurrentPosition (GDI.78)
1220 DWORD WINAPI GetCurrentPosition16( HDC16 hdc )
1223 if (!GetCurrentPositionEx( HDC_32(hdc), &pt32 )) return 0;
1224 return MAKELONG( pt32.x, pt32.y );
1228 /***********************************************************************
1231 DWORD WINAPI GetDCOrg16( HDC16 hdc )
1234 if (GetDCOrgEx( HDC_32(hdc), &pt )) return MAKELONG( pt.x, pt.y );
1239 /***********************************************************************
1240 * GetDeviceCaps (GDI.80)
1242 INT16 WINAPI GetDeviceCaps16( HDC16 hdc, INT16 cap )
1244 INT16 ret = GetDeviceCaps( HDC_32(hdc), cap );
1245 /* some apps don't expect -1 and think it's a B&W screen */
1246 if ((cap == NUMCOLORS) && (ret == -1)) ret = 2048;
1251 /***********************************************************************
1252 * GetMapMode (GDI.81)
1254 INT16 WINAPI GetMapMode16( HDC16 hdc )
1256 return GetMapMode( HDC_32(hdc) );
1260 /***********************************************************************
1261 * GetObject (GDI.82)
1263 INT16 WINAPI GetObject16( HGDIOBJ16 handle16, INT16 count, LPVOID buffer )
1265 HGDIOBJ handle = HGDIOBJ_32( handle16 );
1266 switch( GetObjectType( handle ))
1271 LOGPEN16 *pen16 = buffer;
1274 if (count < sizeof(LOGPEN16)) return 0;
1275 if (!GetObjectW( handle, sizeof(pen), &pen )) return 0;
1277 pen16->lopnStyle = pen.lopnStyle;
1278 pen16->lopnColor = pen.lopnColor;
1279 pen16->lopnWidth.x = pen.lopnWidth.x;
1280 pen16->lopnWidth.y = pen.lopnWidth.y;
1282 return sizeof(LOGPEN16);
1290 if (!GetObjectW( handle, sizeof(brush), &brush )) return 0;
1291 brush16.lbStyle = brush.lbStyle;
1292 brush16.lbColor = brush.lbColor;
1293 brush16.lbHatch = brush.lbHatch;
1294 if (count > sizeof(brush16)) count = sizeof(brush16);
1295 memcpy( buffer, &brush16, count );
1298 return sizeof(LOGBRUSH16);
1301 return GetObjectW( handle, count, buffer );
1309 if (!GetObjectW( handle, sizeof(font), &font )) return 0;
1310 logfont_W_to_16( &font, &font16 );
1311 if (count > sizeof(font16)) count = sizeof(font16);
1312 memcpy( buffer, &font16, count );
1315 return sizeof(LOGFONT16);
1321 BITMAP16 *bmp16 = buffer;
1323 if (!(size = GetObjectW( handle, sizeof(dib), &dib ))) return 0;
1324 if (size == sizeof(DIBSECTION) && count > sizeof(BITMAP16))
1326 FIXME("not implemented for DIBs: count %d\n", count);
1331 if (count < sizeof(BITMAP16)) return 0;
1332 bmp16->bmType = dib.dsBm.bmType;
1333 bmp16->bmWidth = dib.dsBm.bmWidth;
1334 bmp16->bmHeight = dib.dsBm.bmHeight;
1335 bmp16->bmWidthBytes = dib.dsBm.bmWidthBytes;
1336 bmp16->bmPlanes = dib.dsBm.bmPlanes;
1337 bmp16->bmBitsPixel = dib.dsBm.bmBitsPixel;
1339 return sizeof(BITMAP16);
1349 /***********************************************************************
1352 COLORREF WINAPI GetPixel16( HDC16 hdc, INT16 x, INT16 y )
1354 return GetPixel( HDC_32(hdc), x, y );
1358 /***********************************************************************
1359 * GetPolyFillMode (GDI.84)
1361 INT16 WINAPI GetPolyFillMode16( HDC16 hdc )
1363 return GetPolyFillMode( HDC_32(hdc) );
1367 /***********************************************************************
1370 INT16 WINAPI GetROP216( HDC16 hdc )
1372 return GetROP2( HDC_32(hdc) );
1376 /***********************************************************************
1377 * GetRelAbs (GDI.86)
1379 INT16 WINAPI GetRelAbs16( HDC16 hdc )
1381 return GetRelAbs( HDC_32(hdc), 0 );
1385 /***********************************************************************
1386 * GetStockObject (GDI.87)
1388 HGDIOBJ16 WINAPI GetStockObject16( INT16 obj )
1390 return HGDIOBJ_16( GetStockObject( obj ) );
1394 /***********************************************************************
1395 * GetStretchBltMode (GDI.88)
1397 INT16 WINAPI GetStretchBltMode16( HDC16 hdc )
1399 return GetStretchBltMode( HDC_32(hdc) );
1403 /***********************************************************************
1404 * GetTextCharacterExtra (GDI.89)
1406 INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
1408 return GetTextCharacterExtra( HDC_32(hdc) );
1412 /***********************************************************************
1413 * GetTextColor (GDI.90)
1415 COLORREF WINAPI GetTextColor16( HDC16 hdc )
1417 return GetTextColor( HDC_32(hdc) );
1421 /***********************************************************************
1422 * GetTextExtent (GDI.91)
1424 DWORD WINAPI GetTextExtent16( HDC16 hdc, LPCSTR str, INT16 count )
1427 if (!GetTextExtentPoint32A( HDC_32(hdc), str, count, &size )) return 0;
1428 return MAKELONG( size.cx, size.cy );
1432 /***********************************************************************
1433 * GetTextFace (GDI.92)
1435 INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
1437 return GetTextFaceA( HDC_32(hdc), count, name );
1441 /***********************************************************************
1442 * GetTextMetrics (GDI.93)
1444 BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *tm )
1448 if (!GetTextMetricsW( HDC_32(hdc), &tm32 )) return FALSE;
1450 tm->tmHeight = tm32.tmHeight;
1451 tm->tmAscent = tm32.tmAscent;
1452 tm->tmDescent = tm32.tmDescent;
1453 tm->tmInternalLeading = tm32.tmInternalLeading;
1454 tm->tmExternalLeading = tm32.tmExternalLeading;
1455 tm->tmAveCharWidth = tm32.tmAveCharWidth;
1456 tm->tmMaxCharWidth = tm32.tmMaxCharWidth;
1457 tm->tmWeight = tm32.tmWeight;
1458 tm->tmOverhang = tm32.tmOverhang;
1459 tm->tmDigitizedAspectX = tm32.tmDigitizedAspectX;
1460 tm->tmDigitizedAspectY = tm32.tmDigitizedAspectY;
1461 tm->tmFirstChar = tm32.tmFirstChar;
1462 tm->tmLastChar = tm32.tmLastChar;
1463 tm->tmDefaultChar = tm32.tmDefaultChar;
1464 tm->tmBreakChar = tm32.tmBreakChar;
1465 tm->tmItalic = tm32.tmItalic;
1466 tm->tmUnderlined = tm32.tmUnderlined;
1467 tm->tmStruckOut = tm32.tmStruckOut;
1468 tm->tmPitchAndFamily = tm32.tmPitchAndFamily;
1469 tm->tmCharSet = tm32.tmCharSet;
1474 /***********************************************************************
1475 * GetViewportExt (GDI.94)
1477 DWORD WINAPI GetViewportExt16( HDC16 hdc )
1480 if (!GetViewportExtEx( HDC_32(hdc), &size )) return 0;
1481 return MAKELONG( size.cx, size.cy );
1485 /***********************************************************************
1486 * GetViewportOrg (GDI.95)
1488 DWORD WINAPI GetViewportOrg16( HDC16 hdc )
1491 if (!GetViewportOrgEx( HDC_32(hdc), &pt )) return 0;
1492 return MAKELONG( pt.x, pt.y );
1496 /***********************************************************************
1497 * GetWindowExt (GDI.96)
1499 DWORD WINAPI GetWindowExt16( HDC16 hdc )
1502 if (!GetWindowExtEx( HDC_32(hdc), &size )) return 0;
1503 return MAKELONG( size.cx, size.cy );
1507 /***********************************************************************
1508 * GetWindowOrg (GDI.97)
1510 DWORD WINAPI GetWindowOrg16( HDC16 hdc )
1513 if (!GetWindowOrgEx( HDC_32(hdc), &pt )) return 0;
1514 return MAKELONG( pt.x, pt.y );
1520 /**********************************************************************
1523 void WINAPI LineDDA16( INT16 nXStart, INT16 nYStart, INT16 nXEnd,
1524 INT16 nYEnd, LINEDDAPROC16 proc, LPARAM lParam )
1526 struct callback16_info info;
1527 info.proc = (FARPROC16)proc;
1528 info.param = lParam;
1529 LineDDA( nXStart, nYStart, nXEnd, nYEnd, linedda_callback, (LPARAM)&info );
1533 /***********************************************************************
1534 * OffsetRgn (GDI.101)
1536 INT16 WINAPI OffsetRgn16( HRGN16 hrgn, INT16 x, INT16 y )
1538 return OffsetRgn( HRGN_32(hrgn), x, y );
1542 /***********************************************************************
1543 * PtVisible (GDI.103)
1545 BOOL16 WINAPI PtVisible16( HDC16 hdc, INT16 x, INT16 y )
1547 return PtVisible( HDC_32(hdc), x, y );
1551 /***********************************************************************
1552 * SelectVisRgn (GDI.105)
1554 INT16 WINAPI SelectVisRgn16( HDC16 hdc, HRGN16 hrgn )
1556 return SelectVisRgn( HDC_32(hdc), HRGN_32(hrgn) );
1560 /***********************************************************************
1561 * SetBitmapBits (GDI.106)
1563 LONG WINAPI SetBitmapBits16( HBITMAP16 hbitmap, LONG count, LPCVOID buffer )
1565 return SetBitmapBits( HBITMAP_32(hbitmap), count, buffer );
1569 /***********************************************************************
1570 * AddFontResource (GDI.119)
1572 INT16 WINAPI AddFontResource16( LPCSTR filename )
1574 return AddFontResourceA( filename );
1578 /***********************************************************************
1581 * Disables GDI, switches back to text mode.
1582 * We don't have to do anything here,
1583 * just let console support handle everything
1585 void WINAPI Death16(HDC16 hdc)
1587 MESSAGE("Death(%04x) called. Application enters text mode...\n", hdc);
1591 /***********************************************************************
1592 * Resurrection (GDI.122)
1594 * Restores GDI functionality
1596 void WINAPI Resurrection16(HDC16 hdc,
1597 WORD w1, WORD w2, WORD w3, WORD w4, WORD w5, WORD w6)
1599 MESSAGE("Resurrection(%04x, %04x, %04x, %04x, %04x, %04x, %04x) called. Application left text mode.\n",
1600 hdc, w1, w2, w3, w4, w5, w6);
1604 /***********************************************************************
1607 INT16 WINAPI MulDiv16( INT16 nMultiplicand, INT16 nMultiplier, INT16 nDivisor)
1610 if (!nDivisor) return -32768;
1611 /* We want to deal with a positive divisor to simplify the logic. */
1614 nMultiplicand = - nMultiplicand;
1615 nDivisor = -nDivisor;
1617 /* If the result is positive, we "add" to round. else,
1618 * we subtract to round. */
1619 if ( ( (nMultiplicand < 0) && (nMultiplier < 0) ) ||
1620 ( (nMultiplicand >= 0) && (nMultiplier >= 0) ) )
1621 ret = (((int)nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
1623 ret = (((int)nMultiplicand * nMultiplier) - (nDivisor/2)) / nDivisor;
1624 if ((ret > 32767) || (ret < -32767)) return -32768;
1629 /***********************************************************************
1630 * GetRgnBox (GDI.134)
1632 INT16 WINAPI GetRgnBox16( HRGN16 hrgn, LPRECT16 rect )
1635 INT16 ret = GetRgnBox( HRGN_32(hrgn), &r );
1636 rect->left = r.left;
1638 rect->right = r.right;
1639 rect->bottom = r.bottom;
1644 /***********************************************************************
1645 * RemoveFontResource (GDI.136)
1647 BOOL16 WINAPI RemoveFontResource16( LPCSTR str )
1649 return RemoveFontResourceA(str);
1653 /***********************************************************************
1654 * SetBrushOrg (GDI.148)
1656 DWORD WINAPI SetBrushOrg16( HDC16 hdc, INT16 x, INT16 y )
1660 if (!SetBrushOrgEx( HDC_32(hdc), x, y, &pt )) return 0;
1661 return MAKELONG( pt.x, pt.y );
1665 /***********************************************************************
1666 * GetBrushOrg (GDI.149)
1668 DWORD WINAPI GetBrushOrg16( HDC16 hdc )
1671 if (!GetBrushOrgEx( HDC_32(hdc), &pt )) return 0;
1672 return MAKELONG( pt.x, pt.y );
1676 /***********************************************************************
1677 * UnrealizeObject (GDI.150)
1679 BOOL16 WINAPI UnrealizeObject16( HGDIOBJ16 obj )
1681 return UnrealizeObject( HGDIOBJ_32(obj) );
1685 /***********************************************************************
1686 * CreateIC (GDI.153)
1688 HDC16 WINAPI CreateIC16( LPCSTR driver, LPCSTR device, LPCSTR output,
1689 const DEVMODEA* initData )
1691 return HDC_16( CreateICA( driver, device, output, initData ) );
1695 /***********************************************************************
1696 * GetNearestColor (GDI.154)
1698 COLORREF WINAPI GetNearestColor16( HDC16 hdc, COLORREF color )
1700 return GetNearestColor( HDC_32(hdc), color );
1704 /***********************************************************************
1705 * CreateDiscardableBitmap (GDI.156)
1707 HBITMAP16 WINAPI CreateDiscardableBitmap16( HDC16 hdc, INT16 width, INT16 height )
1709 return HBITMAP_16( CreateDiscardableBitmap( HDC_32(hdc), width, height ) );
1713 /***********************************************************************
1714 * PtInRegion (GDI.161)
1716 BOOL16 WINAPI PtInRegion16( HRGN16 hrgn, INT16 x, INT16 y )
1718 return PtInRegion( HRGN_32(hrgn), x, y );
1722 /***********************************************************************
1723 * GetBitmapDimension (GDI.162)
1725 DWORD WINAPI GetBitmapDimension16( HBITMAP16 hbitmap )
1728 if (!GetBitmapDimensionEx16( hbitmap, &size )) return 0;
1729 return MAKELONG( size.cx, size.cy );
1733 /***********************************************************************
1734 * SetBitmapDimension (GDI.163)
1736 DWORD WINAPI SetBitmapDimension16( HBITMAP16 hbitmap, INT16 x, INT16 y )
1739 if (!SetBitmapDimensionEx16( hbitmap, x, y, &size )) return 0;
1740 return MAKELONG( size.cx, size.cy );
1744 /***********************************************************************
1745 * SetRectRgn (GDI.172)
1747 * NOTE: Win 3.1 sets region to empty if left > right
1749 void WINAPI SetRectRgn16( HRGN16 hrgn, INT16 left, INT16 top, INT16 right, INT16 bottom )
1751 if (left < right) SetRectRgn( HRGN_32(hrgn), left, top, right, bottom );
1752 else SetRectRgn( HRGN_32(hrgn), 0, 0, 0, 0 );
1756 /******************************************************************
1757 * PlayMetaFileRecord (GDI.176)
1759 void WINAPI PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr, UINT16 handles )
1761 HANDLETABLE *ht32 = HeapAlloc( GetProcessHeap(), 0, handles * sizeof(*ht32) );
1764 for (i = 0; i < handles; i++) ht32->objectHandle[i] = HGDIOBJ_32(ht->objectHandle[i]);
1765 PlayMetaFileRecord( HDC_32(hdc), ht32, mr, handles );
1766 for (i = 0; i < handles; i++) ht->objectHandle[i] = HGDIOBJ_16(ht32->objectHandle[i]);
1767 HeapFree( GetProcessHeap(), 0, ht32 );
1771 /***********************************************************************
1772 * SetHookFlags (GDI.192)
1774 WORD WINAPI SetHookFlags16( HDC16 hdc, WORD flags )
1776 return SetHookFlags( HDC_32(hdc), flags );
1780 /***********************************************************************
1781 * SetBoundsRect (GDI.193)
1783 UINT16 WINAPI SetBoundsRect16( HDC16 hdc, const RECT16* rect, UINT16 flags )
1788 rect32.left = rect->left;
1789 rect32.top = rect->top;
1790 rect32.right = rect->right;
1791 rect32.bottom = rect->bottom;
1792 return SetBoundsRect( HDC_32( hdc ), &rect32, flags );
1794 else return SetBoundsRect( HDC_32( hdc ), NULL, flags );
1798 /***********************************************************************
1799 * GetBoundsRect (GDI.194)
1801 UINT16 WINAPI GetBoundsRect16( HDC16 hdc, LPRECT16 rect, UINT16 flags)
1804 UINT ret = GetBoundsRect( HDC_32( hdc ), &rect32, flags );
1807 rect->left = rect32.left;
1808 rect->top = rect32.top;
1809 rect->right = rect32.right;
1810 rect->bottom = rect32.bottom;
1816 /***********************************************************************
1817 * EngineEnumerateFont (GDI.300)
1819 WORD WINAPI EngineEnumerateFont16(LPSTR fontname, FARPROC16 proc, DWORD data )
1821 FIXME("(%s,%p,%x),stub\n",fontname,proc,data);
1826 /***********************************************************************
1827 * EngineDeleteFont (GDI.301)
1829 WORD WINAPI EngineDeleteFont16(LPFONTINFO16 lpFontInfo)
1833 /* untested, don't know if it works.
1834 We seem to access some structure that is located after the
1835 FONTINFO. The FONTINFO documentation says that there may
1836 follow some char-width table or font bitmap or vector info.
1837 I think it is some kind of font bitmap that begins at offset 0x52,
1838 as FONTINFO goes up to 0x51.
1839 If this is correct, everything should be implemented correctly.
1841 if ( ((lpFontInfo->dfType & (RASTER_FONTTYPE|DEVICE_FONTTYPE)) == (RASTER_FONTTYPE|DEVICE_FONTTYPE))
1842 && (LOWORD(lpFontInfo->dfFace) == LOWORD(lpFontInfo)+0x6e)
1843 && (handle = *(WORD *)(lpFontInfo+0x54)) )
1845 *(WORD *)(lpFontInfo+0x54) = 0;
1846 GlobalFree16(handle);
1852 /***********************************************************************
1853 * EngineRealizeFont (GDI.302)
1855 WORD WINAPI EngineRealizeFont16(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo)
1857 FIXME("(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo);
1863 /***********************************************************************
1864 * EngineRealizeFontExt (GDI.315)
1866 WORD WINAPI EngineRealizeFontExt16(LONG l1, LONG l2, LONG l3, LONG l4)
1868 FIXME("(%08x,%08x,%08x,%08x),stub\n",l1,l2,l3,l4);
1874 /***********************************************************************
1875 * EngineGetCharWidth (GDI.303)
1877 WORD WINAPI EngineGetCharWidth16(LPFONTINFO16 lpFontInfo, BYTE firstChar, BYTE lastChar, LPINT16 buffer)
1881 for (i = firstChar; i <= lastChar; i++)
1882 FIXME(" returns font's average width for range %d to %d\n", firstChar, lastChar);
1883 *buffer++ = lpFontInfo->dfAvgWidth; /* insert some charwidth functionality here; use average width for now */
1888 /***********************************************************************
1889 * EngineSetFontContext (GDI.304)
1891 WORD WINAPI EngineSetFontContext16(LPFONTINFO16 lpFontInfo, WORD data)
1897 /***********************************************************************
1898 * EngineGetGlyphBMP (GDI.305)
1900 WORD WINAPI EngineGetGlyphBMP16(WORD word, LPFONTINFO16 lpFontInfo, WORD w1, WORD w2,
1901 LPSTR string, DWORD dword, /*LPBITMAPMETRICS16*/ LPVOID metrics)
1908 /***********************************************************************
1909 * EngineMakeFontDir (GDI.306)
1911 DWORD WINAPI EngineMakeFontDir16(HDC16 hdc, LPFONTDIR16 fontdir, LPCSTR string)
1913 FIXME(" stub! (always fails)\n");
1914 return ~0UL; /* error */
1918 /***********************************************************************
1919 * GetCharABCWidths (GDI.307)
1921 BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar, LPABC16 abc )
1925 LPABC abc32 = HeapAlloc( GetProcessHeap(), 0, sizeof(ABC) * (lastChar - firstChar + 1) );
1927 if ((ret = GetCharABCWidthsA( HDC_32(hdc), firstChar, lastChar, abc32 )))
1929 for (i = firstChar; i <= lastChar; i++)
1931 abc[i-firstChar].abcA = abc32[i-firstChar].abcA;
1932 abc[i-firstChar].abcB = abc32[i-firstChar].abcB;
1933 abc[i-firstChar].abcC = abc32[i-firstChar].abcC;
1936 HeapFree( GetProcessHeap(), 0, abc32 );
1941 /***********************************************************************
1942 * GetOutlineTextMetrics (GDI.308)
1944 * Gets metrics for TrueType fonts.
1947 * hdc [In] Handle of device context
1948 * cbData [In] Size of metric data array
1949 * lpOTM [Out] Address of metric data array
1952 * Success: Non-zero or size of required buffer
1956 * lpOTM should be LPOUTLINETEXTMETRIC
1958 UINT16 WINAPI GetOutlineTextMetrics16( HDC16 hdc, UINT16 cbData,
1959 LPOUTLINETEXTMETRIC16 lpOTM )
1961 FIXME("(%04x,%04x,%p): stub\n", hdc,cbData,lpOTM);
1966 /***********************************************************************
1967 * GetGlyphOutline (GDI.309)
1969 DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
1970 LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
1971 LPVOID lpBuffer, const MAT2 *lpmat2 )
1976 ret = GetGlyphOutlineA( HDC_32(hdc), uChar, fuFormat, &gm32, cbBuffer, lpBuffer, lpmat2);
1977 if (ret && ret != GDI_ERROR)
1979 lpgm->gmBlackBoxX = gm32.gmBlackBoxX;
1980 lpgm->gmBlackBoxY = gm32.gmBlackBoxY;
1981 lpgm->gmptGlyphOrigin.x = gm32.gmptGlyphOrigin.x;
1982 lpgm->gmptGlyphOrigin.y = gm32.gmptGlyphOrigin.y;
1983 lpgm->gmCellIncX = gm32.gmCellIncX;
1984 lpgm->gmCellIncY = gm32.gmCellIncY;
1990 /***********************************************************************
1991 * CreateScalableFontResource (GDI.310)
1993 BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden, LPCSTR lpszResourceFile,
1994 LPCSTR fontFile, LPCSTR path )
1996 return CreateScalableFontResourceA( fHidden, lpszResourceFile, fontFile, path );
2000 /*************************************************************************
2001 * GetFontData (GDI.311)
2004 DWORD WINAPI GetFontData16( HDC16 hdc, DWORD table, DWORD offset, LPVOID buffer, DWORD count )
2006 return GetFontData( HDC_32(hdc), table, offset, buffer, count );
2010 /*************************************************************************
2011 * GetRasterizerCaps (GDI.313)
2013 BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes )
2015 return GetRasterizerCaps( lprs, cbNumBytes );
2019 /***********************************************************************
2020 * EnumFontFamilies (GDI.330)
2022 INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily,
2023 FONTENUMPROC16 efproc, LPARAM lpData )
2029 if (!*lpFamily) return 1;
2030 lstrcpynA( lf.lfFaceName, lpFamily, LF_FACESIZE );
2031 lf.lfCharSet = DEFAULT_CHARSET;
2032 lf.lfPitchAndFamily = 0;
2037 return EnumFontFamiliesEx16( hDC, plf, efproc, lpData, 0 );
2041 /*************************************************************************
2042 * GetKerningPairs (GDI.332)
2045 INT16 WINAPI GetKerningPairs16( HDC16 hdc, INT16 count, LPKERNINGPAIR16 pairs )
2047 KERNINGPAIR *pairs32;
2050 if (!count) return 0;
2052 if (!(pairs32 = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*pairs32) ))) return 0;
2053 if ((ret = GetKerningPairsA( HDC_32(hdc), count, pairs32 )))
2055 for (i = 0; i < ret; i++)
2057 pairs->wFirst = pairs32->wFirst;
2058 pairs->wSecond = pairs32->wSecond;
2059 pairs->iKernAmount = pairs32->iKernAmount;
2062 HeapFree( GetProcessHeap(), 0, pairs32 );
2068 /***********************************************************************
2069 * GetTextAlign (GDI.345)
2071 UINT16 WINAPI GetTextAlign16( HDC16 hdc )
2073 return GetTextAlign( HDC_32(hdc) );
2077 /***********************************************************************
2078 * SetTextAlign (GDI.346)
2080 UINT16 WINAPI SetTextAlign16( HDC16 hdc, UINT16 align )
2082 return SetTextAlign( HDC_32(hdc), align );
2086 /***********************************************************************
2089 BOOL16 WINAPI Chord16( HDC16 hdc, INT16 left, INT16 top,
2090 INT16 right, INT16 bottom, INT16 xstart, INT16 ystart,
2091 INT16 xend, INT16 yend )
2093 return Chord( HDC_32(hdc), left, top, right, bottom, xstart, ystart, xend, yend );
2097 /***********************************************************************
2098 * SetMapperFlags (GDI.349)
2100 DWORD WINAPI SetMapperFlags16( HDC16 hdc, DWORD flags )
2102 return SetMapperFlags( HDC_32(hdc), flags );
2106 /***********************************************************************
2107 * GetCharWidth (GDI.350)
2109 BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar, LPINT16 buffer )
2111 BOOL retVal = FALSE;
2113 if( firstChar != lastChar )
2115 LPINT buf32 = HeapAlloc(GetProcessHeap(), 0, sizeof(INT)*(1 + (lastChar - firstChar)));
2118 LPINT obuf32 = buf32;
2121 retVal = GetCharWidth32A( HDC_32(hdc), firstChar, lastChar, buf32);
2124 for (i = firstChar; i <= lastChar; i++) *buffer++ = *buf32++;
2126 HeapFree(GetProcessHeap(), 0, obuf32);
2129 else /* happens quite often to warrant a special treatment */
2132 retVal = GetCharWidth32A( HDC_32(hdc), firstChar, lastChar, &chWidth );
2139 /***********************************************************************
2140 * ExtTextOut (GDI.351)
2142 BOOL16 WINAPI ExtTextOut16( HDC16 hdc, INT16 x, INT16 y, UINT16 flags,
2143 const RECT16 *lprect, LPCSTR str, UINT16 count,
2149 LPINT lpdx32 = NULL;
2152 lpdx32 = HeapAlloc( GetProcessHeap(),0, sizeof(INT)*count );
2153 if(lpdx32 == NULL) return FALSE;
2154 for (i=count;i--;) lpdx32[i]=lpDx[i];
2158 rect32.left = lprect->left;
2159 rect32.top = lprect->top;
2160 rect32.right = lprect->right;
2161 rect32.bottom = lprect->bottom;
2163 ret = ExtTextOutA(HDC_32(hdc),x,y,flags,lprect?&rect32:NULL,str,count,lpdx32);
2164 HeapFree( GetProcessHeap(), 0, lpdx32 );
2169 /***********************************************************************
2170 * CreatePalette (GDI.360)
2172 HPALETTE16 WINAPI CreatePalette16( const LOGPALETTE* palette )
2174 return HPALETTE_16( CreatePalette( palette ) );
2178 /***********************************************************************
2179 * GDISelectPalette (GDI.361)
2181 HPALETTE16 WINAPI GDISelectPalette16( HDC16 hdc, HPALETTE16 hpalette, WORD wBkg )
2183 return HPALETTE_16( GDISelectPalette( HDC_32(hdc), HPALETTE_32(hpalette), wBkg ));
2187 /***********************************************************************
2188 * GDIRealizePalette (GDI.362)
2190 UINT16 WINAPI GDIRealizePalette16( HDC16 hdc )
2192 return GDIRealizePalette( HDC_32(hdc) );
2196 /***********************************************************************
2197 * GetPaletteEntries (GDI.363)
2199 UINT16 WINAPI GetPaletteEntries16( HPALETTE16 hpalette, UINT16 start,
2200 UINT16 count, LPPALETTEENTRY entries )
2202 return GetPaletteEntries( HPALETTE_32(hpalette), start, count, entries );
2206 /***********************************************************************
2207 * SetPaletteEntries (GDI.364)
2209 UINT16 WINAPI SetPaletteEntries16( HPALETTE16 hpalette, UINT16 start,
2210 UINT16 count, const PALETTEENTRY *entries )
2212 return SetPaletteEntries( HPALETTE_32(hpalette), start, count, entries );
2216 /**********************************************************************
2217 * UpdateColors (GDI.366)
2219 INT16 WINAPI UpdateColors16( HDC16 hdc )
2221 UpdateColors( HDC_32(hdc) );
2226 /***********************************************************************
2227 * AnimatePalette (GDI.367)
2229 void WINAPI AnimatePalette16( HPALETTE16 hpalette, UINT16 StartIndex,
2230 UINT16 NumEntries, const PALETTEENTRY* PaletteColors)
2232 AnimatePalette( HPALETTE_32(hpalette), StartIndex, NumEntries, PaletteColors );
2236 /***********************************************************************
2237 * ResizePalette (GDI.368)
2239 BOOL16 WINAPI ResizePalette16( HPALETTE16 hpalette, UINT16 cEntries )
2241 return ResizePalette( HPALETTE_32(hpalette), cEntries );
2245 /***********************************************************************
2246 * GetNearestPaletteIndex (GDI.370)
2248 UINT16 WINAPI GetNearestPaletteIndex16( HPALETTE16 hpalette, COLORREF color )
2250 return GetNearestPaletteIndex( HPALETTE_32(hpalette), color );
2254 /**********************************************************************
2255 * ExtFloodFill (GDI.372)
2257 BOOL16 WINAPI ExtFloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color,
2260 return ExtFloodFill( HDC_32(hdc), x, y, color, fillType );
2264 /***********************************************************************
2265 * SetSystemPaletteUse (GDI.373)
2267 UINT16 WINAPI SetSystemPaletteUse16( HDC16 hdc, UINT16 use )
2269 return SetSystemPaletteUse( HDC_32(hdc), use );
2273 /***********************************************************************
2274 * GetSystemPaletteUse (GDI.374)
2276 UINT16 WINAPI GetSystemPaletteUse16( HDC16 hdc )
2278 return GetSystemPaletteUse( HDC_32(hdc) );
2282 /***********************************************************************
2283 * GetSystemPaletteEntries (GDI.375)
2285 UINT16 WINAPI GetSystemPaletteEntries16( HDC16 hdc, UINT16 start, UINT16 count,
2286 LPPALETTEENTRY entries )
2288 return GetSystemPaletteEntries( HDC_32(hdc), start, count, entries );
2292 /***********************************************************************
2295 HDC16 WINAPI ResetDC16( HDC16 hdc, const DEVMODEA *devmode )
2297 return HDC_16( ResetDCA(HDC_32(hdc), devmode) );
2301 /******************************************************************
2302 * StartDoc (GDI.377)
2304 INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc )
2308 docA.cbSize = lpdoc->cbSize;
2309 docA.lpszDocName = MapSL(lpdoc->lpszDocName);
2310 docA.lpszOutput = MapSL(lpdoc->lpszOutput);
2311 if(lpdoc->cbSize > offsetof(DOCINFO16,lpszDatatype))
2312 docA.lpszDatatype = MapSL(lpdoc->lpszDatatype);
2314 docA.lpszDatatype = NULL;
2315 if(lpdoc->cbSize > offsetof(DOCINFO16,fwType))
2316 docA.fwType = lpdoc->fwType;
2319 return StartDocA( HDC_32(hdc), &docA );
2323 /******************************************************************
2326 INT16 WINAPI EndDoc16( HDC16 hdc )
2328 return EndDoc( HDC_32(hdc) );
2332 /******************************************************************
2333 * StartPage (GDI.379)
2335 INT16 WINAPI StartPage16( HDC16 hdc )
2337 return StartPage( HDC_32(hdc) );
2341 /******************************************************************
2344 INT16 WINAPI EndPage16( HDC16 hdc )
2346 return EndPage( HDC_32(hdc) );
2350 /******************************************************************************
2351 * AbortDoc (GDI.382)
2353 INT16 WINAPI AbortDoc16( HDC16 hdc )
2355 return AbortDoc( HDC_32(hdc) );
2359 /***********************************************************************
2360 * FastWindowFrame (GDI.400)
2362 BOOL16 WINAPI FastWindowFrame16( HDC16 hdc, const RECT16 *rect,
2363 INT16 width, INT16 height, DWORD rop )
2365 HDC hdc32 = HDC_32(hdc);
2366 HBRUSH hbrush = SelectObject( hdc32, GetStockObject( GRAY_BRUSH ) );
2367 PatBlt( hdc32, rect->left, rect->top,
2368 rect->right - rect->left - width, height, rop );
2369 PatBlt( hdc32, rect->left, rect->top + height, width,
2370 rect->bottom - rect->top - height, rop );
2371 PatBlt( hdc32, rect->left + width, rect->bottom - 1,
2372 rect->right - rect->left - width, -height, rop );
2373 PatBlt( hdc32, rect->right - 1, rect->top, -width,
2374 rect->bottom - rect->top - height, rop );
2375 SelectObject( hdc32, hbrush );
2380 /***********************************************************************
2381 * GdiInit2 (GDI.403)
2383 * See "Undocumented Windows"
2387 * h2 [I] global data
2389 HANDLE16 WINAPI GdiInit216( HANDLE16 h1, HANDLE16 h2 )
2391 FIXME("(%04x, %04x), stub.\n", h1, h2);
2392 if (h2 == 0xffff) return 0xffff; /* undefined return value */
2393 return h1; /* FIXME: should be the memory handle of h1 */
2397 /***********************************************************************
2398 * FinalGdiInit (GDI.405)
2400 void WINAPI FinalGdiInit16( HBRUSH16 hPattern /* [in] fill pattern of desktop */ )
2405 /***********************************************************************
2406 * CreateUserBitmap (GDI.407)
2408 HBITMAP16 WINAPI CreateUserBitmap16( INT16 width, INT16 height, UINT16 planes,
2409 UINT16 bpp, LPCVOID bits )
2411 return CreateBitmap16( width, height, planes, bpp, bits );
2415 /***********************************************************************
2416 * CreateUserDiscardableBitmap (GDI.409)
2418 HBITMAP16 WINAPI CreateUserDiscardableBitmap16( WORD dummy, INT16 width, INT16 height )
2420 HDC hdc = CreateDCA( "DISPLAY", NULL, NULL, NULL );
2421 HBITMAP ret = CreateCompatibleBitmap( hdc, width, height );
2423 return HBITMAP_16(ret);
2427 /***********************************************************************
2428 * GetCurLogFont (GDI.411)
2430 HFONT16 WINAPI GetCurLogFont16( HDC16 hdc )
2432 return HFONT_16( GetCurrentObject( HDC_32(hdc), OBJ_FONT ) );
2436 /***********************************************************************
2437 * StretchDIBits (GDI.439)
2439 INT16 WINAPI StretchDIBits16( HDC16 hdc, INT16 xDst, INT16 yDst, INT16 widthDst,
2440 INT16 heightDst, INT16 xSrc, INT16 ySrc, INT16 widthSrc,
2441 INT16 heightSrc, const VOID *bits,
2442 const BITMAPINFO *info, UINT16 wUsage, DWORD dwRop )
2444 return StretchDIBits( HDC_32(hdc), xDst, yDst, widthDst, heightDst,
2445 xSrc, ySrc, widthSrc, heightSrc, bits,
2446 info, wUsage, dwRop );
2450 /***********************************************************************
2451 * SetDIBits (GDI.440)
2453 INT16 WINAPI SetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
2454 UINT16 lines, LPCVOID bits, const BITMAPINFO *info,
2457 return SetDIBits( HDC_32(hdc), HBITMAP_32(hbitmap), startscan, lines, bits, info, coloruse );
2461 /***********************************************************************
2462 * GetDIBits (GDI.441)
2464 INT16 WINAPI GetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
2465 UINT16 lines, LPVOID bits, BITMAPINFO * info,
2468 return GetDIBits( HDC_32(hdc), HBITMAP_32(hbitmap), startscan, lines, bits, info, coloruse );
2472 /***********************************************************************
2473 * CreateDIBitmap (GDI.442)
2475 HBITMAP16 WINAPI CreateDIBitmap16( HDC16 hdc, const BITMAPINFOHEADER * header,
2476 DWORD init, LPCVOID bits, const BITMAPINFO * data,
2479 return HBITMAP_16( CreateDIBitmap( HDC_32(hdc), header, init, bits, data, coloruse ) );
2483 /***********************************************************************
2484 * SetDIBitsToDevice (GDI.443)
2486 INT16 WINAPI SetDIBitsToDevice16( HDC16 hdc, INT16 xDest, INT16 yDest, INT16 cx,
2487 INT16 cy, INT16 xSrc, INT16 ySrc, UINT16 startscan,
2488 UINT16 lines, LPCVOID bits, const BITMAPINFO *info,
2491 return SetDIBitsToDevice( HDC_32(hdc), xDest, yDest, cx, cy, xSrc, ySrc,
2492 startscan, lines, bits, info, coloruse );
2496 /***********************************************************************
2497 * CreateRoundRectRgn (GDI.444)
2499 * If either ellipse dimension is zero we call CreateRectRgn16 for its
2500 * `special' behaviour. -ve ellipse dimensions can result in GPFs under win3.1
2501 * we just let CreateRoundRectRgn convert them to +ve values.
2504 HRGN16 WINAPI CreateRoundRectRgn16( INT16 left, INT16 top, INT16 right, INT16 bottom,
2505 INT16 ellipse_width, INT16 ellipse_height )
2507 if( ellipse_width == 0 || ellipse_height == 0 )
2508 return CreateRectRgn16( left, top, right, bottom );
2510 return HRGN_16( CreateRoundRectRgn( left, top, right, bottom,
2511 ellipse_width, ellipse_height ));
2515 /***********************************************************************
2516 * CreateDIBPatternBrush (GDI.445)
2518 HBRUSH16 WINAPI CreateDIBPatternBrush16( HGLOBAL16 hbitmap, UINT16 coloruse )
2523 if (!(bmi = GlobalLock16( hbitmap ))) return 0;
2524 ret = HBRUSH_16( CreateDIBPatternBrushPt( bmi, coloruse ));
2525 GlobalUnlock16( hbitmap );
2530 /**********************************************************************
2531 * PolyPolygon (GDI.450)
2533 BOOL16 WINAPI PolyPolygon16( HDC16 hdc, const POINT16* pt, const INT16* counts,
2542 for (i=polygons;i--;)
2544 pt32 = HeapAlloc( GetProcessHeap(), 0, sizeof(POINT)*nrpts);
2545 if(pt32 == NULL) return FALSE;
2548 pt32[i].x = pt[i].x;
2549 pt32[i].y = pt[i].y;
2551 counts32 = HeapAlloc( GetProcessHeap(), 0, polygons*sizeof(INT) );
2552 if(counts32 == NULL) {
2553 HeapFree( GetProcessHeap(), 0, pt32 );
2556 for (i=polygons;i--;) counts32[i]=counts[i];
2558 ret = PolyPolygon(HDC_32(hdc),pt32,counts32,polygons);
2559 HeapFree( GetProcessHeap(), 0, counts32 );
2560 HeapFree( GetProcessHeap(), 0, pt32 );
2565 /***********************************************************************
2566 * CreatePolyPolygonRgn (GDI.451)
2568 HRGN16 WINAPI CreatePolyPolygonRgn16( const POINT16 *points,
2569 const INT16 *count, INT16 nbpolygons, INT16 mode )
2576 for (i = 0; i < nbpolygons; i++) npts += count[i];
2577 points32 = HeapAlloc( GetProcessHeap(), 0, npts * sizeof(POINT) );
2578 for (i = 0; i < npts; i++)
2580 points32[i].x = points[i].x;
2581 points32[i].y = points[i].y;
2584 count32 = HeapAlloc( GetProcessHeap(), 0, nbpolygons * sizeof(INT) );
2585 for (i = 0; i < nbpolygons; i++) count32[i] = count[i];
2586 hrgn = CreatePolyPolygonRgn( points32, count32, nbpolygons, mode );
2587 HeapFree( GetProcessHeap(), 0, count32 );
2588 HeapFree( GetProcessHeap(), 0, points32 );
2589 return HRGN_16(hrgn);
2593 /***********************************************************************
2594 * GdiSeeGdiDo (GDI.452)
2596 DWORD WINAPI GdiSeeGdiDo16( WORD wReqType, WORD wParam1, WORD wParam2,
2603 case 0x0001: /* LocalAlloc */
2604 WARN("LocalAlloc16(%x, %x): ignoring\n", wParam1, wParam3);
2607 case 0x0002: /* LocalFree */
2608 WARN("LocalFree16(%x): ignoring\n", wParam1);
2611 case 0x0003: /* LocalCompact */
2612 WARN("LocalCompact16(%x): ignoring\n", wParam3);
2613 ret = 65000; /* lie about the amount of free space */
2615 case 0x0103: /* LocalHeap */
2616 WARN("LocalHeap16(): ignoring\n");
2619 WARN("(wReqType=%04x): Unknown\n", wReqType);
2626 /***********************************************************************
2627 * SetObjectOwner (GDI.461)
2629 void WINAPI SetObjectOwner16( HGDIOBJ16 handle, HANDLE16 owner )
2635 /***********************************************************************
2636 * IsGDIObject (GDI.462)
2638 * returns type of object if valid (W95 system programming secrets p. 264-5)
2640 BOOL16 WINAPI IsGDIObject16( HGDIOBJ16 handle16 )
2642 static const BYTE type_map[] =
2653 10, /* OBJ_METAFILE */
2656 9, /* OBJ_ENHMETADC */
2657 12, /* OBJ_ENHMETAFILE */
2658 0 /* OBJ_COLORSPACE */
2661 UINT type = GetObjectType( HGDIOBJ_32( handle16 ));
2663 if (type >= sizeof(type_map)/sizeof(type_map[0])) return 0;
2664 return type_map[type];
2668 /***********************************************************************
2669 * RectVisible (GDI.465)
2670 * RectVisibleOld (GDI.104)
2672 BOOL16 WINAPI RectVisible16( HDC16 hdc, const RECT16* rect16 )
2676 rect.left = rect16->left;
2677 rect.top = rect16->top;
2678 rect.right = rect16->right;
2679 rect.bottom = rect16->bottom;
2680 return RectVisible( HDC_32(hdc), &rect );
2684 /***********************************************************************
2685 * RectInRegion (GDI.466)
2686 * RectInRegionOld (GDI.181)
2688 BOOL16 WINAPI RectInRegion16( HRGN16 hrgn, const RECT16 *rect )
2692 r32.left = rect->left;
2693 r32.top = rect->top;
2694 r32.right = rect->right;
2695 r32.bottom = rect->bottom;
2696 return RectInRegion( HRGN_32(hrgn), &r32 );
2700 /***********************************************************************
2701 * GetBitmapDimensionEx (GDI.468)
2703 BOOL16 WINAPI GetBitmapDimensionEx16( HBITMAP16 hbitmap, LPSIZE16 size )
2706 BOOL ret = GetBitmapDimensionEx( HBITMAP_32(hbitmap), &size32 );
2710 size->cx = size32.cx;
2711 size->cy = size32.cy;
2717 /***********************************************************************
2718 * GetBrushOrgEx (GDI.469)
2720 BOOL16 WINAPI GetBrushOrgEx16( HDC16 hdc, LPPOINT16 pt )
2723 if (!GetBrushOrgEx( HDC_32(hdc), &pt32 )) return FALSE;
2730 /***********************************************************************
2731 * GetCurrentPositionEx (GDI.470)
2733 BOOL16 WINAPI GetCurrentPositionEx16( HDC16 hdc, LPPOINT16 pt )
2736 if (!GetCurrentPositionEx( HDC_32(hdc), &pt32 )) return FALSE;
2743 /***********************************************************************
2744 * GetTextExtentPoint (GDI.471)
2746 * FIXME: Should this have a bug for compatibility?
2747 * Original Windows versions of GetTextExtentPoint{A,W} have documented
2748 * bugs (-> MSDN KB q147647.txt).
2750 BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count, LPSIZE16 size )
2753 BOOL ret = GetTextExtentPoint32A( HDC_32(hdc), str, count, &size32 );
2757 size->cx = size32.cx;
2758 size->cy = size32.cy;
2764 /***********************************************************************
2765 * GetViewportExtEx (GDI.472)
2767 BOOL16 WINAPI GetViewportExtEx16( HDC16 hdc, LPSIZE16 size )
2770 if (!GetViewportExtEx( HDC_32(hdc), &size32 )) return FALSE;
2771 size->cx = size32.cx;
2772 size->cy = size32.cy;
2777 /***********************************************************************
2778 * GetViewportOrgEx (GDI.473)
2780 BOOL16 WINAPI GetViewportOrgEx16( HDC16 hdc, LPPOINT16 pt )
2783 if (!GetViewportOrgEx( HDC_32(hdc), &pt32 )) return FALSE;
2790 /***********************************************************************
2791 * GetWindowExtEx (GDI.474)
2793 BOOL16 WINAPI GetWindowExtEx16( HDC16 hdc, LPSIZE16 size )
2796 if (!GetWindowExtEx( HDC_32(hdc), &size32 )) return FALSE;
2797 size->cx = size32.cx;
2798 size->cy = size32.cy;
2803 /***********************************************************************
2804 * GetWindowOrgEx (GDI.475)
2806 BOOL16 WINAPI GetWindowOrgEx16( HDC16 hdc, LPPOINT16 pt )
2809 if (!GetWindowOrgEx( HDC_32(hdc), &pt32 )) return FALSE;
2816 /***********************************************************************
2817 * OffsetViewportOrgEx (GDI.476)
2819 BOOL16 WINAPI OffsetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt)
2822 BOOL16 ret = OffsetViewportOrgEx( HDC_32(hdc), x, y, &pt32 );
2832 /***********************************************************************
2833 * OffsetWindowOrgEx (GDI.477)
2835 BOOL16 WINAPI OffsetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2838 BOOL16 ret = OffsetWindowOrgEx( HDC_32(hdc), x, y, &pt32 );
2848 /***********************************************************************
2849 * SetBitmapDimensionEx (GDI.478)
2851 BOOL16 WINAPI SetBitmapDimensionEx16( HBITMAP16 hbitmap, INT16 x, INT16 y, LPSIZE16 prevSize )
2854 BOOL ret = SetBitmapDimensionEx( HBITMAP_32(hbitmap), x, y, &size32 );
2856 if (ret && prevSize)
2858 prevSize->cx = size32.cx;
2859 prevSize->cy = size32.cy;
2865 /***********************************************************************
2866 * SetViewportExtEx (GDI.479)
2868 BOOL16 WINAPI SetViewportExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
2871 BOOL16 ret = SetViewportExtEx( HDC_32(hdc), x, y, &size32 );
2872 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2877 /***********************************************************************
2878 * SetViewportOrgEx (GDI.480)
2880 BOOL16 WINAPI SetViewportOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2883 BOOL16 ret = SetViewportOrgEx( HDC_32(hdc), x, y, &pt32 );
2893 /***********************************************************************
2894 * SetWindowExtEx (GDI.481)
2896 BOOL16 WINAPI SetWindowExtEx16( HDC16 hdc, INT16 x, INT16 y, LPSIZE16 size )
2899 BOOL16 ret = SetWindowExtEx( HDC_32(hdc), x, y, &size32 );
2900 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2905 /***********************************************************************
2906 * SetWindowOrgEx (GDI.482)
2908 BOOL16 WINAPI SetWindowOrgEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2911 BOOL16 ret = SetWindowOrgEx( HDC_32(hdc), x, y, &pt32 );
2921 /***********************************************************************
2922 * MoveToEx (GDI.483)
2924 BOOL16 WINAPI MoveToEx16( HDC16 hdc, INT16 x, INT16 y, LPPOINT16 pt )
2928 if (!MoveToEx( HDC_32(hdc), x, y, &pt32 )) return FALSE;
2938 /***********************************************************************
2939 * ScaleViewportExtEx (GDI.484)
2941 BOOL16 WINAPI ScaleViewportExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
2942 INT16 yNum, INT16 yDenom, LPSIZE16 size )
2945 BOOL16 ret = ScaleViewportExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom,
2947 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2952 /***********************************************************************
2953 * ScaleWindowExtEx (GDI.485)
2955 BOOL16 WINAPI ScaleWindowExtEx16( HDC16 hdc, INT16 xNum, INT16 xDenom,
2956 INT16 yNum, INT16 yDenom, LPSIZE16 size )
2959 BOOL16 ret = ScaleWindowExtEx( HDC_32(hdc), xNum, xDenom, yNum, yDenom,
2961 if (size) { size->cx = size32.cx; size->cy = size32.cy; }
2966 /***********************************************************************
2967 * GetAspectRatioFilterEx (GDI.486)
2969 BOOL16 WINAPI GetAspectRatioFilterEx16( HDC16 hdc, LPSIZE16 pAspectRatio )
2971 FIXME("(%04x, %p): -- Empty Stub !\n", hdc, pAspectRatio);
2976 /******************************************************************************
2977 * PolyBezier (GDI.502)
2979 BOOL16 WINAPI PolyBezier16( HDC16 hdc, const POINT16* lppt, INT16 cPoints )
2983 LPPOINT pt32 = HeapAlloc( GetProcessHeap(), 0, cPoints*sizeof(POINT) );
2984 if(!pt32) return FALSE;
2985 for (i=cPoints;i--;)
2987 pt32[i].x = lppt[i].x;
2988 pt32[i].y = lppt[i].y;
2990 ret= PolyBezier(HDC_32(hdc), pt32, cPoints);
2991 HeapFree( GetProcessHeap(), 0, pt32 );
2996 /******************************************************************************
2997 * PolyBezierTo (GDI.503)
2999 BOOL16 WINAPI PolyBezierTo16( HDC16 hdc, const POINT16* lppt, INT16 cPoints )
3003 LPPOINT pt32 = HeapAlloc( GetProcessHeap(), 0,
3004 cPoints*sizeof(POINT) );
3005 if(!pt32) return FALSE;
3006 for (i=cPoints;i--;)
3008 pt32[i].x = lppt[i].x;
3009 pt32[i].y = lppt[i].y;
3011 ret= PolyBezierTo(HDC_32(hdc), pt32, cPoints);
3012 HeapFree( GetProcessHeap(), 0, pt32 );
3017 /******************************************************************************
3018 * ExtSelectClipRgn (GDI.508)
3020 INT16 WINAPI ExtSelectClipRgn16( HDC16 hdc, HRGN16 hrgn, INT16 fnMode )
3022 return ExtSelectClipRgn( HDC_32(hdc), HRGN_32(hrgn), fnMode);
3026 /***********************************************************************
3027 * AbortPath (GDI.511)
3029 BOOL16 WINAPI AbortPath16(HDC16 hdc)
3031 return AbortPath( HDC_32(hdc) );
3035 /***********************************************************************
3036 * BeginPath (GDI.512)
3038 BOOL16 WINAPI BeginPath16(HDC16 hdc)
3040 return BeginPath( HDC_32(hdc) );
3044 /***********************************************************************
3045 * CloseFigure (GDI.513)
3047 BOOL16 WINAPI CloseFigure16(HDC16 hdc)
3049 return CloseFigure( HDC_32(hdc) );
3053 /***********************************************************************
3056 BOOL16 WINAPI EndPath16(HDC16 hdc)
3058 return EndPath( HDC_32(hdc) );
3062 /***********************************************************************
3063 * FillPath (GDI.515)
3065 BOOL16 WINAPI FillPath16(HDC16 hdc)
3067 return FillPath( HDC_32(hdc) );
3071 /*******************************************************************
3072 * FlattenPath (GDI.516)
3074 BOOL16 WINAPI FlattenPath16(HDC16 hdc)
3076 return FlattenPath( HDC_32(hdc) );
3080 /***********************************************************************
3083 INT16 WINAPI GetPath16(HDC16 hdc, LPPOINT16 pPoints, LPBYTE pTypes, INT16 nSize)
3085 FIXME("(%d,%p,%p): stub\n",hdc,pPoints,pTypes);
3090 /***********************************************************************
3091 * PathToRegion (GDI.518)
3093 HRGN16 WINAPI PathToRegion16(HDC16 hdc)
3095 return HRGN_16( PathToRegion( HDC_32(hdc) ));
3099 /***********************************************************************
3100 * SelectClipPath (GDI.519)
3102 BOOL16 WINAPI SelectClipPath16(HDC16 hdc, INT16 iMode)
3104 return SelectClipPath( HDC_32(hdc), iMode );
3108 /*******************************************************************
3109 * StrokeAndFillPath (GDI.520)
3111 BOOL16 WINAPI StrokeAndFillPath16(HDC16 hdc)
3113 return StrokeAndFillPath( HDC_32(hdc) );
3117 /*******************************************************************
3118 * StrokePath (GDI.521)
3120 BOOL16 WINAPI StrokePath16(HDC16 hdc)
3122 return StrokePath( HDC_32(hdc) );
3126 /*******************************************************************
3127 * WidenPath (GDI.522)
3129 BOOL16 WINAPI WidenPath16(HDC16 hdc)
3131 return WidenPath( HDC_32(hdc) );
3135 /***********************************************************************
3136 * GetArcDirection (GDI.524)
3138 INT16 WINAPI GetArcDirection16( HDC16 hdc )
3140 return GetArcDirection( HDC_32(hdc) );
3144 /***********************************************************************
3145 * SetArcDirection (GDI.525)
3147 INT16 WINAPI SetArcDirection16( HDC16 hdc, INT16 nDirection )
3149 return SetArcDirection( HDC_32(hdc), (INT)nDirection );
3153 /***********************************************************************
3154 * CreateHalftonePalette (GDI.529)
3156 HPALETTE16 WINAPI CreateHalftonePalette16( HDC16 hdc )
3158 return HPALETTE_16( CreateHalftonePalette( HDC_32(hdc) ));
3162 /***********************************************************************
3163 * SetDIBColorTable (GDI.602)
3165 UINT16 WINAPI SetDIBColorTable16( HDC16 hdc, UINT16 startpos, UINT16 entries, RGBQUAD *colors )
3167 return SetDIBColorTable( HDC_32(hdc), startpos, entries, colors );
3171 /***********************************************************************
3172 * GetDIBColorTable (GDI.603)
3174 UINT16 WINAPI GetDIBColorTable16( HDC16 hdc, UINT16 startpos, UINT16 entries, RGBQUAD *colors )
3176 return GetDIBColorTable( HDC_32(hdc), startpos, entries, colors );
3180 /***********************************************************************
3181 * GetRegionData (GDI.607)
3183 * FIXME: is LPRGNDATA the same in Win16 and Win32 ?
3185 DWORD WINAPI GetRegionData16( HRGN16 hrgn, DWORD count, LPRGNDATA rgndata )
3187 return GetRegionData( HRGN_32(hrgn), count, rgndata );
3191 /***********************************************************************
3192 * GdiFreeResources (GDI.609)
3194 WORD WINAPI GdiFreeResources16( DWORD reserve )
3196 return 90; /* lie about it, it shouldn't matter */
3200 /***********************************************************************
3201 * GdiSignalProc32 (GDI.610)
3203 WORD WINAPI GdiSignalProc( UINT uCode, DWORD dwThreadOrProcessID,
3204 DWORD dwFlags, HMODULE16 hModule )
3210 /***********************************************************************
3211 * GetTextCharset (GDI.612)
3213 UINT16 WINAPI GetTextCharset16( HDC16 hdc )
3215 return GetTextCharset( HDC_32(hdc) );
3219 /***********************************************************************
3220 * EnumFontFamiliesEx (GDI.613)
3222 INT16 WINAPI EnumFontFamiliesEx16( HDC16 hdc, LPLOGFONT16 plf,
3223 FONTENUMPROC16 proc, LPARAM lParam,
3226 struct callback16_info info;
3227 LOGFONTW lfW, *plfW;
3229 info.proc = (FARPROC16)proc;
3230 info.param = lParam;
3234 logfont_16_to_W(plf, &lfW);
3239 return EnumFontFamiliesExW( HDC_32(hdc), plfW, enum_font_callback,
3240 (LPARAM)&info, dwFlags );
3244 /*************************************************************************
3245 * GetFontLanguageInfo (GDI.616)
3247 DWORD WINAPI GetFontLanguageInfo16( HDC16 hdc )
3249 return GetFontLanguageInfo( HDC_32(hdc) );
3253 /***********************************************************************
3254 * SetLayout (GDI.1000)
3256 * Sets left->right or right->left text layout flags of a dc.
3258 BOOL16 WINAPI SetLayout16( HDC16 hdc, DWORD layout )
3260 return SetLayout( HDC_32(hdc), layout );
3264 /***********************************************************************
3265 * SetSolidBrush (GDI.604)
3267 * Change the color of a solid brush.
3270 * hBrush [I] Brush to change the color of
3271 * newColor [I] New color for hBrush
3274 * Success: TRUE. The color of hBrush is set to newColor.
3278 * This function is undocumented and untested. The implementation may
3281 BOOL16 WINAPI SetSolidBrush16(HBRUSH16 hBrush, COLORREF newColor )
3283 TRACE("(hBrush %04x, newColor %08x)\n", hBrush, newColor);
3285 return BRUSH_SetSolid( HBRUSH_32(hBrush), newColor );
3289 /***********************************************************************
3292 void WINAPI Copy16( LPVOID src, LPVOID dst, WORD size )
3294 memcpy( dst, src, size );
3297 /***********************************************************************
3298 * RealizeDefaultPalette (GDI.365)
3300 UINT16 WINAPI RealizeDefaultPalette16( HDC16 hdc )
3305 TRACE("%04x\n", hdc );
3307 if (!(dc = get_dc_ptr( HDC_32(hdc) ))) return 0;
3309 if (dc->funcs->pRealizeDefaultPalette) ret = dc->funcs->pRealizeDefaultPalette( dc->physDev );
3310 release_dc_ptr( dc );
3314 /***********************************************************************
3315 * IsDCCurrentPalette (GDI.412)
3317 BOOL16 WINAPI IsDCCurrentPalette16(HDC16 hDC)
3319 DC *dc = get_dc_ptr( HDC_32(hDC) );
3322 BOOL bRet = dc->hPalette == hPrimaryPalette;
3323 release_dc_ptr( dc );
3329 /*********************************************************************
3330 * SetMagicColors (GDI.606)
3332 VOID WINAPI SetMagicColors16(HDC16 hDC, COLORREF color, UINT16 index)
3334 FIXME("(hDC %04x, color %04x, index %04x): stub\n", hDC, (int)color, index);
3339 /***********************************************************************
3342 BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
3344 DC * dc = get_dc_ptr( HDC_32(hdc) );
3345 if (!dc) return FALSE;
3349 points->x = MulDiv( points->x - dc->vportOrgX, dc->wndExtX, dc->vportExtX ) + dc->wndOrgX;
3350 points->y = MulDiv( points->y - dc->vportOrgY, dc->wndExtY, dc->vportExtY ) + dc->wndOrgY;
3353 release_dc_ptr( dc );
3358 /***********************************************************************
3361 BOOL16 WINAPI LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count )
3363 DC * dc = get_dc_ptr( HDC_32(hdc) );
3364 if (!dc) return FALSE;
3368 points->x = MulDiv( points->x - dc->wndOrgX, dc->vportExtX, dc->wndExtX ) + dc->vportOrgX;
3369 points->y = MulDiv( points->y - dc->wndOrgY, dc->vportExtY, dc->wndExtY ) + dc->vportOrgY;
3372 release_dc_ptr( dc );
3377 /***********************************************************************
3378 * GetDCState (GDI.179)
3380 HDC16 WINAPI GetDCState16( HDC16 hdc )
3382 ERR( "no longer supported\n" );
3387 /***********************************************************************
3388 * SetDCState (GDI.180)
3390 void WINAPI SetDCState16( HDC16 hdc, HDC16 hdcs )
3392 ERR( "no longer supported\n" );
3395 /***********************************************************************
3396 * SetDCOrg (GDI.117)
3398 DWORD WINAPI SetDCOrg16( HDC16 hdc16, INT16 x, INT16 y )
3401 HDC hdc = HDC_32( hdc16 );
3402 DC *dc = get_dc_ptr( hdc );
3404 if (dc->funcs->pSetDCOrg) prevOrg = dc->funcs->pSetDCOrg( dc->physDev, x, y );
3405 release_dc_ptr( dc );
3410 /***********************************************************************
3411 * InquireVisRgn (GDI.131)
3413 HRGN16 WINAPI InquireVisRgn16( HDC16 hdc )
3416 DC * dc = get_dc_ptr( HDC_32(hdc) );
3419 ret = HRGN_16(dc->hVisRgn);
3420 release_dc_ptr( dc );
3426 /***********************************************************************
3427 * OffsetVisRgn (GDI.102)
3429 INT16 WINAPI OffsetVisRgn16( HDC16 hdc16, INT16 x, INT16 y )
3432 HDC hdc = HDC_32( hdc16 );
3433 DC * dc = get_dc_ptr( hdc );
3435 if (!dc) return ERROR;
3436 TRACE("%p %d,%d\n", hdc, x, y );
3438 retval = OffsetRgn( dc->hVisRgn, x, y );
3439 CLIPPING_UpdateGCRegion( dc );
3440 release_dc_ptr( dc );
3445 /***********************************************************************
3446 * ExcludeVisRect (GDI.73)
3448 INT16 WINAPI ExcludeVisRect16( HDC16 hdc16, INT16 left, INT16 top, INT16 right, INT16 bottom )
3453 HDC hdc = HDC_32( hdc16 );
3454 DC * dc = get_dc_ptr( hdc );
3455 if (!dc) return ERROR;
3462 LPtoDP( hdc, pt, 2 );
3464 TRACE("%p %d,%d - %d,%d\n", hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
3466 if (!(tempRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ))) ret = ERROR;
3470 ret = CombineRgn( dc->hVisRgn, dc->hVisRgn, tempRgn, RGN_DIFF );
3471 DeleteObject( tempRgn );
3473 if (ret != ERROR) CLIPPING_UpdateGCRegion( dc );
3474 release_dc_ptr( dc );
3479 /***********************************************************************
3480 * IntersectVisRect (GDI.98)
3482 INT16 WINAPI IntersectVisRect16( HDC16 hdc16, INT16 left, INT16 top, INT16 right, INT16 bottom )
3487 HDC hdc = HDC_32( hdc16 );
3488 DC * dc = get_dc_ptr( hdc );
3489 if (!dc) return ERROR;
3496 LPtoDP( hdc, pt, 2 );
3498 TRACE("%p %d,%d - %d,%d\n", hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y);
3500 if (!(tempRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ))) ret = ERROR;
3504 ret = CombineRgn( dc->hVisRgn, dc->hVisRgn, tempRgn, RGN_AND );
3505 DeleteObject( tempRgn );
3507 if (ret != ERROR) CLIPPING_UpdateGCRegion( dc );
3508 release_dc_ptr( dc );
3513 /***********************************************************************
3514 * SaveVisRgn (GDI.129)
3516 HRGN16 WINAPI SaveVisRgn16( HDC16 hdc16 )
3518 struct saved_visrgn *saved;
3519 HDC hdc = HDC_32( hdc16 );
3520 DC *dc = get_dc_ptr( hdc );
3523 TRACE("%p\n", hdc );
3526 if (!(saved = HeapAlloc( GetProcessHeap(), 0, sizeof(*saved) ))) goto error;
3527 if (!(saved->hrgn = CreateRectRgn( 0, 0, 0, 0 ))) goto error;
3528 CombineRgn( saved->hrgn, dc->hVisRgn, 0, RGN_COPY );
3529 saved->next = dc->saved_visrgn;
3530 dc->saved_visrgn = saved;
3531 release_dc_ptr( dc );
3532 return HRGN_16(saved->hrgn);
3535 release_dc_ptr( dc );
3536 HeapFree( GetProcessHeap(), 0, saved );
3541 /***********************************************************************
3542 * RestoreVisRgn (GDI.130)
3544 INT16 WINAPI RestoreVisRgn16( HDC16 hdc16 )
3546 struct saved_visrgn *saved;
3547 HDC hdc = HDC_32( hdc16 );
3548 DC *dc = get_dc_ptr( hdc );
3551 if (!dc) return ERROR;
3553 TRACE("%p\n", hdc );
3555 if (!(saved = dc->saved_visrgn)) goto done;
3557 ret = CombineRgn( dc->hVisRgn, saved->hrgn, 0, RGN_COPY );
3558 dc->saved_visrgn = saved->next;
3559 DeleteObject( saved->hrgn );
3560 HeapFree( GetProcessHeap(), 0, saved );
3561 CLIPPING_UpdateGCRegion( dc );
3563 release_dc_ptr( dc );
3568 /***********************************************************************
3569 * GetClipRgn (GDI.173)
3571 HRGN16 WINAPI GetClipRgn16( HDC16 hdc )
3574 DC * dc = get_dc_ptr( HDC_32(hdc) );
3577 ret = HRGN_16(dc->hClipRgn);
3578 release_dc_ptr( dc );
3584 /***********************************************************************
3585 * MakeObjectPrivate (GDI.463)
3587 * What does that mean ?
3588 * Some little docu can be found in "Undocumented Windows",
3589 * but this is basically useless.
3591 void WINAPI MakeObjectPrivate16( HGDIOBJ16 handle16, BOOL16 private )
3593 FIXME( "stub: %x %u\n", handle16, private );
3596 /***********************************************************************
3597 * CreateDIBSection (GDI.489)
3599 HBITMAP16 WINAPI CreateDIBSection16 (HDC16 hdc, const BITMAPINFO *bmi, UINT16 usage,
3600 SEGPTR *bits16, HANDLE section, DWORD offset)
3605 hbitmap = CreateDIBSection( HDC_32(hdc), bmi, usage, &bits32, section, offset );
3608 BITMAPOBJ *bmp = GDI_GetObjPtr(hbitmap, OBJ_BITMAP);
3609 if (bmp && bmp->dib && bits32)
3611 const BITMAPINFOHEADER *bi = &bmi->bmiHeader;
3619 DIB_GetBitmapInfo(bi, &width, &height, &planes, &bpp, &compr, &size);
3621 height = height >= 0 ? height : -height;
3622 width_bytes = DIB_GetDIBWidthBytes(width, bpp);
3624 if (!size || (compr != BI_RLE4 && compr != BI_RLE8)) size = width_bytes * height;
3626 /* calculate number of sel's needed for size with 64K steps */
3627 count = (size + 0xffff) / 0x10000;
3628 sel = AllocSelectorArray16(count);
3630 for (i = 0; i < count; i++)
3632 SetSelectorBase(sel + (i << __AHSHIFT), (DWORD)bits32 + i * 0x10000);
3633 SetSelectorLimit16(sel + (i << __AHSHIFT), size - 1); /* yep, limit is correct */
3636 bmp->segptr_bits = MAKESEGPTR( sel, 0 );
3637 if (bits16) *bits16 = bmp->segptr_bits;
3639 if (bmp) GDI_ReleaseObj( hbitmap );
3641 return HBITMAP_16(hbitmap);