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 "subtly/merger.h"
188c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com
198c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include <stdio.h>
208c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com
218c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "sfntly/font.h"
228c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "sfntly/font_factory.h"
238c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "subtly/character_predicate.h"
248c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "subtly/font_assembler.h"
258c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "subtly/font_info.h"
268c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#include "subtly/utils.h"
278c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com
288c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comnamespace subtly {
298c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comusing namespace sfntly;
308c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com
318c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com/******************************************************************************
328c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com * Merger class
338c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com ******************************************************************************/
348c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comMerger::Merger(FontArray* fonts) {
358c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  if (!fonts) {
368c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    return;
378c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  }
388c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  int32_t num_fonts = fonts->size();
398c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  for (int32_t i = 0; i < num_fonts; ++i) {
408c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    fonts_.insert(std::make_pair(i, fonts->at(i)));
418c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  }
428c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com}
438c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com
448c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comCALLER_ATTACH Font* Merger::Merge() {
458c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  Ptr<FontInfo> merged_info;
468c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  merged_info.Attach(MergeFontInfos());
478c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  if (!merged_info) {
488c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#if defined (SUBTLY_DEBUG)
498c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    fprintf(stderr, "Could not create merged font info\n");
508c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#endif
518c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    return NULL;
528c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  }
538c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  Ptr<FontAssembler> font_assembler = new FontAssembler(merged_info);
548c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  return font_assembler->Assemble();
558c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com}
568c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com
578c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.comCALLER_ATTACH FontInfo* Merger::MergeFontInfos() {
588c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  Ptr<FontInfo> font_info = new FontInfo;
598c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  font_info->set_fonts(&fonts_);
608c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  for (FontIdMap::iterator it = fonts_.begin(),
618c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com           e = fonts_.end(); it != e; ++it) {
628c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    Ptr<FontSourcedInfoBuilder> info_builder =
638c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com        new FontSourcedInfoBuilder(it->second, it->first, NULL);
648c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    Ptr<FontInfo> current_font_info;
658c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    current_font_info.Attach(info_builder->GetFontInfo());
668c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    if (!current_font_info) {
678c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#if defined (SUBTLY_DEBUG)
688c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com      fprintf(stderr, "Couldn't create font info. "
698c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com              "No subset will be generated.\n");
708c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#endif
718c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com      return NULL;
728c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    }
738c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    font_info->chars_to_glyph_ids()->insert(
748c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com        current_font_info->chars_to_glyph_ids()->begin(),
758c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com        current_font_info->chars_to_glyph_ids()->end());
768c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    font_info->resolved_glyph_ids()->insert(
778c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com        current_font_info->resolved_glyph_ids()->begin(),
788c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com        current_font_info->resolved_glyph_ids()->end());
798c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#if defined (SUBTLY_DEBUG)
808c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com    fprintf(stderr, "Counts: chars_to_glyph_ids: %d; resoved_glyph_ids: %d\n",
818c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com            font_info->chars_to_glyph_ids()->size(),
828c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com            font_info->resolved_glyph_ids()->size());
838c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com#endif
848c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  }
858c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com  return font_info.Detach();
868c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com}
878c433a9f5819ad995a14c8476c266487c8a82f53dfilimon@google.com}
88