Changes in crossover-wine-src-6.1.0 except for configure
[wine/hacks.git] / dlls / gdi32 / mfdrv / text.c
blobb97bf713f171fe497fe312733d0b6f9251143629
1 /*
2 * metafile driver text functions
4 * Copyright 1993, 1994 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
21 #include <stdarg.h>
22 #include <string.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "mfdrv/metafiledrv.h"
27 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(metafile);
32 /******************************************************************
33 * MFDRV_MetaExtTextOut
35 static BOOL MFDRV_MetaExtTextOut( PHYSDEV dev, short x, short y, UINT16 flags,
36 const RECT16 *rect, LPCSTR str, short count,
37 const INT16 *lpDx)
39 BOOL ret;
40 DWORD len;
41 METARECORD *mr;
42 BOOL isrect = flags & (ETO_CLIPPED | ETO_OPAQUE);
44 len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 2 * sizeof(short)
45 + sizeof(UINT16);
46 if (isrect)
47 len += sizeof(RECT16);
48 if (lpDx)
49 len+=count*sizeof(INT16);
50 if (!(mr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len)))
51 return FALSE;
53 mr->rdSize = len / 2;
54 mr->rdFunction = META_EXTTEXTOUT;
55 *(mr->rdParm) = y;
56 *(mr->rdParm + 1) = x;
57 *(mr->rdParm + 2) = count;
58 *(mr->rdParm + 3) = flags;
59 if (isrect) memcpy(mr->rdParm + 4, rect, sizeof(RECT16));
60 memcpy(mr->rdParm + (isrect ? 8 : 4), str, count);
61 if (lpDx)
62 memcpy(mr->rdParm + (isrect ? 8 : 4) + ((count + 1) >> 1),lpDx,
63 count*sizeof(INT16));
64 ret = MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);
65 HeapFree( GetProcessHeap(), 0, mr);
66 return ret;
71 /***********************************************************************
72 * MFDRV_ExtTextOut
74 BOOL
75 MFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
76 const RECT *lprect, LPCWSTR str, UINT count,
77 const INT *lpDx )
79 RECT16 rect16;
80 LPINT16 lpdx16 = NULL;
81 BOOL ret;
82 unsigned int i;
83 LPSTR ascii;
85 ascii = HeapAlloc(GetProcessHeap(), 0, count);
86 for(i = 0; i < count; i++) {
87 if(str[i] > 0xff)
88 ascii[i] = '?';
89 else
90 ascii[i] = (BYTE)(str[i] & 0xff);
93 TRACE("mapped %s -> %s\n", debugstr_wn(str, count), debugstr_an(ascii, count));
95 if (lprect)
97 rect16.left = lprect->left;
98 rect16.top = lprect->top;
99 rect16.right = lprect->right;
100 rect16.bottom = lprect->bottom;
103 if(lpDx) {
104 lpdx16 = HeapAlloc( GetProcessHeap(), 0, sizeof(INT16)*count );
105 for(i = 0; i < count; i++)
106 lpdx16[i] = lpDx[i];
109 ret = MFDRV_MetaExtTextOut(dev,x,y,flags,lprect?&rect16:NULL,ascii,count,lpdx16);
110 HeapFree( GetProcessHeap(), 0, ascii );
111 HeapFree( GetProcessHeap(), 0, lpdx16 );
112 return ret;