Home | History | Annotate | Download | only in chromium
      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   int SubsetFont(const unsigned int* glyph_ids,
     61                  size_t glyph_count,
     62                  unsigned char** output_buffer);
     63 
     64  private:
     65   CALLER_ATTACH Font* Subset(const IntegerSet& glyph_ids,
     66                              GlyphTable* glyf, LocaTable* loca);
     67 
     68   FontFactoryPtr factory_;
     69   FontPtr font_;
     70 };
     71 
     72 }  // namespace sfntly
     73 
     74 #endif  // SFNTLY_CPP_SRC_TEST_SUBSETTER_IMPL_H_
     75