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_WRITABLE_FONT_DATA_H_ 18 #define SFNTLY_CPP_SRC_SFNTLY_DATA_WRITABLE_FONT_DATA_H_ 19 20 #include "sfntly/data/readable_font_data.h" 21 22 namespace sfntly { 23 24 // Writable font data wrapper. Supports writing of data primitives in the 25 // TrueType / OpenType spec. 26 class WritableFontData : public ReadableFontData { 27 public: 28 explicit WritableFontData(ByteArray* ba); 29 virtual ~WritableFontData(); 30 31 // Constructs a writable font data object. If the length is specified as 32 // positive then a fixed size font data object will be created. If the length 33 // is zero or less then a growable font data object will be created and the 34 // size will be used as an estimate to help in allocating the original space. 35 // @param length if length > 0 create a fixed length font data; otherwise 36 // create a growable font data 37 // @return a new writable font data 38 static CALLER_ATTACH WritableFontData* CreateWritableFontData(int32_t length); 39 40 // Constructs a writable font data object. The new font data object will wrap 41 // the bytes passed in to the factory and it will take make a copy of those 42 // bytes. 43 // @param b the byte vector to wrap 44 // @return a new writable font data 45 static CALLER_ATTACH WritableFontData* CreateWritableFontData(std::vector<uint8_t>* b); 46 47 // Write a byte at the given index. 48 // @param index index into the font data 49 // @param b the byte to write 50 // @return the number of bytes written 51 virtual int32_t WriteByte(int32_t index, uint8_t b); 52 53 // Write the bytes from the array. 54 // @param index index into the font data 55 // @param b the source for the bytes to be written 56 // @param offset offset in the byte array 57 // @param length the length of the bytes to be written 58 // @return the number of bytes actually written; -1 if the index is outside 59 // the FontData's range 60 virtual int32_t WriteBytes(int32_t index, 61 uint8_t* b, 62 int32_t offset, 63 int32_t length); 64 65 // Write the bytes from the array. 66 // @param index index into the font data 67 // @param b the source for the bytes to be written 68 // @return the number of bytes actually written; -1 if the index is outside 69 // the FontData's range 70 virtual int32_t WriteBytes(int32_t index, std::vector<uint8_t>* b); 71 72 // Write the bytes from the array and pad if necessary. 73 // Write to the length given using the byte array provided and if there are 74 // not enough bytes in the array then pad to the requested length using the 75 // pad byte specified. 76 // @param index index into the font data 77 // @param b the source for the bytes to be written 78 // @param offset offset in the byte array 79 // @param length the length of the bytes to be written 80 // @param pad the padding byte to be used if necessary 81 // @return the number of bytes actually written 82 virtual int32_t WriteBytesPad(int32_t index, 83 std::vector<uint8_t>* b, 84 int32_t offset, 85 int32_t length, 86 uint8_t pad); 87 88 // Writes padding to the FontData. The padding byte written is 0x00. 89 // @param index index into the font data 90 // @param count the number of pad bytes to write 91 // @return the number of pad bytes written 92 virtual int32_t WritePadding(int32_t index, int32_t count); 93 94 // Writes padding to the FontData. 95 // @param index index into the font data 96 // @param count the number of pad bytes to write 97 // @param pad the byte value to use as padding 98 // @return the number of pad bytes written 99 virtual int32_t WritePadding(int32_t index, int32_t count, uint8_t pad); 100 101 // Write the CHAR at the given index. 102 // @param index index into the font data 103 // @param c the CHAR 104 // @return the number of bytes actually written 105 // @throws IndexOutOfBoundsException if index is outside the FontData's range 106 virtual int32_t WriteChar(int32_t index, uint8_t c); 107 108 // Write the USHORT at the given index. 109 // @param index index into the font data 110 // @param us the USHORT 111 // @return the number of bytes actually written 112 // @throws IndexOutOfBoundsException if index is outside the FontData's range 113 virtual int32_t WriteUShort(int32_t index, int32_t us); 114 115 // Write the USHORT at the given index in little endian format. 116 // @param index index into the font data 117 // @param us the USHORT 118 // @return the number of bytes actually written 119 // @throws IndexOutOfBoundsException if index is outside the FontData's range 120 virtual int32_t WriteUShortLE(int32_t index, int32_t us); 121 122 // Write the SHORT at the given index. 123 // @param index index into the font data 124 // @param s the SHORT 125 // @return the number of bytes actually written 126 // @throws IndexOutOfBoundsException if index is outside the FontData's range 127 virtual int32_t WriteShort(int32_t index, int32_t s); 128 129 // Write the UINT24 at the given index. 130 // @param index index into the font data 131 // @param ui the UINT24 132 // @return the number of bytes actually written 133 // @throws IndexOutOfBoundsException if index is outside the FontData's range 134 virtual int32_t WriteUInt24(int32_t index, int32_t ui); 135 136 // Write the ULONG at the given index. 137 // @param index index into the font data 138 // @param ul the ULONG 139 // @return the number of bytes actually written 140 // @throws IndexOutOfBoundsException if index is outside the FontData's range 141 virtual int32_t WriteULong(int32_t index, int64_t ul); 142 143 // Write the ULONG at the given index in little endian format. 144 // @param index index into the font data 145 // @param ul the ULONG 146 // @return the number of bytes actually written 147 // @throws IndexOutOfBoundsException if index is outside the FontData's range 148 virtual int32_t WriteULongLE(int32_t index, int64_t ul); 149 150 // Write the LONG at the given index. 151 // @param index index into the font data 152 // @param l the LONG 153 // @return the number of bytes actually written 154 // @throws IndexOutOfBoundsException if index is outside the FontData's range 155 virtual int32_t WriteLong(int32_t index, int64_t l); 156 157 // Write the Fixed at the given index. 158 // @param index index into the font data 159 // @param f the Fixed 160 // @return the number of bytes actually written 161 // @throws IndexOutOfBoundsException if index is outside the FontData's range 162 virtual int32_t WriteFixed(int32_t index, int32_t f); 163 164 // Write the LONGDATETIME at the given index. 165 // @param index index into the font data 166 // @param date the LONGDATETIME 167 // @return the number of bytes actually written 168 // @throws IndexOutOfBoundsException if index is outside the FontData's range 169 virtual int32_t WriteDateTime(int32_t index, int64_t date); 170 171 // Copy from the InputStream into this FontData. 172 // @param is the source 173 // @param length the number of bytes to copy 174 // @throws IOException 175 virtual void CopyFrom(InputStream* is, int32_t length); 176 177 // Copy everything from the InputStream into this FontData. 178 // @param is the source 179 // @throws IOException 180 virtual void CopyFrom(InputStream* is); 181 182 // Makes a slice of this FontData. The returned slice will share the data with 183 // the original FontData. 184 // @param offset the start of the slice 185 // @param length the number of bytes in the slice 186 // @return a slice of the original FontData 187 virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length); 188 189 // Makes a bottom bound only slice of this array. The returned slice will 190 // share the data with the original FontData. 191 // @param offset the start of the slice 192 // @return a slice of the original FontData 193 virtual CALLER_ATTACH FontData* Slice(int32_t offset); 194 195 private: 196 // Constructor with a lower bound. 197 // @param data other WritableFontData object to share data with 198 // @param offset offset from the other WritableFontData's data 199 WritableFontData(WritableFontData* data, int32_t offset); 200 201 // Constructor with lower bound and a length bound. 202 // @param data other WritableFontData object to share data with 203 // @param offset offset from the other WritableFontData's data 204 // @param length length of other WritableFontData's data to use 205 WritableFontData(WritableFontData* data, int32_t offset, int32_t length); 206 }; 207 typedef Ptr<WritableFontData> WritableFontDataPtr; 208 209 } // namespace sfntly 210 211 #endif // SFNTLY_CPP_SRC_SFNTLY_DATA_WRITABLE_FONT_DATA_H_ 212