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 <stdio.h>
18 
19 #include "gtest/gtest.h"
20 #include "sfntly/data/memory_byte_array.h"
21 #include "sfntly/data/growable_memory_byte_array.h"
22 #include "sfntly/port/file_input_stream.h"
23 #include "test/test_font_utils.h"
24 
25 namespace sfntly {
26 
BuilderForFontFile(const char * font_path,FontFactory * factory,FontBuilderArray * builders)27 void BuilderForFontFile(const char* font_path, FontFactory* factory,
28                         FontBuilderArray* builders) {
29   assert(factory);
30   FileInputStream is;
31   is.Open(font_path);
32   factory->LoadFontsForBuilding(&is, builders);
33   EXPECT_GT(builders->size(), static_cast<size_t>(0));
34 }
35 
SerializeFont(const char * font_path,FontFactory * factory,Font * font)36 void SerializeFont(const char* font_path, FontFactory* factory, Font* font) {
37   assert(font_path);
38   assert(factory);
39   assert(font);
40   MemoryOutputStream output_stream;
41   factory->SerializeFont(font, &output_stream);
42   SerializeToFile(&output_stream, font_path);
43 }
44 
LoadFont(const char * font_path,FontFactory * factory,FontArray * fonts)45 void LoadFont(const char* font_path, FontFactory* factory, FontArray* fonts) {
46   FileInputStream is;
47   is.Open(font_path);
48   factory->LoadFonts(&is, fonts);
49   is.Close();
50 }
51 
LoadFontUsingByteVector(const char * font_path,bool fingerprint,FontArray * fonts)52 void LoadFontUsingByteVector(const char* font_path,
53                             bool fingerprint,
54                             FontArray* fonts) {
55   ByteVector bv;
56   LoadFile(font_path, &bv);
57   FontFactoryPtr factory;
58   factory.Attach(FontFactory::GetInstance());
59   factory->FingerprintFont(fingerprint);
60   factory->LoadFonts(&bv, fonts);
61 }
62 
LoadFile(const char * input_file_path,ByteVector * input_buffer)63 void LoadFile(const char* input_file_path, ByteVector* input_buffer) {
64   assert(input_file_path);
65   assert(input_buffer);
66 
67   FILE* input_file = NULL;
68 #if defined WIN32
69   fopen_s(&input_file, input_file_path, "rb");
70 #else
71   input_file = fopen(input_file_path, "rb");
72 #endif
73   EXPECT_NE(input_file, reinterpret_cast<FILE*>(NULL));
74   fseek(input_file, 0, SEEK_END);
75   size_t file_size = ftell(input_file);
76   fseek(input_file, 0, SEEK_SET);
77   input_buffer->resize(file_size);
78   size_t bytes_read = fread(&((*input_buffer)[0]), 1, file_size, input_file);
79   EXPECT_EQ(bytes_read, file_size);
80   fclose(input_file);
81 }
82 
SerializeToFile(MemoryOutputStream * output_stream,const char * file_path)83 void SerializeToFile(MemoryOutputStream* output_stream, const char* file_path) {
84   assert(file_path);
85   assert(output_stream);
86 
87   FILE* output_file = NULL;
88 #if defined WIN32
89   fopen_s(&output_file, file_path, "wb");
90 #else
91   output_file = fopen(file_path, "wb");
92 #endif
93   EXPECT_NE(output_file, reinterpret_cast<FILE*>(NULL));
94   fwrite(output_stream->Get(), 1, output_stream->Size(), output_file);
95   fflush(output_file);
96   fclose(output_file);
97 }
98 
HexDump(const unsigned char * byte_data,size_t length)99 void HexDump(const unsigned char* byte_data, size_t length) {
100   if (byte_data == NULL || length == 0) {
101     fprintf(stderr, "<NULL>\n");
102     return;
103   }
104 
105   fprintf(stderr, "data length = %ld (%lx)\n", length, length);
106   for (size_t i = 0; i < length; ++i) {
107     fprintf(stderr, "%02x ", byte_data[i]);
108     if ((i & 0xf) == 0xf) {
109       fprintf(stderr, "\n");
110     }
111   }
112   fprintf(stderr, "\n");
113 }
114 
115 }  // namespace sfntly
116