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_DATA_FONT_DATA_H_ 18#define SFNTLY_CPP_SRC_SFNTLY_DATA_FONT_DATA_H_ 19 20#include <limits.h> 21 22#include <vector> 23 24#include "sfntly/port/type.h" 25#include "sfntly/data/byte_array.h" 26#include "sfntly/port/refcount.h" 27 28namespace sfntly { 29 30struct DataSize { 31 enum { 32 kBYTE = 1, 33 kCHAR = 1, 34 kUSHORT = 2, 35 kSHORT = 2, 36 kUINT24 = 3, 37 kULONG = 4, 38 kLONG = 4, 39 kFixed = 4, 40 kFUNIT = 4, 41 kFWORD = 2, 42 kUFWORD = 2, 43 kF2DOT14 = 2, 44 kLONGDATETIME = 8, 45 kTag = 4, 46 kGlyphID = 2, 47 kOffset = 2 48 }; 49}; 50 51class FontData : virtual public RefCount { 52 public: 53 // Gets the maximum size of the FontData. This is the maximum number of bytes 54 // that the font data can hold and all of it may not be filled with data or 55 // even fully allocated yet. 56 // @return the maximum size of this font data 57 virtual int32_t Size() const; 58 59 // Sets limits on the size of the FontData. The FontData is then only 60 // visible within the bounds set. 61 // @param offset the start of the new bounds 62 // @param length the number of bytes in the bounded array 63 // @return true if the bounding range was successful; false otherwise 64 virtual bool Bound(int32_t offset, int32_t length); 65 66 // Sets limits on the size of the FontData. This is a offset bound only so if 67 // the FontData is writable and growable then there is no limit to that growth 68 // from the bounding operation. 69 // @param offset the start of the new bounds which must be within the current 70 // size of the FontData 71 // @return true if the bounding range was successful; false otherwise 72 virtual bool Bound(int32_t offset); 73 74 // Makes a slice of this FontData. The returned slice will share the data with 75 // the original <code>FontData</code>. 76 // @param offset the start of the slice 77 // @param length the number of bytes in the slice 78 // @return a slice of the original FontData 79 virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length) = 0; 80 81 // Makes a bottom bound only slice of this array. The returned slice will 82 // share the data with the original <code>FontData</code>. 83 // @param offset the start of the slice 84 // @return a slice of the original FontData 85 virtual CALLER_ATTACH FontData* Slice(int32_t offset) = 0; 86 87 // Gets the length of the data. 88 virtual int32_t Length() const; 89 90 protected: 91 // Constructor. 92 // @param ba the byte array to use for the backing data 93 explicit FontData(ByteArray* ba); 94 95 // Constructor. 96 // @param data the data to wrap 97 // @param offset the offset to start the wrap from 98 // @param length the length of the data wrapped 99 FontData(FontData* data, int32_t offset, int32_t length); 100 101 // Constructor. 102 // @param data the data to wrap 103 // @param offset the offset to start the wrap from 104 FontData(FontData* data, int32_t offset); 105 virtual ~FontData(); 106 107 void Init(ByteArray* ba); 108 109 // Gets the offset in the underlying data taking into account any bounds on 110 // the data. 111 // @param offset the offset to get the bound compensated offset for 112 // @return the bound compensated offset 113 int32_t BoundOffset(int32_t offset); 114 115 // Gets the length in the underlying data taking into account any bounds on 116 // the data. 117 // @param offset the offset that the length is being used at 118 // @param length the length to get the bound compensated length for 119 // @return the bound compensated length 120 int32_t BoundLength(int32_t offset, int32_t length); 121 122 static const int32_t GROWABLE_SIZE = INT_MAX; 123 124 // TODO(arthurhsu): style guide violation: refactor this protected member 125 ByteArrayPtr array_; 126 127 private: 128 int32_t bound_offset_; 129 int32_t bound_length_; 130}; 131typedef Ptr<FontData> FontDataPtr; 132 133} // namespace sfntly 134 135#endif // SFNTLY_CPP_SRC_SFNTLY_DATA_FONT_DATA_H_ 136