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 "gtest/gtest.h"
18#include "sfntly/font.h"
19#include "sfntly/table/core/os2_table.h"
20#include "test/serialization_test.h"
21
22namespace sfntly {
23
24const int32_t OS2_VERSION = 1;
25const int32_t OS2_XAVG_CHAR_WIDTH = 863;
26const int32_t OS2_US_WEIGHT_CLASS = 500;
27const int32_t OS2_US_WIDTH_CLASS = 5;
28const int32_t OS2_FS_TYPE = 0;
29const int32_t OS2_YSUBS_XSIZE = 0;
30const int32_t OS2_YSUBS_YSIZE = 2;
31const int32_t OS2_YSUBS_XOFFSET = -16560;
32const int32_t OS2_YSUBS_YOFFSET = 0;
33const int32_t OS2_YSUPS_XSIZE = -25944;
34const int32_t OS2_YSUPS_YSIZE = -27176;
35const int32_t OS2_YSUPS_XOFFSET = -16376;
36const int32_t OS2_YSUPS_YOFFSET = 1;
37const int32_t OS2_YSTRIKEOUT_SIZE = 12312;
38const int32_t OS2_YSTRIKEOUT_POS = -16224;
39const int32_t OS2_SFAMILY_CLASS = 0;
40const byte_t OS2_PANOSE[] = { 2, 11, 6, 3, 6, 1, 0, 0, 0, 0 };
41const int64_t OS2_UL_UNICODE_RANGE1 = 0xE00002FFL;
42const int64_t OS2_UL_UNICODE_RANGE2 = 0x520020FBL;
43const int64_t OS2_UL_UNICODE_RANGE3 = 0L;
44const int64_t OS2_UL_UNICODE_RANGE4 = 0L;
45const byte_t OS2_ACH_VEND_ID[] = { 'P', 'f', 'E', 'd' };
46const int32_t OS2_FS_SELECTION = 0x0040;
47const int32_t OS2_US_FIRST_CHAR_IDX = 0x0020;
48const int32_t OS2_US_LAST_CHAR_IDX = 0xFFFF;
49const int32_t OS2_STYPO_ASCENDER = 1597;
50const int32_t OS2_STYPO_DESCENDER = -451;
51const int32_t OS2_STYPO_LINE_GAP = 0;
52const int32_t OS2_US_WIN_ASCENT = 2023;
53const int32_t OS2_US_WIN_DESCENT = 648;
54const int64_t OS2_UL_CODE_PAGE_RANGE1 = 0x2000019FL;
55const int64_t OS2_UL_CODE_PAGE_RANGE2 = 0x00000000L;
56
57static bool VerifyOS_2(Table* table) {
58  OS2TablePtr os2 = down_cast<OS2Table*>(table);
59  if (os2 == NULL) {
60    return false;
61  }
62
63  EXPECT_EQ(os2->TableVersion(), OS2_VERSION);
64  EXPECT_EQ(os2->XAvgCharWidth(), OS2_XAVG_CHAR_WIDTH);
65  EXPECT_EQ(os2->UsWeightClass(), OS2_US_WEIGHT_CLASS);
66  EXPECT_EQ(os2->UsWidthClass(), OS2_US_WIDTH_CLASS);
67  EXPECT_EQ(os2->FsType(), OS2_FS_TYPE);
68  EXPECT_EQ(os2->YSubscriptXSize(), OS2_YSUBS_XSIZE);
69  EXPECT_EQ(os2->YSubscriptYSize(), OS2_YSUBS_YSIZE);
70  EXPECT_EQ(os2->YSubscriptXOffset(), OS2_YSUBS_XOFFSET);
71  EXPECT_EQ(os2->YSubscriptYOffset(), OS2_YSUBS_YOFFSET);
72  EXPECT_EQ(os2->YSuperscriptXSize(), OS2_YSUPS_XSIZE);
73  EXPECT_EQ(os2->YSuperscriptYSize(), OS2_YSUPS_YSIZE);
74  EXPECT_EQ(os2->YSuperscriptXOffset(), OS2_YSUPS_XOFFSET);
75  EXPECT_EQ(os2->YSuperscriptYOffset(), OS2_YSUPS_YOFFSET);
76  EXPECT_EQ(os2->YStrikeoutSize(), OS2_YSTRIKEOUT_SIZE);
77  EXPECT_EQ(os2->YStrikeoutPosition(), OS2_YSTRIKEOUT_POS);
78  EXPECT_EQ(os2->SFamilyClass(), OS2_SFAMILY_CLASS);
79
80  ByteVector panose;
81  os2->Panose(&panose);
82  EXPECT_EQ(panose.size(), sizeof(OS2_PANOSE));
83  for (size_t i = 0; i < panose.size(); ++i) {
84    EXPECT_EQ(panose[i], OS2_PANOSE[i]);
85  }
86
87  EXPECT_EQ(os2->UlUnicodeRange1(), OS2_UL_UNICODE_RANGE1);
88  EXPECT_EQ(os2->UlUnicodeRange2(), OS2_UL_UNICODE_RANGE2);
89  EXPECT_EQ(os2->UlUnicodeRange3(), OS2_UL_UNICODE_RANGE3);
90  EXPECT_EQ(os2->UlUnicodeRange4(), OS2_UL_UNICODE_RANGE4);
91
92  ByteVector vend_id;
93  os2->AchVendId(&vend_id);
94  EXPECT_EQ(vend_id.size(), sizeof(OS2_ACH_VEND_ID));
95  for (size_t i = 0; i < vend_id.size(); ++i) {
96    EXPECT_EQ(vend_id[i], OS2_ACH_VEND_ID[i]);
97  }
98
99  EXPECT_EQ(os2->FsSelection(), OS2_FS_SELECTION);
100  EXPECT_EQ(os2->UsFirstCharIndex(), OS2_US_FIRST_CHAR_IDX);
101  EXPECT_EQ(os2->UsLastCharIndex(), OS2_US_LAST_CHAR_IDX);
102  EXPECT_EQ(os2->STypoAscender(), OS2_STYPO_ASCENDER);
103  EXPECT_EQ(os2->STypoDescender(), OS2_STYPO_DESCENDER);
104  EXPECT_EQ(os2->STypoLineGap(), OS2_STYPO_LINE_GAP);
105  EXPECT_EQ(os2->UsWinAscent(), OS2_US_WIN_ASCENT);
106  EXPECT_EQ(os2->UsWinDescent(), OS2_US_WIN_DESCENT);
107  EXPECT_EQ(os2->UlCodePageRange1(), OS2_UL_CODE_PAGE_RANGE1);
108  EXPECT_EQ(os2->UlCodePageRange2(), OS2_UL_CODE_PAGE_RANGE2);
109
110  // TODO(arthurhsu): SxHeight() not tested
111  // TODO(arthurhsu): SCapHeight() not tested
112  // TODO(arthurhsu): UsDefaultChar() not tested
113  // TODO(arthurhsu): UsBreakChar() not tested
114  // TODO(arthurhsu): UsMaxContext() not tested
115
116  return true;
117}
118
119bool VerifyOS_2(Table* original, Table* target) {
120  EXPECT_TRUE(VerifyOS_2(original));
121  EXPECT_TRUE(VerifyOS_2(target));
122  return true;
123}
124
125}  // namespace sfntly
126