OSDN Git Service

310ad95de6c03fad79b3c90e2e5000fb9d9ac720
[mingw/mingw-org-wsl.git] / w32api / include / gdiplus / gdiplusstringformat.h
1 /*\r
2  * gdiplusstringformat.h\r
3  *\r
4  * GDI+ StringFormat class\r
5  *\r
6  * This file is part of the w32api package.\r
7  *\r
8  * Contributors:\r
9  *   Created by Markus Koenig <markus@stber-koenig.de>\r
10  *\r
11  * THIS SOFTWARE IS NOT COPYRIGHTED\r
12  *\r
13  * This source code is offered for use in the public domain. You may\r
14  * use, modify or distribute it freely.\r
15  *\r
16  * This code is distributed in the hope that it will be useful but\r
17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\r
18  * DISCLAIMED. This includes but is not limited to warranties of\r
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
20  *\r
21  */\r
22 \r
23 #ifndef __GDIPLUS_STRINGFORMAT_H\r
24 #define __GDIPLUS_STRINGFORMAT_H\r
25 #if __GNUC__ >=3\r
26 #pragma GCC system_header\r
27 #endif\r
28 \r
29 #ifndef __cplusplus\r
30 #error "A C++ compiler is required to include gdiplusstringformat.h."\r
31 #endif\r
32 \r
33 class StringFormat: public GdiplusBase\r
34 {\r
35         friend class Graphics;\r
36         friend class GraphicsPath;\r
37 \r
38 public:\r
39         static const StringFormat* GenericDefault();\r
40         static const StringFormat* GenericTypographic();\r
41 \r
42         StringFormat(INT formatFlags = 0, LANGID language = LANG_NEUTRAL):\r
43                         nativeStringFormat(NULL), lastStatus(Ok)\r
44         {\r
45                 lastStatus = DllExports::GdipCreateStringFormat(\r
46                                 formatFlags, language, &nativeStringFormat);\r
47         }\r
48         StringFormat(const StringFormat *format):\r
49                         nativeStringFormat(NULL), lastStatus(Ok)\r
50         {\r
51                 lastStatus = DllExports::GdipCloneStringFormat(\r
52                                 format ? format->nativeStringFormat : NULL,\r
53                                 &nativeStringFormat);\r
54         }\r
55         ~StringFormat()\r
56         {\r
57                 DllExports::GdipDeleteStringFormat(nativeStringFormat);\r
58         }\r
59         StringFormat* Clone() const\r
60         {\r
61                 GpStringFormat *cloneStringFormat = NULL;\r
62                 Status status = updateStatus(DllExports::GdipCloneStringFormat(\r
63                                 nativeStringFormat, &cloneStringFormat));\r
64                 if (status == Ok) {\r
65                         StringFormat *result = new StringFormat(\r
66                                         cloneStringFormat, lastStatus);\r
67                         if (!result) {\r
68                                 DllExports::GdipDeleteStringFormat(cloneStringFormat);\r
69                                 lastStatus = OutOfMemory;\r
70                         }\r
71                         return result;\r
72                 } else {\r
73                         return NULL;\r
74                 }\r
75         }\r
76 \r
77         StringAlignment GetAlignment() const\r
78         {\r
79                 StringAlignment result = StringAlignmentNear;\r
80                 updateStatus(DllExports::GdipGetStringFormatAlign(\r
81                                 nativeStringFormat, &result));\r
82                 return result;\r
83         }\r
84         LANGID GetDigitSubstitutionLanguage() const\r
85         {\r
86                 LANGID result = 0;\r
87                 StringDigitSubstitute method;\r
88                 updateStatus(DllExports::GdipGetStringFormatDigitSubstitution(\r
89                                 nativeStringFormat, &result, &method));\r
90                 return result;\r
91         }\r
92         StringDigitSubstitute GetDigitSubstitutionMethod() const\r
93         {\r
94                 LANGID language;\r
95                 StringDigitSubstitute result = StringDigitSubstituteUser;\r
96                 updateStatus(DllExports::GdipGetStringFormatDigitSubstitution(\r
97                                 nativeStringFormat, &language, &result));\r
98                 return result;\r
99         }\r
100         INT GetFormatFlags() const\r
101         {\r
102                 INT result = 0;\r
103                 updateStatus(DllExports::GdipGetStringFormatFlags(\r
104                                 nativeStringFormat, &result));\r
105                 return result;\r
106         }\r
107         HotkeyPrefix GetHotkeyPrefix() const\r
108         {\r
109                 HotkeyPrefix result = HotkeyPrefixNone;\r
110                 updateStatus(DllExports::GdipGetStringFormatHotkeyPrefix(\r
111                                 nativeStringFormat, (INT*) &result));\r
112                 return result;\r
113         }\r
114         Status GetLastStatus() const\r
115         {\r
116                 Status result = lastStatus;\r
117                 lastStatus = Ok;\r
118                 return result;\r
119         }\r
120         StringAlignment GetLineAlignment() const\r
121         {\r
122                 StringAlignment result = StringAlignmentNear;\r
123                 updateStatus(DllExports::GdipGetStringFormatLineAlign(\r
124                                 nativeStringFormat, &result));\r
125                 return result;\r
126         }\r
127         INT GetMeasurableCharacterRangeCount() const\r
128         {\r
129                 INT result = 0;\r
130                 updateStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount(\r
131                                 nativeStringFormat, &result));\r
132                 return result;\r
133         }\r
134         INT GetTabStopCount() const\r
135         {\r
136                 INT result = 0;\r
137                 updateStatus(DllExports::GdipGetStringFormatTabStopCount(\r
138                                 nativeStringFormat, &result));\r
139                 return result;\r
140         }\r
141         Status GetTabStops(INT count, REAL *firstTabOffset, REAL *tabStops)\r
142         {\r
143                 return updateStatus(DllExports::GdipGetStringFormatTabStops(\r
144                                 nativeStringFormat, count,\r
145                                 firstTabOffset, tabStops));\r
146         }\r
147         StringTrimming GetTrimming() const\r
148         {\r
149                 StringTrimming result = StringTrimmingNone;\r
150                 updateStatus(DllExports::GdipGetStringFormatTrimming(\r
151                                 nativeStringFormat, &result));\r
152                 return result;\r
153         }\r
154         Status SetAlignment(StringAlignment align)\r
155         {\r
156                 return updateStatus(DllExports::GdipSetStringFormatAlign(\r
157                                 nativeStringFormat, align));\r
158         }\r
159         Status SetDigitSubstitution(LANGID language,\r
160                         StringDigitSubstitute substitute)\r
161         {\r
162                 return updateStatus(DllExports::GdipSetStringFormatDigitSubstitution(\r
163                                 nativeStringFormat, language, substitute));\r
164         }\r
165         Status SetFormatFlags(INT flags)\r
166         {\r
167                 return updateStatus(DllExports::GdipSetStringFormatFlags(\r
168                                 nativeStringFormat, flags));\r
169         }\r
170         Status SetHotkeyPrefix(HotkeyPrefix hotkeyPrefix)\r
171         {\r
172                 return updateStatus(DllExports::GdipSetStringFormatHotkeyPrefix(\r
173                                 nativeStringFormat, (INT) hotkeyPrefix));\r
174         }\r
175         Status SetLineAlignment(StringAlignment align)\r
176         {\r
177                 return updateStatus(DllExports::GdipSetStringFormatLineAlign(\r
178                                 nativeStringFormat, align));\r
179         }\r
180         Status SetMeasurableCharacterRanges(INT rangeCount,\r
181                         const CharacterRange *ranges)\r
182         {\r
183                 return updateStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges(\r
184                                 nativeStringFormat, rangeCount, ranges));\r
185         }\r
186         Status SetTabStops(REAL firstTabOffset, INT count, const REAL *tabStops)\r
187         {\r
188                 return updateStatus(DllExports::GdipSetStringFormatTabStops(\r
189                                 nativeStringFormat, firstTabOffset,\r
190                                 count, tabStops));\r
191         }\r
192         Status SetTrimming(StringTrimming trimming)\r
193         {\r
194                 return updateStatus(DllExports::GdipSetStringFormatTrimming(\r
195                                 nativeStringFormat, trimming));\r
196         }\r
197 \r
198 private:\r
199         StringFormat(GpStringFormat *stringFormat, Status status):\r
200                 nativeStringFormat(stringFormat), lastStatus(status) {}\r
201         StringFormat(const StringFormat&);\r
202         StringFormat& operator=(const StringFormat&);\r
203 \r
204         Status updateStatus(Status newStatus) const\r
205         {\r
206                 if (newStatus != Ok) lastStatus = newStatus;\r
207                 return newStatus;\r
208         }\r
209 \r
210         GpStringFormat *nativeStringFormat;\r
211         mutable Status lastStatus;\r
212 };\r
213 \r
214 \r
215 // FIXME: do StringFormat::GenericDefault() et al. need to be thread safe?\r
216 // FIXME: maybe put this in gdiplus.c?\r
217 \r
218 extern "C" void *_GdipStringFormatCachedGenericDefault;\r
219 extern "C" void *_GdipStringFormatCachedGenericTypographic;\r
220 \r
221 __inline__ const StringFormat* StringFormat::GenericDefault()\r
222 {\r
223         if (!_GdipStringFormatCachedGenericDefault) {\r
224                 GpStringFormat *nativeStringFormat = 0;\r
225                 Status status = DllExports::GdipStringFormatGetGenericDefault(\r
226                                 &nativeStringFormat);\r
227                 if (status == Ok && nativeStringFormat) {\r
228                         _GdipStringFormatCachedGenericDefault = (void*)\r
229                                 new StringFormat(nativeStringFormat, Ok);\r
230                 }\r
231         }\r
232         return (StringFormat*) _GdipStringFormatCachedGenericDefault;\r
233 }\r
234 \r
235 __inline__ const StringFormat* StringFormat::GenericTypographic()\r
236 {\r
237         if (!_GdipStringFormatCachedGenericTypographic) {\r
238                 GpStringFormat *nativeStringFormat = 0;\r
239                 Status status = DllExports::GdipStringFormatGetGenericTypographic(\r
240                                 &nativeStringFormat);\r
241                 if (status == Ok && nativeStringFormat) {\r
242                         _GdipStringFormatCachedGenericTypographic = (void*)\r
243                                 new StringFormat(nativeStringFormat, Ok);\r
244                 }\r
245         }\r
246         return (StringFormat*) _GdipStringFormatCachedGenericTypographic;\r
247 }\r
248 \r
249 \r
250 \r
251 #endif /* __GDIPLUS_STRINGFORMAT_H */\r