130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// File is originally from Chromium third_party/sfntly/src/subsetter.
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Use as test case in sfntly so that problems can be caught in upstream early.
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_TEST_SUBSETTER_IMPL_H_
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_TEST_SUBSETTER_IMPL_H_
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font_factory.h"
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/truetype/glyph_table.h"
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/truetype/loca_table.h"
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/tag.h"
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Smart pointer usage in sfntly:
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// sfntly carries a smart pointer implementation like COM.  Ref-countable object
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// type inherits from RefCounted<>, which have AddRef and Release just like
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// IUnknown (but no QueryInterface).  Use a Ptr<> based smart pointer to hold
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// the object so that the object ref count is handled correctly.
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// class Foo : public RefCounted<Foo> {
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//  public:
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//   static Foo* CreateInstance() {
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//     Ptr<Foo> obj = new Foo();  // ref count = 1
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//     return obj.detach();
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//   }
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// };
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// typedef Ptr<Foo> FooPtr;  // common short-hand notation
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// FooPtr obj;
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// obj.attach(Foo::CreatedInstance());  // ref count = 1
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// {
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//   FooPtr obj2 = obj;  // ref count = 2
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// }  // ref count = 1, obj2 out of scope
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// obj.release();  // ref count = 0, object destroyed
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass SubsetterImpl {
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  SubsetterImpl();
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ~SubsetterImpl();
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool LoadFont(const char* font_name,
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                const unsigned char* original_font,
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                size_t font_size);
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int SubsetFont(const unsigned int* glyph_ids,
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                 size_t glyph_count,
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                 unsigned char** output_buffer);
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private:
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  CALLER_ATTACH Font* Subset(const IntegerSet& glyph_ids,
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                             GlyphTable* glyf, LocaTable* loca);
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontFactoryPtr factory_;
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontPtr font_;
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_TEST_SUBSETTER_IMPL_H_
75