1 /**************************************************************************\
2 *
3 * Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
4 *
5 * Module Name:
6 *
7 * GdiplusStringFormat.h
8 *
9 * Abstract:
10 *
11 * String format specification for DrawString and text APIs
12 *
13 \**************************************************************************/
14
15 #ifndef _GDIPLUSSTRINGFORMAT_H
16 #define _GDIPLUSSTRINGFORMAT_H
17
18
19 class StringFormat : public GdiplusBase
20 {
21 public:
22 friend class Graphics;
23 friend class GraphicsPath;
24
25
26 StringFormat(
27 IN INT formatFlags = 0,
28 IN LANGID language = LANG_NEUTRAL
29 )
30 {
31 nativeFormat = NULL;
32 lastError = DllExports::GdipCreateStringFormat(
33 formatFlags,
34 language,
35 &nativeFormat
36 );
37 }
38
39 static const StringFormat *GenericDefault();
40 static const StringFormat *GenericTypographic();
41
42 // Constructor based on existing string format
43
StringFormat(IN const StringFormat * format)44 StringFormat(
45 IN const StringFormat *format
46 )
47 {
48 nativeFormat = NULL;
49 lastError = DllExports::GdipCloneStringFormat(
50 format ? format->nativeFormat : NULL,
51 &nativeFormat
52 );
53 }
54
Clone()55 StringFormat *Clone() const
56 {
57 GpStringFormat *clonedStringFormat = NULL;
58
59 lastError = DllExports::GdipCloneStringFormat(
60 nativeFormat,
61 &clonedStringFormat
62 );
63
64 if (lastError == Ok)
65 return new StringFormat(clonedStringFormat, lastError);
66 else
67 return NULL;
68 }
69
~StringFormat()70 ~StringFormat()
71 {
72 DllExports::GdipDeleteStringFormat(nativeFormat);
73 }
74
SetFormatFlags(IN INT flags)75 Status SetFormatFlags(IN INT flags)
76 {
77 return SetStatus(DllExports::GdipSetStringFormatFlags(
78 nativeFormat,
79 flags
80 ));
81 }
82
GetFormatFlags()83 INT GetFormatFlags() const
84 {
85 INT flags;
86 SetStatus(DllExports::GdipGetStringFormatFlags(nativeFormat, &flags));
87 return flags;
88 }
89
90 #ifndef DCR_USE_NEW_152154
91 Status SetLineSpacing(
92 IN REAL amount = 1.0f,
93 IN LineSpacing method = LineSpacingRecommended
94 )
95 {
96 return SetStatus(DllExports::GdipSetStringFormatLineSpacing(
97 nativeFormat,
98 amount,
99 method
100 ));
101 }
102 #endif
103
SetAlignment(IN StringAlignment align)104 Status SetAlignment(IN StringAlignment align)
105 {
106 return SetStatus(DllExports::GdipSetStringFormatAlign(
107 nativeFormat,
108 align
109 ));
110 }
111
GetAlignment()112 StringAlignment GetAlignment() const
113 {
114 StringAlignment alignment;
115 SetStatus(DllExports::GdipGetStringFormatAlign(
116 nativeFormat,
117 &alignment
118 ));
119 return alignment;
120 }
121
SetLineAlignment(IN StringAlignment align)122 Status SetLineAlignment(IN StringAlignment align)
123 {
124 return SetStatus(DllExports::GdipSetStringFormatLineAlign(
125 nativeFormat,
126 align
127 ));
128 }
129
GetLineAlignment()130 StringAlignment GetLineAlignment() const
131 {
132 StringAlignment alignment;
133 SetStatus(DllExports::GdipGetStringFormatLineAlign(
134 nativeFormat,
135 &alignment
136 ));
137 return alignment;
138 }
139
SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix)140 Status SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix)
141 {
142 return SetStatus(DllExports::GdipSetStringFormatHotkeyPrefix(
143 nativeFormat,
144 (INT)hotkeyPrefix
145 ));
146 }
147
GetHotkeyPrefix()148 HotkeyPrefix GetHotkeyPrefix() const
149 {
150 HotkeyPrefix hotkeyPrefix;
151 SetStatus(DllExports::GdipGetStringFormatHotkeyPrefix(
152 nativeFormat,
153 (INT*)&hotkeyPrefix
154 ));
155 return hotkeyPrefix;
156 }
157
SetTabStops(IN REAL firstTabOffset,IN INT count,IN const REAL * tabStops)158 Status SetTabStops(
159 IN REAL firstTabOffset,
160 IN INT count,
161 IN const REAL *tabStops
162 )
163 {
164 return SetStatus(DllExports::GdipSetStringFormatTabStops(
165 nativeFormat,
166 firstTabOffset,
167 count,
168 tabStops
169 ));
170 }
171
GetTabStopCount()172 INT GetTabStopCount() const
173 {
174 INT count;
175 SetStatus(DllExports::GdipGetStringFormatTabStopCount(nativeFormat, &count));
176 return count;
177 }
178
GetTabStops(IN INT count,OUT REAL * firstTabOffset,OUT REAL * tabStops)179 Status GetTabStops(
180 IN INT count,
181 OUT REAL *firstTabOffset,
182 OUT REAL *tabStops
183 ) const
184 {
185 return SetStatus(DllExports::GdipGetStringFormatTabStops(
186 nativeFormat,
187 count,
188 firstTabOffset,
189 tabStops
190 ));
191 }
192
193 #ifdef DCR_USE_NEW_146933
SetDigitSubstitution(IN LANGID language,IN StringDigitSubstitute substitute)194 Status SetDigitSubstitution(
195 IN LANGID language,
196 IN StringDigitSubstitute substitute
197 )
198 {
199 return SetStatus(DllExports::GdipSetStringFormatDigitSubstitution(
200 nativeFormat,
201 language,
202 substitute
203 ));
204 }
205
GetDigitSubstitutionLanguage()206 LANGID GetDigitSubstitutionLanguage(
207 ) const
208 {
209 LANGID language;
210 SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
211 nativeFormat,
212 &language,
213 NULL
214 ));
215 return language;
216 }
217
GetDigitSubstitutionMethod()218 StringDigitSubstitute GetDigitSubstitutionMethod(
219 ) const
220 {
221 StringDigitSubstitute substitute;
222 SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
223 nativeFormat,
224 NULL,
225 &substitute
226 ));
227 return substitute;
228 }
229 #endif // DCR_USE_NEW_146933
230
231 // String trimming. How to handle more text than can be displayed
232 // in the limits available.
233
SetTrimming(IN StringTrimming trimming)234 Status SetTrimming(IN StringTrimming trimming)
235 {
236 return SetStatus(DllExports::GdipSetStringFormatTrimming(
237 nativeFormat,
238 trimming
239 ));
240 }
241
GetTrimming()242 StringTrimming StringFormat::GetTrimming() const
243 {
244 StringTrimming trimming;
245 SetStatus(DllExports::GdipGetStringFormatTrimming(
246 nativeFormat,
247 &trimming
248 ));
249 return trimming;
250 }
251
252 #ifdef DCR_USE_NEW_174340
SetMeasurableCharacterRanges(IN INT rangeCount,IN const CharacterRange * ranges)253 Status SetMeasurableCharacterRanges(
254 IN INT rangeCount,
255 IN const CharacterRange *ranges
256 )
257 {
258 return SetStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges(
259 nativeFormat,
260 rangeCount,
261 ranges
262 ));
263 }
264
GetMeasurableCharacterRangeCount()265 INT GetMeasurableCharacterRangeCount()
266 {
267 INT count;
268 SetStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount(
269 nativeFormat,
270 &count
271 ));
272 return count;
273 }
274 #endif
275
276 // GetLastStatus - return last error code and clear error code
277
GetLastStatus()278 Status GetLastStatus() const
279 {
280 Status lastStatus = lastError;
281 lastError = Ok;
282
283 return lastStatus;
284 }
285
286 protected:
287
SetStatus(GpStatus newStatus)288 Status SetStatus(GpStatus newStatus) const
289 {
290 if (newStatus == Ok)
291 {
292 return Ok;
293 }
294 else
295 {
296 return lastError = newStatus;
297 }
298 }
299
300
301 // Not allowed and move to private
StringFormat(const StringFormat & source)302 StringFormat(const StringFormat &source)
303 {
304 nativeFormat = NULL;
305 lastError = DllExports::GdipCloneStringFormat(
306 source.nativeFormat,
307 &nativeFormat
308 );
309 }
310
311 StringFormat& operator=(const StringFormat &source)
312 {
313 DllExports::GdipDeleteStringFormat(nativeFormat);
314 lastError = DllExports::GdipCloneStringFormat(
315 source.nativeFormat,
316 &nativeFormat
317 );
318 return *this;
319 }
320
321
322 // private constructor for copy
StringFormat(GpStringFormat * clonedStringFormat,Status status)323 StringFormat(GpStringFormat * clonedStringFormat, Status status)
324 {
325 lastError = status;
326 nativeFormat = clonedStringFormat;
327
328 }
329
330 GpStringFormat *nativeFormat;
331 mutable Status lastError;
332 };
333
334 // Generic constant string formats.
335
336 static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0};
337 static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0};
338
339 static StringFormat *GenericTypographicStringFormat = NULL;
340 static StringFormat *GenericDefaultStringFormat = NULL;
341
342 // Define the generic string formats
343
344
GenericDefault()345 inline const StringFormat *StringFormat::GenericDefault()
346 {
347 if (GenericDefaultStringFormat != NULL)
348 {
349 return GenericDefaultStringFormat;
350 }
351
352 GenericDefaultStringFormat =
353 (StringFormat*)GenericDefaultStringFormatBuffer;
354
355 GenericDefaultStringFormat->lastError =
356 DllExports::GdipStringFormatGetGenericDefault(
357 &(GenericDefaultStringFormat->nativeFormat)
358 );
359
360 return GenericDefaultStringFormat;
361 }
362
GenericTypographic()363 inline const StringFormat *StringFormat::GenericTypographic()
364 {
365 if (GenericTypographicStringFormat != NULL)
366 {
367 return GenericTypographicStringFormat;
368 }
369
370 GenericTypographicStringFormat =
371 (StringFormat*)GenericTypographicStringFormatBuffer;
372
373 GenericTypographicStringFormat->lastError =
374 DllExports::GdipStringFormatGetGenericTypographic(
375 &GenericTypographicStringFormat->nativeFormat
376 );
377
378 return GenericTypographicStringFormat;
379 }
380
381 #endif // !_GDIPLUSSTRINGFORMAT_H
382