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
30 #include "gdiplus_private.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
35 GpStatus WINGDIPAPI GdipCreateStringFormat(INT attr, LANGID lang,
36 GpStringFormat **format)
38 TRACE("(%i, %x, %p)\n", attr, lang, format);
41 return InvalidParameter;
43 *format = GdipAlloc(sizeof(GpStringFormat));
44 if(!*format) return OutOfMemory;
46 (*format)->attr = attr;
47 (*format)->lang = lang;
48 (*format)->digitlang = LANG_NEUTRAL;
49 (*format)->trimming = StringTrimmingCharacter;
50 (*format)->digitsub = StringDigitSubstituteUser;
51 (*format)->character_ranges = NULL;
52 (*format)->range_count = 0;
54 (*format)->tabcount = 0;
55 (*format)->firsttab = 0.0;
56 (*format)->tabs = NULL;
61 GpStatus WINGDIPAPI GdipDeleteStringFormat(GpStringFormat *format)
64 return InvalidParameter;
66 GdipFree(format->character_ranges);
67 GdipFree(format->tabs);
73 GpStatus WINGDIPAPI GdipStringFormatGetGenericDefault(GpStringFormat **format)
78 return InvalidParameter;
80 stat = GdipCreateStringFormat(0, LANG_NEUTRAL, format);
84 (*format)->align = StringAlignmentNear;
85 (*format)->vertalign = StringAlignmentNear;
90 GpStatus WINGDIPAPI GdipGetStringFormatAlign(GpStringFormat *format,
91 StringAlignment *align)
94 return InvalidParameter;
96 *align = format->align;
101 GpStatus WINGDIPAPI GdipGetStringFormatDigitSubstitution(GDIPCONST GpStringFormat *format,
102 LANGID *language, StringDigitSubstitute *substitute)
105 return InvalidParameter;
107 if(language) *language = format->digitlang;
108 if(substitute) *substitute = format->digitsub;
113 GpStatus WINGDIPAPI GdipGetStringFormatFlags(GDIPCONST GpStringFormat* format,
116 if (!(format && flags))
117 return InvalidParameter;
119 *flags = format->attr;
124 GpStatus WINGDIPAPI GdipGetStringFormatHotkeyPrefix(GDIPCONST GpStringFormat
128 return InvalidParameter;
130 *hkpx = (INT)format->hkprefix;
135 GpStatus WINGDIPAPI GdipGetStringFormatLineAlign(GpStringFormat *format,
136 StringAlignment *align)
138 if(!format || !align)
139 return InvalidParameter;
141 *align = format->vertalign;
146 GpStatus WINGDIPAPI GdipGetStringFormatMeasurableCharacterRangeCount(
147 GDIPCONST GpStringFormat *format, INT *count)
149 if (!(format && count))
150 return InvalidParameter;
152 TRACE("%p %p\n", format, count);
154 *count = format->range_count;
159 GpStatus WINGDIPAPI GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format,
162 if(!format || !count)
163 return InvalidParameter;
165 *count = format->tabcount;
170 GpStatus WINGDIPAPI GdipGetStringFormatTabStops(GDIPCONST GpStringFormat *format, INT count,
171 REAL *firsttab, REAL *tabs)
173 if(!format || !firsttab || !tabs)
174 return InvalidParameter;
176 /* native simply crashes on count < 0 */
178 memcpy(tabs, format->tabs, sizeof(REAL)*count);
180 *firsttab = format->firsttab;
185 GpStatus WINGDIPAPI GdipGetStringFormatTrimming(GpStringFormat *format,
186 StringTrimming *trimming)
188 if(!format || !trimming)
189 return InvalidParameter;
191 *trimming = format->trimming;
196 GpStatus WINGDIPAPI GdipSetStringFormatAlign(GpStringFormat *format,
197 StringAlignment align)
199 TRACE("(%p, %i)\n", format, align);
202 return InvalidParameter;
204 format->align = align;
209 /*FIXME: digit substitution actually not implemented, get/set only */
210 GpStatus WINGDIPAPI GdipSetStringFormatDigitSubstitution(GpStringFormat *format,
211 LANGID language, StringDigitSubstitute substitute)
213 TRACE("(%p, %x, %i)\n", format, language, substitute);
216 return InvalidParameter;
218 format->digitlang = language;
219 format->digitsub = substitute;
224 GpStatus WINGDIPAPI GdipSetStringFormatHotkeyPrefix(GpStringFormat *format,
227 TRACE("(%p, %i)\n", format, hkpx);
229 if(!format || hkpx < 0 || hkpx > 2)
230 return InvalidParameter;
232 format->hkprefix = (HotkeyPrefix) hkpx;
237 GpStatus WINGDIPAPI GdipSetStringFormatLineAlign(GpStringFormat *format,
238 StringAlignment align)
240 TRACE("(%p, %i)\n", format, align);
243 return InvalidParameter;
245 format->vertalign = align;
250 GpStatus WINGDIPAPI GdipSetStringFormatMeasurableCharacterRanges(
251 GpStringFormat *format, INT rangeCount, GDIPCONST CharacterRange *ranges)
253 if (!(format && ranges))
254 return InvalidParameter;
256 TRACE("%p, %d, %p\n", format, rangeCount, ranges);
258 format->character_ranges = GdipAlloc(rangeCount * sizeof(CharacterRange));
259 if (!format->character_ranges)
262 memcpy(format->character_ranges, ranges, sizeof(CharacterRange) * rangeCount);
263 format->range_count = rangeCount;
268 GpStatus WINGDIPAPI GdipSetStringFormatTabStops(GpStringFormat *format, REAL firsttab,
269 INT count, GDIPCONST REAL *tabs)
271 TRACE("(%p, %0.2f, %i, %p)\n", format, firsttab, count, tabs);
274 return InvalidParameter;
277 if(firsttab < 0.0) return NotImplemented;
278 /* first time allocation */
279 if(format->tabcount == 0){
280 format->tabs = GdipAlloc(sizeof(REAL)*count);
285 if((format->tabcount < count) && (format->tabcount > 0)){
287 ptr = HeapReAlloc(GetProcessHeap(), 0, format->tabs, sizeof(REAL)*count);
292 format->firsttab = firsttab;
293 format->tabcount = count;
294 memcpy(format->tabs, tabs, sizeof(REAL)*count);
300 GpStatus WINGDIPAPI GdipSetStringFormatTrimming(GpStringFormat *format,
301 StringTrimming trimming)
303 TRACE("(%p, %i)\n", format, trimming);
306 return InvalidParameter;
308 format->trimming = trimming;
313 GpStatus WINGDIPAPI GdipSetStringFormatFlags(GpStringFormat *format, INT flags)
315 TRACE("(%p, %x)\n", format, flags);
318 return InvalidParameter;
320 format->attr = flags;
325 GpStatus WINGDIPAPI GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat)
327 if(!format || !newFormat)
328 return InvalidParameter;
330 *newFormat = GdipAlloc(sizeof(GpStringFormat));
331 if(!*newFormat) return OutOfMemory;
333 **newFormat = *format;
335 if(format->tabcount > 0){
336 (*newFormat)->tabs = GdipAlloc(sizeof(REAL) * format->tabcount);
337 if(!(*newFormat)->tabs){
338 GdipFree(*newFormat);
341 memcpy((*newFormat)->tabs, format->tabs, sizeof(REAL) * format->tabcount);
344 (*newFormat)->tabs = NULL;
346 if(format->range_count > 0){
347 (*newFormat)->character_ranges = GdipAlloc(sizeof(CharacterRange) * format->range_count);
348 if(!(*newFormat)->character_ranges){
349 GdipFree((*newFormat)->tabs);
350 GdipFree(*newFormat);
353 memcpy((*newFormat)->character_ranges, format->character_ranges,
354 sizeof(CharacterRange) * format->range_count);
357 (*newFormat)->character_ranges = NULL;
359 TRACE("%p %p\n",format,newFormat);
364 GpStatus WINGDIPAPI GdipStringFormatGetGenericTypographic(GpStringFormat **format)
369 return InvalidParameter;
371 stat = GdipCreateStringFormat(StringFormatFlagsNoFitBlackBox |
372 StringFormatFlagsLineLimit |
373 StringFormatFlagsNoClip, LANG_NEUTRAL, format);
377 (*format)->digitlang = LANG_NEUTRAL;
378 (*format)->digitsub = StringDigitSubstituteUser;
379 (*format)->trimming = StringTrimmingNone;
380 (*format)->hkprefix = HotkeyPrefixNone;
381 (*format)->align = StringAlignmentNear;
382 (*format)->vertalign = StringAlignmentNear;