summaryrefslogtreecommitdiff
path: root/Build/source/libs/graphite-engine/include/graphite/Segment.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/graphite-engine/include/graphite/Segment.h')
-rw-r--r--Build/source/libs/graphite-engine/include/graphite/Segment.h627
1 files changed, 0 insertions, 627 deletions
diff --git a/Build/source/libs/graphite-engine/include/graphite/Segment.h b/Build/source/libs/graphite-engine/include/graphite/Segment.h
deleted file mode 100644
index 41443c27f53..00000000000
--- a/Build/source/libs/graphite-engine/include/graphite/Segment.h
+++ /dev/null
@@ -1,627 +0,0 @@
-/*--------------------------------------------------------------------*//*: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: Segment.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_SEGMENT_INCLUDED
-#define GR_SEGMENT_INCLUDED
-
-#include "Font.h"
-#include "GrConstants.h"
-#include "SegmentAux.h"
-
-// undo automagic DrawTextA DrawTextW stuff
-// #undef DrawText
-
-//:End Ignore
-
-namespace gr
-{
-class GrEngine;
-class SegmentMemoryUsage;
-
-class IGrJustifier;
-class GrTableManager;
-class GrSlotStream;
-class GrSlotOutput;
-
-/*----------------------------------------------------------------------------------------------
- A Graphite segment consists of a sequence of well-positioned glyphs all on one line,
- Each glyph understands its relationship to the underlying text that was used to generate
- the segment.
-
- Hungarian: seg
-----------------------------------------------------------------------------------------------*/
-class Segment
-{
- friend class GrEngine;
- friend class SegmentPainter;
- friend class GlyphInfo;
- friend class GlyphIterator;
- friend class GlyphSetIterator;
- friend class SegmentMemoryUsage;
-
-public:
- // Static methods
-
- // Constructors, destructors, etc.
- Segment();
-// Segment(ITextSource * pgts, int ichMin, int ichLim,
-// LineBrk lbStart, LineBrk lbEnd,
-// bool fStartLine, bool fEndLine, bool fWsRtl);
-
- virtual ~Segment();
-
- // Basic copy constructor:
- Segment(Segment & seg);
-
- // For making modified copies of segments:
- static Segment * LineContextSegment(Segment & seg, bool fStartLine, bool fEndLine);
- static Segment * JustifiedSegment(Segment & seg, float xsNewWidth);
- static Segment * WhiteSpaceSegment(Segment & seg, int newDirDepth);
-
- static int GetSegmentCount();
-
-public:
-
- long IncRefCount();
- long DecRefCount();
-
- Font & getFont();
- ITextSource & getText();
- float advanceWidth();
- Rect boundingRect();
-
- bool rightToLeft();
- bool paraRightToLeft() { return m_fParaRtl; }
- int directionDepth(bool * pfWeak = NULL);
- bool setDirectionDepth(int nNewDepth);
- int startCharacter();
- int stopCharacter();
- bool startOfLine();
- bool endOfLine();
- bool hasLineBoundaryContext();
- SegEnd segmentTermination();
- LineBrk startBreakWeight();
- LineBrk endBreakWeight();
- float stretch();
- float maxStretch();
- float maxShrink();
- void setTextSourceOffset(int ichMin)
- {
- m_ichwMin = ichMin;
- }
-
- //GrResult changeLineEnds(bool fNewStart, bool fNewEnd);
-
- std::pair<GlyphIterator, GlyphIterator> glyphs();
- std::pair<GlyphSetIterator, GlyphSetIterator> charToGlyphs(toffset ich);
-
- // OBSOLETE:
- GrResult GetCharData(int cchMax, utf16 * prgch, int * pcchRet);
- GrResult GlyphToChar(int iginf, bool fFirst, int * pich);
- GrResult GlyphToAllChars(int iginf, int cichMax, int * prgich, int *pcichRet);
- GrResult CharToGlyph(int ich, bool fFirst, int * pigbb);
-
- // Not part of FW interface:
-
- float getRangeWidth(int ichMin, int ichLim,
- bool fStartLine = true, bool fEndLine = true, bool fSkipSpace = true);
- int findNextBreakPoint(int ichStart,
- LineBrk lbPref, LineBrk lbWorst, float dxMaxWidth,
- float * pdxBreakWidth, bool fStartLine = true, bool fEndLine = true);
-
- GrResult getUniscribeClusters(
- int * prgigbb1stOfCluster, int cchMax, int * pcch,
- bool * pfClusterStart, int cfMax, int * pcf);
-
- //GrResult GetGlyphsAndPositions(
- // Rect rsArg, Rect rdArg, int cgidMax, int * pcgidRet, utf16 * prggid,
- // float * prgxd, float * prgyd, float * prgdxdAdv);
- //GrResult GetUniscribePositions(
- // Rect rs, Rect rd, int cgidMax, int * pcgidRet,
- // float * prgxd, float * prgyd, float * prgdxdAdv);
- //GrResult GetUniscribeGlyphsAndPositions(
- // Rect rsArg, Rect rdArg, int cgidMax, int * pcchRet, utf16 * prgchGlyphs,
- // float * prgxd, float * prgyd, float * prgdxdAdv);
-
- // Other public methods:
-
- void Initialize(ITextSource * pgts, int ichMin, int ichLim,
- LineBrk lbStart, LineBrk lbEnd, SegEnd est,
- bool fStartLine, bool fEndLine, bool fWsRtl);
- void DestroyContents();
- void SwapWith(Segment * pgrseg);
- void ClearAltEndLineSeg();
-
- ITextSource * GetString(); // client is responsible to Release()
-
- // The following three functions handle storing and retrieving information that
- // allows us to restart a new segment following a line break. This is necessary
- // in case there is some sort of contextualization across the line break.
- void StoreRestartInfo(int cslotRestartBackup, std::vector<int>& vnSkipOffsets)
- {
- m_cslotRestartBackup = cslotRestartBackup;
- m_vnSkipOffsets.resize(vnSkipOffsets.size());
- for (size_t i = 0; i < vnSkipOffsets.size(); i++)
- m_vnSkipOffsets[i] = sdata8(vnSkipOffsets[i]);
- }
- int NextRestartBackup()
- {
- return m_cslotRestartBackup;
- }
- int RestartBackup()
- {
- //return (m_psegPrev)? m_psegPrev->NextRestartBackup(): 0;
- return 0;
- }
- int SkipOffset(int ipass)
- {
- return int(m_vnSkipOffsets[ipass]);
- }
- DirCode PreviousStrongDir()
- {
- return m_dircPrevStrong;
- }
- void SetPreviousStrongDir(DirCode dirc)
- {
- m_dircPrevStrong = dirc;
- }
- DirCode PreviousTermDir()
- {
- return m_dircPrevTerm;
- }
- void SetPreviousTermDir(DirCode dirc)
- {
- m_dircPrevTerm = dirc;
- }
-
- int NextSegInitBuffer(byte ** ppbDat)
- {
- *ppbDat = m_prgbNextSegDat;
- return m_cbNextSegDat;
- }
- int ThisSegInitBuffer(byte ** ppbDat)
- {
- *ppbDat = m_prgInitDat;
- return m_cbInitDat;
- }
-
-// void SetNextSeg(Segment * psegNext)
-// {
-// m_psegNext = psegNext;
-// }
-
- void SetFaceName(std::wstring stu, std::wstring stuBase)
- {
-// m_stuFaceName = stu;
-// m_stuBaseFaceName = stuBase;
-// m_fUseSepBase = (m_stuBaseFaceName.size() > 0);
- }
-
- void SetEngine(GrEngine * pgreng);
- void SetFont(Font * pfont);
- void SwitchFont(Font * pfont);
- GrEngine * EngineImpl();
-
- void SetJustifier(IGrJustifier * pgjus);
- IGrJustifier * Justifier()
- {
- return m_pgjus;
- }
-
- void SetPreContext(int dich)
- {
- m_dichPreContext = dich;
- }
-
- //void SetToBaseFont(IGrGraphics * pgg);
- //void RestoreFont(IGrGraphics * pgg);
-
- void SetUpOutputArrays(Font * pfont, GrTableManager * ptm,
- GrSlotStream * psstrmFinal,
- int cchwUnderlying, int csloutSurface, gid16 chwLB,
- TrWsHandling twsh, bool fParaRtl, int nDirDepth,
- bool fEmpty = false);
- void RecordSurfaceAssoc(int ichw, int islot, int nDir);
- void RecordLigature(int ichwUnder, int islotSurface, int iComponent);
- void AdjustForOverlapsWithPrevSeg();
- void MarkSlotInPrevSeg(int ichw, int islot);
- void MarkSlotInNextSeg(int ichw, int islot);
-
- void CleanUpAssocsVectors()
- {
- for (int iv = 0; iv < m_ichwAssocsLim - m_ichwAssocsMin; iv++)
- {
- std::vector<int> * pvislout = m_prgpvisloutAssocs[iv];
- if (pvislout->size() <= 1)
- {
- delete pvislout;
- *(m_prgpvisloutAssocs + iv) = NULL;
- }
- }
- }
-
- GrSlotOutput * OutputSlot(int islout);
-
- void RecordInitializationForNextSeg(int cbNextSegDat, byte * pbNextSegDat)
- {
- m_cbNextSegDat = cbNextSegDat;
- m_prgbNextSegDat = new byte[m_cbNextSegDat];
- std::copy(pbNextSegDat, pbNextSegDat + cbNextSegDat, m_prgbNextSegDat);
- }
- void RecordInitializationForThisSeg(int cbDat, byte * pbDat)
- {
- m_cbInitDat = cbDat;
- if (cbDat == 0)
- m_prgInitDat = NULL;
- else
- {
- m_prgInitDat = new byte[m_cbInitDat];
- std::copy(pbDat, pbDat + cbDat, m_prgInitDat);
- }
- }
-
- void SetWidths(float dxsVisWidth, float dxsTotalWidth)
- {
- m_dxsVisibleWidth = dxsVisWidth;
- m_dxsTotalWidth = dxsTotalWidth;
- }
-
- void SetLayout(LayoutEnvironment & layout)
- {
- m_layout.setStartOfLine(layout.startOfLine());
- m_layout.setEndOfLine(layout.endOfLine());
- m_layout.setBestBreak(layout.bestBreak());
- m_layout.setWorstBreak(layout.worstBreak());
- m_layout.setRightToLeft(layout.rightToLeft());
- m_layout.setTrailingWs(layout.trailingWs());
- m_layout.setPrevSegment(layout.prevSegment());
- m_layout.setJustifier(layout.justifier());
- m_layout.setLoggingStream(layout.loggingStream());
- m_layout.setDumbFallback(layout.dumbFallback());
- }
- LayoutEnvironment & Layout()
- {
- return m_layout;
- }
-
- bool Erroneous()
- {
- return m_fErroneous;
- }
- void SetErroneous(bool f)
- {
- m_fErroneous = f;
- }
-
- void FixTermination(SegEnd est)
- {
- m_est = est;
- }
-
- // Convert from em-units to logical units.
- float EmToLogUnits(int m);
-
- Rect ComponentRect(GrSlotOutput * pslout, int icomp);
-
- void ClusterMembersForGlyph(int islout, int disloutCluster, std::vector<int> & visloutRet);
-
- // for transduction logging:
- // implementations are empty unless TRACING is defined
- void LogUnderlyingToSurface(GrTableManager * ptman, std::ostream & strmOut,
- GrCharStream * pchstrm);
- void LogSurfaceToUnderlying(GrTableManager * ptman, std::ostream & strmOut);
- void LogXmlUnderlyingToSurface(std::ostream & strmOut, GrTableManager * ptman,
- GrCharStream * pchstrm, int nIndent);
- void LogXmlSurfaceToUnderlying(std::ostream & strmOut, GrTableManager * ptman,
- GrCharStream * pchstrm, int nIndent);
-
- // calculate memory usage
- void calculateMemoryUsage(SegmentMemoryUsage & smu);
-
-protected:
- // Member variables:
- long m_cref; // standard COM ref count
-
- ITextSource * m_pgts; // the string we are a segment of
- int m_dichwLim; // number of characters officially in this segment
- int m_ichwMin; // first character relative to the text-source
-
- Font * m_pfont;
- GrEngine * m_preneng;
-
- bool m_fErroneous; // an error occurred in generating this segment
-
- IGrJustifier * m_pgjus;
-
- LayoutEnvironment m_layout;
-
- bool m_fWsRtl; // writing system direction
- bool m_fParaRtl; // paragraph direction; redundant with layout?
-
- TrWsHandling m_twsh; // // redundant with layout?
- int m_nDirDepth; // segment direction (white-space-only segments can switch)
-
- byte * m_prgbNextSegDat; // for initializing the following segment
- int m_cbNextSegDat; // length of above buffer
-
- byte * m_prgInitDat; // what was used to initialize this segment
- int m_cbInitDat;
-
- int m_dichPreContext; // what part of this segment affects the previous;
- // not really used for anything right now
-
-// Segment * m_psegPrev; // OBSOLETE
-// Segment * m_psegNext;
-
- // Font information:
-// std::wstring m_stuFaceName;
-// std::wstring m_stuBaseFaceName;
-// bool m_fUseSepBase;
-
-// float m_pixHeight; // character height of font in pixels (NOT = ascent + descent)
-// bool m_fBold;
-// bool m_fItalic;
-
- LineBrk m_lbStart;
- LineBrk m_lbEnd;
-
- bool m_fStartLine; // redundant with layout?
- bool m_fEndLine; // redundant with layout?
-
- SegEnd m_est;
-
- //Segment * m_psegAltEndLine; // segment having the alternate m_fEndLine value
-
- int m_mFontEmUnits;
- float m_dysFontAscent;
- float m_dysFontDescent;
- float m_xysEmSquare; // em-square of the font in display units
-// float m_xsDPI; // DPI of device on which segment was measured
-// float m_ysDPI;
-
- float m_dxsStretch; // difference between actual and natural width
- float m_dxsWidth; // width in absence of any stretch. -1 if not computed.
- float m_dysHeight;
- float m_dysAscent; // distance from common baseline to top of this segment,
- // including extra ascent
-
- float m_dysXAscent; // extra for this renderer, beyond what is standard for the font
- float m_dysXDescent;
-
- float m_dysAscentOverhang; // extra height above official top of segment; >= 0
- float m_dysDescentOverhang; // extra height below bottom of segment; <= 0;
- float m_dxsLeftOverhang; // <= 0
- float m_dxsRightOverhang;
-
- float m_dxsVisibleWidth; // not including trailing white space
- float m_dxsTotalWidth; // including trailing white space
-
- int m_isloutVisLim; // lim of visible stuff (to handle trailing ws underlines)
-
- float m_dysOffset;
-
- // Index of the first item in the before/after arrays and the ligature/component arrays,
- // relative to the start of the segment. Normally == 0, but will be some negative number
- // if there are slots "borrowed" from the previous segment (officially located in the
- // previous segment but rendered in this one).
- int m_ichwAssocsMin;
-
- // 1 + index of last item in the before/after arrays and the ligature/component arrays,
- // relative to the start of the segment. Normally == m_dichwLim, but will be
- // larger if there are slots "borrowed" from the following segment.
- int m_ichwAssocsLim;
-
- // Underlying-to-surface associations:
- int * m_prgisloutBefore; // logical first
- int * m_prgisloutAfter; // logical last
- std::vector<int> ** m_prgpvisloutAssocs; // all; used by range selections
-
- int * m_prgisloutLigature; // similar to above, index of associated ligature, or kNegInfinity
-
- sdata8 * m_prgiComponent; // component of the ligature that the corresponding character
- // represents; only meaningful if corresponding item in
- // m_prgisloutLigature is set
-
-// GrSlotStream * m_psstrm; // TODO: rework to remove this
- int m_cslout;
- GrSlotOutput * m_prgslout; // final output slots
- u_intslot * m_prgnSlotVarLenBuf; // var-length buffer for slots--one big buffer managed by the
- // segment, but pointed to by the slots
-
-// int m_cnUserDefn; // this information is not stored in the segment itself
- int m_cnCompPerLig;
-// int m_cnFeat; // this information is not stored in the segment itself
-
- int m_cginf;
- int m_isloutGinf0; // islout index for m_prgginf[0];
- GlyphInfo * m_prgginf;
-
- // Data structures to hold glyphs for rendering:
-////#include "GrSegmentPlatform.h"
-
- // For initializing the following segment:
- int m_cslotRestartBackup; // the number of slots in the underlying
- // input that need to be reprocessed when starting
- // the next segment
-
- std::vector<sdata8> m_vnSkipOffsets; // skip offset for each pass when restarting
-
- DirCode m_dircPrevStrong; // previous strong directionality code
- DirCode m_dircPrevTerm; // previous terminator code, if any
-
-
- // Other protected methods:
-
- void InitLineContextSegment(bool fStartLine, bool fEndLine);
- void InitWhiteSpaceSegment(int nNewDepth);
-
- void ComputeDimensions();
-
- void SetUpGlyphInfo(GrTableManager * ptman, GrSlotStream * psstrmFinal,
- gid16 chwLB, int nDirDepth, int islotMin, int cslot);
- void SetUpLigInfo(GrTableManager * ptman, GlyphInfo & ginf, GrSlotOutput * pslout);
-
- void InitBeforeArrayFromPrevSeg(); // obsolete
- void AdjustBeforeArrayFromPrevSeg();
- void AdjustAfterArrayFromNextSeg();
- void EnsureSpaceAtLineBoundaries(int ichwUnder);
-
- int LogicalSurfaceToUnderlying(int islout,
- float xsOffset, float ysOffset,
- float dxsGlyphWidth = 0, float dysGlyphHeight = 0, bool * pfAfter = NULL);
- int LogicalSurfaceToUnderlying(int islout, bool fBefore);
- int PhysicalSurfaceToUnderlying(int iginf,
- float xsOffset, float xyOffset,
- float dxsGlyphWidth = 0, float dysGlyphHeight = 0, bool * pfAfter = NULL);
- int PhysicalSurfaceToUnderlying(int iginf, bool fBefore);
- int UnderlyingToLogicalSurface(int ichw, bool fBefore);
- int UnderlyingToPhysicalSurface(int ichw, bool fBefore);
- int LogicalToPhysicalSurface(int islout);
- void UnderlyingToPhysicalAssocs(int ichw, std::vector<int> & viginf);
- std::vector<int> UnderlyingToLogicalAssocs(int ichw);
- int UnderlyingToLogicalInThisSeg(int ichw);
- bool SameSurfaceGlyphs(int ichw1, int ichw2);
-
- void ShiftGlyphs(float dxsShift);
-
- float GlyphLeftEdge(int iginf);
-
- int DirLevelOfChar(int ichw, bool fBefore);
- int CharIsRightToLeft(int ichw, bool fBefore);
- int SlotIsRightToLeft(GrSlotOutput * pslout);
- int TopDirLevel()
- {
- if (m_fWsRtl)
- return 1;
- else
- return 0;
- }
-
- void AssertValidClusters(GrSlotStream * psstrm);
-
- void MergeUniscribeCluster(
- std::vector<int> & visloutBefore, std::vector<int> & visloutAfter,
- int ich1, int ich2);
-
- int GlyphHit(float xsClick, float ysClick);
- int SelectBb(std::vector<int> & viginf, bool fRTL);
-
- int RightMostGlyph();
- int LeftMostGlyph();
-
- void ComputeOverhangs(float * pdysVisAscent, float * pdysNegVisDescent,
- float * pdxsVisLeft, float * pdxsVisRight);
-
-public:
- LineBrk getBreakWeight(int ich, bool fBreakBefore = false);
-
- // Platform-specific routines:
-protected:
- //void ShiftGlyphsPlatform(float dxsShift);
- //bool SetDirectionDepthPlatform(int nNewDepth);
-
- //void InitializePlatform();
- //void DestroyContentsPlatform();
- //GrResult GetGlyphsAndPositionsPlatform(float xs, float ys,
- // Rect rsArg, Rect rdArg,
- // utf16 * prgchGlyphs, float * prgxd, float * prgyd, float * prgdxdAdv);
- //void SetUpOutputArraysPlatform(GrTableManager * ptman, gid16 chwLB, int nDirDepth,
- // int islotMin, int cslot);
-
- // Temporary - for WinSegmentPainter
-public:
- int CSlout()
- {
- return m_cslout;
- }
- gid16 LBGlyphID();
- float AscentOffset()
- {
- if (m_dysAscent == -1)
- ComputeDimensions();
- return m_dysAscent - m_dysFontAscent;
- }
-};
-
-
-//:>********************************************************************************************
-//:> The purpose of these subclasses is simply to provide meaningful names for the
-//:> constructors. Instances of these classes are in every way equivalent to Segment.
-//:>********************************************************************************************
-
-/*----------------------------------------------------------------------------------------------
- Creating a LineFillSegment fits as much of the text on the line as possible,
- finding a reasonable break point if necessary.
-----------------------------------------------------------------------------------------------*/
-class LineFillSegment : public Segment
-{
-public:
- LineFillSegment(
- Font * pfont,
- ITextSource * pts,
- LayoutEnvironment * playout,
- toffset ichStart,
- toffset ichStop,
- float maxWidth,
- bool fBacktracking = false);
-protected:
- // Default constructor:
- LineFillSegment() : Segment()
- {
- }
-};
-
-/*----------------------------------------------------------------------------------------------
- Creating a RangeSegment makes a segment representing the given range of characters, or
- the entire text-source.
-----------------------------------------------------------------------------------------------*/
-class RangeSegment : public Segment
-{
-public:
- RangeSegment(
- Font * pfont,
- ITextSource * pts,
- LayoutEnvironment * playout,
- toffset ichStart = 0,
- toffset ichStop = kPosInfinity,
- Segment * psegInitLike = NULL);
-};
-
-/*----------------------------------------------------------------------------------------------
- The JustSegmentAux class is used by the factory method that creates a justified segment.
- It is called JustSegmentAux to avoid conflicting with the factory method.
-----------------------------------------------------------------------------------------------*/
-class JustSegmentAux : public Segment
-{
-public:
- JustSegmentAux(
- Font * pfont,
- ITextSource * pts,
- LayoutEnvironment * playout,
- toffset ichStart,
- toffset ichStop,
- float xsNaturalWidth,
- float xsJustifiedWidth,
- Segment * psegInitLike = NULL);
-};
-
-} // namespace gr
-
-#if defined(GR_NO_NAMESPACE)
-using namespace gr;
-#endif
-
-#endif // !GR_SEGMENT_INCLUDED