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