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
22 namespace sfntly {
23
24 const int32_t OS2_VERSION = 1;
25 const int32_t OS2_XAVG_CHAR_WIDTH = 863;
26 const int32_t OS2_US_WEIGHT_CLASS = 500;
27 const int32_t OS2_US_WIDTH_CLASS = 5;
28 const int32_t OS2_FS_TYPE = 0;
29 const int32_t OS2_YSUBS_XSIZE = 0;
30 const int32_t OS2_YSUBS_YSIZE = 2;
31 const int32_t OS2_YSUBS_XOFFSET = -16560;
32 const int32_t OS2_YSUBS_YOFFSET = 0;
33 const int32_t OS2_YSUPS_XSIZE = -25944;
34 const int32_t OS2_YSUPS_YSIZE = -27176;
35 const int32_t OS2_YSUPS_XOFFSET = -16376;
36 const int32_t OS2_YSUPS_YOFFSET = 1;
37 const int32_t OS2_YSTRIKEOUT_SIZE = 12312;
38 const int32_t OS2_YSTRIKEOUT_POS = -16224;
39 const int32_t OS2_SFAMILY_CLASS = 0;
40 const uint8_t OS2_PANOSE[] = { 2, 11, 6, 3, 6, 1, 0, 0, 0, 0 };
41 const int64_t OS2_UL_UNICODE_RANGE1 = 0xE00002FFL;
42 const int64_t OS2_UL_UNICODE_RANGE2 = 0x520020FBL;
43 const int64_t OS2_UL_UNICODE_RANGE3 = 0L;
44 const int64_t OS2_UL_UNICODE_RANGE4 = 0L;
45 const uint8_t OS2_ACH_VEND_ID[] = { 'P', 'f', 'E', 'd' };
46 const int32_t OS2_FS_SELECTION = 0x0040;
47 const int32_t OS2_US_FIRST_CHAR_IDX = 0x0020;
48 const int32_t OS2_US_LAST_CHAR_IDX = 0xFFFF;
49 const int32_t OS2_STYPO_ASCENDER = 1597;
50 const int32_t OS2_STYPO_DESCENDER = -451;
51 const int32_t OS2_STYPO_LINE_GAP = 0;
52 const int32_t OS2_US_WIN_ASCENT = 2023;
53 const int32_t OS2_US_WIN_DESCENT = 648;
54 const int64_t OS2_UL_CODE_PAGE_RANGE1 = 0x2000019FL;
55 const int64_t OS2_UL_CODE_PAGE_RANGE2 = 0x00000000L;
56
VerifyOS_2(Table * table)57 static 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
VerifyOS_2(Table * original,Table * target)119 bool 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