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 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h> 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdlib.h> 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <map> 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <utility> 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h" 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/core/cmap_table.h" 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/tag.h" 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "subtly/stats.h" 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "subtly/subsetter.h" 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "subtly/utils.h" 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunusing namespace subtly; 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid PrintUsage(const char* program_name) { 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stdout, "Usage: %s <input_font_file>\n", program_name); 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunint main(int argc, const char** argv) { 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* program_name = argv[0]; 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (argc < 2) { 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun PrintUsage(program_name); 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun exit(1); 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* input_font_path = argv[1]; 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const char* output_font_path = argv[2]; 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontPtr font; 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun font.Attach(subtly::LoadFont(input_font_path)); 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t original_size = TotalFontSize(font); 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<Subsetter> subsetter = new Subsetter(font, NULL); 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Ptr<Font> new_font; 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun new_font.Attach(subsetter->Subset()); 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun if (!new_font) { 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stdout, "Cannot create subset.\n"); 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return 0; 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun subtly::SerializeFont(output_font_path, new_font); 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun subtly::PrintComparison(stdout, font, new_font); 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t new_size = TotalFontSize(new_font); 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun fprintf(stdout, "Went from %d to %d: %lf%% of original\n", 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun original_size, new_size, 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static_cast<double>(new_size) / original_size * 100); 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return 0; 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} 65