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