summaryrefslogtreecommitdiff
path: root/Build/source/libs/graphite-engine/include/graphite/SegmentPainter.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/graphite-engine/include/graphite/SegmentPainter.h')
-rw-r--r--Build/source/libs/graphite-engine/include/graphite/SegmentPainter.h233
1 files changed, 233 insertions, 0 deletions
diff --git a/Build/source/libs/graphite-engine/include/graphite/SegmentPainter.h b/Build/source/libs/graphite-engine/include/graphite/SegmentPainter.h
new file mode 100644
index 00000000000..caa7d445690
--- /dev/null
+++ b/Build/source/libs/graphite-engine/include/graphite/SegmentPainter.h
@@ -0,0 +1,233 @@
+/*--------------------------------------------------------------------*//*:Ignore this sentence.
+Copyright (C) 1999, 2001 SIL International. All rights reserved.
+
+Distributable under the terms of either the Common Public License or the
+GNU Lesser General Public License, as specified in the LICENSING.txt file.
+
+File: SegmentPainter.h
+Responsibility: Sharon Correll
+Last reviewed: Not yet.
+
+Description:
+ Defines the class for a Graphite text segment.
+----------------------------------------------------------------------------------------------*/
+#ifdef _MSC_VER
+#pragma once
+#endif
+#ifndef GR_SEGPAINTER_INCLUDED
+#define GR_SEGPAINTER_INCLUDED
+
+// undo automagic DrawTextA DrawTextW stuff
+// #undef DrawText
+
+//:End Ignore
+
+
+namespace gr
+{
+
+ class Segment;
+/*----------------------------------------------------------------------------------------------
+ A SegmentPainter handles the UI-related operations on for segment.
+
+ This superclass does not know how to do any actual drawing, because it has no access
+ to a device. Subclasses are needed to handle drawing on the various platforms. In addition,
+ it is legitimate to make a subclass to override the behavior of a specific piece of
+ functionality.
+
+ Hungarian: segp
+----------------------------------------------------------------------------------------------*/
+class SegmentPainter
+{
+public:
+ // Static methods
+
+ // Constructors/destructors/etc.
+ SegmentPainter(Segment * pseg, float xOrigin = 0, float yOrigin = 0);
+ //SegmentPainter(Segment * pseg, float xOrigin, float yOrigin);
+
+ virtual ~SegmentPainter();
+
+ virtual void setOrigin(float xsOrigin, float ysOrigin);
+ virtual void setPosition(float xdPosition, float ydPosition);
+ virtual void setScalingFactors(float xFactor, float yFactor);
+
+ virtual void setBuggyDisplayFormat(int strategy, long textColor, long backColor,
+ long underlineColor)
+ {
+ // Currently not implemented to do anything useful.
+ }
+
+ // The paint method must be implemented by a concrete subclass:
+ virtual void paint() = 0;
+
+ virtual void drawInsertionPoint(int ichwIP, bool fAssocPrev, bool bOn, bool fForceSplit);
+ virtual void positionsOfIP(int ichwIP, bool fAssocPrev, bool fForceSplit,
+ Rect * prdPrimary, Rect * prdSecondary);
+ virtual bool drawSelectionRange(int ichwMin, int ichwLim,
+ float ydTop, float ydBottom, bool bOn);
+ virtual bool positionsOfRange(int ichwMin, int ichwLim,
+ float ydTop, float ydBottom, Rect * prsBounds);
+ virtual size_t getUnderlinePlacement(int ichwMin, int ichwLim,
+ bool fSkipSpace,
+ size_t crgMax, // number of ranges allowed
+ float * prgxdLefts, float * prgxdRights, float * prgydUnderline);
+
+ virtual void pointToChar(Point zptdClickPosition, int * pichw, bool * pfAssocPrev);
+ virtual LgIpValidResult isValidInsertionPoint(int ichwIP);
+ virtual bool doBoundariesCoincide(bool fBoundaryEnd, bool fBoundaryRight);
+ virtual int arrowKeyPosition(int ichwIP, bool * pfAssocPrev,
+ bool fRight, bool * pfInThisSeg);
+ virtual int extendSelectionPosition(
+ int charIndex, bool assocPrevMatch, bool assocPrevNeeded,
+ int anchorIndex, bool movingRight, bool * inThisSeg);
+
+
+ // For calculating underlines:
+ struct LineSeg { // hungarian: ls
+ float left;
+ float right;
+ };
+
+
+ static float ScaleX(float xs, Rect rs, Rect rd);
+ static float ScaleY(float ys, Rect rs, Rect rd);
+
+ float ScaleXToDest(float xs)
+ {
+ float xd = ((xs + m_xsOrigin) * m_xFactor) + m_xdPosition;
+ return xd;
+ }
+ //int ScaleXToDest(int xs)
+ //{
+ // int xd = (((xs + m_xsOriginInt) * m_xFactor64) >> 6) + m_xdPositionInt;
+ // return xd; // >> 6 means div by 64
+ //}
+ float ScaleYToDest(float ys)
+ {
+ float yd = ((ys + m_ysOrigin) * m_yFactor) + m_ydPosition;
+ return yd;
+ }
+
+ float ScaleXToSource(float xd)
+ {
+ float xs = ((xd - m_xdPosition) / m_xFactor) - m_xsOrigin;
+ return xs;
+ }
+ float ScaleYToSource(float yd)
+ {
+ float ys = ((yd - m_ydPosition) / m_yFactor) - m_ysOrigin;
+ return ys;
+ }
+
+protected:
+ // Member variables:
+
+ Segment * m_pseg;
+
+ // transformation factors:
+ float m_xsOrigin;
+ float m_ysOrigin;
+ float m_xdPosition;
+ float m_ydPosition;
+ float m_xFactor; // destination / source
+ float m_yFactor; // destination / source
+
+ // optimizations for when we need integer arithmetic (converting between int and float is
+ // very slow) - DELETE these.
+ //int m_xsOriginInt;
+ //int m_xdPositionInt;
+ //int m_xFactor64;
+
+ //gr::Rect m_rectSrc;
+
+ // Other methods:
+
+ void CalcOrDrawInsertionPoint(
+ int ich, bool fAssocPrev, bool bOn, bool fForceSplit,
+ Rect * prectPrimary, Rect * prectSecondary);
+ void InvertIBeam(float xs, float ysTop, float ysBottom, bool fAssocPrev,
+ Rect * prdRet);
+ void InvertSplitIP(float xs, float ysTop, float ysBottom,
+ bool fTop, bool fAssocRight, bool fSecondary, float ysMinSplitHt,
+ Rect * prdRet);
+ void CalcIP(int ichw, bool fBefore,
+ float * pxs, float * pysTop, float * pysBottom, bool * pfRtl);
+ bool CloseIPPositions(
+ float * pxsBefore, float ysBeforeTop, float ysBeforeBottom,
+ float * pxsAfter, float ysAfterTop, float ysAfterBottom);
+ bool AtEdgeOfCluster(GrSlotOutput * pslout, int islout, bool fBefore);
+ bool CanInsertIntoCluster(GrSlotOutput * pslout, int islout);
+
+ void CalcPartialLigatures(bool * prgfAllSelected,
+ int ichwMinSeg, int ichwLimSeg,
+ int ichwMinSel, int ichwLimSel);
+ void CalcHighlightRect(int ichw,
+ std::vector<Rect> & vrs, std::vector<bool> & vfEntireLineHt,
+ bool fJustComponent, bool * rgfHighlighted, bool fSkipTrSpace);
+ void CalcCompleteCluster(int islout,
+ std::vector<Rect> & vrs, std::vector<bool> & vfEntireLineHt, bool * prgfHighlighted);
+ void AddRectWithoutOverlaps(std::vector<Rect> & vrect, Rect rectToAdd);
+ bool AnyArea(Rect * prect);
+ bool AdjustRectsToNotOverlap(std::vector<Rect> & vrect, int irect, Rect * prect2,
+ std::vector<Rect> & vrectMoreToAdd);
+ void AssertNoOverlaps(std::vector<Rect> & vrect);
+
+ void AddLineSegWithoutOverlaps(std::vector<LineSeg> & vls, LineSeg lsToAdd);
+ bool AnyLength(LineSeg * pls);
+ bool AdjustLineSegsToNotOverlap(std::vector<LineSeg> & vls, int ils, LineSeg * pls2,
+ std::vector<LineSeg> & vlsMoreToAdd);
+ void AssertNoOverlaps(std::vector<LineSeg> & vls);
+
+ GrResult ArrowKeyPositionAux(int * pichwIP, bool * pfAssocPrev,
+ bool fRight, bool fMovingIn,
+ bool fAssocPrevMatch, bool fAssocPrevNeeded,
+ bool * pfResult);
+ bool ArrowKeyPositionInternal(int * pichw, bool * pfAssocPrev,
+ bool fRight, bool fAssocPrevMatch, bool fAssocPrevNeeded, int * nNextOrPrevSeg);
+ bool AdjacentLigComponent(int * pichw, bool * pfAssocPrev, bool fRight, bool fMove);
+
+ int PointToCharAux(float xsTry, float ysTry,
+ float * pxsGlyphOffset, float * pxsGlyphWidth);
+
+ // Platform-specific routines:
+
+ GrResult DrawSegmentPlatform(float xs, float ys);
+
+ // Low-level routines--these must be implemented appropriate by subclasses:
+
+ virtual void InvertRect(float xLeft, float yTop, float xRight, float yBottom)
+ {
+ GrAssert(false); // no device context
+ }
+
+ //void SetFontProps();
+ virtual void SetFontProps(unsigned long clrFore, unsigned long clrBack);
+
+};
+
+/*----------------------------------------------------------------------------------------------
+ This is a subclass of SegmentPainter for which the paint operation is unnecessary.
+----------------------------------------------------------------------------------------------*/
+class SegmentNonPainter : public SegmentPainter
+{
+public:
+ SegmentNonPainter(Segment * pseg)
+ : SegmentPainter(pseg)
+ {
+ }
+
+ void paint()
+ {
+ GrAssert(false);
+ throw;
+ }
+};
+
+} // namespace gr
+
+#if defined(GR_NO_NAMESPACE)
+using namespace gr;
+#endif
+
+#endif // !GR_SEGPAINTER_INCLUDED