blob: b95d1c369af695e8026dd4af154905ffc08266c3 [file] [log] [blame]
/*
* 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 */