/* * Copyright 2011 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "subtly/merger.h" #include #include "sfntly/font.h" #include "sfntly/font_factory.h" #include "subtly/character_predicate.h" #include "subtly/font_assembler.h" #include "subtly/font_info.h" #include "subtly/utils.h" namespace subtly { using namespace sfntly; /****************************************************************************** * Merger class ******************************************************************************/ Merger::Merger(FontArray* fonts) { if (!fonts) { return; } int32_t num_fonts = fonts->size(); for (int32_t i = 0; i < num_fonts; ++i) { fonts_.insert(std::make_pair(i, fonts->at(i))); } } CALLER_ATTACH Font* Merger::Merge() { Ptr merged_info; merged_info.Attach(MergeFontInfos()); if (!merged_info) { #if defined (SUBTLY_DEBUG) fprintf(stderr, "Could not create merged font info\n"); #endif return NULL; } Ptr font_assembler = new FontAssembler(merged_info); return font_assembler->Assemble(); } CALLER_ATTACH FontInfo* Merger::MergeFontInfos() { Ptr font_info = new FontInfo; font_info->set_fonts(&fonts_); for (FontIdMap::iterator it = fonts_.begin(), e = fonts_.end(); it != e; ++it) { Ptr info_builder = new FontSourcedInfoBuilder(it->second, it->first, NULL); Ptr current_font_info; current_font_info.Attach(info_builder->GetFontInfo()); if (!current_font_info) { #if defined (SUBTLY_DEBUG) fprintf(stderr, "Couldn't create font info. " "No subset will be generated.\n"); #endif return NULL; } font_info->chars_to_glyph_ids()->insert( current_font_info->chars_to_glyph_ids()->begin(), current_font_info->chars_to_glyph_ids()->end()); font_info->resolved_glyph_ids()->insert( current_font_info->resolved_glyph_ids()->begin(), current_font_info->resolved_glyph_ids()->end()); #if defined (SUBTLY_DEBUG) fprintf(stderr, "Counts: chars_to_glyph_ids: %d; resoved_glyph_ids: %d\n", font_info->chars_to_glyph_ids()->size(), font_info->resolved_glyph_ids()->size()); #endif } return font_info.Detach(); } }