/*
* 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