1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: Test for GetTextMetrics and GetTextExtentPoint32 5 * COPYRIGHT: Copyright 2018 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) 6 */ 7 8 #include "precomp.h" 9 10 /* #define EMIT_TESTCASES */ 11 12 typedef struct TEST_ENTRY 13 { 14 int line; 15 LONG lfHeight; 16 LONG lfWidth; 17 LONG cxText; 18 LONG cyText; 19 LONG tmHeight; 20 LONG tmAscent; 21 LONG tmDescent; 22 LONG tmInternalLeading; 23 LONG tmExternalLeading; 24 } TEST_ENTRY; 25 26 #ifdef EMIT_TESTCASES 27 static const TEST_ENTRY g_test_entries[] = 28 { 29 { __LINE__, 400, 0 }, 30 { __LINE__, 300, 0 }, 31 { __LINE__, 200, 0 }, 32 { __LINE__, 100, 0 }, 33 { __LINE__, 64, 0 }, 34 { __LINE__, 32, 0 }, 35 { __LINE__, 16, 0 }, 36 { __LINE__, 15, 0 }, 37 { __LINE__, 14, 0 }, 38 { __LINE__, 13, 0 }, 39 { __LINE__, 12, 0 }, 40 { __LINE__, 11, 0 }, 41 { __LINE__, 10, 0 }, 42 { __LINE__, 9, 0 }, 43 { __LINE__, 8, 0 }, 44 { __LINE__, 7, 0 }, 45 { __LINE__, 6, 0 }, 46 { __LINE__, 5, 0 }, 47 { __LINE__, 4, 0 }, 48 { __LINE__, 3, 0 }, 49 { __LINE__, 2, 0 }, 50 { __LINE__, 1, 0 }, 51 { __LINE__, 0, 0 }, 52 { __LINE__, -1, 0 }, 53 { __LINE__, -2, 0 }, 54 { __LINE__, -3, 0 }, 55 { __LINE__, -4, 0 }, 56 { __LINE__, -5, 0 }, 57 { __LINE__, -6, 0 }, 58 { __LINE__, -7, 0 }, 59 { __LINE__, -8, 0 }, 60 { __LINE__, -9, 0 }, 61 { __LINE__, -10, 0 }, 62 { __LINE__, -11, 0 }, 63 { __LINE__, -12, 0 }, 64 { __LINE__, -13, 0 }, 65 { __LINE__, -14, 0 }, 66 { __LINE__, -15, 0 }, 67 { __LINE__, -16, 0 }, 68 { __LINE__, -32, 0 }, 69 { __LINE__, -64, 0 }, 70 { __LINE__, -100, 0 }, 71 { __LINE__, -200, 0 }, 72 { __LINE__, -300, 0 }, 73 { __LINE__, -400, 0 }, 74 }; 75 #define g_test_entry_count _countof(g_test_entries) 76 #else 77 static const TEST_ENTRY g_FREEMONO[] = 78 { 79 { __LINE__, 400, 0, 3600, 400, 400, 320, 80, 0, 0 }, 80 { __LINE__, 300, 0, 2700, 300, 300, 240, 60, 0, 0 }, 81 { __LINE__, 200, 0, 1800, 200, 200, 160, 40, 0, 0 }, 82 { __LINE__, 100, 0, 900, 100, 100, 80, 20, 0, 0 }, 83 { __LINE__, 64, 0, 570, 64, 64, 51, 13, 0, 0 }, 84 { __LINE__, 32, 0, 285, 32, 32, 26, 6, 0, 0 }, 85 { __LINE__, 16, 0, 150, 16, 16, 13, 3, 0, 0 }, 86 { __LINE__, 15, 0, 135, 15, 15, 12, 3, 0, 0 }, 87 { __LINE__, 14, 0, 120, 14, 14, 11, 3, 0, 0 }, 88 { __LINE__, 13, 0, 120, 13, 13, 10, 3, 0, 0 }, 89 { __LINE__, 12, 0, 105, 12, 12, 10, 2, 0, 0 }, 90 { __LINE__, 11, 0, 105, 11, 11, 9, 2, 0, 0 }, 91 { __LINE__, 10, 0, 90, 10, 10, 8, 2, 0, 0 }, 92 { __LINE__, 9, 0, 77, 9, 9, 7, 2, 0, 0 }, 93 { __LINE__, 8, 0, 75, 8, 8, 6, 2, 0, 0 }, 94 { __LINE__, 7, 0, 60, 7, 7, 6, 1, 0, 0 }, 95 { __LINE__, 6, 0, 60, 6, 6, 5, 1, 0, 0 }, 96 { __LINE__, 5, 0, 45, 5, 5, 4, 1, 0, 0 }, 97 { __LINE__, 4, 0, 30, 4, 4, 3, 1, 0, 0 }, 98 { __LINE__, 3, 0, 30, 3, 3, 2, 1, 0, 0 }, 99 { __LINE__, 2, 0, 15, 2, 2, 2, 0, 0, 0 }, 100 { __LINE__, 1, 0, 15, 2, 2, 2, 0, 0, 0 }, 101 { __LINE__, 0, 0, -165, -18, -18, -14, -4, 0, 0 }, 102 { __LINE__, -1, 0, 15, 2, 2, 2, 0, 0, 0 }, 103 { __LINE__, -2, 0, 15, 2, 2, 2, 0, 0, 0 }, 104 { __LINE__, -3, 0, 30, 3, 3, 2, 1, 0, 0 }, 105 { __LINE__, -4, 0, 30, 4, 4, 3, 1, 0, 0 }, 106 { __LINE__, -5, 0, 45, 5, 5, 4, 1, 0, 0 }, 107 { __LINE__, -6, 0, 60, 6, 6, 5, 1, 0, 0 }, 108 { __LINE__, -7, 0, 60, 7, 7, 6, 1, 0, 0 }, 109 { __LINE__, -8, 0, 75, 8, 8, 6, 2, 0, 0 }, 110 { __LINE__, -9, 0, 77, 9, 9, 7, 2, 0, 0 }, 111 { __LINE__, -10, 0, 90, 10, 10, 8, 2, 0, 0 }, 112 { __LINE__, -11, 0, 105, 11, 11, 9, 2, 0, 0 }, 113 { __LINE__, -12, 0, 105, 12, 12, 10, 2, 0, 0 }, 114 { __LINE__, -13, 0, 120, 13, 13, 10, 3, 0, 0 }, 115 { __LINE__, -14, 0, 120, 14, 14, 11, 3, 0, 0 }, 116 { __LINE__, -15, 0, 135, 15, 15, 12, 3, 0, 0 }, 117 { __LINE__, -16, 0, 150, 16, 16, 13, 3, 0, 0 }, 118 { __LINE__, -32, 0, 285, 32, 32, 26, 6, 0, 0 }, 119 { __LINE__, -64, 0, 570, 64, 64, 51, 13, 0, 0 }, 120 { __LINE__, -100, 0, 900, 100, 100, 80, 20, 0, 0 }, 121 { __LINE__, -200, 0, 1800, 200, 200, 160, 40, 0, 0 }, 122 { __LINE__, -300, 0, 2700, 300, 300, 240, 60, 0, 0 }, 123 { __LINE__, -400, 0, 3600, 400, 400, 320, 80, 0, 0 }, 124 }; 125 #define g_FREEMONO_count _countof(g_FREEMONO) 126 127 static const TEST_ENTRY g_DEJAVUSERIF[] = 128 { 129 { __LINE__, 400, 0, 2323, 400, 400, 319, 81, 56, 0 }, 130 { __LINE__, 300, 0, 1743, 300, 300, 239, 61, 42, 0 }, 131 { __LINE__, 200, 0, 1162, 200, 200, 159, 41, 28, 0 }, 132 { __LINE__, 100, 0, 580, 100, 100, 80, 20, 14, 0 }, 133 { __LINE__, 64, 0, 370, 64, 64, 51, 13, 9, 0 }, 134 { __LINE__, 32, 0, 190, 32, 32, 26, 6, 4, 0 }, 135 { __LINE__, 16, 0, 91, 16, 16, 13, 3, 2, 0 }, 136 { __LINE__, 15, 0, 84, 15, 15, 12, 3, 2, 0 }, 137 { __LINE__, 14, 0, 82, 14, 14, 11, 3, 2, 0 }, 138 { __LINE__, 13, 0, 77, 13, 13, 10, 3, 2, 0 }, 139 { __LINE__, 12, 0, 66, 12, 12, 10, 2, 2, 0 }, 140 { __LINE__, 11, 0, 63, 11, 11, 9, 2, 2, 0 }, 141 { __LINE__, 10, 0, 63, 10, 10, 8, 2, 1, 0 }, 142 { __LINE__, 9, 0, 56, 9, 9, 7, 2, 1, 0 }, 143 { __LINE__, 8, 0, 49, 8, 8, 6, 2, 1, 0 }, 144 { __LINE__, 7, 0, 42, 7, 7, 6, 1, 1, 0 }, 145 { __LINE__, 6, 0, 36, 6, 6, 5, 1, 1, 0 }, 146 { __LINE__, 5, 0, 26, 5, 5, 4, 1, 1, 0 }, 147 { __LINE__, 4, 0, 22, 4, 4, 3, 1, 1, 0 }, 148 { __LINE__, 3, 0, 22, 3, 3, 2, 1, 0, 0 }, 149 { __LINE__, 2, 0, 15, 2, 2, 2, 0, 0, 0 }, 150 { __LINE__, 1, 0, 15, 2, 2, 2, 0, 0, 0 }, 151 { __LINE__, 0, 0, -125, -21, -21, -17, -4, -3, 0 }, 152 { __LINE__, -1, 0, 15, 2, 2, 2, 0, 0, 0 }, 153 { __LINE__, -2, 0, 15, 2, 2, 2, 0, 0, 0 }, 154 { __LINE__, -3, 0, 22, 4, 4, 3, 1, 1, 0 }, 155 { __LINE__, -4, 0, 26, 5, 5, 4, 1, 1, 0 }, 156 { __LINE__, -5, 0, 36, 6, 6, 5, 1, 1, 0 }, 157 { __LINE__, -6, 0, 42, 7, 7, 6, 1, 1, 0 }, 158 { __LINE__, -7, 0, 49, 8, 8, 6, 2, 1, 0 }, 159 { __LINE__, -8, 0, 56, 9, 9, 7, 2, 1, 0 }, 160 { __LINE__, -9, 0, 63, 10, 10, 8, 2, 1, 0 }, 161 { __LINE__, -10, 0, 66, 11, 11, 9, 2, 1, 0 }, 162 { __LINE__, -11, 0, 77, 13, 13, 10, 3, 2, 0 }, 163 { __LINE__, -12, 0, 82, 14, 14, 11, 3, 2, 0 }, 164 { __LINE__, -13, 0, 84, 15, 15, 12, 3, 2, 0 }, 165 { __LINE__, -14, 0, 91, 16, 16, 13, 3, 2, 0 }, 166 { __LINE__, -15, 0, 103, 18, 18, 14, 4, 3, 0 }, 167 { __LINE__, -16, 0, 114, 19, 19, 15, 4, 3, 0 }, 168 { __LINE__, -32, 0, 214, 38, 38, 30, 8, 6, 0 }, 169 { __LINE__, -64, 0, 431, 74, 74, 59, 15, 10, 0 }, 170 { __LINE__, -100, 0, 674, 117, 117, 93, 24, 17, 0 }, 171 { __LINE__, -200, 0, 1352, 233, 233, 186, 47, 33, 0 }, 172 { __LINE__, -300, 0, 2026, 349, 349, 278, 71, 49, 0 }, 173 { __LINE__, -400, 0, 2702, 465, 465, 371, 94, 65, 0 }, 174 }; 175 #define g_DEJAVUSERIF_count _countof(g_DEJAVUSERIF) 176 177 static const TEST_ENTRY g_DEJAVUSANS[] = 178 { 179 { __LINE__, 400, 0, 2286, 400, 400, 319, 81, 56, 0 }, 180 { __LINE__, 300, 0, 1715, 300, 300, 239, 61, 42, 0 }, 181 { __LINE__, 200, 0, 1145, 200, 200, 159, 41, 28, 0 }, 182 { __LINE__, 100, 0, 573, 100, 100, 80, 20, 14, 0 }, 183 { __LINE__, 64, 0, 366, 64, 64, 51, 13, 9, 0 }, 184 { __LINE__, 32, 0, 188, 32, 32, 26, 6, 4, 0 }, 185 { __LINE__, 16, 0, 91, 16, 16, 13, 3, 2, 0 }, 186 { __LINE__, 15, 0, 84, 15, 15, 12, 3, 2, 0 }, 187 { __LINE__, 14, 0, 84, 14, 14, 11, 3, 2, 0 }, 188 { __LINE__, 13, 0, 79, 13, 13, 10, 3, 2, 0 }, 189 { __LINE__, 12, 0, 62, 12, 12, 10, 2, 2, 0 }, 190 { __LINE__, 11, 0, 64, 11, 11, 9, 2, 2, 0 }, 191 { __LINE__, 10, 0, 64, 10, 10, 8, 2, 1, 0 }, 192 { __LINE__, 9, 0, 54, 9, 9, 7, 2, 1, 0 }, 193 { __LINE__, 8, 0, 46, 8, 8, 6, 2, 1, 0 }, 194 { __LINE__, 7, 0, 41, 7, 7, 6, 1, 1, 0 }, 195 { __LINE__, 6, 0, 35, 6, 6, 5, 1, 1, 0 }, 196 { __LINE__, 5, 0, 25, 5, 5, 4, 1, 1, 0 }, 197 { __LINE__, 4, 0, 22, 4, 4, 3, 1, 1, 0 }, 198 { __LINE__, 3, 0, 22, 3, 3, 2, 1, 0, 0 }, 199 { __LINE__, 2, 0, 15, 2, 2, 2, 0, 0, 0 }, 200 { __LINE__, 1, 0, 15, 2, 2, 2, 0, 0, 0 }, 201 { __LINE__, 0, 0, -116, -21, -21, -17, -4, -3, 0 }, 202 { __LINE__, -1, 0, 15, 2, 2, 2, 0, 0, 0 }, 203 { __LINE__, -2, 0, 15, 2, 2, 2, 0, 0, 0 }, 204 { __LINE__, -3, 0, 22, 4, 4, 3, 1, 1, 0 }, 205 { __LINE__, -4, 0, 25, 5, 5, 4, 1, 1, 0 }, 206 { __LINE__, -5, 0, 35, 6, 6, 5, 1, 1, 0 }, 207 { __LINE__, -6, 0, 41, 7, 7, 6, 1, 1, 0 }, 208 { __LINE__, -7, 0, 46, 8, 8, 6, 2, 1, 0 }, 209 { __LINE__, -8, 0, 54, 9, 9, 7, 2, 1, 0 }, 210 { __LINE__, -9, 0, 64, 10, 10, 8, 2, 1, 0 }, 211 { __LINE__, -10, 0, 62, 11, 11, 9, 2, 1, 0 }, 212 { __LINE__, -11, 0, 79, 13, 13, 10, 3, 2, 0 }, 213 { __LINE__, -12, 0, 84, 14, 14, 11, 3, 2, 0 }, 214 { __LINE__, -13, 0, 84, 15, 15, 12, 3, 2, 0 }, 215 { __LINE__, -14, 0, 91, 16, 16, 13, 3, 2, 0 }, 216 { __LINE__, -15, 0, 98, 18, 18, 14, 4, 3, 0 }, 217 { __LINE__, -16, 0, 102, 19, 19, 15, 4, 3, 0 }, 218 { __LINE__, -32, 0, 215, 38, 38, 30, 8, 6, 0 }, 219 { __LINE__, -64, 0, 423, 74, 74, 59, 15, 10, 0 }, 220 { __LINE__, -100, 0, 665, 117, 117, 93, 24, 17, 0 }, 221 { __LINE__, -200, 0, 1331, 233, 233, 186, 47, 33, 0 }, 222 { __LINE__, -300, 0, 1992, 349, 349, 278, 71, 49, 0 }, 223 { __LINE__, -400, 0, 2657, 465, 465, 371, 94, 65, 0 }, 224 }; 225 #define g_DEJAVUSANS_count _countof(g_DEJAVUSANS) 226 227 static const TEST_ENTRY g_UBUNTUMONO[] = 228 { 229 { __LINE__, 400, 0, 3000, 400, 400, 332, 68, 0, 0 }, 230 { __LINE__, 300, 0, 2250, 300, 300, 249, 51, 0, 0 }, 231 { __LINE__, 200, 0, 1500, 200, 200, 166, 34, 1, 0 }, 232 { __LINE__, 100, 0, 735, 100, 100, 83, 17, 2, 0 }, 233 { __LINE__, 64, 0, 465, 63, 63, 53, 10, 2, 0 }, 234 { __LINE__, 32, 0, 240, 31, 31, 26, 5, 0, 0 }, 235 { __LINE__, 16, 0, 105, 16, 16, 13, 3, 3, 0 }, 236 { __LINE__, 15, 0, 90, 15, 15, 12, 3, 4, 0 }, 237 { __LINE__, 14, 0, 75, 14, 14, 11, 3, 5, 0 }, 238 { __LINE__, 13, 0, 60, 13, 13, 10, 3, 5, 0 }, 239 { __LINE__, 12, 0, 60, 12, 12, 10, 2, 5, 0 }, 240 { __LINE__, 11, 0, 60, 11, 11, 9, 2, 4, 0 }, 241 { __LINE__, 10, 0, 60, 10, 10, 8, 2, 3, 0 }, 242 { __LINE__, 9, 0, 60, 9, 9, 7, 2, 2, 0 }, 243 { __LINE__, 8, 0, 60, 8, 8, 7, 1, 1, 0 }, 244 { __LINE__, 7, 0, 60, 7, 7, 6, 1, 0, 0 }, 245 { __LINE__, 6, 0, 45, 6, 6, 5, 1, 0, 0 }, 246 { __LINE__, 5, 0, 45, 5, 5, 4, 1, 0, 0 }, 247 { __LINE__, 4, 0, 30, 4, 4, 3, 1, 0, 0 }, 248 { __LINE__, 3, 0, 30, 3, 3, 2, 1, 0, 0 }, 249 { __LINE__, 2, 0, 15, 2, 2, 2, 0, 0, 0 }, 250 { __LINE__, 1, 0, 15, 2, 2, 2, 0, 0, 0 }, 251 { __LINE__, 0, 0, -135, -19, -19, -16, -3, -1, 0 }, 252 { __LINE__, -1, 0, 15, 2, 2, 2, 0, 0, 0 }, 253 { __LINE__, -2, 0, 15, 2, 2, 2, 0, 0, 0 }, 254 { __LINE__, -3, 0, 30, 3, 3, 2, 1, 0, 0 }, 255 { __LINE__, -4, 0, 30, 4, 4, 3, 1, 0, 0 }, 256 { __LINE__, -5, 0, 45, 5, 5, 4, 1, 0, 0 }, 257 { __LINE__, -6, 0, 45, 6, 6, 5, 1, 0, 0 }, 258 { __LINE__, -7, 0, 60, 7, 7, 6, 1, 0, 0 }, 259 { __LINE__, -8, 0, 60, 13, 13, 10, 3, 5, 0 }, 260 { __LINE__, -9, 0, 75, 14, 14, 11, 3, 5, 0 }, 261 { __LINE__, -10, 0, 75, 14, 14, 11, 3, 4, 0 }, 262 { __LINE__, -11, 0, 90, 15, 15, 12, 3, 4, 0 }, 263 { __LINE__, -12, 0, 90, 15, 15, 12, 3, 3, 0 }, 264 { __LINE__, -13, 0, 105, 16, 16, 13, 3, 3, 0 }, 265 { __LINE__, -14, 0, 105, 17, 17, 14, 3, 3, 0 }, 266 { __LINE__, -15, 0, 105, 17, 17, 14, 3, 2, 0 }, 267 { __LINE__, -16, 0, 120, 18, 18, 15, 3, 2, 0 }, 268 { __LINE__, -32, 0, 240, 33, 33, 28, 5, 1, 0 }, 269 { __LINE__, -64, 0, 480, 66, 66, 55, 11, 2, 0 }, 270 { __LINE__, -100, 0, 750, 101, 101, 84, 17, 1, 0 }, 271 { __LINE__, -200, 0, 1500, 201, 201, 167, 34, 1, 0 }, 272 { __LINE__, -300, 0, 2250, 300, 300, 249, 51, 0, 0 }, 273 { __LINE__, -400, 0, 3000, 400, 400, 332, 68, 0, 0 }, 274 }; 275 #define g_UBUNTUMONO_count _countof(g_UBUNTUMONO) 276 277 static const TEST_ENTRY g_MSGOTHIC[] = 278 { 279 { __LINE__, 400, 0, 3000, 400, 400, 344, 56, 0, 0 }, 280 { __LINE__, 300, 0, 2250, 300, 300, 258, 42, 0, 0 }, 281 { __LINE__, 200, 0, 1500, 200, 200, 172, 28, 0, 0 }, 282 { __LINE__, 100, 0, 750, 100, 100, 86, 14, 0, 0 }, 283 { __LINE__, 64, 0, 480, 64, 64, 55, 9, 0, 0 }, 284 { __LINE__, 32, 0, 240, 33, 33, 28, 5, 1, 0 }, 285 { __LINE__, 16, 0, 120, 16, 16, 14, 2, 0, 0 }, 286 { __LINE__, 15, 0, 120, 15, 15, 13, 2, 0, 0 }, 287 { __LINE__, 14, 0, 105, 14, 14, 12, 2, 0, 0 }, 288 { __LINE__, 13, 0, 105, 13, 13, 11, 2, 0, 0 }, 289 { __LINE__, 12, 0, 90, 12, 12, 10, 2, 0, 0 }, 290 { __LINE__, 11, 0, 90, 11, 11, 9, 2, 0, 0 }, 291 { __LINE__, 10, 0, 75, 10, 10, 9, 1, 0, 0 }, 292 { __LINE__, 9, 0, 75, 9, 9, 8, 1, 0, 0 }, 293 { __LINE__, 8, 0, 60, 8, 8, 7, 1, 0, 0 }, 294 { __LINE__, 7, 0, 60, 7, 7, 6, 1, 0, 0 }, 295 { __LINE__, 6, 0, 45, 6, 6, 5, 1, 0, 0 }, 296 { __LINE__, 5, 0, 45, 5, 5, 4, 1, 0, 0 }, 297 { __LINE__, 4, 0, 30, 4, 4, 3, 1, 0, 0 }, 298 { __LINE__, 3, 0, 30, 3, 3, 3, 0, 0, 0 }, 299 { __LINE__, 2, 0, 15, 2, 2, 2, 0, 0, 0 }, 300 { __LINE__, 1, 0, 15, 2, 2, 2, 0, 0, 0 }, 301 { __LINE__, 0, 0, -135, -18, -18, -15, -3, 0, 0 }, 302 { __LINE__, -1, 0, 15, 2, 2, 2, 0, 0, 0 }, 303 { __LINE__, -2, 0, 15, 2, 2, 2, 0, 0, 0 }, 304 { __LINE__, -3, 0, 30, 3, 3, 3, 0, 0, 0 }, 305 { __LINE__, -4, 0, 30, 4, 4, 3, 1, 0, 0 }, 306 { __LINE__, -5, 0, 45, 5, 5, 4, 1, 0, 0 }, 307 { __LINE__, -6, 0, 45, 6, 6, 5, 1, 0, 0 }, 308 { __LINE__, -7, 0, 60, 7, 7, 6, 1, 0, 0 }, 309 { __LINE__, -8, 0, 60, 8, 8, 7, 1, 0, 0 }, 310 { __LINE__, -9, 0, 75, 9, 9, 8, 1, 0, 0 }, 311 { __LINE__, -10, 0, 75, 10, 10, 9, 1, 0, 0 }, 312 { __LINE__, -11, 0, 90, 11, 11, 9, 2, 0, 0 }, 313 { __LINE__, -12, 0, 90, 12, 12, 10, 2, 0, 0 }, 314 { __LINE__, -13, 0, 105, 13, 13, 11, 2, 0, 0 }, 315 { __LINE__, -14, 0, 105, 14, 14, 12, 2, 0, 0 }, 316 { __LINE__, -15, 0, 120, 15, 15, 13, 2, 0, 0 }, 317 { __LINE__, -16, 0, 120, 16, 16, 14, 2, 0, 0 }, 318 { __LINE__, -32, 0, 240, 33, 33, 28, 5, 1, 0 }, 319 { __LINE__, -64, 0, 480, 64, 64, 55, 9, 0, 0 }, 320 { __LINE__, -100, 0, 750, 100, 100, 86, 14, 0, 0 }, 321 { __LINE__, -200, 0, 1500, 200, 200, 172, 28, 0, 0 }, 322 { __LINE__, -300, 0, 2250, 300, 300, 258, 42, 0, 0 }, 323 { __LINE__, -400, 0, 3000, 400, 400, 344, 56, 0, 0 }, 324 }; 325 #define g_MSGOTHIC_count _countof(g_MSGOTHIC) 326 327 static const TEST_ENTRY g_MSMINCHO[] = 328 { 329 { __LINE__, 400, 0, 3000, 400, 400, 344, 56, 0, 0 }, 330 { __LINE__, 300, 0, 2250, 300, 300, 258, 42, 0, 0 }, 331 { __LINE__, 200, 0, 1500, 200, 200, 172, 28, 0, 0 }, 332 { __LINE__, 100, 0, 750, 100, 100, 86, 14, 0, 0 }, 333 { __LINE__, 64, 0, 480, 64, 64, 55, 9, 0, 0 }, 334 { __LINE__, 32, 0, 240, 33, 33, 28, 5, 1, 0 }, 335 { __LINE__, 16, 0, 120, 16, 16, 14, 2, 0, 0 }, 336 { __LINE__, 15, 0, 120, 15, 15, 13, 2, 0, 0 }, 337 { __LINE__, 14, 0, 105, 14, 14, 12, 2, 0, 0 }, 338 { __LINE__, 13, 0, 105, 13, 13, 11, 2, 0, 0 }, 339 { __LINE__, 12, 0, 90, 12, 12, 10, 2, 0, 0 }, 340 { __LINE__, 11, 0, 90, 11, 11, 9, 2, 0, 0 }, 341 { __LINE__, 10, 0, 75, 10, 10, 9, 1, 0, 0 }, 342 { __LINE__, 9, 0, 75, 9, 9, 8, 1, 0, 0 }, 343 { __LINE__, 8, 0, 60, 8, 8, 7, 1, 0, 0 }, 344 { __LINE__, 7, 0, 60, 7, 7, 6, 1, 0, 0 }, 345 { __LINE__, 6, 0, 45, 6, 6, 5, 1, 0, 0 }, 346 { __LINE__, 5, 0, 45, 5, 5, 4, 1, 0, 0 }, 347 { __LINE__, 4, 0, 30, 4, 4, 3, 1, 0, 0 }, 348 { __LINE__, 3, 0, 30, 3, 3, 3, 0, 0, 0 }, 349 { __LINE__, 2, 0, 15, 2, 2, 2, 0, 0, 0 }, 350 { __LINE__, 1, 0, 15, 2, 2, 2, 0, 0, 0 }, 351 { __LINE__, 0, 0, -135, -18, -18, -15, -3, 0, 0 }, 352 { __LINE__, -1, 0, 15, 2, 2, 2, 0, 0, 0 }, 353 { __LINE__, -2, 0, 15, 2, 2, 2, 0, 0, 0 }, 354 { __LINE__, -3, 0, 30, 3, 3, 3, 0, 0, 0 }, 355 { __LINE__, -4, 0, 30, 4, 4, 3, 1, 0, 0 }, 356 { __LINE__, -5, 0, 45, 5, 5, 4, 1, 0, 0 }, 357 { __LINE__, -6, 0, 45, 6, 6, 5, 1, 0, 0 }, 358 { __LINE__, -7, 0, 60, 7, 7, 6, 1, 0, 0 }, 359 { __LINE__, -8, 0, 60, 8, 8, 7, 1, 0, 0 }, 360 { __LINE__, -9, 0, 75, 9, 9, 8, 1, 0, 0 }, 361 { __LINE__, -10, 0, 75, 10, 10, 9, 1, 0, 0 }, 362 { __LINE__, -11, 0, 90, 11, 11, 9, 2, 0, 0 }, 363 { __LINE__, -12, 0, 90, 12, 12, 10, 2, 0, 0 }, 364 { __LINE__, -13, 0, 105, 13, 13, 11, 2, 0, 0 }, 365 { __LINE__, -14, 0, 105, 14, 14, 12, 2, 0, 0 }, 366 { __LINE__, -15, 0, 120, 15, 15, 13, 2, 0, 0 }, 367 { __LINE__, -16, 0, 120, 16, 16, 14, 2, 0, 0 }, 368 { __LINE__, -32, 0, 240, 33, 33, 28, 5, 1, 0 }, 369 { __LINE__, -64, 0, 480, 64, 64, 55, 9, 0, 0 }, 370 { __LINE__, -100, 0, 750, 100, 100, 86, 14, 0, 0 }, 371 { __LINE__, -200, 0, 1500, 200, 200, 172, 28, 0, 0 }, 372 { __LINE__, -300, 0, 2250, 300, 300, 258, 42, 0, 0 }, 373 { __LINE__, -400, 0, 3000, 400, 400, 344, 56, 0, 0 }, 374 }; 375 #define g_MSMINCHO_count _countof(g_MSMINCHO) 376 377 static const TEST_ENTRY g_TAHOMA[] = 378 { 379 { __LINE__, 400, 0, 1953, 400, 400, 332, 68, 0, 0 }, 380 { __LINE__, 300, 0, 1466, 300, 300, 249, 51, 0, 0 }, 381 { __LINE__, 200, 0, 980, 200, 200, 166, 34, 0, 0 }, 382 { __LINE__, 100, 0, 490, 100, 100, 83, 17, 0, 0 }, 383 { __LINE__, 64, 0, 316, 64, 64, 53, 11, 0, 0 }, 384 { __LINE__, 32, 0, 156, 32, 32, 27, 5, 6, 0 }, 385 { __LINE__, 16, 0, 77, 16, 16, 13, 3, 0, 0 }, 386 { __LINE__, 15, 0, 73, 15, 15, 12, 3, 0, 0 }, 387 { __LINE__, 14, 0, 73, 14, 14, 12, 2, 0, 0 }, 388 { __LINE__, 13, 0, 64, 13, 13, 11, 2, 0, 0 }, 389 { __LINE__, 12, 0, 56, 12, 12, 10, 2, 0, 0 }, 390 { __LINE__, 11, 0, 55, 11, 11, 9, 2, 0, 0 }, 391 { __LINE__, 10, 0, 50, 10, 10, 8, 2, 0, 0 }, 392 { __LINE__, 9, 0, 41, 9, 9, 7, 2, 0, 0 }, 393 { __LINE__, 8, 0, 41, 8, 8, 7, 1, 0, 0 }, 394 { __LINE__, 7, 0, 36, 7, 7, 6, 1, 0, 0 }, 395 { __LINE__, 6, 0, 32, 6, 6, 5, 1, 0, 0 }, 396 { __LINE__, 5, 0, 22, 5, 5, 4, 1, 0, 0 }, 397 { __LINE__, 4, 0, 19, 4, 4, 3, 1, 0, 0 }, 398 { __LINE__, 3, 0, 13, 4, 4, 3, 0, 0, 0 }, 399 { __LINE__, 2, 0, 13, 2, 2, 2, 0, 0, 0 }, 400 { __LINE__, 1, 0, 13, 2, 2, 2, 0, 0, 0 }, 401 { __LINE__, 0, 0, -135, -18, -18, -15, -3, 0, 0 }, 402 { __LINE__, -1, 0, 13, 2, 2, 2, 0, 0, 0 }, 403 { __LINE__, -2, 0, 13, 2, 2, 2, 0, 0, 0 }, 404 { __LINE__, -3, 0, 19, 4, 4, 3, 0, 0, 0 }, 405 { __LINE__, -4, 0, 22, 5, 5, 4, 1, 0, 0 }, 406 { __LINE__, -5, 0, 32, 6, 6, 5, 1, 0, 0 }, 407 { __LINE__, -6, 0, 36, 7, 7, 6, 1, 0, 0 }, 408 { __LINE__, -7, 0, 41, 8, 8, 7, 1, 0, 0 }, 409 { __LINE__, -8, 0, 50, 10, 10, 8, 2, 0, 0 }, 410 { __LINE__, -9, 0, 55, 11, 11, 9, 2, 0, 0 }, 411 { __LINE__, -10, 0, 56, 12, 12, 10, 2, 0, 0 }, 412 { __LINE__, -11, 0, 64, 13, 13, 11, 2, 0, 0 }, 413 { __LINE__, -12, 0, 73, 14, 14, 12, 2, 0, 0 }, 414 { __LINE__, -13, 0, 77, 16, 16, 13, 3, 0, 0 }, 415 { __LINE__, -14, 0, 78, 17, 17, 14, 3, 0, 0 }, 416 { __LINE__, -15, 0, 89, 18, 18, 15, 3, 0, 0 }, 417 { __LINE__, -16, 0, 94, 19, 19, 16, 3, 0, 0 }, 418 { __LINE__, -32, 0, 189, 39, 39, 32, 7, 7, 0 }, 419 { __LINE__, -64, 0, 379, 77, 77, 64, 13, 0, 0 }, 420 { __LINE__, -100, 0, 589, 121, 121, 100, 21, 0, 0 }, 421 { __LINE__, -200, 0, 1182, 241, 241, 200, 41, 0, 0 }, 422 { __LINE__, -300, 0, 1770, 362, 362, 300, 62, 0, 0 }, 423 { __LINE__, -400, 0, 2361, 483, 483, 400, 83, 0, 0 }, 424 }; 425 #define g_TAHOMA_count _countof(g_TAHOMA) 426 427 #endif 428 429 typedef struct FONT_ENTRY 430 { 431 const char *entry_name; 432 const char *font_name; 433 const char *font_file; 434 size_t test_count; 435 const TEST_ENTRY *tests; 436 } FONT_ENTRY; 437 438 static FONT_ENTRY g_font_entries[] = 439 { 440 #ifdef EMIT_TESTCASES 441 { "FREEMONO", "FreeMono", "FreeMono.ttf" }, 442 { "DEJAVUSERIF", "DejaVu Serif", "DejaVuSerif.ttf" }, 443 { "DEJAVUSANS", "DejaVu Sans", "DejaVuSans.ttf" }, 444 { "UBUNTUMONO", "Ubuntu Mono", "UbuntuMono-R.ttf" }, 445 { "MSGOTHIC", "MS Gothic", "msgothic.ttc" }, 446 { "MSMINCHO", "MS Mincho", "msmincho.ttc" }, 447 { "TAHOMA", "Tahoma", "tahoma.ttf" }, 448 #else 449 { "FREEMONO", "FreeMono", "FreeMono.ttf", g_FREEMONO_count, g_FREEMONO }, 450 { "DEJAVUSERIF", "DejaVu Serif", "DejaVuSerif.ttf", g_DEJAVUSERIF_count, g_DEJAVUSERIF }, 451 { "DEJAVUSANS", "DejaVu Sans", "DejaVuSans.ttf", g_DEJAVUSANS_count, g_DEJAVUSANS }, 452 { "UBUNTUMONO", "Ubuntu Mono", "UbuntuMono-R.ttf", g_UBUNTUMONO_count, g_UBUNTUMONO }, 453 { "MSGOTHIC", "MS Gothic", "msgothic.ttc", g_MSGOTHIC_count, g_MSGOTHIC }, 454 { "MSMINCHO", "MS Mincho", "msmincho.ttc", g_MSMINCHO_count, g_MSMINCHO }, 455 { "TAHOMA", "Tahoma", "Tahoma.ttf", g_TAHOMA_count, g_TAHOMA }, 456 #endif 457 }; 458 static size_t g_font_entry_count = _countof(g_font_entries); 459 460 START_TEST(GetTextMetrics) 461 { 462 size_t i, k; 463 LOGFONTA lf; 464 HFONT hFont; 465 HDC hDC; 466 HGDIOBJ hFontOld; 467 SIZE siz; 468 TEXTMETRIC tm; 469 char szPath[MAX_PATH]; 470 static const char *text = "This is a test."; 471 472 hDC = CreateCompatibleDC(NULL); 473 for (i = 0; i < g_font_entry_count; ++i) 474 { 475 FONT_ENTRY *font = &g_font_entries[i]; 476 ZeroMemory(&lf, sizeof(lf)); 477 lf.lfCharSet = DEFAULT_CHARSET; 478 lstrcpyA(lf.lfFaceName, font->font_name); 479 480 GetWindowsDirectoryA(szPath, MAX_PATH); 481 lstrcatA(szPath, "\\Fonts\\"); 482 lstrcatA(szPath, font->font_file); 483 if (GetFileAttributesA(szPath) == 0xFFFFFFFF) 484 { 485 skip("Font file '%s' doesn't exists\n", font->font_file); 486 continue; 487 } 488 489 trace("Testing '%s'.\n", font->font_file); 490 491 #ifdef EMIT_TESTCASES 492 printf("static const TEST_ENTRY g_%s[] =\n", font->entry_name); 493 printf("{\n"); 494 for (k = 0; k < g_test_entry_count; ++k) 495 { 496 const TEST_ENTRY *test = &g_test_entries[k]; 497 498 lf.lfHeight = test->lfHeight; 499 lf.lfWidth = test->lfWidth; 500 501 hFont = CreateFontIndirectA(&lf); 502 hFontOld = SelectObject(hDC, hFont); 503 { 504 GetTextExtentPoint32A(hDC, text, lstrlenA(text), &siz); 505 GetTextMetrics(hDC, &tm); 506 } 507 SelectObject(hDC, hFontOld); 508 DeleteObject(hFont); 509 510 printf(" { __LINE__, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld, %ld },\n", 511 lf.lfHeight, lf.lfWidth, 512 siz.cx, siz.cy, 513 tm.tmHeight, tm.tmAscent, tm.tmDescent, tm.tmInternalLeading, tm.tmExternalLeading); 514 } 515 printf("};\n"); 516 printf("#define g_%s_count _countof(g_%s)\n\n", font->entry_name, font->entry_name); 517 #else 518 for (k = 0; k < font->test_count; ++k) 519 { 520 const TEST_ENTRY *test = &font->tests[k]; 521 522 lf.lfHeight = test->lfHeight; 523 lf.lfWidth = test->lfWidth; 524 525 hFont = CreateFontIndirectA(&lf); 526 hFontOld = SelectObject(hDC, hFont); 527 { 528 GetTextExtentPoint32A(hDC, text, lstrlenA(text), &siz); 529 GetTextMetrics(hDC, &tm); 530 } 531 SelectObject(hDC, hFontOld); 532 DeleteObject(hFont); 533 534 if (test->cxText > 0) 535 { 536 ok_(__FILE__, test->line)(labs(test->cxText - siz.cx) <= 1, "%s (%ld): cxText: labs(%ld - %ld) > 1\n", font->entry_name, test->lfHeight, test->cxText, siz.cx); 537 ok_(__FILE__, test->line)(labs(test->cxText - siz.cx) == 0, "%s (%ld): cxText: labs(%ld - %ld) != 0\n", font->entry_name, test->lfHeight, test->cxText, siz.cx); 538 } 539 if (test->cyText > 0) 540 { 541 ok_(__FILE__, test->line)(labs(test->cyText - siz.cy) <= 1, "%s (%ld): cyText: labs(%ld - %ld) > 1\n", font->entry_name, test->lfHeight, test->cyText, siz.cy); 542 ok_(__FILE__, test->line)(labs(test->cyText - siz.cy) == 0, "%s (%ld): cyText: labs(%ld - %ld) != 0\n", font->entry_name, test->lfHeight, test->cyText, siz.cy); 543 } 544 if (test->tmHeight > 0) 545 { 546 ok_(__FILE__, test->line)(labs(test->tmHeight - tm.tmHeight) <= 1, "%s (%ld): tmHeight: labs(%ld - %ld) > 1\n", font->entry_name, test->lfHeight, test->tmHeight, tm.tmHeight); 547 ok_(__FILE__, test->line)(labs(test->tmHeight - tm.tmHeight) == 0, "%s (%ld): tmHeight: labs(%ld - %ld) != 0\n", font->entry_name, test->lfHeight, test->tmHeight, tm.tmHeight); 548 } 549 if (test->tmAscent > 0) 550 { 551 ok_(__FILE__, test->line)(labs(test->tmAscent - tm.tmAscent) <= 1, "%s (%ld): tmAscent: labs(%ld - %ld) > 1\n", font->entry_name, test->lfHeight, test->tmAscent, tm.tmAscent); 552 ok_(__FILE__, test->line)(labs(test->tmAscent - tm.tmAscent) == 0, "%s (%ld): tmAscent: labs(%ld - %ld) != 0\n", font->entry_name, test->lfHeight, test->tmAscent, tm.tmAscent); 553 } 554 if (test->tmDescent > 0) 555 { 556 ok_(__FILE__, test->line)(labs(test->tmDescent - tm.tmDescent) <= 1, "%s (%ld): tmDescent: labs(%ld - %ld) > 1\n", font->entry_name, test->lfHeight, test->tmDescent, tm.tmDescent); 557 ok_(__FILE__, test->line)(labs(test->tmDescent - tm.tmDescent) == 0, "%s (%ld): tmDescent: labs(%ld - %ld) != 0\n", font->entry_name, test->lfHeight, test->tmDescent, tm.tmDescent); 558 } 559 if (test->tmInternalLeading > 0) 560 { 561 ok_(__FILE__, test->line)(labs(test->tmInternalLeading - tm.tmInternalLeading) <= 1, "%s (%ld): tmInternalLeading: labs(%ld - %ld) > 1\n", font->entry_name, test->lfHeight, test->tmInternalLeading, tm.tmInternalLeading); 562 ok_(__FILE__, test->line)(labs(test->tmInternalLeading - tm.tmInternalLeading) == 0, "%s (%ld): tmInternalLeading: labs(%ld - %ld) != 0\n", font->entry_name, test->lfHeight, test->tmInternalLeading, tm.tmInternalLeading); 563 } 564 if (test->tmExternalLeading > 0) 565 { 566 ok_(__FILE__, test->line)(labs(test->tmExternalLeading - tm.tmExternalLeading) <= 1, "%s (%ld): tmExternalLeading: labs(%ld - %ld) > 1\n", font->entry_name, test->lfHeight, test->tmExternalLeading, tm.tmExternalLeading); 567 ok_(__FILE__, test->line)(labs(test->tmExternalLeading - tm.tmExternalLeading) == 0, "%s (%ld): tmExternalLeading: labs(%ld - %ld) != 0\n", font->entry_name, test->lfHeight, test->tmExternalLeading, tm.tmExternalLeading); 568 } 569 } 570 #endif 571 } 572 DeleteDC(hDC); 573 } 574