/*
* 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 <stdio.h>
#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<FontInfo> 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<FontAssembler> font_assembler = new FontAssembler(merged_info);
return font_assembler->Assemble();
}
CALLER_ATTACH FontInfo* Merger::MergeFontInfos() {
Ptr<FontInfo> font_info = new FontInfo;
font_info->set_fonts(&fonts_);
for (FontIdMap::iterator it = fonts_.begin(),
e = fonts_.end(); it != e; ++it) {
Ptr<FontSourcedInfoBuilder> info_builder =
new FontSourcedInfoBuilder(it->second, it->first, NULL);
Ptr<FontInfo> 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();
}
}