3 * Copyright (C) 2007 Google (Evan Stade)
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "gdiplus_private.h"
22 GpStatus WINGDIPAPI
GdipCreateStringFormat(INT attr
, LANGID lang
,
23 GpStringFormat
**format
)
25 TRACE("(%i, %x, %p)\n", attr
, lang
, format
);
28 return InvalidParameter
;
30 *format
= GdipAlloc(sizeof(GpStringFormat
));
31 if(!*format
) return OutOfMemory
;
33 (*format
)->attr
= attr
;
34 (*format
)->lang
= lang
;
35 (*format
)->digitlang
= LANG_NEUTRAL
;
36 (*format
)->trimming
= StringTrimmingCharacter
;
37 (*format
)->digitsub
= StringDigitSubstituteUser
;
38 (*format
)->character_ranges
= NULL
;
39 (*format
)->range_count
= 0;
40 (*format
)->generic_typographic
= FALSE
;
42 (*format
)->tabcount
= 0;
43 (*format
)->firsttab
= 0.0;
44 (*format
)->tabs
= NULL
;
46 TRACE("<-- %p\n", *format
);
51 GpStatus WINGDIPAPI
GdipDeleteStringFormat(GpStringFormat
*format
)
54 return InvalidParameter
;
56 GdipFree(format
->character_ranges
);
57 GdipFree(format
->tabs
);
63 GpStatus WINGDIPAPI
GdipStringFormatGetGenericDefault(GpStringFormat
**format
)
68 return InvalidParameter
;
70 stat
= GdipCreateStringFormat(0, LANG_NEUTRAL
, format
);
74 (*format
)->align
= StringAlignmentNear
;
75 (*format
)->vertalign
= StringAlignmentNear
;
80 GpStatus WINGDIPAPI
GdipGetStringFormatAlign(GpStringFormat
*format
,
81 StringAlignment
*align
)
84 return InvalidParameter
;
86 *align
= format
->align
;
91 GpStatus WINGDIPAPI
GdipGetStringFormatDigitSubstitution(GDIPCONST GpStringFormat
*format
,
92 LANGID
*language
, StringDigitSubstitute
*substitute
)
95 return InvalidParameter
;
97 if(language
) *language
= format
->digitlang
;
98 if(substitute
) *substitute
= format
->digitsub
;
103 GpStatus WINGDIPAPI
GdipGetStringFormatFlags(GDIPCONST GpStringFormat
* format
,
106 if (!(format
&& flags
))
107 return InvalidParameter
;
109 *flags
= format
->attr
;
114 GpStatus WINGDIPAPI
GdipGetStringFormatHotkeyPrefix(GDIPCONST GpStringFormat
118 return InvalidParameter
;
120 *hkpx
= (INT
)format
->hkprefix
;
125 GpStatus WINGDIPAPI
GdipGetStringFormatLineAlign(GpStringFormat
*format
,
126 StringAlignment
*align
)
128 if(!format
|| !align
)
129 return InvalidParameter
;
131 *align
= format
->vertalign
;
136 GpStatus WINGDIPAPI
GdipGetStringFormatMeasurableCharacterRangeCount(
137 GDIPCONST GpStringFormat
*format
, INT
*count
)
139 if (!(format
&& count
))
140 return InvalidParameter
;
142 TRACE("%p %p\n", format
, count
);
144 *count
= format
->range_count
;
149 GpStatus WINGDIPAPI
GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat
*format
,
152 if(!format
|| !count
)
153 return InvalidParameter
;
155 *count
= format
->tabcount
;
160 GpStatus WINGDIPAPI
GdipGetStringFormatTabStops(GDIPCONST GpStringFormat
*format
, INT count
,
161 REAL
*firsttab
, REAL
*tabs
)
163 if(!format
|| !firsttab
|| !tabs
)
164 return InvalidParameter
;
166 /* native simply crashes on count < 0 */
168 memcpy(tabs
, format
->tabs
, sizeof(REAL
)*count
);
170 *firsttab
= format
->firsttab
;
175 GpStatus WINGDIPAPI
GdipGetStringFormatTrimming(GpStringFormat
*format
,
176 StringTrimming
*trimming
)
178 if(!format
|| !trimming
)
179 return InvalidParameter
;
181 *trimming
= format
->trimming
;
186 GpStatus WINGDIPAPI
GdipSetStringFormatAlign(GpStringFormat
*format
,
187 StringAlignment align
)
189 TRACE("(%p, %i)\n", format
, align
);
192 return InvalidParameter
;
194 format
->align
= align
;
199 /*FIXME: digit substitution actually not implemented, get/set only */
200 GpStatus WINGDIPAPI
GdipSetStringFormatDigitSubstitution(GpStringFormat
*format
,
201 LANGID language
, StringDigitSubstitute substitute
)
203 TRACE("(%p, %x, %i)\n", format
, language
, substitute
);
206 return InvalidParameter
;
208 format
->digitlang
= language
;
209 format
->digitsub
= substitute
;
214 GpStatus WINGDIPAPI
GdipSetStringFormatHotkeyPrefix(GpStringFormat
*format
,
217 TRACE("(%p, %i)\n", format
, hkpx
);
219 if(!format
|| hkpx
< 0 || hkpx
> 2)
220 return InvalidParameter
;
222 format
->hkprefix
= (HotkeyPrefix
) hkpx
;
227 GpStatus WINGDIPAPI
GdipSetStringFormatLineAlign(GpStringFormat
*format
,
228 StringAlignment align
)
230 TRACE("(%p, %i)\n", format
, align
);
233 return InvalidParameter
;
235 format
->vertalign
= align
;
240 GpStatus WINGDIPAPI
GdipSetStringFormatMeasurableCharacterRanges(
241 GpStringFormat
*format
, INT rangeCount
, GDIPCONST CharacterRange
*ranges
)
243 CharacterRange
*new_ranges
;
245 if (!(format
&& ranges
))
246 return InvalidParameter
;
248 TRACE("%p, %d, %p\n", format
, rangeCount
, ranges
);
250 new_ranges
= GdipAlloc(rangeCount
* sizeof(CharacterRange
));
254 GdipFree(format
->character_ranges
);
255 format
->character_ranges
= new_ranges
;
256 memcpy(format
->character_ranges
, ranges
, sizeof(CharacterRange
) * rangeCount
);
257 format
->range_count
= rangeCount
;
262 GpStatus WINGDIPAPI
GdipSetStringFormatTabStops(GpStringFormat
*format
, REAL firsttab
,
263 INT count
, GDIPCONST REAL
*tabs
)
265 TRACE("(%p, %0.2f, %i, %p)\n", format
, firsttab
, count
, tabs
);
268 return InvalidParameter
;
271 if(firsttab
< 0.0) return NotImplemented
;
272 /* first time allocation */
273 if(format
->tabcount
== 0){
274 format
->tabs
= GdipAlloc(sizeof(REAL
)*count
);
279 if((format
->tabcount
< count
) && (format
->tabcount
> 0)){
281 ptr
= HeapReAlloc(GetProcessHeap(), 0, format
->tabs
, sizeof(REAL
)*count
);
286 format
->firsttab
= firsttab
;
287 format
->tabcount
= count
;
288 memcpy(format
->tabs
, tabs
, sizeof(REAL
)*count
);
294 GpStatus WINGDIPAPI
GdipSetStringFormatTrimming(GpStringFormat
*format
,
295 StringTrimming trimming
)
297 TRACE("(%p, %i)\n", format
, trimming
);
300 return InvalidParameter
;
302 format
->trimming
= trimming
;
307 GpStatus WINGDIPAPI
GdipSetStringFormatFlags(GpStringFormat
*format
, INT flags
)
309 TRACE("(%p, %x)\n", format
, flags
);
312 return InvalidParameter
;
314 format
->attr
= flags
;
319 GpStatus WINGDIPAPI
GdipCloneStringFormat(GDIPCONST GpStringFormat
*format
, GpStringFormat
**newFormat
)
321 if(!format
|| !newFormat
)
322 return InvalidParameter
;
324 *newFormat
= GdipAlloc(sizeof(GpStringFormat
));
325 if(!*newFormat
) return OutOfMemory
;
327 **newFormat
= *format
;
329 if(format
->tabcount
> 0){
330 (*newFormat
)->tabs
= GdipAlloc(sizeof(REAL
) * format
->tabcount
);
331 if(!(*newFormat
)->tabs
){
332 GdipFree(*newFormat
);
335 memcpy((*newFormat
)->tabs
, format
->tabs
, sizeof(REAL
) * format
->tabcount
);
338 (*newFormat
)->tabs
= NULL
;
340 if(format
->range_count
> 0){
341 (*newFormat
)->character_ranges
= GdipAlloc(sizeof(CharacterRange
) * format
->range_count
);
342 if(!(*newFormat
)->character_ranges
){
343 GdipFree((*newFormat
)->tabs
);
344 GdipFree(*newFormat
);
347 memcpy((*newFormat
)->character_ranges
, format
->character_ranges
,
348 sizeof(CharacterRange
) * format
->range_count
);
351 (*newFormat
)->character_ranges
= NULL
;
353 TRACE("%p %p\n",format
,newFormat
);
358 GpStatus WINGDIPAPI
GdipStringFormatGetGenericTypographic(GpStringFormat
**format
)
363 return InvalidParameter
;
365 stat
= GdipCreateStringFormat(StringFormatFlagsNoFitBlackBox
|
366 StringFormatFlagsLineLimit
|
367 StringFormatFlagsNoClip
, LANG_NEUTRAL
, format
);
371 (*format
)->digitlang
= LANG_NEUTRAL
;
372 (*format
)->digitsub
= StringDigitSubstituteUser
;
373 (*format
)->trimming
= StringTrimmingNone
;
374 (*format
)->hkprefix
= HotkeyPrefixNone
;
375 (*format
)->align
= StringAlignmentNear
;
376 (*format
)->vertalign
= StringAlignmentNear
;
377 (*format
)->generic_typographic
= TRUE
;
379 TRACE("%p => %p\n", format
, *format
);