diff options
Diffstat (limited to 'gfx/sfntly/cpp/src/sample/subtly/merger.cc')
-rw-r--r-- | gfx/sfntly/cpp/src/sample/subtly/merger.cc | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gfx/sfntly/cpp/src/sample/subtly/merger.cc b/gfx/sfntly/cpp/src/sample/subtly/merger.cc new file mode 100644 index 0000000000..7875c2d6b9 --- /dev/null +++ b/gfx/sfntly/cpp/src/sample/subtly/merger.cc @@ -0,0 +1,87 @@ +/* + * 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(); +} +} |