Added an explanation for the directory symlink stuff.
[wine/testsucceed.git] / graphics / metafiledrv / text.c
blobed13b225731295011587a6ea9f6041bf3c184c1d
1 /*
2 * metafile driver text functions
4 * Copyright 1993, 1994 Alexandre Julliard
6 */
8 #include <string.h>
10 #include "windef.h"
11 #include "wine/winestring.h"
12 #include "metafiledrv.h"
13 #include "debugtools.h"
14 #include "heap.h"
16 DEFAULT_DEBUG_CHANNEL(metafile);
19 /******************************************************************
20 * MFDRV_MetaExtTextOut
22 static BOOL MFDRV_MetaExtTextOut(DC*dc, short x, short y, UINT16 flags,
23 const RECT16 *rect, LPCSTR str, short count,
24 const INT16 *lpDx)
26 BOOL ret;
27 DWORD len;
28 METARECORD *mr;
30 if((!flags && rect) || (flags && !rect))
31 WARN("Inconsistent flags and rect\n");
32 len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 2 * sizeof(short)
33 + sizeof(UINT16);
34 if(rect)
35 len += sizeof(RECT16);
36 if (lpDx)
37 len+=count*sizeof(INT16);
38 if (!(mr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len)))
39 return FALSE;
41 mr->rdSize = len / 2;
42 mr->rdFunction = META_EXTTEXTOUT;
43 *(mr->rdParm) = y;
44 *(mr->rdParm + 1) = x;
45 *(mr->rdParm + 2) = count;
46 *(mr->rdParm + 3) = flags;
47 if (rect) memcpy(mr->rdParm + 4, rect, sizeof(RECT16));
48 memcpy(mr->rdParm + (rect ? 8 : 4), str, count);
49 if (lpDx)
50 memcpy(mr->rdParm + (rect ? 8 : 4) + ((count + 1) >> 1),lpDx,
51 count*sizeof(INT16));
52 ret = MFDRV_WriteRecord( dc, mr, mr->rdSize * 2);
53 HeapFree( GetProcessHeap(), 0, mr);
54 return ret;
59 /***********************************************************************
60 * MFDRV_ExtTextOut
62 BOOL
63 MFDRV_ExtTextOut( DC *dc, INT x, INT y, UINT flags,
64 const RECT *lprect, LPCWSTR str, UINT count,
65 const INT *lpDx )
67 RECT16 rect16;
68 LPINT16 lpdx16 = NULL;
69 BOOL ret;
70 int i;
71 LPSTR ascii;
73 if(lpDx)
74 lpdx16 = HeapAlloc( GetProcessHeap(), 0, sizeof(INT16)*count );
75 if (lprect) CONV_RECT32TO16(lprect,&rect16);
76 if (lpdx16)
77 for (i=count;i--;)
78 lpdx16[i]=lpDx[i];
79 ascii = HeapAlloc( GetProcessHeap(), 0, count+1 );
80 lstrcpynWtoA(ascii, str, count+1);
81 ret = MFDRV_MetaExtTextOut(dc,x,y,flags,lprect?&rect16:NULL,ascii,count,
82 lpdx16);
83 HeapFree( GetProcessHeap(), 0, ascii );
84 if (lpdx16) HeapFree( GetProcessHeap(), 0, lpdx16 );
85 return ret;