252 lines
6.9 KiB
C
252 lines
6.9 KiB
C
|
/*
|
||
|
* 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 */
|