1437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Copyright 2013 Google Inc. All Rights Reserved. 2437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// 3437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Licensed under the Apache License, Version 2.0 (the "License"); 4437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// you may not use this file except in compliance with the License. 5437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// You may obtain a copy of the License at 6437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// 7437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// http://www.apache.org/licenses/LICENSE-2.0 8437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// 9437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Unless required by applicable law or agreed to in writing, software 10437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// distributed under the License is distributed on an "AS IS" BASIS, 11437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// See the License for the specific language governing permissions and 13437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// limitations under the License. 14437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// 15437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Data model and I/O for glyph data within sfnt format files for the purpose of 16437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// performing the preprocessing step of the WOFF 2.0 conversion. 17437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 18494c85cebbaaa0db345df69ffa1b639aa4652022Zoltan Szabadka#ifndef WOFF2_GLYPH_H_ 19494c85cebbaaa0db345df69ffa1b639aa4652022Zoltan Szabadka#define WOFF2_GLYPH_H_ 20437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 21437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#include <stddef.h> 22437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#include <inttypes.h> 23437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter#include <vector> 24437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 25437bbad37074e472b66d427814275de84ca77f19Roderick Sheeternamespace woff2 { 26437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 27437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Represents a parsed simple or composite glyph. The composite glyph data and 28437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// instructions are un-parsed and we keep only pointers to the raw data, 29437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// therefore the glyph is valid only so long the data from which it was parsed 30437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// is around. 31437bbad37074e472b66d427814275de84ca77f19Roderick Sheeterclass Glyph { 32437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter public: 33437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter Glyph() : instructions_size(0), composite_data_size(0) {} 34437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 35437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter // Bounding box. 36437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter int16_t x_min; 37437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter int16_t x_max; 38437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter int16_t y_min; 39437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter int16_t y_max; 40437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 41437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter // Instructions. 42437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter uint16_t instructions_size; 43437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter const uint8_t* instructions_data; 44437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 45437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter // Data model for simple glyphs. 46437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter struct Point { 47437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter int x; 48437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter int y; 49437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter bool on_curve; 50437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter }; 51437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter std::vector<std::vector<Point> > contours; 52437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 53437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter // Data for composite glyphs. 54437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter const uint8_t* composite_data; 55437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter uint32_t composite_data_size; 56437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter bool have_instructions; 57437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter}; 58437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 59437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Parses the glyph from the given data. Returns false on parsing failure or 60437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// buffer overflow. The glyph is valid only so long the input data pointer is 61437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// valid. 62437bbad37074e472b66d427814275de84ca77f19Roderick Sheeterbool ReadGlyph(const uint8_t* data, size_t len, Glyph* glyph); 63437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 64437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Stores the glyph into the specified dst buffer. The *dst_size is the buffer 65437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// size on entry and is set to the actual (unpadded) stored size on exit. 66437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter// Returns false on buffer overflow. 67437bbad37074e472b66d427814275de84ca77f19Roderick Sheeterbool StoreGlyph(const Glyph& glyph, uint8_t* dst, size_t* dst_size); 68437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 69437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter} // namespace woff2 70437bbad37074e472b66d427814275de84ca77f19Roderick Sheeter 71494c85cebbaaa0db345df69ffa1b639aa4652022Zoltan Szabadka#endif // WOFF2_GLYPH_H_ 72