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 byte_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 byte_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