Home | History | Annotate | Download | only in test
      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 <map>
     18 #include <algorithm>
     19 
     20 #include "sfntly/font.h"
     21 #include "sfntly/font_factory.h"
     22 #include "sfntly/table/core/font_header_table.h"
     23 #include "sfntly/tag.h"
     24 #include "sfntly/data/memory_byte_array.h"
     25 #include "sfntly/port/endian.h"
     26 #include "sfntly/port/file_input_stream.h"
     27 #include "sfntly/port/memory_output_stream.h"
     28 #include "test/test_data.h"
     29 #include "test/test_font_utils.h"
     30 #include "sfntly/table/core/cmap_table.h"
     31 #include "sfntly/port/refcount.h"
     32 #include "gtest/gtest.h"
     33 
     34 namespace sfntly {
     35 TEST(CMapEditingTest, RemoveAllButOneCMap) {
     36   FontBuilderArray builders;
     37   FontFactoryPtr font_factory;
     38   font_factory.Attach(FontFactory::GetInstance());
     39   BuilderForFontFile(SAMPLE_TTF_FILE, font_factory, &builders);
     40   ASSERT_FALSE(builders.empty());
     41   FontBuilderPtr font_builder = builders[0];
     42   Ptr<CMapTable::Builder> cmap_table_builder =
     43       (CMapTable::Builder*)font_builder->GetTableBuilder(Tag::cmap);
     44   ASSERT_NE(cmap_table_builder, reinterpret_cast<CMapTable::Builder*>(NULL));
     45   CMapTable::CMapBuilderMap*
     46       cmap_builders = cmap_table_builder->GetCMapBuilders();
     47   ASSERT_FALSE(cmap_builders->empty());
     48 
     49   for (CMapTable::CMapBuilderMap::iterator
     50            it = cmap_builders->begin(); it != cmap_builders->end();) {
     51     if (it->second->cmap_id() == CMapTable::WINDOWS_BMP) {
     52       ++it;
     53     } else {
     54       cmap_builders->erase(it++);
     55     }
     56   }
     57   ASSERT_EQ(cmap_builders->size(), (uint32_t)1);
     58   Font* font = font_builder->Build();
     59   CMapTablePtr cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap));
     60   ASSERT_EQ(1, cmap_table->NumCMaps());
     61   CMapTable::CMapPtr cmap;
     62   cmap.Attach(cmap_table->GetCMap(CMapTable::WINDOWS_BMP));
     63   ASSERT_EQ(CMapTable::WINDOWS_BMP, cmap->cmap_id());
     64   delete font;
     65 }
     66 
     67 TEST(CMapEditingTest, CopyAllCMapsToNewFont) {
     68   FontArray fonts;
     69   FontFactoryPtr font_factory;
     70   font_factory.Attach(FontFactory::GetInstance());
     71   LoadFont(SAMPLE_TTF_FILE, font_factory, &fonts);
     72 
     73   ASSERT_FALSE(fonts.empty());
     74   ASSERT_FALSE(fonts[0] == NULL);
     75   FontPtr font = fonts[0];
     76   CMapTablePtr cmap_table = down_cast<CMapTable*>(font->GetTable(Tag::cmap));
     77   FontBuilderPtr font_builder;
     78   font_builder.Attach(font_factory->NewFontBuilder());
     79   Ptr<CMapTable::Builder> cmap_table_builder =
     80       (CMapTable::Builder*)font_builder->NewTableBuilder(Tag::cmap);
     81 
     82   CMapTable::CMapIterator cmap_iter(cmap_table, NULL);
     83   while (cmap_iter.HasNext()) {
     84     CMapTable::CMapPtr cmap;
     85     cmap.Attach(cmap_iter.Next());
     86     if (!cmap)
     87       continue;
     88     cmap_table_builder->NewCMapBuilder(cmap->cmap_id(), cmap->ReadFontData());
     89   }
     90 
     91   FontPtr new_font;
     92   new_font.Attach(font_builder->Build());
     93   CMapTablePtr new_cmap_table =
     94       down_cast<CMapTable*>(font->GetTable(Tag::cmap));
     95   ASSERT_EQ(cmap_table->NumCMaps(), new_cmap_table->NumCMaps());
     96   CMapTable::CMapPtr cmap;
     97   cmap.Attach(cmap_table->GetCMap(CMapTable::WINDOWS_BMP));
     98   ASSERT_NE(cmap, reinterpret_cast<CMapTable::CMap*>(NULL));
     99   ASSERT_EQ(CMapTable::WINDOWS_BMP, cmap->cmap_id());
    100 }
    101 }
    102