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