sl@0: /* sl@0: * sl@0: * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #ifndef __GLYPHPOSITIONADJUSTMENTS_H sl@0: #define __GLYPHPOSITIONADJUSTMENTS_H sl@0: sl@0: /** sl@0: * \file sl@0: * \internal sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "OpenTypeTables.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: class LEGlyphStorage; sl@0: class LEFontInstance; sl@0: sl@0: class GlyphPositionAdjustments : public UMemory sl@0: { sl@0: private: sl@0: class Adjustment : public UMemory { sl@0: public: sl@0: sl@0: inline Adjustment(); sl@0: inline Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff = -1); sl@0: inline ~Adjustment(); sl@0: sl@0: inline float getXPlacement() const; sl@0: inline float getYPlacement() const; sl@0: inline float getXAdvance() const; sl@0: inline float getYAdvance() const; sl@0: sl@0: inline le_int32 getBaseOffset() const; sl@0: sl@0: inline void setXPlacement(float newXPlacement); sl@0: inline void setYPlacement(float newYPlacement); sl@0: inline void setXAdvance(float newXAdvance); sl@0: inline void setYAdvance(float newYAdvance); sl@0: sl@0: inline void setBaseOffset(le_int32 newBaseOffset); sl@0: sl@0: inline void adjustXPlacement(float xAdjustment); sl@0: inline void adjustYPlacement(float yAdjustment); sl@0: inline void adjustXAdvance(float xAdjustment); sl@0: inline void adjustYAdvance(float yAdjustment); sl@0: sl@0: private: sl@0: float xPlacement; sl@0: float yPlacement; sl@0: float xAdvance; sl@0: float yAdvance; sl@0: sl@0: le_int32 baseOffset; sl@0: sl@0: // allow copying of this class because all of its fields are simple types sl@0: }; sl@0: sl@0: class EntryExitPoint : public UMemory sl@0: { sl@0: public: sl@0: inline EntryExitPoint(); sl@0: inline ~EntryExitPoint(); sl@0: sl@0: inline le_bool isCursiveGlyph() const; sl@0: inline le_bool baselineIsLogicalEnd() const; sl@0: sl@0: LEPoint *getEntryPoint(LEPoint &entryPoint) const; sl@0: LEPoint *getExitPoint(LEPoint &exitPoint) const; sl@0: sl@0: inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); sl@0: inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); sl@0: inline void setCursiveGlyph(le_bool baselineIsLogicalEnd); sl@0: sl@0: private: sl@0: enum EntryExitFlags sl@0: { sl@0: EEF_HAS_ENTRY_POINT = 0x80000000L, sl@0: EEF_HAS_EXIT_POINT = 0x40000000L, sl@0: EEF_IS_CURSIVE_GLYPH = 0x20000000L, sl@0: EEF_BASELINE_IS_LOGICAL_END = 0x10000000L sl@0: }; sl@0: sl@0: le_uint32 fFlags; sl@0: LEPoint fEntryPoint; sl@0: LEPoint fExitPoint; sl@0: }; sl@0: sl@0: le_int32 fGlyphCount; sl@0: EntryExitPoint *fEntryExitPoints; sl@0: Adjustment *fAdjustments; sl@0: sl@0: GlyphPositionAdjustments(); sl@0: sl@0: public: sl@0: GlyphPositionAdjustments(le_int32 glyphCount); sl@0: ~GlyphPositionAdjustments(); sl@0: sl@0: inline le_bool hasCursiveGlyphs() const; sl@0: inline le_bool isCursiveGlyph(le_int32 index) const; sl@0: inline le_bool baselineIsLogicalEnd(le_int32 index) const; sl@0: sl@0: const LEPoint *getEntryPoint(le_int32 index, LEPoint &entryPoint) const; sl@0: const LEPoint *getExitPoint(le_int32 index, LEPoint &exitPoint) const; sl@0: sl@0: inline float getXPlacement(le_int32 index) const; sl@0: inline float getYPlacement(le_int32 index) const; sl@0: inline float getXAdvance(le_int32 index) const; sl@0: inline float getYAdvance(le_int32 index) const; sl@0: sl@0: inline le_int32 getBaseOffset(le_int32 index) const; sl@0: sl@0: inline void setXPlacement(le_int32 index, float newXPlacement); sl@0: inline void setYPlacement(le_int32 index, float newYPlacement); sl@0: inline void setXAdvance(le_int32 index, float newXAdvance); sl@0: inline void setYAdvance(le_int32 index, float newYAdvance); sl@0: sl@0: inline void setBaseOffset(le_int32 index, le_int32 newBaseOffset); sl@0: sl@0: inline void adjustXPlacement(le_int32 index, float xAdjustment); sl@0: inline void adjustYPlacement(le_int32 index, float yAdjustment); sl@0: inline void adjustXAdvance(le_int32 index, float xAdjustment); sl@0: inline void adjustYAdvance(le_int32 index, float yAdjustment); sl@0: sl@0: void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); sl@0: void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); sl@0: void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd); sl@0: sl@0: void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance); sl@0: }; sl@0: sl@0: inline GlyphPositionAdjustments::Adjustment::Adjustment() sl@0: : xPlacement(0), yPlacement(0), xAdvance(0), yAdvance(0), baseOffset(-1) sl@0: { sl@0: // nothing else to do! sl@0: } sl@0: sl@0: inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff) sl@0: : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff) sl@0: { sl@0: // nothing else to do! sl@0: } sl@0: sl@0: inline GlyphPositionAdjustments::Adjustment::~Adjustment() sl@0: { sl@0: // nothing to do! sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::Adjustment::getXPlacement() const sl@0: { sl@0: return xPlacement; sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::Adjustment::getYPlacement() const sl@0: { sl@0: return yPlacement; sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::Adjustment::getXAdvance() const sl@0: { sl@0: return xAdvance; sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::Adjustment::getYAdvance() const sl@0: { sl@0: return yAdvance; sl@0: } sl@0: sl@0: inline le_int32 GlyphPositionAdjustments::Adjustment::getBaseOffset() const sl@0: { sl@0: return baseOffset; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::setXPlacement(float newXPlacement) sl@0: { sl@0: xPlacement = newXPlacement; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::setYPlacement(float newYPlacement) sl@0: { sl@0: yPlacement = newYPlacement; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::setXAdvance(float newXAdvance) sl@0: { sl@0: xAdvance = newXAdvance; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::setYAdvance(float newYAdvance) sl@0: { sl@0: yAdvance = newYAdvance; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::setBaseOffset(le_int32 newBaseOffset) sl@0: { sl@0: baseOffset = newBaseOffset; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::adjustXPlacement(float xAdjustment) sl@0: { sl@0: xPlacement += xAdjustment; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::adjustYPlacement(float yAdjustment) sl@0: { sl@0: yPlacement += yAdjustment; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::adjustXAdvance(float xAdjustment) sl@0: { sl@0: xAdvance += xAdjustment; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::Adjustment::adjustYAdvance(float yAdjustment) sl@0: { sl@0: yAdvance += yAdjustment; sl@0: } sl@0: sl@0: inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint() sl@0: : fFlags(0) sl@0: { sl@0: fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fEntryPoint.fY = 0; sl@0: } sl@0: sl@0: inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint() sl@0: { sl@0: // nothing special to do sl@0: } sl@0: sl@0: inline le_bool GlyphPositionAdjustments::EntryExitPoint::isCursiveGlyph() const sl@0: { sl@0: return (fFlags & EEF_IS_CURSIVE_GLYPH) != 0; sl@0: } sl@0: sl@0: inline le_bool GlyphPositionAdjustments::EntryExitPoint::baselineIsLogicalEnd() const sl@0: { sl@0: return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) sl@0: { sl@0: if (baselineIsLogicalEnd) { sl@0: fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); sl@0: } else { sl@0: fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH); sl@0: } sl@0: sl@0: fEntryPoint = newEntryPoint; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) sl@0: { sl@0: if (baselineIsLogicalEnd) { sl@0: fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); sl@0: } else { sl@0: fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH); sl@0: } sl@0: sl@0: fExitPoint = newExitPoint; sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd) sl@0: { sl@0: if (baselineIsLogicalEnd) { sl@0: fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); sl@0: } else { sl@0: fFlags |= EEF_IS_CURSIVE_GLYPH; sl@0: } sl@0: } sl@0: sl@0: inline le_bool GlyphPositionAdjustments::isCursiveGlyph(le_int32 index) const sl@0: { sl@0: return fEntryExitPoints != NULL && fEntryExitPoints[index].isCursiveGlyph(); sl@0: } sl@0: sl@0: inline le_bool GlyphPositionAdjustments::baselineIsLogicalEnd(le_int32 index) const sl@0: { sl@0: return fEntryExitPoints != NULL && fEntryExitPoints[index].baselineIsLogicalEnd(); sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::getXPlacement(le_int32 index) const sl@0: { sl@0: return fAdjustments[index].getXPlacement(); sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::getYPlacement(le_int32 index) const sl@0: { sl@0: return fAdjustments[index].getYPlacement(); sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::getXAdvance(le_int32 index) const sl@0: { sl@0: return fAdjustments[index].getXAdvance(); sl@0: } sl@0: sl@0: inline float GlyphPositionAdjustments::getYAdvance(le_int32 index) const sl@0: { sl@0: return fAdjustments[index].getYAdvance(); sl@0: } sl@0: sl@0: sl@0: inline le_int32 GlyphPositionAdjustments::getBaseOffset(le_int32 index) const sl@0: { sl@0: return fAdjustments[index].getBaseOffset(); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::setXPlacement(le_int32 index, float newXPlacement) sl@0: { sl@0: fAdjustments[index].setXPlacement(newXPlacement); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::setYPlacement(le_int32 index, float newYPlacement) sl@0: { sl@0: fAdjustments[index].setYPlacement(newYPlacement); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::setXAdvance(le_int32 index, float newXAdvance) sl@0: { sl@0: fAdjustments[index].setXAdvance(newXAdvance); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::setYAdvance(le_int32 index, float newYAdvance) sl@0: { sl@0: fAdjustments[index].setYAdvance(newYAdvance); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::setBaseOffset(le_int32 index, le_int32 newBaseOffset) sl@0: { sl@0: fAdjustments[index].setBaseOffset(newBaseOffset); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::adjustXPlacement(le_int32 index, float xAdjustment) sl@0: { sl@0: fAdjustments[index].adjustXPlacement(xAdjustment); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::adjustYPlacement(le_int32 index, float yAdjustment) sl@0: { sl@0: fAdjustments[index].adjustYPlacement(yAdjustment); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::adjustXAdvance(le_int32 index, float xAdjustment) sl@0: { sl@0: fAdjustments[index].adjustXAdvance(xAdjustment); sl@0: } sl@0: sl@0: inline void GlyphPositionAdjustments::adjustYAdvance(le_int32 index, float yAdjustment) sl@0: { sl@0: fAdjustments[index].adjustYAdvance(yAdjustment); sl@0: } sl@0: sl@0: inline le_bool GlyphPositionAdjustments::hasCursiveGlyphs() const sl@0: { sl@0: return fEntryExitPoints != NULL; sl@0: } sl@0: sl@0: U_NAMESPACE_END sl@0: #endif