InDesign SDK  20.5
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TEInputOutputMapping.h
1 //========================================================================================
2 //
3 // $File$
4 //
5 // Owner: shagupta
6 //
7 // $Author$
8 //
9 // $DateTime$
10 //
11 // $Revision$
12 //
13 // $Change $
14 // ___________________
15 //
16 // ADOBE CONFIDENTIAL
17 //
18 // Copyright 2018 Adobe Systems Incorporated
19 // All Rights Reserved.
20 //
21 // NOTICE: All information contained herein is, and remains
22 // the property of Adobe Systems Incorporated and its suppliers,
23 // if any. The intellectual and technical concepts contained
24 // herein are proprietary to Adobe Systems Incorporated and its
25 // suppliers and are protected by all applicable intellectual property
26 // laws, including trade secret and copyright laws.
27 // Dissemination of this information or reproduction of this material
28 // is strictly forbidden unless prior written permission is obtained
29 // from Adobe Systems Incorporated.
30 //
31 //========================================================================================
32 
33 
34 
35 #ifndef __TEInputOutputMapping__
36 #define __TEInputOutputMapping__
37 
38 #include "IWROptyca.h"
39 #include <vector>
40 
41 #define kHundredPerCent 100
42 
44 {
45 public:
46  TEPosition() : index(0), inner(0) {}
47  TEPosition(int32 ix, int32 in) : index(ix), inner(in) {}
48  int32 index;
49  int32 inner;
50 };
51 
52 class TERange
53 {
54 public:
55  TERange() { }
56  TERange(int32 ixa, int32 ina, int32 ixb, int32 inb) :a(ixa, ina), b(ixb, inb) { }
57  TERange(const TEPosition& aPos, const TEPosition&bPos) : a(aPos), b(bPos) { }
58  TEPosition a;
59  TEPosition b;
60 };
61 
62 class TERangeList : public std::vector<TERange>
63 {
64 public:
65  TERangeList() {}
66  void Append(TERange range)
67  {
68  this->push_back(range);
69  }
70  int Size()
71  {
72  return (int) this->size();
73  }
74  int Remove(int pos)
75  {
76  if (pos >= (int)this->size())
77  {
78  return -1;
79  }
80  vector<TERange>::iterator it;
81  it = this->begin();
82  it += pos;
83  this->erase(it);
84  return 1;
85  }
86  TERange* PeekArray()
87  {
88  return &this->front();
89  }
90 };
91 
93 {
94  /*
95  This is a base class with 2 child classes. One of the child class is a wrapper over InputOutputHB, and the other over SubstitutionLog. If optyca has been initialized and DoShaping is called, a pointer of TEInputOutputMapping will then point to an object of one of these child sub-classes.
96  */
97 public:
98 
100  {
101  }
103  {
104 
105  }
106 
107  enum { kLeft, kRight, kLeftMost, kRightMost };
108 
109  virtual void Initialize(IWROptyca* optycaInstance) { ASSERT(" This function is not available on Harfbuzz!"); }
110 
111  virtual void InputToOutput(int32 characterIndex, int32 &inner, int32 &glyphIndex)
112  {
113  glyphIndex = characterIndex;
114  }
115 
116  virtual void InputToOutput(int32 characterIndex, int32 &inner, int32 &glyphIndex, bool16 &direction) { glyphIndex = characterIndex; direction = reverse; }
117 
118  virtual void InputToOutputRanges(TERangeList& ranges) { };
119 
120  virtual void InputToOutputClientEncoding(int32 characterIndex, int32 &inner, int32 &glyphIndex) {
121  glyphIndex = characterIndex;
122  }
123 
124  virtual void InputToOutputRangesClientEncoding(TERangeList& ranges) { ASSERT(" This function is not available on Harfbuzz!"); }
125 
126  virtual void OutputToInput(int32 glyphIndex, int32 &inner, int32 &characterIndex, int32 startPos = 0)
127  {
128  characterIndex = glyphIndex;
129  };
130 
131  virtual void OutputToInputRanges(TERangeList& ranges) {};
132 
133  virtual int32 GetInputCount() { return 0; }
134 
135  virtual void SetInputCount(int count) { };
136 
137  virtual int32 GetOutputCount() { return 0; }
138 
139  virtual void SetOutputCount(int count) { };
140 
141  virtual void Clear() { }; // not available on harfbuzz
142 
143  virtual void Reset() { };
144 
145  virtual int MaxExtent(int len, int start = 0) { return len; }
146 
147  virtual int TEReplayLog(short* t, int32 len, int32 maxLen, int32 startPos) { return len; }
148 
149  virtual void GetCluster(int32 ix, int32& start, unsigned char& count)
150  {
151  start = ix;
152  count = 1;
153  };
154 
155  virtual void ToClusterBase(int32& index, int32& inner) {};
156 
157  virtual void RecordReverse(int32 count, int32 start) { reverse = kTrue; };
158 
159  virtual int32 TEReplayLogClientEncoding(int32* t, int32 len, int32 maxLen) { return len; }
160 
161  virtual bool VisualMove(int32 whichMove, int32& ix, int32& in, bool& keyboardIsRTL) {
162  return false;
163  }
164 
165  virtual void RecordMove(int32 src, int32 dst, int32 count) { };
166 
167  virtual int32 GetSubsSize() const { return 0; }
168 
169  virtual int32 GetClustersSize() const { ASSERT(" This function is not available on Harfbuzz!"); return 0; }
170 
171  virtual void ResizeClusters(int32 n) { ASSERT(" This function is not available on Harfbuzz!"); }
172 
173  virtual unsigned short& Clusters(int32 index) { ASSERT(" This function is not available on Harfbuzz!"); return dummyShort; }
174 
175  virtual unsigned short& GetSubs(int32 index) { return dummyShort; }
176 
177  virtual int32& UTFMapping(int32 index) { return dummyInt; }
178 
179  virtual int32 UTFMappingSize() { return 0; }
180 
181  virtual short GetUndo() { return 0; }
182 
183  virtual void Resize(int32 n) { };
184 
185  virtual int UTFMappingResize(int n) { return 0; }
186 
187  virtual int32 TEExtract(TEInputOutputMapping& extractedLog, int32 start, int32 count) { return 0; }
188 
189  virtual int32 Catenate(TEInputOutputMapping& next) { return 0; } // implement
190 
191  virtual int GetMappingType() { return 2; }
192 
193  void slToTeRangeList(SLRangeList &slRanges, TERangeList &ranges)
194  {
195  for (int i = 0; i < slRanges.Size(); i++)
196  {
197  if (i + 1 > ranges.Size())
198  {
199  TERange temp(0, 0, 0, 0);
200  ranges.Append(temp);
201  }
202  ranges[i].a.index = slRanges[i].a.index; ranges[i].a.inner = slRanges[i].a.inner; ranges[i].b.index = slRanges[i].b.index; ranges[i].b.inner = slRanges[i].b.inner;
203  }
204  }
205 
206  void teToSlRangeList(SLRangeList &slRanges, TERangeList &ranges)
207  {
208  for (int i = 0; i < ranges.Size(); i++)
209  {
210  SLRange temp(ranges[i].a.index, ranges[i].a.inner, ranges[i].b.index, ranges[i].b.inner);
211  slRanges.Append(temp);
212  }
213  }
214 
215  int32 dummyInt = 0;
216  unsigned short dummyShort = 0;
217  bool16 reverse = kFalse;
218 };
219 
220 
221 #endif //__TEInputOutputMapping__