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