| 1415 | */ |
| 1416 | |
| 1417 | static ssize_t /* O - Number of bytes read */ |
| 1418 | cups_raster_read(cups_raster_t *r, /* I - Raster stream */ |
| 1419 | unsigned char *buf, /* I - Buffer */ |
| 1420 | size_t bytes) /* I - Number of bytes to read */ |
| 1421 | { |
| 1422 | ssize_t count, /* Number of bytes read */ |
| 1423 | remaining, /* Remaining bytes in buffer */ |
| 1424 | total; /* Total bytes read */ |
| 1425 | |
| 1426 | |
| 1427 | DEBUG_printf(("4cups_raster_read(r=%p, buf=%p, bytes=" CUPS_LLFMT "), offset=" CUPS_LLFMT, (void *)r, (void *)buf, CUPS_LLCAST bytes, CUPS_LLCAST (r->iostart + (ssize_t)(r->bufptr - r->buffer)))); |
| 1428 | |
| 1429 | if (!r->compressed) |
| 1430 | return (cups_raster_io(r, buf, bytes)); |
| 1431 | |
| 1432 | /* |
| 1433 | * Allocate a read buffer as needed... |
| 1434 | */ |
| 1435 | |
| 1436 | count = (ssize_t)(2 * r->header.cupsBytesPerLine); |
| 1437 | if (count < 65536) |
| 1438 | count = 65536; |
| 1439 | |
| 1440 | if ((size_t)count > r->bufsize) |
| 1441 | { |
| 1442 | ssize_t offset = r->bufptr - r->buffer; |
| 1443 | /* Offset to current start of buffer */ |
| 1444 | ssize_t end = r->bufend - r->buffer;/* Offset to current end of buffer */ |
| 1445 | unsigned char *rptr; /* Pointer in read buffer */ |
| 1446 | |
| 1447 | if (r->buffer) |
| 1448 | rptr = realloc(r->buffer, (size_t)count); |
| 1449 | else |
| 1450 | rptr = malloc((size_t)count); |
| 1451 | |
| 1452 | if (!rptr) |
| 1453 | return (0); |
| 1454 | |
| 1455 | r->buffer = rptr; |
| 1456 | r->bufptr = rptr + offset; |
| 1457 | r->bufend = rptr + end; |
| 1458 | r->bufsize = (size_t)count; |
| 1459 | } |
| 1460 | |
| 1461 | /* |
| 1462 | * Loop until we have read everything... |
| 1463 | */ |
| 1464 | |
| 1465 | for (total = 0, remaining = (int)(r->bufend - r->bufptr); |
| 1466 | total < (ssize_t)bytes; |
| 1467 | total += count, buf += count) |
| 1468 | { |
| 1469 | count = (ssize_t)bytes - total; |
| 1470 | |
| 1471 | DEBUG_printf(("5cups_raster_read: count=" CUPS_LLFMT ", remaining=" CUPS_LLFMT ", buf=%p, bufptr=%p, bufend=%p", CUPS_LLCAST count, CUPS_LLCAST remaining, (void *)buf, (void *)r->bufptr, (void *)r->bufend)); |
| 1472 | |
| 1473 | if (remaining == 0) |
| 1474 | { |
no test coverage detected