ReactOS 0.4.16-dev-303-g11d5cb8
text.c
Go to the documentation of this file.
1/*
2 * metafile driver text functions
3 *
4 * Copyright 1993, 1994 Alexandre Julliard
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include <stdarg.h>
22#include <string.h>
23
24#include "windef.h"
25#include "winbase.h"
26#include "wine/wingdi16.h"
27#include "mfdrv/metafiledrv.h"
28#include "wine/debug.h"
29
31
32
33/******************************************************************
34 * MFDRV_MetaExtTextOut
35 */
37 const RECT16 *rect, LPCSTR str, short count,
38 const INT16 *lpDx)
39{
40 BOOL ret;
41 DWORD len;
42 METARECORD *mr;
43 BOOL isrect = flags & (ETO_CLIPPED | ETO_OPAQUE);
44
45 len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 2 * sizeof(short)
46 + sizeof(UINT16);
47 if (isrect)
48 len += sizeof(RECT16);
49 if (lpDx)
50 len+=count*sizeof(INT16);
52 return FALSE;
53
54 mr->rdSize = len / 2;
56 *(mr->rdParm) = y;
57 *(mr->rdParm + 1) = x;
58 *(mr->rdParm + 2) = count;
59 *(mr->rdParm + 3) = flags;
60 if (isrect) memcpy(mr->rdParm + 4, rect, sizeof(RECT16));
61 memcpy(mr->rdParm + (isrect ? 8 : 4), str, count);
62 if (lpDx)
63 memcpy(mr->rdParm + (isrect ? 8 : 4) + ((count + 1) >> 1),lpDx,
64 count*sizeof(INT16));
65 ret = MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);
66 HeapFree( GetProcessHeap(), 0, mr);
67 return ret;
68}
69
70
71
72/***********************************************************************
73 * MFDRV_ExtTextOut
74 */
76 const RECT *lprect, LPCWSTR str, UINT count, const INT *lpDx )
77{
78 RECT16 rect16;
79 LPINT16 lpdx16 = NULL;
80 BOOL ret;
81 unsigned int i, j;
82 LPSTR ascii;
83 DWORD len;
84 CHARSETINFO csi;
85 int charset = GetTextCharset( dev->hdc );
86 UINT cp = CP_ACP;
87
89 cp = csi.ciACP;
90 else {
91 switch(charset) {
92 case OEM_CHARSET:
93 cp = GetOEMCP();
94 break;
95 case DEFAULT_CHARSET:
96 cp = GetACP();
97 break;
98
99 case VISCII_CHARSET:
100 case TCVN_CHARSET:
101 case KOI8_CHARSET:
102 case ISO3_CHARSET:
103 case ISO4_CHARSET:
104 case ISO10_CHARSET:
105 case CELTIC_CHARSET:
106 /* FIXME: These have no place here, but because x11drv
107 enumerates fonts with these (made up) charsets some apps
108 might use them and then the FIXME below would become
109 annoying. Now we could pick the intended codepage for
110 each of these, but since it's broken anyway we'll just
111 use CP_ACP and hope it'll go away...
112 */
113 cp = CP_ACP;
114 break;
115
116
117 default:
118 FIXME("Can't find codepage for charset %d\n", charset);
119 break;
120 }
121 }
122
123
124 TRACE("cp == %d\n", cp);
126 ascii = HeapAlloc(GetProcessHeap(), 0, len);
127 WideCharToMultiByte(cp, 0, str, count, ascii, len, NULL, NULL);
128 TRACE("mapped %s -> %s\n", debugstr_wn(str, count), debugstr_an(ascii, len));
129
130
131 if (lprect)
132 {
133 rect16.left = lprect->left;
134 rect16.top = lprect->top;
135 rect16.right = lprect->right;
136 rect16.bottom = lprect->bottom;
137 }
138
139 if(lpDx) {
140 lpdx16 = HeapAlloc( GetProcessHeap(), 0, sizeof(INT16)*len );
141 for(i = j = 0; i < len; )
142 if(IsDBCSLeadByteEx(cp, ascii[i])) {
143 lpdx16[i++] = lpDx[j++];
144 lpdx16[i++] = 0;
145 } else
146 lpdx16[i++] = lpDx[j++];
147 }
148
149 ret = MFDRV_MetaExtTextOut(dev,x,y,flags,lprect?&rect16:NULL,ascii,len,lpdx16);
150 HeapFree( GetProcessHeap(), 0, ascii );
151 HeapFree( GetProcessHeap(), 0, lpdx16 );
152 return ret;
153}
unsigned short UINT16
signed short INT16
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ULongToPtr(ul)
Definition: basetsd.h:92
CFF_Charset charset
Definition: cffcmap.c:138
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define GetProcessHeap()
Definition: compat.h:736
#define CP_ACP
Definition: compat.h:109
#define HeapAlloc
Definition: compat.h:733
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
#define HeapFree(x, y, z)
Definition: compat.h:735
#define WideCharToMultiByte
Definition: compat.h:111
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
UINT WINAPI GetACP(void)
Definition: locale.c:2021
BOOL WINAPI IsDBCSLeadByteEx(UINT codepage, BYTE testchar)
Definition: locale.c:2104
UINT WINAPI GetOEMCP(void)
Definition: locale.c:2060
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLbitfield flags
Definition: glext.h:7161
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define debugstr_wn
Definition: kernel32.h:33
POINT cp
Definition: magnifier.c:59
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static const unsigned char metafile[]
Definition: olepicture.c:138
unsigned int UINT
Definition: ndis.h:50
const WCHAR * str
#define TRACE(s)
Definition: solgame.cpp:4
& rect
Definition: startmenu.cpp:1413
INT16 left
Definition: windef16.h:143
INT16 bottom
Definition: windef16.h:146
INT16 top
Definition: windef16.h:144
INT16 right
Definition: windef16.h:145
DWORD rdSize
Definition: wingdi.h:2345
WORD rdParm[1]
Definition: wingdi.h:2347
WORD rdFunction
Definition: wingdi.h:2346
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
int32_t INT
Definition: typedefs.h:58
int ret
INT WINAPI GetTextCharset(_In_ HDC hdc)
Definition: text.c:187
BOOL MFDRV_WriteRecord(PHYSDEV dev, METARECORD *mr, DWORD rlen)
Definition: init.c:475
static BOOL MFDRV_MetaExtTextOut(PHYSDEV dev, short x, short y, UINT16 flags, const RECT16 *rect, LPCSTR str, short count, const INT16 *lpDx)
Definition: text.c:36
BOOL MFDRV_ExtTextOut(PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprect, LPCWSTR str, UINT count, const INT *lpDx)
Definition: text.c:75
INT16 * LPINT16
Definition: windef16.h:43
#define TCVN_CHARSET
Definition: wingdi.h:408
#define ISO3_CHARSET
Definition: wingdi.h:410
#define CELTIC_CHARSET
Definition: wingdi.h:413
#define KOI8_CHARSET
Definition: wingdi.h:409
#define VISCII_CHARSET
Definition: wingdi.h:407
#define DEFAULT_CHARSET
Definition: wingdi.h:384
#define ISO10_CHARSET
Definition: wingdi.h:412
#define ETO_CLIPPED
Definition: wingdi.h:648
#define ETO_OPAQUE
Definition: wingdi.h:647
#define TCI_SRCCHARSET
Definition: wingdi.h:961
#define META_EXTTEXTOUT
Definition: wingdi.h:259
#define OEM_CHARSET
Definition: wingdi.h:400
#define ISO4_CHARSET
Definition: wingdi.h:411
struct tagMETARECORD METARECORD
BOOL WINAPI TranslateCharsetInfo(_Inout_ PDWORD, _Out_ LPCHARSETINFO, _In_ DWORD)
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185