18c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com/* 28c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * Copyright 2011 Google Inc. All Rights Reserved. 38c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * 48c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 58c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * you may not use this file except in compliance with the License. 68c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * You may obtain a copy of the License at 78c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * 88c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * http://www.apache.org/licenses/LICENSE-2.0 98c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * 108c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * Unless required by applicable law or agreed to in writing, software 118c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * distributed under the License is distributed on an "AS IS" BASIS, 128c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * See the License for the specific language governing permissions and 148c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * limitations under the License. 158c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com */ 168c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 178c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include <stdio.h> 188c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include <stdlib.h> 198c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 208c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include <map> 218c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include <utility> 228c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 238c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "sfntly/font.h" 248c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "sfntly/table/core/cmap_table.h" 258c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "sfntly/tag.h" 268c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "subtly/stats.h" 278c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "subtly/subsetter.h" 288c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "subtly/utils.h" 298c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 308c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comusing namespace subtly; 318c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 328c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comvoid PrintUsage(const char* program_name) { 338c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com fprintf(stdout, "Usage: %s <input_font_file>\n", program_name); 348c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com} 358c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 368c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comint main(int argc, const char** argv) { 378c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com const char* program_name = argv[0]; 388c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com if (argc < 2) { 398c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com PrintUsage(program_name); 408c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com exit(1); 418c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com } 428c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 438c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com const char* input_font_path = argv[1]; 448c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com const char* output_font_path = argv[2]; 458c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com FontPtr font; 468c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com font.Attach(subtly::LoadFont(input_font_path)); 478c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 488c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com int32_t original_size = TotalFontSize(font); 498c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com Ptr<Subsetter> subsetter = new Subsetter(font, NULL); 508c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com Ptr<Font> new_font; 518c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com new_font.Attach(subsetter->Subset()); 528c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com if (!new_font) { 538c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com fprintf(stdout, "Cannot create subset.\n"); 548c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com return 0; 558c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com } 568c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com 578c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com subtly::SerializeFont(output_font_path, new_font); 588c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com subtly::PrintComparison(stdout, font, new_font); 598c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com int32_t new_size = TotalFontSize(new_font); 608c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com fprintf(stdout, "Went from %d to %d: %lf%% of original\n", 618c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com original_size, new_size, 628c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com static_cast<double>(new_size) / original_size * 100); 638c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com return 0; 648c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com} 65