OLD | NEW |
1 | 1 |
2 /* pngpread.c - read a png file in push mode | 2 /* pngpread.c - read a png file in push mode |
3 * | 3 * |
4 * Last changed in libpng 1.2.44 [June 26, 2010] | 4 * Last changed in libpng 1.2.44 [June 26, 2010] |
5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson | 5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson |
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) | 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) |
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) | 7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) |
8 * | 8 * |
9 * This code is released under the libpng license. | 9 * This code is released under the libpng license. |
10 * For conditions of distribution and use, see the disclaimer | 10 * For conditions of distribution and use, see the disclaimer |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 png_push_read_chunk(png_ptr, info_ptr); | 64 png_push_read_chunk(png_ptr, info_ptr); |
65 break; | 65 break; |
66 } | 66 } |
67 | 67 |
68 case PNG_READ_IDAT_MODE: | 68 case PNG_READ_IDAT_MODE: |
69 { | 69 { |
70 png_push_read_IDAT(png_ptr); | 70 png_push_read_IDAT(png_ptr); |
71 break; | 71 break; |
72 } | 72 } |
73 | 73 |
74 #ifdef PNG_READ_tEXt_SUPPORTED | |
75 case PNG_READ_tEXt_MODE: | |
76 { | |
77 png_push_read_tEXt(png_ptr, info_ptr); | |
78 break; | |
79 } | |
80 | |
81 #endif | |
82 #ifdef PNG_READ_zTXt_SUPPORTED | |
83 case PNG_READ_zTXt_MODE: | |
84 { | |
85 png_push_read_zTXt(png_ptr, info_ptr); | |
86 break; | |
87 } | |
88 | |
89 #endif | |
90 #ifdef PNG_READ_iTXt_SUPPORTED | |
91 case PNG_READ_iTXt_MODE: | |
92 { | |
93 png_push_read_iTXt(png_ptr, info_ptr); | |
94 break; | |
95 } | |
96 | |
97 #endif | |
98 case PNG_SKIP_MODE: | 74 case PNG_SKIP_MODE: |
99 { | 75 { |
100 png_push_crc_finish(png_ptr); | 76 png_push_crc_finish(png_ptr); |
101 break; | 77 break; |
102 } | 78 } |
103 | 79 |
104 default: | 80 default: |
105 { | 81 { |
106 png_ptr->buffer_size = 0; | 82 png_ptr->buffer_size = 0; |
107 break; | 83 break; |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 #endif | 498 #endif |
523 #ifdef PNG_READ_tEXt_SUPPORTED | 499 #ifdef PNG_READ_tEXt_SUPPORTED |
524 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) | 500 else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) |
525 { | 501 { |
526 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 502 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
527 { | 503 { |
528 png_push_save_buffer(png_ptr); | 504 png_push_save_buffer(png_ptr); |
529 return; | 505 return; |
530 } | 506 } |
531 | 507 |
532 png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); | 508 png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); |
533 } | 509 } |
534 | 510 |
535 #endif | 511 #endif |
536 #ifdef PNG_READ_zTXt_SUPPORTED | 512 #ifdef PNG_READ_zTXt_SUPPORTED |
537 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) | 513 else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) |
538 { | 514 { |
539 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 515 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
540 { | 516 { |
541 png_push_save_buffer(png_ptr); | 517 png_push_save_buffer(png_ptr); |
542 return; | 518 return; |
543 } | 519 } |
544 | 520 |
545 png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); | 521 png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); |
546 } | 522 } |
547 | 523 |
548 #endif | 524 #endif |
549 #ifdef PNG_READ_iTXt_SUPPORTED | 525 #ifdef PNG_READ_iTXt_SUPPORTED |
550 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) | 526 else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) |
551 { | 527 { |
552 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 528 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
553 { | 529 { |
554 png_push_save_buffer(png_ptr); | 530 png_push_save_buffer(png_ptr); |
555 return; | 531 return; |
556 } | 532 } |
557 | 533 |
558 png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); | 534 png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); |
559 } | 535 } |
560 | 536 |
561 #endif | 537 #endif |
562 else | 538 else |
563 { | 539 { |
564 if (png_ptr->push_length + 4 > png_ptr->buffer_size) | 540 if (png_ptr->push_length + 4 > png_ptr->buffer_size) |
565 { | 541 { |
566 png_push_save_buffer(png_ptr); | 542 png_push_save_buffer(png_ptr); |
567 return; | 543 return; |
568 } | 544 } |
569 png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); | 545 png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); |
570 } | 546 } |
571 | 547 |
572 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; | 548 png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; |
573 } | 549 } |
574 | 550 |
575 void /* PRIVATE */ | 551 void /* PRIVATE */ |
576 png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) | 552 png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) |
577 { | 553 { |
578 png_ptr->process_mode = PNG_SKIP_MODE; | 554 png_ptr->process_mode = PNG_SKIP_MODE; |
579 png_ptr->skip_length = skip; | 555 png_ptr->skip_length = skip; |
(...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1194 png_ptr->num_rows = (png_ptr->height + | 1170 png_ptr->num_rows = (png_ptr->height + |
1195 png_pass_yinc[png_ptr->pass] - 1 - | 1171 png_pass_yinc[png_ptr->pass] - 1 - |
1196 png_pass_ystart[png_ptr->pass]) / | 1172 png_pass_ystart[png_ptr->pass]) / |
1197 png_pass_yinc[png_ptr->pass]; | 1173 png_pass_yinc[png_ptr->pass]; |
1198 | 1174 |
1199 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); | 1175 } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); |
1200 } | 1176 } |
1201 #endif /* PNG_READ_INTERLACING_SUPPORTED */ | 1177 #endif /* PNG_READ_INTERLACING_SUPPORTED */ |
1202 } | 1178 } |
1203 | 1179 |
1204 #ifdef PNG_READ_tEXt_SUPPORTED | |
1205 void /* PRIVATE */ | |
1206 png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
1207 length) | |
1208 { | |
1209 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | |
1210 { | |
1211 png_error(png_ptr, "Out of place tEXt"); | |
1212 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
1213 } | |
1214 | |
1215 #ifdef PNG_MAX_MALLOC_64K | |
1216 png_ptr->skip_length = 0; /* This may not be necessary */ | |
1217 | |
1218 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | |
1219 { | |
1220 png_warning(png_ptr, "tEXt chunk too large to fit in memory"); | |
1221 png_ptr->skip_length = length - (png_uint_32)65535L; | |
1222 length = (png_uint_32)65535L; | |
1223 } | |
1224 #endif | |
1225 | |
1226 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | |
1227 (png_uint_32)(length + 1)); | |
1228 png_ptr->current_text[length] = '\0'; | |
1229 png_ptr->current_text_ptr = png_ptr->current_text; | |
1230 png_ptr->current_text_size = (png_size_t)length; | |
1231 png_ptr->current_text_left = (png_size_t)length; | |
1232 png_ptr->process_mode = PNG_READ_tEXt_MODE; | |
1233 } | |
1234 | |
1235 void /* PRIVATE */ | |
1236 png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) | |
1237 { | |
1238 if (png_ptr->buffer_size && png_ptr->current_text_left) | |
1239 { | |
1240 png_size_t text_size; | |
1241 | |
1242 if (png_ptr->buffer_size < png_ptr->current_text_left) | |
1243 text_size = png_ptr->buffer_size; | |
1244 | |
1245 else | |
1246 text_size = png_ptr->current_text_left; | |
1247 | |
1248 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | |
1249 png_ptr->current_text_left -= text_size; | |
1250 png_ptr->current_text_ptr += text_size; | |
1251 } | |
1252 if (!(png_ptr->current_text_left)) | |
1253 { | |
1254 png_textp text_ptr; | |
1255 png_charp text; | |
1256 png_charp key; | |
1257 int ret; | |
1258 | |
1259 if (png_ptr->buffer_size < 4) | |
1260 { | |
1261 png_push_save_buffer(png_ptr); | |
1262 return; | |
1263 } | |
1264 | |
1265 png_push_crc_finish(png_ptr); | |
1266 | |
1267 #ifdef PNG_MAX_MALLOC_64K | |
1268 if (png_ptr->skip_length) | |
1269 return; | |
1270 #endif | |
1271 | |
1272 key = png_ptr->current_text; | |
1273 | |
1274 for (text = key; *text; text++) | |
1275 /* Empty loop */ ; | |
1276 | |
1277 if (text < key + png_ptr->current_text_size) | |
1278 text++; | |
1279 | |
1280 text_ptr = (png_textp)png_malloc(png_ptr, | |
1281 (png_uint_32)png_sizeof(png_text)); | |
1282 text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; | |
1283 text_ptr->key = key; | |
1284 #ifdef PNG_iTXt_SUPPORTED | |
1285 text_ptr->lang = NULL; | |
1286 text_ptr->lang_key = NULL; | |
1287 #endif | |
1288 text_ptr->text = text; | |
1289 | |
1290 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); | |
1291 | |
1292 png_free(png_ptr, key); | |
1293 png_free(png_ptr, text_ptr); | |
1294 png_ptr->current_text = NULL; | |
1295 | |
1296 if (ret) | |
1297 png_warning(png_ptr, "Insufficient memory to store text chunk."); | |
1298 } | |
1299 } | |
1300 #endif | |
1301 | |
1302 #ifdef PNG_READ_zTXt_SUPPORTED | |
1303 void /* PRIVATE */ | |
1304 png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
1305 length) | |
1306 { | |
1307 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | |
1308 { | |
1309 png_error(png_ptr, "Out of place zTXt"); | |
1310 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
1311 } | |
1312 | |
1313 #ifdef PNG_MAX_MALLOC_64K | |
1314 /* We can't handle zTXt chunks > 64K, since we don't have enough space | |
1315 * to be able to store the uncompressed data. Actually, the threshold | |
1316 * is probably around 32K, but it isn't as definite as 64K is. | |
1317 */ | |
1318 if (length > (png_uint_32)65535L) | |
1319 { | |
1320 png_warning(png_ptr, "zTXt chunk too large to fit in memory"); | |
1321 png_push_crc_skip(png_ptr, length); | |
1322 return; | |
1323 } | |
1324 #endif | |
1325 | |
1326 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | |
1327 (png_uint_32)(length + 1)); | |
1328 png_ptr->current_text[length] = '\0'; | |
1329 png_ptr->current_text_ptr = png_ptr->current_text; | |
1330 png_ptr->current_text_size = (png_size_t)length; | |
1331 png_ptr->current_text_left = (png_size_t)length; | |
1332 png_ptr->process_mode = PNG_READ_zTXt_MODE; | |
1333 } | |
1334 | |
1335 void /* PRIVATE */ | |
1336 png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) | |
1337 { | |
1338 if (png_ptr->buffer_size && png_ptr->current_text_left) | |
1339 { | |
1340 png_size_t text_size; | |
1341 | |
1342 if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) | |
1343 text_size = png_ptr->buffer_size; | |
1344 | |
1345 else | |
1346 text_size = png_ptr->current_text_left; | |
1347 | |
1348 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | |
1349 png_ptr->current_text_left -= text_size; | |
1350 png_ptr->current_text_ptr += text_size; | |
1351 } | |
1352 if (!(png_ptr->current_text_left)) | |
1353 { | |
1354 png_textp text_ptr; | |
1355 png_charp text; | |
1356 png_charp key; | |
1357 int ret; | |
1358 png_size_t text_size, key_size; | |
1359 | |
1360 if (png_ptr->buffer_size < 4) | |
1361 { | |
1362 png_push_save_buffer(png_ptr); | |
1363 return; | |
1364 } | |
1365 | |
1366 png_push_crc_finish(png_ptr); | |
1367 | |
1368 key = png_ptr->current_text; | |
1369 | |
1370 for (text = key; *text; text++) | |
1371 /* Empty loop */ ; | |
1372 | |
1373 /* zTXt can't have zero text */ | |
1374 if (text >= key + png_ptr->current_text_size) | |
1375 { | |
1376 png_ptr->current_text = NULL; | |
1377 png_free(png_ptr, key); | |
1378 return; | |
1379 } | |
1380 | |
1381 text++; | |
1382 | |
1383 if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ | |
1384 { | |
1385 png_ptr->current_text = NULL; | |
1386 png_free(png_ptr, key); | |
1387 return; | |
1388 } | |
1389 | |
1390 text++; | |
1391 | |
1392 png_ptr->zstream.next_in = (png_bytep )text; | |
1393 png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - | |
1394 (text - key)); | |
1395 png_ptr->zstream.next_out = png_ptr->zbuf; | |
1396 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; | |
1397 | |
1398 key_size = text - key; | |
1399 text_size = 0; | |
1400 text = NULL; | |
1401 ret = Z_STREAM_END; | |
1402 | |
1403 while (png_ptr->zstream.avail_in) | |
1404 { | |
1405 ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); | |
1406 if (ret != Z_OK && ret != Z_STREAM_END) | |
1407 { | |
1408 inflateReset(&png_ptr->zstream); | |
1409 png_ptr->zstream.avail_in = 0; | |
1410 png_ptr->current_text = NULL; | |
1411 png_free(png_ptr, key); | |
1412 png_free(png_ptr, text); | |
1413 return; | |
1414 } | |
1415 if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) | |
1416 { | |
1417 if (text == NULL) | |
1418 { | |
1419 text = (png_charp)png_malloc(png_ptr, | |
1420 (png_uint_32)(png_ptr->zbuf_size | |
1421 - png_ptr->zstream.avail_out + key_size + 1)); | |
1422 | |
1423 png_memcpy(text + key_size, png_ptr->zbuf, | |
1424 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | |
1425 | |
1426 png_memcpy(text, key, key_size); | |
1427 | |
1428 text_size = key_size + png_ptr->zbuf_size - | |
1429 png_ptr->zstream.avail_out; | |
1430 | |
1431 *(text + text_size) = '\0'; | |
1432 } | |
1433 else | |
1434 { | |
1435 png_charp tmp; | |
1436 | |
1437 tmp = text; | |
1438 text = (png_charp)png_malloc(png_ptr, text_size + | |
1439 (png_uint_32)(png_ptr->zbuf_size | |
1440 - png_ptr->zstream.avail_out + 1)); | |
1441 | |
1442 png_memcpy(text, tmp, text_size); | |
1443 png_free(png_ptr, tmp); | |
1444 | |
1445 png_memcpy(text + text_size, png_ptr->zbuf, | |
1446 png_ptr->zbuf_size - png_ptr->zstream.avail_out); | |
1447 | |
1448 text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; | |
1449 *(text + text_size) = '\0'; | |
1450 } | |
1451 if (ret != Z_STREAM_END) | |
1452 { | |
1453 png_ptr->zstream.next_out = png_ptr->zbuf; | |
1454 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; | |
1455 } | |
1456 } | |
1457 else | |
1458 { | |
1459 break; | |
1460 } | |
1461 | |
1462 if (ret == Z_STREAM_END) | |
1463 break; | |
1464 } | |
1465 | |
1466 inflateReset(&png_ptr->zstream); | |
1467 png_ptr->zstream.avail_in = 0; | |
1468 | |
1469 if (ret != Z_STREAM_END) | |
1470 { | |
1471 png_ptr->current_text = NULL; | |
1472 png_free(png_ptr, key); | |
1473 png_free(png_ptr, text); | |
1474 return; | |
1475 } | |
1476 | |
1477 png_ptr->current_text = NULL; | |
1478 png_free(png_ptr, key); | |
1479 key = text; | |
1480 text += key_size; | |
1481 | |
1482 text_ptr = (png_textp)png_malloc(png_ptr, | |
1483 (png_uint_32)png_sizeof(png_text)); | |
1484 text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; | |
1485 text_ptr->key = key; | |
1486 #ifdef PNG_iTXt_SUPPORTED | |
1487 text_ptr->lang = NULL; | |
1488 text_ptr->lang_key = NULL; | |
1489 #endif | |
1490 text_ptr->text = text; | |
1491 | |
1492 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); | |
1493 | |
1494 png_free(png_ptr, key); | |
1495 png_free(png_ptr, text_ptr); | |
1496 | |
1497 if (ret) | |
1498 png_warning(png_ptr, "Insufficient memory to store text chunk."); | |
1499 } | |
1500 } | |
1501 #endif | |
1502 | |
1503 #ifdef PNG_READ_iTXt_SUPPORTED | |
1504 void /* PRIVATE */ | |
1505 png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
1506 length) | |
1507 { | |
1508 if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) | |
1509 { | |
1510 png_error(png_ptr, "Out of place iTXt"); | |
1511 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
1512 } | |
1513 | |
1514 #ifdef PNG_MAX_MALLOC_64K | |
1515 png_ptr->skip_length = 0; /* This may not be necessary */ | |
1516 | |
1517 if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ | |
1518 { | |
1519 png_warning(png_ptr, "iTXt chunk too large to fit in memory"); | |
1520 png_ptr->skip_length = length - (png_uint_32)65535L; | |
1521 length = (png_uint_32)65535L; | |
1522 } | |
1523 #endif | |
1524 | |
1525 png_ptr->current_text = (png_charp)png_malloc(png_ptr, | |
1526 (png_uint_32)(length + 1)); | |
1527 png_ptr->current_text[length] = '\0'; | |
1528 png_ptr->current_text_ptr = png_ptr->current_text; | |
1529 png_ptr->current_text_size = (png_size_t)length; | |
1530 png_ptr->current_text_left = (png_size_t)length; | |
1531 png_ptr->process_mode = PNG_READ_iTXt_MODE; | |
1532 } | |
1533 | |
1534 void /* PRIVATE */ | |
1535 png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) | |
1536 { | |
1537 | |
1538 if (png_ptr->buffer_size && png_ptr->current_text_left) | |
1539 { | |
1540 png_size_t text_size; | |
1541 | |
1542 if (png_ptr->buffer_size < png_ptr->current_text_left) | |
1543 text_size = png_ptr->buffer_size; | |
1544 | |
1545 else | |
1546 text_size = png_ptr->current_text_left; | |
1547 | |
1548 png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); | |
1549 png_ptr->current_text_left -= text_size; | |
1550 png_ptr->current_text_ptr += text_size; | |
1551 } | |
1552 if (!(png_ptr->current_text_left)) | |
1553 { | |
1554 png_textp text_ptr; | |
1555 png_charp key; | |
1556 int comp_flag; | |
1557 png_charp lang; | |
1558 png_charp lang_key; | |
1559 png_charp text; | |
1560 int ret; | |
1561 | |
1562 if (png_ptr->buffer_size < 4) | |
1563 { | |
1564 png_push_save_buffer(png_ptr); | |
1565 return; | |
1566 } | |
1567 | |
1568 png_push_crc_finish(png_ptr); | |
1569 | |
1570 #ifdef PNG_MAX_MALLOC_64K | |
1571 if (png_ptr->skip_length) | |
1572 return; | |
1573 #endif | |
1574 | |
1575 key = png_ptr->current_text; | |
1576 | |
1577 for (lang = key; *lang; lang++) | |
1578 /* Empty loop */ ; | |
1579 | |
1580 if (lang < key + png_ptr->current_text_size - 3) | |
1581 lang++; | |
1582 | |
1583 comp_flag = *lang++; | |
1584 lang++; /* Skip comp_type, always zero */ | |
1585 | |
1586 for (lang_key = lang; *lang_key; lang_key++) | |
1587 /* Empty loop */ ; | |
1588 | |
1589 lang_key++; /* Skip NUL separator */ | |
1590 | |
1591 text=lang_key; | |
1592 | |
1593 if (lang_key < key + png_ptr->current_text_size - 1) | |
1594 { | |
1595 for (; *text; text++) | |
1596 /* Empty loop */ ; | |
1597 } | |
1598 | |
1599 if (text < key + png_ptr->current_text_size) | |
1600 text++; | |
1601 | |
1602 text_ptr = (png_textp)png_malloc(png_ptr, | |
1603 (png_uint_32)png_sizeof(png_text)); | |
1604 | |
1605 text_ptr->compression = comp_flag + 2; | |
1606 text_ptr->key = key; | |
1607 text_ptr->lang = lang; | |
1608 text_ptr->lang_key = lang_key; | |
1609 text_ptr->text = text; | |
1610 text_ptr->text_length = 0; | |
1611 text_ptr->itxt_length = png_strlen(text); | |
1612 | |
1613 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); | |
1614 | |
1615 png_ptr->current_text = NULL; | |
1616 | |
1617 png_free(png_ptr, text_ptr); | |
1618 if (ret) | |
1619 png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); | |
1620 } | |
1621 } | |
1622 #endif | |
1623 | |
1624 /* This function is called when we haven't found a handler for this | |
1625 * chunk. If there isn't a problem with the chunk itself (ie a bad chunk | |
1626 * name or a critical chunk), the chunk is (currently) silently ignored. | |
1627 */ | |
1628 void /* PRIVATE */ | |
1629 png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 | |
1630 length) | |
1631 { | |
1632 png_uint_32 skip = 0; | |
1633 | |
1634 if (!(png_ptr->chunk_name[0] & 0x20)) | |
1635 { | |
1636 #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | |
1637 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | |
1638 PNG_HANDLE_CHUNK_ALWAYS | |
1639 #ifdef PNG_READ_USER_CHUNKS_SUPPORTED | |
1640 && png_ptr->read_user_chunk_fn == NULL | |
1641 #endif | |
1642 ) | |
1643 #endif | |
1644 png_chunk_error(png_ptr, "unknown critical chunk"); | |
1645 | |
1646 info_ptr = info_ptr; /* To quiet some compiler warnings */ | |
1647 } | |
1648 | |
1649 #ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | |
1650 if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) | |
1651 { | |
1652 #ifdef PNG_MAX_MALLOC_64K | |
1653 if (length > (png_uint_32)65535L) | |
1654 { | |
1655 png_warning(png_ptr, "unknown chunk too large to fit in memory"); | |
1656 skip = length - (png_uint_32)65535L; | |
1657 length = (png_uint_32)65535L; | |
1658 } | |
1659 #endif | |
1660 png_memcpy((png_charp)png_ptr->unknown_chunk.name, | |
1661 (png_charp)png_ptr->chunk_name, | |
1662 png_sizeof(png_ptr->unknown_chunk.name)); | |
1663 png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] | |
1664 = '\0'; | |
1665 | |
1666 png_ptr->unknown_chunk.size = (png_size_t)length; | |
1667 | |
1668 if (length == 0) | |
1669 png_ptr->unknown_chunk.data = NULL; | |
1670 | |
1671 else | |
1672 { | |
1673 png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, | |
1674 (png_uint_32)length); | |
1675 png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); | |
1676 } | |
1677 | |
1678 #ifdef PNG_READ_USER_CHUNKS_SUPPORTED | |
1679 if (png_ptr->read_user_chunk_fn != NULL) | |
1680 { | |
1681 /* Callback to user unknown chunk handler */ | |
1682 int ret; | |
1683 ret = (*(png_ptr->read_user_chunk_fn)) | |
1684 (png_ptr, &png_ptr->unknown_chunk); | |
1685 | |
1686 if (ret < 0) | |
1687 png_chunk_error(png_ptr, "error in user chunk"); | |
1688 | |
1689 if (ret == 0) | |
1690 { | |
1691 if (!(png_ptr->chunk_name[0] & 0x20)) | |
1692 if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != | |
1693 PNG_HANDLE_CHUNK_ALWAYS) | |
1694 png_chunk_error(png_ptr, "unknown critical chunk"); | |
1695 png_set_unknown_chunks(png_ptr, info_ptr, | |
1696 &png_ptr->unknown_chunk, 1); | |
1697 } | |
1698 } | |
1699 | |
1700 else | |
1701 #endif | |
1702 png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); | |
1703 png_free(png_ptr, png_ptr->unknown_chunk.data); | |
1704 png_ptr->unknown_chunk.data = NULL; | |
1705 } | |
1706 | |
1707 else | |
1708 #endif | |
1709 skip=length; | |
1710 png_push_crc_skip(png_ptr, skip); | |
1711 } | |
1712 | |
1713 void /* PRIVATE */ | 1180 void /* PRIVATE */ |
1714 png_push_have_info(png_structp png_ptr, png_infop info_ptr) | 1181 png_push_have_info(png_structp png_ptr, png_infop info_ptr) |
1715 { | 1182 { |
1716 if (png_ptr->info_fn != NULL) | 1183 if (png_ptr->info_fn != NULL) |
1717 (*(png_ptr->info_fn))(png_ptr, info_ptr); | 1184 (*(png_ptr->info_fn))(png_ptr, info_ptr); |
1718 } | 1185 } |
1719 | 1186 |
1720 void /* PRIVATE */ | 1187 void /* PRIVATE */ |
1721 png_push_have_end(png_structp png_ptr, png_infop info_ptr) | 1188 png_push_have_end(png_structp png_ptr, png_infop info_ptr) |
1722 { | 1189 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1765 | 1232 |
1766 png_voidp PNGAPI | 1233 png_voidp PNGAPI |
1767 png_get_progressive_ptr(png_structp png_ptr) | 1234 png_get_progressive_ptr(png_structp png_ptr) |
1768 { | 1235 { |
1769 if (png_ptr == NULL) | 1236 if (png_ptr == NULL) |
1770 return (NULL); | 1237 return (NULL); |
1771 | 1238 |
1772 return png_ptr->io_ptr; | 1239 return png_ptr->io_ptr; |
1773 } | 1240 } |
1774 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ | 1241 #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ |
OLD | NEW |