• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // File is originally from Chromium third_party/sfntly/src/subsetter.
17 // Use as test case in sfntly so that problems can be caught in upstream early.
18 
19 #ifndef SFNTLY_CPP_SRC_TEST_SUBSETTER_IMPL_H_
20 #define SFNTLY_CPP_SRC_TEST_SUBSETTER_IMPL_H_
21 
22 #include "sfntly/font.h"
23 #include "sfntly/font_factory.h"
24 #include "sfntly/table/truetype/glyph_table.h"
25 #include "sfntly/table/truetype/loca_table.h"
26 #include "sfntly/tag.h"
27 
28 namespace sfntly {
29 
30 // Smart pointer usage in sfntly:
31 //
32 // sfntly carries a smart pointer implementation like COM.  Ref-countable object
33 // type inherits from RefCounted<>, which have AddRef and Release just like
34 // IUnknown (but no QueryInterface).  Use a Ptr<> based smart pointer to hold
35 // the object so that the object ref count is handled correctly.
36 //
37 // class Foo : public RefCounted<Foo> {
38 //  public:
39 //   static Foo* CreateInstance() {
40 //     Ptr<Foo> obj = new Foo();  // ref count = 1
41 //     return obj.detach();
42 //   }
43 // };
44 // typedef Ptr<Foo> FooPtr;  // common short-hand notation
45 // FooPtr obj;
46 // obj.attach(Foo::CreatedInstance());  // ref count = 1
47 // {
48 //   FooPtr obj2 = obj;  // ref count = 2
49 // }  // ref count = 1, obj2 out of scope
50 // obj.release();  // ref count = 0, object destroyed
51 
52 class SubsetterImpl {
53  public:
54   SubsetterImpl();
55   ~SubsetterImpl();
56 
57   bool LoadFont(const char* font_name,
58                 const unsigned char* original_font,
59                 size_t font_size);
60   bool LoadFont(int font_index,
61                 const unsigned char* original_font,
62                 size_t font_size);
63   int SubsetFont(const unsigned int* glyph_ids,
64                  size_t glyph_count,
65                  unsigned char** output_buffer);
66 
67  private:
68   CALLER_ATTACH Font* Subset(const IntegerSet& glyph_ids,
69                              GlyphTable* glyf, LocaTable* loca);
70 
71   FontFactoryPtr factory_;
72   FontPtr font_;
73 };
74 
75 }  // namespace sfntly
76 
77 #endif  // SFNTLY_CPP_SRC_TEST_SUBSETTER_IMPL_H_
78