1 /* 2 * Copyright 2011 Google Inc. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_GLYPH_TABLE_H_ 18 #define SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_GLYPH_TABLE_H_ 19 20 #include <vector> 21 22 #include "sfntly/table/table.h" 23 #include "sfntly/table/subtable.h" 24 #include "sfntly/table/subtable_container_table.h" 25 26 namespace sfntly { 27 28 struct GlyphType { 29 enum { 30 kSimple = 0, 31 kComposite = 1 32 }; 33 }; 34 35 class GlyphTable : public SubTableContainerTable, 36 public RefCounted<GlyphTable> { 37 public: 38 class Builder; 39 class Glyph : public SubTable { 40 public: 41 // Note: Contour is an empty class for the version ported 42 class Contour { 43 protected: 44 Contour() {} 45 virtual ~Contour() {} 46 }; 47 48 class Builder : public SubTable::Builder { 49 public: 50 virtual ~Builder(); 51 52 protected: 53 // Incoming table_builder is GlyphTable::Builder*. 54 // Note: constructor refactored in C++ to avoid heavy lifting. 55 // caller need to do data->Slice(offset, length) beforehand. 56 explicit Builder(WritableFontData* data); 57 explicit Builder(ReadableFontData* data); 58 59 static CALLER_ATTACH Builder* 60 GetBuilder(GlyphTable::Builder* table_builder, 61 ReadableFontData* data); 62 static CALLER_ATTACH Builder* 63 GetBuilder(GlyphTable::Builder* table_builder, 64 ReadableFontData* data, 65 int32_t offset, 66 int32_t length); 67 virtual void SubDataSet(); 68 virtual int32_t SubDataSizeToSerialize(); 69 virtual bool SubReadyToSerialize(); 70 virtual int32_t SubSerialize(WritableFontData* new_data); 71 72 private: 73 friend class GlyphTable::Builder; 74 }; 75 76 virtual ~Glyph(); 77 static CALLER_ATTACH Glyph* GetGlyph(GlyphTable* table, 78 ReadableFontData* data, 79 int32_t offset, 80 int32_t length); 81 82 virtual int32_t Padding(); 83 virtual int32_t GlyphType(); 84 virtual int32_t NumberOfContours(); 85 virtual int32_t XMin(); 86 virtual int32_t XMax(); 87 virtual int32_t YMin(); 88 virtual int32_t YMax(); 89 90 virtual int32_t InstructionSize() = 0; 91 virtual ReadableFontData* Instructions() = 0; 92 93 protected: 94 // Note: constructor refactored in C++ to avoid heavy lifting. 95 // caller need to do data->Slice(offset, length) beforehand. 96 Glyph(ReadableFontData* data, int32_t glyph_type); 97 virtual void Initialize() = 0; 98 // Note: Derived class to define initialization_lock_. 99 100 private: 101 static int32_t GlyphType(ReadableFontData* data, 102 int32_t offset, 103 int32_t length); 104 105 int32_t glyph_type_; 106 int32_t number_of_contours_; 107 }; // class GlyphTable::Glyph 108 typedef Ptr<GlyphTable::Glyph::Builder> GlyphBuilderPtr; 109 typedef std::vector<GlyphBuilderPtr> GlyphBuilderList; 110 111 class Builder : public SubTableContainerTable::Builder, 112 public RefCounted<GlyphTable::Builder> { 113 public: 114 // Note: Constructor scope altered to public for base class to instantiate. 115 Builder(Header* header, ReadableFontData* data); 116 virtual ~Builder(); 117 118 virtual void SetLoca(const IntegerList& loca); 119 virtual void GenerateLocaList(IntegerList* locas); 120 121 static CALLER_ATTACH Builder* CreateBuilder(Header* header, 122 WritableFontData* data); 123 124 // Gets the List of glyph builders for the glyph table builder. These may be 125 // manipulated in any way by the caller and the changes will be reflected in 126 // the final glyph table produced. 127 // If there is no current data for the glyph builder or the glyph builders 128 // have not been previously set then this will return an empty glyph builder 129 // List. If there is current data (i.e. data read from an existing font) and 130 // the <code>loca</code> list has not been set or is null, empty, or 131 // invalid, then an empty glyph builder List will be returned. 132 GlyphBuilderList* GlyphBuilders(); 133 134 // Replace the internal glyph builders with the one provided. The provided 135 // list and all contained objects belong to this builder. 136 // This call is only required if the entire set of glyphs in the glyph 137 // table builder are being replaced. If the glyph builder list provided from 138 // the GlyphTable.Builder::GlyphBuilders() is being used and modified 139 // then those changes will already be reflected in the glyph table builder. 140 void SetGlyphBuilders(GlyphBuilderList* glyph_builders); 141 142 // Glyph builder factories 143 CALLER_ATTACH Glyph::Builder* GlyphBuilder(ReadableFontData* data); 144 145 protected: // internal API for building 146 virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data); 147 virtual void SubDataSet(); 148 virtual int32_t SubDataSizeToSerialize(); 149 virtual bool SubReadyToSerialize(); 150 virtual int32_t SubSerialize(WritableFontData* new_data); 151 152 private: 153 void Initialize(ReadableFontData* data, const IntegerList& loca); 154 GlyphBuilderList* GetGlyphBuilders(); 155 void Revert(); 156 157 GlyphBuilderList glyph_builders_; 158 IntegerList loca_; 159 }; 160 161 class SimpleGlyph : public Glyph, public RefCounted<SimpleGlyph> { 162 public: 163 static const int32_t kFLAG_ONCURVE; 164 static const int32_t kFLAG_XSHORT; 165 static const int32_t kFLAG_YSHORT; 166 static const int32_t kFLAG_REPEAT; 167 static const int32_t kFLAG_XREPEATSIGN; 168 static const int32_t kFLAG_YREPEATSIGN; 169 170 class SimpleContour : public Glyph::Contour { 171 protected: 172 SimpleContour() {} 173 virtual ~SimpleContour() {} 174 }; 175 176 class SimpleGlyphBuilder : public Glyph::Builder, 177 public RefCounted<SimpleGlyphBuilder> { 178 public: 179 virtual ~SimpleGlyphBuilder(); 180 181 protected: 182 // Note: constructor refactored in C++ to avoid heavy lifting. 183 // caller need to do data->Slice(offset, length) beforehand. 184 explicit SimpleGlyphBuilder(WritableFontData* data); 185 explicit SimpleGlyphBuilder(ReadableFontData* data); 186 virtual CALLER_ATTACH FontDataTable* 187 SubBuildTable(ReadableFontData* data); 188 189 private: 190 friend class Glyph::Builder; 191 }; 192 193 // Note: constructor refactored in C++ to avoid heavy lifting. 194 // caller need to do data->Slice(offset, length) beforehand. 195 explicit SimpleGlyph(ReadableFontData* data); 196 virtual ~SimpleGlyph(); 197 198 virtual int32_t InstructionSize(); 199 virtual CALLER_ATTACH ReadableFontData* Instructions(); 200 virtual void Initialize(); 201 202 int32_t NumberOfPoints(int32_t contour); 203 int32_t XCoordinate(int32_t contour, int32_t point); 204 int32_t YCoordinate(int32_t contour, int32_t point); 205 bool OnCurve(int32_t contour, int32_t point); 206 207 private: 208 void ParseData(bool fill_arrays); 209 int32_t FlagAsInt(int32_t index); 210 int32_t ContourEndPoint(int32_t contour); 211 212 bool initialized_; 213 Lock initialization_lock_; 214 int32_t instruction_size_; 215 int32_t number_of_points_; 216 217 // start offsets of the arrays 218 int32_t instructions_offset_; 219 int32_t flags_offset_; 220 int32_t x_coordinates_offset_; 221 int32_t y_coordinates_offset_; 222 223 int32_t flag_byte_count_; 224 int32_t x_byte_count_; 225 int32_t y_byte_count_; 226 227 IntegerList x_coordinates_; 228 IntegerList y_coordinates_; 229 std::vector<bool> on_curve_; 230 IntegerList contour_index_; 231 }; 232 233 class CompositeGlyph : public Glyph, public RefCounted<CompositeGlyph> { 234 public: 235 static const int32_t kFLAG_ARG_1_AND_2_ARE_WORDS; 236 static const int32_t kFLAG_ARGS_ARE_XY_VALUES; 237 static const int32_t kFLAG_ROUND_XY_TO_GRID; 238 static const int32_t kFLAG_WE_HAVE_A_SCALE; 239 static const int32_t kFLAG_RESERVED; 240 static const int32_t kFLAG_MORE_COMPONENTS; 241 static const int32_t kFLAG_WE_HAVE_AN_X_AND_Y_SCALE; 242 static const int32_t kFLAG_WE_HAVE_A_TWO_BY_TWO; 243 static const int32_t kFLAG_WE_HAVE_INSTRUCTIONS; 244 static const int32_t kFLAG_USE_MY_METRICS; 245 static const int32_t kFLAG_OVERLAP_COMPOUND; 246 static const int32_t kFLAG_SCALED_COMPONENT_OFFSET; 247 static const int32_t kFLAG_UNSCALED_COMPONENT_OFFSET; 248 249 class CompositeGlyphBuilder : public Glyph::Builder, 250 public RefCounted<CompositeGlyphBuilder> { 251 public: 252 virtual ~CompositeGlyphBuilder(); 253 254 protected: 255 // Note: constructor refactored in C++ to avoid heavy lifting. 256 // caller need to do data->Slice(offset, length) beforehand. 257 explicit CompositeGlyphBuilder(WritableFontData* data); 258 explicit CompositeGlyphBuilder(ReadableFontData* data); 259 260 virtual CALLER_ATTACH FontDataTable* 261 SubBuildTable(ReadableFontData* data); 262 263 private: 264 friend class Glyph::Builder; 265 }; 266 267 // Note: constructor refactored in C++ to avoid heavy lifting. 268 // caller need to do data->Slice(offset, length) beforehand. 269 explicit CompositeGlyph(ReadableFontData* data); 270 virtual ~CompositeGlyph(); 271 272 int32_t Flags(int32_t contour); 273 int32_t NumGlyphs(); 274 int32_t GlyphIndex(int32_t contour); 275 int32_t Argument1(int32_t contour); 276 int32_t Argument2(int32_t contour); 277 int32_t TransformationSize(int32_t contour); 278 void Transformation(int32_t contour, ByteVector* transformation); 279 virtual int32_t InstructionSize(); 280 virtual CALLER_ATTACH ReadableFontData* Instructions(); 281 282 protected: 283 virtual void Initialize(); 284 285 private: 286 IntegerList contour_index_; 287 int32_t instruction_size_; 288 int32_t instructions_offset_; 289 bool initialized_; 290 Lock initialization_lock_; 291 }; 292 293 virtual ~GlyphTable(); 294 295 // C++ port: rename glyph() to GetGlyph(). 296 Glyph* GetGlyph(int32_t offset, int32_t length); 297 298 private: 299 struct Offset { 300 enum { 301 // header 302 kNumberOfContours = 0, 303 kXMin = 2, 304 kYMin = 4, 305 kXMax = 6, 306 kYMax = 8, 307 308 // Simple Glyph Description 309 kSimpleEndPtsOfCountours = 10, 310 // offset from the end of the contours array 311 kSimpleInstructionLength = 0, 312 kSimpleInstructions = 2, 313 // flags 314 // xCoordinates 315 // yCoordinates 316 317 // Composite Glyph Description 318 kCompositeFlags = 0, 319 kCompositeGyphIndexWithoutFlag = 0, 320 kCompositeGlyphIndexWithFlag = 2, 321 }; 322 }; 323 324 GlyphTable(Header* header, ReadableFontData* data); 325 }; 326 typedef Ptr<GlyphTable> GlyphTablePtr; 327 typedef Ptr<GlyphTable::Builder> GlyphTableBuilderPtr; 328 typedef std::vector<GlyphTableBuilderPtr> GlyphTableBuilderList; 329 typedef Ptr<GlyphTable::Glyph> GlyphPtr; 330 typedef Ptr<GlyphTable::Glyph::Builder> GlyphBuilderPtr; 331 332 } // namespace sfntly 333 334 #endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_GLYPH_TABLE_H_ 335