summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-xetex/layout/GlyphPositionAdjustments.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-xetex/layout/GlyphPositionAdjustments.h')
-rw-r--r--Build/source/libs/icu/icu-xetex/layout/GlyphPositionAdjustments.h376
1 files changed, 376 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-xetex/layout/GlyphPositionAdjustments.h b/Build/source/libs/icu/icu-xetex/layout/GlyphPositionAdjustments.h
new file mode 100644
index 00000000000..9c9e39bffe6
--- /dev/null
+++ b/Build/source/libs/icu/icu-xetex/layout/GlyphPositionAdjustments.h
@@ -0,0 +1,376 @@
+/*
+ *
+ * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
+ *
+ */
+
+#ifndef __GLYPHPOSITIONADJUSTMENTS_H
+#define __GLYPHPOSITIONADJUSTMENTS_H
+
+/**
+ * \file
+ * \internal
+ */
+
+#include "LETypes.h"
+#include "OpenTypeTables.h"
+
+U_NAMESPACE_BEGIN
+
+class LEGlyphStorage;
+class LEFontInstance;
+
+class GlyphPositionAdjustments : public UMemory
+{
+private:
+ class Adjustment : public UMemory {
+ public:
+
+ inline Adjustment();
+ inline Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff = -1);
+ inline ~Adjustment();
+
+ inline float getXPlacement() const;
+ inline float getYPlacement() const;
+ inline float getXAdvance() const;
+ inline float getYAdvance() const;
+
+ inline le_int32 getBaseOffset() const;
+
+ inline void setXPlacement(float newXPlacement);
+ inline void setYPlacement(float newYPlacement);
+ inline void setXAdvance(float newXAdvance);
+ inline void setYAdvance(float newYAdvance);
+
+ inline void setBaseOffset(le_int32 newBaseOffset);
+
+ inline void adjustXPlacement(float xAdjustment);
+ inline void adjustYPlacement(float yAdjustment);
+ inline void adjustXAdvance(float xAdjustment);
+ inline void adjustYAdvance(float yAdjustment);
+
+ private:
+ float xPlacement;
+ float yPlacement;
+ float xAdvance;
+ float yAdvance;
+
+ le_int32 baseOffset;
+
+ // allow copying of this class because all of its fields are simple types
+ };
+
+ class EntryExitPoint : public UMemory
+ {
+ public:
+ inline EntryExitPoint();
+ inline ~EntryExitPoint();
+
+ inline le_bool isCursiveGlyph() const;
+ inline le_bool baselineIsLogicalEnd() const;
+
+ LEPoint *getEntryPoint(LEPoint &entryPoint) const;
+ LEPoint *getExitPoint(LEPoint &exitPoint) const;
+
+ inline void clearEntryPoint();
+ inline void clearExitPoint();
+ inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
+ inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
+ inline void setCursiveGlyph(le_bool baselineIsLogicalEnd);
+
+ private:
+ enum EntryExitFlags
+ {
+ EEF_HAS_ENTRY_POINT = 0x80000000L,
+ EEF_HAS_EXIT_POINT = 0x40000000L,
+ EEF_IS_CURSIVE_GLYPH = 0x20000000L,
+ EEF_BASELINE_IS_LOGICAL_END = 0x10000000L
+ };
+
+ le_uint32 fFlags;
+ LEPoint fEntryPoint;
+ LEPoint fExitPoint;
+ };
+
+ le_int32 fGlyphCount;
+ EntryExitPoint *fEntryExitPoints;
+ Adjustment *fAdjustments;
+
+ GlyphPositionAdjustments();
+
+public:
+ GlyphPositionAdjustments(le_int32 glyphCount);
+ ~GlyphPositionAdjustments();
+
+ inline le_bool hasCursiveGlyphs() const;
+ inline le_bool isCursiveGlyph(le_int32 index) const;
+ inline le_bool baselineIsLogicalEnd(le_int32 index) const;
+
+ const LEPoint *getEntryPoint(le_int32 index, LEPoint &entryPoint) const;
+ const LEPoint *getExitPoint(le_int32 index, LEPoint &exitPoint) const;
+
+ inline float getXPlacement(le_int32 index) const;
+ inline float getYPlacement(le_int32 index) const;
+ inline float getXAdvance(le_int32 index) const;
+ inline float getYAdvance(le_int32 index) const;
+
+ inline le_int32 getBaseOffset(le_int32 index) const;
+
+ inline void setXPlacement(le_int32 index, float newXPlacement);
+ inline void setYPlacement(le_int32 index, float newYPlacement);
+ inline void setXAdvance(le_int32 index, float newXAdvance);
+ inline void setYAdvance(le_int32 index, float newYAdvance);
+
+ inline void setBaseOffset(le_int32 index, le_int32 newBaseOffset);
+
+ inline void adjustXPlacement(le_int32 index, float xAdjustment);
+ inline void adjustYPlacement(le_int32 index, float yAdjustment);
+ inline void adjustXAdvance(le_int32 index, float xAdjustment);
+ inline void adjustYAdvance(le_int32 index, float yAdjustment);
+
+ void clearEntryPoint(le_int32 index);
+ void clearExitPoint(le_int32 index);
+ void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
+ void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
+ void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd);
+
+ void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance);
+};
+
+inline GlyphPositionAdjustments::Adjustment::Adjustment()
+ : xPlacement(0), yPlacement(0), xAdvance(0), yAdvance(0), baseOffset(-1)
+{
+ // nothing else to do!
+}
+
+inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff)
+ : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff)
+{
+ // nothing else to do!
+}
+
+inline GlyphPositionAdjustments::Adjustment::~Adjustment()
+{
+ // nothing to do!
+}
+
+inline float GlyphPositionAdjustments::Adjustment::getXPlacement() const
+{
+ return xPlacement;
+}
+
+inline float GlyphPositionAdjustments::Adjustment::getYPlacement() const
+{
+ return yPlacement;
+}
+
+inline float GlyphPositionAdjustments::Adjustment::getXAdvance() const
+{
+ return xAdvance;
+}
+
+inline float GlyphPositionAdjustments::Adjustment::getYAdvance() const
+{
+ return yAdvance;
+}
+
+inline le_int32 GlyphPositionAdjustments::Adjustment::getBaseOffset() const
+{
+ return baseOffset;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::setXPlacement(float newXPlacement)
+{
+ xPlacement = newXPlacement;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::setYPlacement(float newYPlacement)
+{
+ yPlacement = newYPlacement;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::setXAdvance(float newXAdvance)
+{
+ xAdvance = newXAdvance;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::setYAdvance(float newYAdvance)
+{
+ yAdvance = newYAdvance;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::setBaseOffset(le_int32 newBaseOffset)
+{
+ baseOffset = newBaseOffset;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::adjustXPlacement(float xAdjustment)
+{
+ xPlacement += xAdjustment;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::adjustYPlacement(float yAdjustment)
+{
+ yPlacement += yAdjustment;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::adjustXAdvance(float xAdjustment)
+{
+ xAdvance += xAdjustment;
+}
+
+inline void GlyphPositionAdjustments::Adjustment::adjustYAdvance(float yAdjustment)
+{
+ yAdvance += yAdjustment;
+}
+
+inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint()
+ : fFlags(0)
+{
+ fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fExitPoint.fY = 0;
+}
+
+inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint()
+{
+ // nothing special to do
+}
+
+inline le_bool GlyphPositionAdjustments::EntryExitPoint::isCursiveGlyph() const
+{
+ return (fFlags & EEF_IS_CURSIVE_GLYPH) != 0;
+}
+
+inline le_bool GlyphPositionAdjustments::EntryExitPoint::baselineIsLogicalEnd() const
+{
+ return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0;
+}
+
+inline void GlyphPositionAdjustments::EntryExitPoint::clearEntryPoint()
+{
+ fFlags &= ~EEF_HAS_ENTRY_POINT;
+}
+
+inline void GlyphPositionAdjustments::EntryExitPoint::clearExitPoint()
+{
+ fFlags &= ~EEF_HAS_EXIT_POINT;
+}
+
+inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd)
+{
+ if (baselineIsLogicalEnd) {
+ fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
+ } else {
+ fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH);
+ }
+
+ fEntryPoint = newEntryPoint;
+}
+
+inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd)
+{
+ if (baselineIsLogicalEnd) {
+ fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
+ } else {
+ fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH);
+ }
+
+ fExitPoint = newExitPoint;
+}
+
+inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd)
+{
+ if (baselineIsLogicalEnd) {
+ fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
+ } else {
+ fFlags |= EEF_IS_CURSIVE_GLYPH;
+ }
+}
+
+inline le_bool GlyphPositionAdjustments::isCursiveGlyph(le_int32 index) const
+{
+ return fEntryExitPoints != NULL && fEntryExitPoints[index].isCursiveGlyph();
+}
+
+inline le_bool GlyphPositionAdjustments::baselineIsLogicalEnd(le_int32 index) const
+{
+ return fEntryExitPoints != NULL && fEntryExitPoints[index].baselineIsLogicalEnd();
+}
+
+inline float GlyphPositionAdjustments::getXPlacement(le_int32 index) const
+{
+ return fAdjustments[index].getXPlacement();
+}
+
+inline float GlyphPositionAdjustments::getYPlacement(le_int32 index) const
+{
+ return fAdjustments[index].getYPlacement();
+}
+
+inline float GlyphPositionAdjustments::getXAdvance(le_int32 index) const
+{
+ return fAdjustments[index].getXAdvance();
+}
+
+inline float GlyphPositionAdjustments::getYAdvance(le_int32 index) const
+{
+ return fAdjustments[index].getYAdvance();
+}
+
+
+inline le_int32 GlyphPositionAdjustments::getBaseOffset(le_int32 index) const
+{
+ return fAdjustments[index].getBaseOffset();
+}
+
+inline void GlyphPositionAdjustments::setXPlacement(le_int32 index, float newXPlacement)
+{
+ fAdjustments[index].setXPlacement(newXPlacement);
+}
+
+inline void GlyphPositionAdjustments::setYPlacement(le_int32 index, float newYPlacement)
+{
+ fAdjustments[index].setYPlacement(newYPlacement);
+}
+
+inline void GlyphPositionAdjustments::setXAdvance(le_int32 index, float newXAdvance)
+{
+ fAdjustments[index].setXAdvance(newXAdvance);
+}
+
+inline void GlyphPositionAdjustments::setYAdvance(le_int32 index, float newYAdvance)
+{
+ fAdjustments[index].setYAdvance(newYAdvance);
+}
+
+inline void GlyphPositionAdjustments::setBaseOffset(le_int32 index, le_int32 newBaseOffset)
+{
+ fAdjustments[index].setBaseOffset(newBaseOffset);
+}
+
+inline void GlyphPositionAdjustments::adjustXPlacement(le_int32 index, float xAdjustment)
+{
+ fAdjustments[index].adjustXPlacement(xAdjustment);
+}
+
+inline void GlyphPositionAdjustments::adjustYPlacement(le_int32 index, float yAdjustment)
+{
+ fAdjustments[index].adjustYPlacement(yAdjustment);
+}
+
+inline void GlyphPositionAdjustments::adjustXAdvance(le_int32 index, float xAdjustment)
+{
+ fAdjustments[index].adjustXAdvance(xAdjustment);
+}
+
+inline void GlyphPositionAdjustments::adjustYAdvance(le_int32 index, float yAdjustment)
+{
+ fAdjustments[index].adjustYAdvance(yAdjustment);
+}
+
+inline le_bool GlyphPositionAdjustments::hasCursiveGlyphs() const
+{
+ return fEntryExitPoints != NULL;
+}
+
+U_NAMESPACE_END
+#endif