| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1998-2004 David Turner and Werner Lemberg | 2 * Copyright (C) 1998-2004 David Turner and Werner Lemberg |
| 3 * Copyright (C) 2006 Behdad Esfahbod | 3 * Copyright (C) 2006 Behdad Esfahbod |
| 4 * | 4 * |
| 5 * This is part of HarfBuzz, an OpenType Layout engine library. | 5 * This is part of HarfBuzz, an OpenType Layout engine library. |
| 6 * | 6 * |
| 7 * Permission is hereby granted, without written agreement and without | 7 * Permission is hereby granted, without written agreement and without |
| 8 * license or royalty fees, to use, copy, modify, and distribute this | 8 * license or royalty fees, to use, copy, modify, and distribute this |
| 9 * software and its documentation for any purpose, provided that the | 9 * software and its documentation for any purpose, provided that the |
| 10 * above copyright notice and the following two paragraphs appear in | 10 * above copyright notice and the following two paragraphs appear in |
| (...skipping 1264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1275 } | 1275 } |
| 1276 | 1276 |
| 1277 | 1277 |
| 1278 | 1278 |
| 1279 /*************************** | 1279 /*************************** |
| 1280 * Device related functions | 1280 * Device related functions |
| 1281 ***************************/ | 1281 ***************************/ |
| 1282 | 1282 |
| 1283 | 1283 |
| 1284 HB_INTERNAL HB_Error | 1284 HB_INTERNAL HB_Error |
| 1285 _HB_OPEN_Load_Device( HB_Device* d, | 1285 _HB_OPEN_Load_Device( HB_Device** device, |
| 1286 HB_Stream stream ) | 1286 HB_Stream stream ) |
| 1287 { | 1287 { |
| 1288 HB_Device* d; |
| 1288 HB_Error error; | 1289 HB_Error error; |
| 1289 | 1290 |
| 1290 HB_UShort n, count; | 1291 HB_UShort n, count; |
| 1291 | 1292 |
| 1292 HB_UShort* dv; | 1293 HB_UShort* dv; |
| 1293 | 1294 |
| 1294 | 1295 |
| 1295 if ( ACCESS_Frame( 6L ) ) | 1296 if ( ACCESS_Frame( 6L ) ) |
| 1296 return error; | 1297 return error; |
| 1297 | 1298 |
| 1299 if ( ALLOC( *device, sizeof(HB_Device)) ) |
| 1300 { |
| 1301 *device = 0; |
| 1302 return error; |
| 1303 } |
| 1304 |
| 1305 d = *device; |
| 1306 |
| 1298 d->StartSize = GET_UShort(); | 1307 d->StartSize = GET_UShort(); |
| 1299 d->EndSize = GET_UShort(); | 1308 d->EndSize = GET_UShort(); |
| 1300 d->DeltaFormat = GET_UShort(); | 1309 d->DeltaFormat = GET_UShort(); |
| 1301 | 1310 |
| 1302 FORGET_Frame(); | 1311 FORGET_Frame(); |
| 1303 | 1312 |
| 1304 d->DeltaValue = NULL; | 1313 d->DeltaValue = NULL; |
| 1305 | 1314 |
| 1306 if ( d->StartSize > d->EndSize || | 1315 if ( d->StartSize > d->EndSize || |
| 1307 d->DeltaFormat == 0 || d->DeltaFormat > 3 ) | 1316 d->DeltaFormat == 0 || d->DeltaFormat > 3 ) |
| 1308 { | 1317 { |
| 1309 /* XXX | 1318 /* XXX |
| 1310 * I've seen fontforge generate DeltaFormat == 0. | 1319 * I've seen fontforge generate DeltaFormat == 0. |
| 1311 * Just return Ok and let the NULL DeltaValue disable | 1320 * Just return Ok and let the NULL DeltaValue disable |
| 1312 * this table. | 1321 * this table. |
| 1313 */ | 1322 */ |
| 1314 return HB_Err_Ok; | 1323 return HB_Err_Ok; |
| 1315 } | 1324 } |
| 1316 | 1325 |
| 1317 count = ( ( d->EndSize - d->StartSize + 1 ) >> | 1326 count = ( ( d->EndSize - d->StartSize + 1 ) >> |
| 1318 ( 4 - d->DeltaFormat ) ) + 1; | 1327 ( 4 - d->DeltaFormat ) ) + 1; |
| 1319 | 1328 |
| 1320 if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) ) | 1329 if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) ) |
| 1330 { |
| 1331 FREE( *device ); |
| 1332 *device = 0; |
| 1321 return error; | 1333 return error; |
| 1334 } |
| 1322 | 1335 |
| 1323 if ( ACCESS_Frame( count * 2L ) ) | 1336 if ( ACCESS_Frame( count * 2L ) ) |
| 1324 { | 1337 { |
| 1325 FREE( d->DeltaValue ); | 1338 FREE( d->DeltaValue ); |
| 1339 FREE( *device ); |
| 1340 *device = 0; |
| 1326 return error; | 1341 return error; |
| 1327 } | 1342 } |
| 1328 | 1343 |
| 1329 dv = d->DeltaValue; | 1344 dv = d->DeltaValue; |
| 1330 | 1345 |
| 1331 for ( n = 0; n < count; n++ ) | 1346 for ( n = 0; n < count; n++ ) |
| 1332 dv[n] = GET_UShort(); | 1347 dv[n] = GET_UShort(); |
| 1333 | 1348 |
| 1334 FORGET_Frame(); | 1349 FORGET_Frame(); |
| 1335 | 1350 |
| 1336 return HB_Err_Ok; | 1351 return HB_Err_Ok; |
| 1337 } | 1352 } |
| 1338 | 1353 |
| 1339 | 1354 |
| 1340 HB_INTERNAL void | 1355 HB_INTERNAL void |
| 1341 _HB_OPEN_Free_Device( HB_Device* d ) | 1356 _HB_OPEN_Free_Device( HB_Device* d ) |
| 1342 { | 1357 { |
| 1343 FREE( d->DeltaValue ); | 1358 if ( d ) |
| 1359 { |
| 1360 FREE( d->DeltaValue ); |
| 1361 FREE( d ); |
| 1362 } |
| 1344 } | 1363 } |
| 1345 | 1364 |
| 1346 | 1365 |
| 1347 /* Since we have the delta values stored in compressed form, we must | 1366 /* Since we have the delta values stored in compressed form, we must |
| 1348 uncompress it now. To simplify the interface, the function always | 1367 uncompress it now. To simplify the interface, the function always |
| 1349 returns a meaningful value in `value'; the error is just for | 1368 returns a meaningful value in `value'; the error is just for |
| 1350 information. | 1369 information. |
| 1351 | | | 1370 | | |
| 1352 format = 1: 0011223344556677|8899101112131415|... | 1371 format = 1: 0011223344556677|8899101112131415|... |
| 1353 | | | 1372 | | |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1377 11111111: (byte >> 0) & mask | 1396 11111111: (byte >> 0) & mask |
| 1378 .... | 1397 .... |
| 1379 | 1398 |
| 1380 mask = 0x00FF */ | 1399 mask = 0x00FF */ |
| 1381 | 1400 |
| 1382 HB_INTERNAL HB_Error | 1401 HB_INTERNAL HB_Error |
| 1383 _HB_OPEN_Get_Device( HB_Device* d, | 1402 _HB_OPEN_Get_Device( HB_Device* d, |
| 1384 HB_UShort size, | 1403 HB_UShort size, |
| 1385 HB_Short* value ) | 1404 HB_Short* value ) |
| 1386 { | 1405 { |
| 1387 HB_UShort byte, bits, mask, f, s; | 1406 HB_UShort byte, bits, mask, s; |
| 1388 | 1407 |
| 1389 | 1408 if ( d && d->DeltaValue && size >= d->StartSize && size <= d->EndSize ) |
| 1390 f = d->DeltaFormat; | |
| 1391 | |
| 1392 if ( d->DeltaValue && size >= d->StartSize && size <= d->EndSize ) | |
| 1393 { | 1409 { |
| 1410 HB_UShort f = d->DeltaFormat; |
| 1394 s = size - d->StartSize; | 1411 s = size - d->StartSize; |
| 1395 byte = d->DeltaValue[s >> ( 4 - f )]; | 1412 byte = d->DeltaValue[s >> ( 4 - f )]; |
| 1396 bits = byte >> ( 16 - ( ( s % ( 1 << ( 4 - f ) ) + 1 ) << f ) ); | 1413 bits = byte >> ( 16 - ( ( s % ( 1 << ( 4 - f ) ) + 1 ) << f ) ); |
| 1397 mask = 0xFFFF >> ( 16 - ( 1 << f ) ); | 1414 mask = 0xFFFF >> ( 16 - ( 1 << f ) ); |
| 1398 | 1415 |
| 1399 *value = (HB_Short)( bits & mask ); | 1416 *value = (HB_Short)( bits & mask ); |
| 1400 | 1417 |
| 1401 /* conversion to a signed value */ | 1418 /* conversion to a signed value */ |
| 1402 | 1419 |
| 1403 if ( *value >= ( ( mask + 1 ) >> 1 ) ) | 1420 if ( *value >= ( ( mask + 1 ) >> 1 ) ) |
| 1404 *value -= mask + 1; | 1421 *value -= mask + 1; |
| 1405 | 1422 |
| 1406 return HB_Err_Ok; | 1423 return HB_Err_Ok; |
| 1407 } | 1424 } |
| 1408 else | 1425 else |
| 1409 { | 1426 { |
| 1410 *value = 0; | 1427 *value = 0; |
| 1411 return HB_Err_Not_Covered; | 1428 return HB_Err_Not_Covered; |
| 1412 } | 1429 } |
| 1413 } | 1430 } |
| 1414 | 1431 |
| 1415 | 1432 |
| 1416 /* END */ | 1433 /* END */ |
| OLD | NEW |