| /* | |
| * gdiplusstringformat.h | |
| * | |
| * GDI+ StringFormat class | |
| * | |
| * This file is part of the w32api package. | |
| * | |
| * Contributors: | |
| * Created by Markus Koenig <markus@stber-koenig.de> | |
| * | |
| * THIS SOFTWARE IS NOT COPYRIGHTED | |
| * | |
| * This source code is offered for use in the public domain. You may | |
| * use, modify or distribute it freely. | |
| * | |
| * This code is distributed in the hope that it will be useful but | |
| * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY | |
| * DISCLAIMED. This includes but is not limited to warranties of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| * | |
| */ | |
| #ifndef __GDIPLUS_STRINGFORMAT_H | |
| #define __GDIPLUS_STRINGFORMAT_H | |
| #if __GNUC__ >=3 | |
| #pragma GCC system_header | |
| #endif | |
| #ifndef __cplusplus | |
| #error "A C++ compiler is required to include gdiplusstringformat.h." | |
| #endif | |
| class StringFormat: public GdiplusBase | |
| { | |
| friend class Graphics; | |
| friend class GraphicsPath; | |
| public: | |
| static const StringFormat* GenericDefault(); | |
| static const StringFormat* GenericTypographic(); | |
| StringFormat(INT formatFlags = 0, LANGID language = LANG_NEUTRAL): | |
| nativeStringFormat(NULL), lastStatus(Ok) | |
| { | |
| lastStatus = DllExports::GdipCreateStringFormat( | |
| formatFlags, language, &nativeStringFormat); | |
| } | |
| StringFormat(const StringFormat *format): | |
| nativeStringFormat(NULL), lastStatus(Ok) | |
| { | |
| lastStatus = DllExports::GdipCloneStringFormat( | |
| format ? format->nativeStringFormat : NULL, | |
| &nativeStringFormat); | |
| } | |
| ~StringFormat() | |
| { | |
| DllExports::GdipDeleteStringFormat(nativeStringFormat); | |
| } | |
| StringFormat* Clone() const | |
| { | |
| GpStringFormat *cloneStringFormat = NULL; | |
| Status status = updateStatus(DllExports::GdipCloneStringFormat( | |
| nativeStringFormat, &cloneStringFormat)); | |
| if (status == Ok) { | |
| StringFormat *result = new StringFormat( | |
| cloneStringFormat, lastStatus); | |
| if (!result) { | |
| DllExports::GdipDeleteStringFormat(cloneStringFormat); | |
| lastStatus = OutOfMemory; | |
| } | |
| return result; | |
| } else { | |
| return NULL; | |
| } | |
| } | |
| StringAlignment GetAlignment() const | |
| { | |
| StringAlignment result = StringAlignmentNear; | |
| updateStatus(DllExports::GdipGetStringFormatAlign( | |
| nativeStringFormat, &result)); | |
| return result; | |
| } | |
| LANGID GetDigitSubstitutionLanguage() const | |
| { | |
| LANGID result = 0; | |
| StringDigitSubstitute method; | |
| updateStatus(DllExports::GdipGetStringFormatDigitSubstitution( | |
| nativeStringFormat, &result, &method)); | |
| return result; | |
| } | |
| StringDigitSubstitute GetDigitSubstitutionMethod() const | |
| { | |
| LANGID language; | |
| StringDigitSubstitute result = StringDigitSubstituteUser; | |
| updateStatus(DllExports::GdipGetStringFormatDigitSubstitution( | |
| nativeStringFormat, &language, &result)); | |
| return result; | |
| } | |
| INT GetFormatFlags() const | |
| { | |
| INT result = 0; | |
| updateStatus(DllExports::GdipGetStringFormatFlags( | |
| nativeStringFormat, &result)); | |
| return result; | |
| } | |
| HotkeyPrefix GetHotkeyPrefix() const | |
| { | |
| HotkeyPrefix result = HotkeyPrefixNone; | |
| updateStatus(DllExports::GdipGetStringFormatHotkeyPrefix( | |
| nativeStringFormat, (INT*) &result)); | |
| return result; | |
| } | |
| Status GetLastStatus() const | |
| { | |
| Status result = lastStatus; | |
| lastStatus = Ok; | |
| return result; | |
| } | |
| StringAlignment GetLineAlignment() const | |
| { | |
| StringAlignment result = StringAlignmentNear; | |
| updateStatus(DllExports::GdipGetStringFormatLineAlign( | |
| nativeStringFormat, &result)); | |
| return result; | |
| } | |
| INT GetMeasurableCharacterRangeCount() const | |
| { | |
| INT result = 0; | |
| updateStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount( | |
| nativeStringFormat, &result)); | |
| return result; | |
| } | |
| INT GetTabStopCount() const | |
| { | |
| INT result = 0; | |
| updateStatus(DllExports::GdipGetStringFormatTabStopCount( | |
| nativeStringFormat, &result)); | |
| return result; | |
| } | |
| Status GetTabStops(INT count, REAL *firstTabOffset, REAL *tabStops) | |
| { | |
| return updateStatus(DllExports::GdipGetStringFormatTabStops( | |
| nativeStringFormat, count, | |
| firstTabOffset, tabStops)); | |
| } | |
| StringTrimming GetTrimming() const | |
| { | |
| StringTrimming result = StringTrimmingNone; | |
| updateStatus(DllExports::GdipGetStringFormatTrimming( | |
| nativeStringFormat, &result)); | |
| return result; | |
| } | |
| Status SetAlignment(StringAlignment align) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatAlign( | |
| nativeStringFormat, align)); | |
| } | |
| Status SetDigitSubstitution(LANGID language, | |
| StringDigitSubstitute substitute) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatDigitSubstitution( | |
| nativeStringFormat, language, substitute)); | |
| } | |
| Status SetFormatFlags(INT flags) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatFlags( | |
| nativeStringFormat, flags)); | |
| } | |
| Status SetHotkeyPrefix(HotkeyPrefix hotkeyPrefix) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatHotkeyPrefix( | |
| nativeStringFormat, (INT) hotkeyPrefix)); | |
| } | |
| Status SetLineAlignment(StringAlignment align) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatLineAlign( | |
| nativeStringFormat, align)); | |
| } | |
| Status SetMeasurableCharacterRanges(INT rangeCount, | |
| const CharacterRange *ranges) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges( | |
| nativeStringFormat, rangeCount, ranges)); | |
| } | |
| Status SetTabStops(REAL firstTabOffset, INT count, const REAL *tabStops) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatTabStops( | |
| nativeStringFormat, firstTabOffset, | |
| count, tabStops)); | |
| } | |
| Status SetTrimming(StringTrimming trimming) | |
| { | |
| return updateStatus(DllExports::GdipSetStringFormatTrimming( | |
| nativeStringFormat, trimming)); | |
| } | |
| private: | |
| StringFormat(GpStringFormat *stringFormat, Status status): | |
| nativeStringFormat(stringFormat), lastStatus(status) {} | |
| StringFormat(const StringFormat&); | |
| StringFormat& operator=(const StringFormat&); | |
| Status updateStatus(Status newStatus) const | |
| { | |
| if (newStatus != Ok) lastStatus = newStatus; | |
| return newStatus; | |
| } | |
| GpStringFormat *nativeStringFormat; | |
| mutable Status lastStatus; | |
| }; | |
| // FIXME: do StringFormat::GenericDefault() et al. need to be thread safe? | |
| // FIXME: maybe put this in gdiplus.c? | |
| extern "C" void *_GdipStringFormatCachedGenericDefault; | |
| extern "C" void *_GdipStringFormatCachedGenericTypographic; | |
| __inline__ const StringFormat* StringFormat::GenericDefault() | |
| { | |
| if (!_GdipStringFormatCachedGenericDefault) { | |
| GpStringFormat *nativeStringFormat = 0; | |
| Status status = DllExports::GdipStringFormatGetGenericDefault( | |
| &nativeStringFormat); | |
| if (status == Ok && nativeStringFormat) { | |
| _GdipStringFormatCachedGenericDefault = (void*) | |
| new StringFormat(nativeStringFormat, Ok); | |
| } | |
| } | |
| return (StringFormat*) _GdipStringFormatCachedGenericDefault; | |
| } | |
| __inline__ const StringFormat* StringFormat::GenericTypographic() | |
| { | |
| if (!_GdipStringFormatCachedGenericTypographic) { | |
| GpStringFormat *nativeStringFormat = 0; | |
| Status status = DllExports::GdipStringFormatGetGenericTypographic( | |
| &nativeStringFormat); | |
| if (status == Ok && nativeStringFormat) { | |
| _GdipStringFormatCachedGenericTypographic = (void*) | |
| new StringFormat(nativeStringFormat, Ok); | |
| } | |
| } | |
| return (StringFormat*) _GdipStringFormatCachedGenericTypographic; | |
| } | |
| #endif /* __GDIPLUS_STRINGFORMAT_H */ |