1 /*
2 * Copyright 2011 Google Inc. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "subtly/merger.h"
18
19 #include <stdio.h>
20
21 #include "sfntly/font.h"
22 #include "sfntly/font_factory.h"
23 #include "subtly/character_predicate.h"
24 #include "subtly/font_assembler.h"
25 #include "subtly/font_info.h"
26 #include "subtly/utils.h"
27
28 namespace subtly {
29 using namespace sfntly;
30
31 /******************************************************************************
32 * Merger class
33 ******************************************************************************/
Merger(FontArray * fonts)34 Merger::Merger(FontArray* fonts) {
35 if (!fonts) {
36 return;
37 }
38 int32_t num_fonts = fonts->size();
39 for (int32_t i = 0; i < num_fonts; ++i) {
40 fonts_.insert(std::make_pair(i, fonts->at(i)));
41 }
42 }
43
Merge()44 CALLER_ATTACH Font* Merger::Merge() {
45 Ptr<FontInfo> merged_info;
46 merged_info.Attach(MergeFontInfos());
47 if (!merged_info) {
48 #if defined (SUBTLY_DEBUG)
49 fprintf(stderr, "Could not create merged font info\n");
50 #endif
51 return NULL;
52 }
53 Ptr<FontAssembler> font_assembler = new FontAssembler(merged_info);
54 return font_assembler->Assemble();
55 }
56
MergeFontInfos()57 CALLER_ATTACH FontInfo* Merger::MergeFontInfos() {
58 Ptr<FontInfo> font_info = new FontInfo;
59 font_info->set_fonts(&fonts_);
60 for (FontIdMap::iterator it = fonts_.begin(),
61 e = fonts_.end(); it != e; ++it) {
62 Ptr<FontSourcedInfoBuilder> info_builder =
63 new FontSourcedInfoBuilder(it->second, it->first, NULL);
64 Ptr<FontInfo> current_font_info;
65 current_font_info.Attach(info_builder->GetFontInfo());
66 if (!current_font_info) {
67 #if defined (SUBTLY_DEBUG)
68 fprintf(stderr, "Couldn't create font info. "
69 "No subset will be generated.\n");
70 #endif
71 return NULL;
72 }
73 font_info->chars_to_glyph_ids()->insert(
74 current_font_info->chars_to_glyph_ids()->begin(),
75 current_font_info->chars_to_glyph_ids()->end());
76 font_info->resolved_glyph_ids()->insert(
77 current_font_info->resolved_glyph_ids()->begin(),
78 current_font_info->resolved_glyph_ids()->end());
79 #if defined (SUBTLY_DEBUG)
80 fprintf(stderr, "Counts: chars_to_glyph_ids: %d; resoved_glyph_ids: %d\n",
81 font_info->chars_to_glyph_ids()->size(),
82 font_info->resolved_glyph_ids()->size());
83 #endif
84 }
85 return font_info.Detach();
86 }
87 }
88