普通文本  |  126行  |  4.64 KB

/*
 * 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 "gtest/gtest.h"
#include "sfntly/font.h"
#include "sfntly/table/core/os2_table.h"
#include "test/serialization_test.h"

namespace sfntly {

const int32_t OS2_VERSION = 1;
const int32_t OS2_XAVG_CHAR_WIDTH = 863;
const int32_t OS2_US_WEIGHT_CLASS = 500;
const int32_t OS2_US_WIDTH_CLASS = 5;
const int32_t OS2_FS_TYPE = 0;
const int32_t OS2_YSUBS_XSIZE = 0;
const int32_t OS2_YSUBS_YSIZE = 2;
const int32_t OS2_YSUBS_XOFFSET = -16560;
const int32_t OS2_YSUBS_YOFFSET = 0;
const int32_t OS2_YSUPS_XSIZE = -25944;
const int32_t OS2_YSUPS_YSIZE = -27176;
const int32_t OS2_YSUPS_XOFFSET = -16376;
const int32_t OS2_YSUPS_YOFFSET = 1;
const int32_t OS2_YSTRIKEOUT_SIZE = 12312;
const int32_t OS2_YSTRIKEOUT_POS = -16224;
const int32_t OS2_SFAMILY_CLASS = 0;
const byte_t OS2_PANOSE[] = { 2, 11, 6, 3, 6, 1, 0, 0, 0, 0 };
const int64_t OS2_UL_UNICODE_RANGE1 = 0xE00002FFL;
const int64_t OS2_UL_UNICODE_RANGE2 = 0x520020FBL;
const int64_t OS2_UL_UNICODE_RANGE3 = 0L;
const int64_t OS2_UL_UNICODE_RANGE4 = 0L;
const byte_t OS2_ACH_VEND_ID[] = { 'P', 'f', 'E', 'd' };
const int32_t OS2_FS_SELECTION = 0x0040;
const int32_t OS2_US_FIRST_CHAR_IDX = 0x0020;
const int32_t OS2_US_LAST_CHAR_IDX = 0xFFFF;
const int32_t OS2_STYPO_ASCENDER = 1597;
const int32_t OS2_STYPO_DESCENDER = -451;
const int32_t OS2_STYPO_LINE_GAP = 0;
const int32_t OS2_US_WIN_ASCENT = 2023;
const int32_t OS2_US_WIN_DESCENT = 648;
const int64_t OS2_UL_CODE_PAGE_RANGE1 = 0x2000019FL;
const int64_t OS2_UL_CODE_PAGE_RANGE2 = 0x00000000L;

static bool VerifyOS_2(Table* table) {
  OS2TablePtr os2 = down_cast<OS2Table*>(table);
  if (os2 == NULL) {
    return false;
  }

  EXPECT_EQ(os2->TableVersion(), OS2_VERSION);
  EXPECT_EQ(os2->XAvgCharWidth(), OS2_XAVG_CHAR_WIDTH);
  EXPECT_EQ(os2->UsWeightClass(), OS2_US_WEIGHT_CLASS);
  EXPECT_EQ(os2->UsWidthClass(), OS2_US_WIDTH_CLASS);
  EXPECT_EQ(os2->FsType(), OS2_FS_TYPE);
  EXPECT_EQ(os2->YSubscriptXSize(), OS2_YSUBS_XSIZE);
  EXPECT_EQ(os2->YSubscriptYSize(), OS2_YSUBS_YSIZE);
  EXPECT_EQ(os2->YSubscriptXOffset(), OS2_YSUBS_XOFFSET);
  EXPECT_EQ(os2->YSubscriptYOffset(), OS2_YSUBS_YOFFSET);
  EXPECT_EQ(os2->YSuperscriptXSize(), OS2_YSUPS_XSIZE);
  EXPECT_EQ(os2->YSuperscriptYSize(), OS2_YSUPS_YSIZE);
  EXPECT_EQ(os2->YSuperscriptXOffset(), OS2_YSUPS_XOFFSET);
  EXPECT_EQ(os2->YSuperscriptYOffset(), OS2_YSUPS_YOFFSET);
  EXPECT_EQ(os2->YStrikeoutSize(), OS2_YSTRIKEOUT_SIZE);
  EXPECT_EQ(os2->YStrikeoutPosition(), OS2_YSTRIKEOUT_POS);
  EXPECT_EQ(os2->SFamilyClass(), OS2_SFAMILY_CLASS);

  ByteVector panose;
  os2->Panose(&panose);
  EXPECT_EQ(panose.size(), sizeof(OS2_PANOSE));
  for (size_t i = 0; i < panose.size(); ++i) {
    EXPECT_EQ(panose[i], OS2_PANOSE[i]);
  }

  EXPECT_EQ(os2->UlUnicodeRange1(), OS2_UL_UNICODE_RANGE1);
  EXPECT_EQ(os2->UlUnicodeRange2(), OS2_UL_UNICODE_RANGE2);
  EXPECT_EQ(os2->UlUnicodeRange3(), OS2_UL_UNICODE_RANGE3);
  EXPECT_EQ(os2->UlUnicodeRange4(), OS2_UL_UNICODE_RANGE4);

  ByteVector vend_id;
  os2->AchVendId(&vend_id);
  EXPECT_EQ(vend_id.size(), sizeof(OS2_ACH_VEND_ID));
  for (size_t i = 0; i < vend_id.size(); ++i) {
    EXPECT_EQ(vend_id[i], OS2_ACH_VEND_ID[i]);
  }

  EXPECT_EQ(os2->FsSelection(), OS2_FS_SELECTION);
  EXPECT_EQ(os2->UsFirstCharIndex(), OS2_US_FIRST_CHAR_IDX);
  EXPECT_EQ(os2->UsLastCharIndex(), OS2_US_LAST_CHAR_IDX);
  EXPECT_EQ(os2->STypoAscender(), OS2_STYPO_ASCENDER);
  EXPECT_EQ(os2->STypoDescender(), OS2_STYPO_DESCENDER);
  EXPECT_EQ(os2->STypoLineGap(), OS2_STYPO_LINE_GAP);
  EXPECT_EQ(os2->UsWinAscent(), OS2_US_WIN_ASCENT);
  EXPECT_EQ(os2->UsWinDescent(), OS2_US_WIN_DESCENT);
  EXPECT_EQ(os2->UlCodePageRange1(), OS2_UL_CODE_PAGE_RANGE1);
  EXPECT_EQ(os2->UlCodePageRange2(), OS2_UL_CODE_PAGE_RANGE2);

  // TODO(arthurhsu): SxHeight() not tested
  // TODO(arthurhsu): SCapHeight() not tested
  // TODO(arthurhsu): UsDefaultChar() not tested
  // TODO(arthurhsu): UsBreakChar() not tested
  // TODO(arthurhsu): UsMaxContext() not tested

  return true;
}

bool VerifyOS_2(Table* original, Table* target) {
  EXPECT_TRUE(VerifyOS_2(original));
  EXPECT_TRUE(VerifyOS_2(target));
  return true;
}

}  // namespace sfntly