#ifndef TextRun_h
#define TextRun_h
#include "PlatformString.h"
#include "TextDirection.h"
namespace WebCore {
class RenderObject;
class RenderSVGResource;
class TextRun {
public:
enum ExpansionBehaviorFlags {
ForbidTrailingExpansion = 0 << 0,
AllowTrailingExpansion = 1 << 0,
ForbidLeadingExpansion = 0 << 1,
AllowLeadingExpansion = 1 << 1,
};
typedef unsigned ExpansionBehavior;
enum RoundingHackFlags {
NoRounding = 0,
RunRounding = 1 << 0,
WordRounding = 1 << 1,
};
typedef unsigned RoundingHacks;
TextRun(const UChar* c, int len, bool allowTabs = false, float xpos = 0, float expansion = 0, ExpansionBehavior expansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion, TextDirection direction = LTR, bool directionalOverride = false, RoundingHacks roundingHacks = RunRounding | WordRounding)
: m_characters(c)
, m_len(len)
, m_xpos(xpos)
, m_expansion(expansion)
, m_expansionBehavior(expansionBehavior)
#if ENABLE(SVG)
, m_horizontalGlyphStretch(1)
#endif
, m_allowTabs(allowTabs)
, m_direction(direction)
, m_directionalOverride(directionalOverride)
, m_applyRunRounding((roundingHacks & RunRounding) && s_allowsRoundingHacks)
, m_applyWordRounding((roundingHacks & WordRounding) && s_allowsRoundingHacks)
, m_disableSpacing(false)
#if ENABLE(SVG_FONTS)
, m_referencingRenderObject(0)
, m_activePaintingResource(0)
#endif
{
}
TextRun(const String& s, bool allowTabs = false, float xpos = 0, float expansion = 0, ExpansionBehavior expansionBehavior = AllowTrailingExpansion | ForbidLeadingExpansion, TextDirection direction = LTR, bool directionalOverride = false, RoundingHacks roundingHacks = RunRounding | WordRounding)
: m_characters(s.characters())
, m_len(s.length())
, m_xpos(xpos)
, m_expansion(expansion)
, m_expansionBehavior(expansionBehavior)
#if ENABLE(SVG)
, m_horizontalGlyphStretch(1)
#endif
, m_allowTabs(allowTabs)
, m_direction(direction)
, m_directionalOverride(directionalOverride)
, m_applyRunRounding((roundingHacks & RunRounding) && s_allowsRoundingHacks)
, m_applyWordRounding((roundingHacks & WordRounding) && s_allowsRoundingHacks)
, m_disableSpacing(false)
#if ENABLE(SVG_FONTS)
, m_referencingRenderObject(0)
, m_activePaintingResource(0)
#endif
{
}
UChar operator[](int i) const { ASSERT(i >= 0 && i < m_len); return m_characters[i]; }
const UChar* data(int i) const { ASSERT(i >= 0 && i < m_len); return &m_characters[i]; }
const UChar* characters() const { return m_characters; }
int length() const { return m_len; }
void setText(const UChar* c, int len) { m_characters = c; m_len = len; }
#if ENABLE(SVG)
float horizontalGlyphStretch() const { return m_horizontalGlyphStretch; }
void setHorizontalGlyphStretch(float scale) { m_horizontalGlyphStretch = scale; }
#endif
bool allowTabs() const { return m_allowTabs; }
float xPos() const { return m_xpos; }
float expansion() const { return m_expansion; }
bool allowsLeadingExpansion() const { return m_expansionBehavior & AllowLeadingExpansion; }
bool allowsTrailingExpansion() const { return m_expansionBehavior & AllowTrailingExpansion; }
TextDirection direction() const { return m_direction; }
bool rtl() const { return m_direction == RTL; }
bool ltr() const { return m_direction == LTR; }
bool directionalOverride() const { return m_directionalOverride; }
bool applyRunRounding() const { return m_applyRunRounding; }
bool applyWordRounding() const { return m_applyWordRounding; }
bool spacingDisabled() const { return m_disableSpacing; }
void disableSpacing() { m_disableSpacing = true; }
void disableRoundingHacks() { m_applyRunRounding = m_applyWordRounding = false; }
void setDirection(TextDirection direction) { m_direction = direction; }
void setDirectionalOverride(bool override) { m_directionalOverride = override; }
#if ENABLE(SVG_FONTS)
RenderObject* referencingRenderObject() const { return m_referencingRenderObject; }
void setReferencingRenderObject(RenderObject* object) { m_referencingRenderObject = object; }
RenderSVGResource* activePaintingResource() const { return m_activePaintingResource; }
void setActivePaintingResource(RenderSVGResource* object) { m_activePaintingResource = object; }
#endif
static void setAllowsRoundingHacks(bool);
static bool allowsRoundingHacks();
private:
static bool s_allowsRoundingHacks;
const UChar* m_characters;
int m_len;
float m_xpos;
float m_expansion;
ExpansionBehavior m_expansionBehavior;
#if ENABLE(SVG)
float m_horizontalGlyphStretch;
#endif
bool m_allowTabs;
TextDirection m_direction;
bool m_directionalOverride; bool m_applyRunRounding;
bool m_applyWordRounding;
bool m_disableSpacing;
#if ENABLE(SVG_FONTS)
RenderObject* m_referencingRenderObject;
RenderSVGResource* m_activePaintingResource;
#endif
};
}
#endif