diff options
Diffstat (limited to 'sfntly/data/font_data.h')
-rw-r--r-- | sfntly/data/font_data.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/sfntly/data/font_data.h b/sfntly/data/font_data.h new file mode 100644 index 0000000..d02e8b7 --- /dev/null +++ b/sfntly/data/font_data.h @@ -0,0 +1,135 @@ +/* + * Copyright 2011 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SFNTLY_CPP_SRC_SFNTLY_DATA_FONT_DATA_H_ +#define SFNTLY_CPP_SRC_SFNTLY_DATA_FONT_DATA_H_ + +#include <limits.h> + +#include <vector> + +#include "sfntly/port/type.h" +#include "sfntly/data/byte_array.h" +#include "sfntly/port/refcount.h" + +namespace sfntly { + +struct DataSize { + enum { + kBYTE = 1, + kCHAR = 1, + kUSHORT = 2, + kSHORT = 2, + kUINT24 = 3, + kULONG = 4, + kLONG = 4, + kFixed = 4, + kFUNIT = 4, + kFWORD = 2, + kUFWORD = 2, + kF2DOT14 = 2, + kLONGDATETIME = 8, + kTag = 4, + kGlyphID = 2, + kOffset = 2 + }; +}; + +class FontData : virtual public RefCount { + public: + // Gets the maximum size of the FontData. This is the maximum number of bytes + // that the font data can hold and all of it may not be filled with data or + // even fully allocated yet. + // @return the maximum size of this font data + virtual int32_t Size() const; + + // Sets limits on the size of the FontData. The FontData is then only + // visible within the bounds set. + // @param offset the start of the new bounds + // @param length the number of bytes in the bounded array + // @return true if the bounding range was successful; false otherwise + virtual bool Bound(int32_t offset, int32_t length); + + // Sets limits on the size of the FontData. This is a offset bound only so if + // the FontData is writable and growable then there is no limit to that growth + // from the bounding operation. + // @param offset the start of the new bounds which must be within the current + // size of the FontData + // @return true if the bounding range was successful; false otherwise + virtual bool Bound(int32_t offset); + + // Makes a slice of this FontData. The returned slice will share the data with + // the original <code>FontData</code>. + // @param offset the start of the slice + // @param length the number of bytes in the slice + // @return a slice of the original FontData + virtual CALLER_ATTACH FontData* Slice(int32_t offset, int32_t length) = 0; + + // Makes a bottom bound only slice of this array. The returned slice will + // share the data with the original <code>FontData</code>. + // @param offset the start of the slice + // @return a slice of the original FontData + virtual CALLER_ATTACH FontData* Slice(int32_t offset) = 0; + + // Gets the length of the data. + virtual int32_t Length() const; + + protected: + // Constructor. + // @param ba the byte array to use for the backing data + explicit FontData(ByteArray* ba); + + // Constructor. + // @param data the data to wrap + // @param offset the offset to start the wrap from + // @param length the length of the data wrapped + FontData(FontData* data, int32_t offset, int32_t length); + + // Constructor. + // @param data the data to wrap + // @param offset the offset to start the wrap from + FontData(FontData* data, int32_t offset); + virtual ~FontData(); + + void Init(ByteArray* ba); + + // Gets the offset in the underlying data taking into account any bounds on + // the data. + // @param offset the offset to get the bound compensated offset for + // @return the bound compensated offset + int32_t BoundOffset(int32_t offset); + + // Gets the length in the underlying data taking into account any bounds on + // the data. + // @param offset the offset that the length is being used at + // @param length the length to get the bound compensated length for + // @return the bound compensated length + int32_t BoundLength(int32_t offset, int32_t length); + + static const int32_t GROWABLE_SIZE = INT_MAX; + + // TODO(arthurhsu): style guide violation: refactor this protected member + ByteArrayPtr array_; + + private: + int32_t bound_offset_; + int32_t bound_length_; +}; +typedef Ptr<FontData> FontDataPtr; + +} // namespace sfntly + +#endif // SFNTLY_CPP_SRC_SFNTLY_DATA_FONT_DATA_H_ |