130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved.
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License.
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License.
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <stdio.h>
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gtest/gtest.h"
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/memory_byte_array.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/growable_memory_byte_array.h"
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/file_input_stream.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "test/test_font_utils.h"
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid BuilderForFontFile(const char* font_path, FontFactory* factory,
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                        FontBuilderArray* builders) {
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(factory);
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FileInputStream is;
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Open(font_path);
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  factory->LoadFontsForBuilding(&is, builders);
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_GT(builders->size(), static_cast<size_t>(0));
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid SerializeFont(const char* font_path, FontFactory* factory, Font* font) {
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(font_path);
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(factory);
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(font);
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  MemoryOutputStream output_stream;
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  factory->SerializeFont(font, &output_stream);
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  SerializeToFile(&output_stream, font_path);
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid LoadFont(const char* font_path, FontFactory* factory, FontArray* fonts) {
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FileInputStream is;
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Open(font_path);
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  factory->LoadFonts(&is, fonts);
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  is.Close();
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid LoadFontUsingByteVector(const char* font_path,
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                            bool fingerprint,
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                            FontArray* fonts) {
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  ByteVector bv;
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  LoadFile(font_path, &bv);
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FontFactoryPtr factory;
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  factory.Attach(FontFactory::GetInstance());
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  factory->FingerprintFont(fingerprint);
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  factory->LoadFonts(&bv, fonts);
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid LoadFile(const char* input_file_path, ByteVector* input_buffer) {
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(input_file_path);
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(input_buffer);
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FILE* input_file = NULL;
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined WIN32
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fopen_s(&input_file, input_file_path, "rb");
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  input_file = fopen(input_file_path, "rb");
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_NE(input_file, reinterpret_cast<FILE*>(NULL));
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fseek(input_file, 0, SEEK_END);
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  size_t file_size = ftell(input_file);
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fseek(input_file, 0, SEEK_SET);
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  input_buffer->resize(file_size);
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  size_t bytes_read = fread(&((*input_buffer)[0]), 1, file_size, input_file);
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_EQ(bytes_read, file_size);
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fclose(input_file);
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid SerializeToFile(MemoryOutputStream* output_stream, const char* file_path) {
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(file_path);
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  assert(output_stream);
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  FILE* output_file = NULL;
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#if defined WIN32
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fopen_s(&output_file, file_path, "wb");
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#else
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  output_file = fopen(file_path, "wb");
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  EXPECT_NE(output_file, reinterpret_cast<FILE*>(NULL));
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fwrite(output_stream->Get(), 1, output_stream->Size(), output_file);
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fflush(output_file);
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fclose(output_file);
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunvoid HexDump(const unsigned char* byte_data, size_t length) {
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  if (byte_data == NULL || length == 0) {
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    fprintf(stderr, "<NULL>\n");
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return;
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fprintf(stderr, "data length = %ld (%lx)\n", length, length);
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  for (size_t i = 0; i < length; ++i) {
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    fprintf(stderr, "%02x ", byte_data[i]);
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    if ((i & 0xf) == 0xf) {
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun      fprintf(stderr, "\n");
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    }
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  }
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  fprintf(stderr, "\n");
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
116