| 1 | #include "fitz-imp.h" |
| 2 | |
| 3 | /* This code needs to be kept out of stm_buffer.c to avoid it being |
| 4 | * pulled into cmapdump.c */ |
| 5 | |
| 6 | void |
| 7 | fz_drop_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf) |
| 8 | { |
| 9 | if (buf) |
| 10 | { |
| 11 | if (buf->params.type == FZ_IMAGE_JBIG2) |
| 12 | fz_drop_jbig2_globals(ctx, buf->params.u.jbig2.globals); |
| 13 | fz_drop_buffer(ctx, buf->buffer); |
| 14 | fz_free(ctx, buf); |
| 15 | } |
| 16 | } |
| 17 | |
| 18 | fz_stream * |
| 19 | fz_open_image_decomp_stream_from_buffer(fz_context *ctx, fz_compressed_buffer *buffer, int *l2factor) |
| 20 | { |
| 21 | fz_stream *head, *tail; |
| 22 | |
| 23 | tail = fz_open_buffer(ctx, buffer->buffer); |
| 24 | fz_try(ctx) |
| 25 | head = fz_open_image_decomp_stream(ctx, tail, &buffer->params, l2factor); |
| 26 | fz_always(ctx) |
| 27 | fz_drop_stream(ctx, tail); |
| 28 | fz_catch(ctx) |
| 29 | fz_rethrow(ctx); |
| 30 | return head; |
| 31 | } |
| 32 | |
| 33 | fz_stream * |
| 34 | fz_open_image_decomp_stream(fz_context *ctx, fz_stream *tail, fz_compression_params *params, int *l2factor) |
| 35 | { |
| 36 | fz_stream *head = NULL, *body = NULL; |
| 37 | int our_l2factor = 0; |
| 38 | |
| 39 | fz_var(body); |
| 40 | |
| 41 | fz_try(ctx) |
| 42 | { |
| 43 | switch (params->type) |
| 44 | { |
| 45 | default: |
| 46 | head = fz_keep_stream(ctx, tail); |
| 47 | break; |
| 48 | |
| 49 | case FZ_IMAGE_FAX: |
| 50 | head = fz_open_faxd(ctx, tail, |
| 51 | params->u.fax.k, |
| 52 | params->u.fax.end_of_line, |
| 53 | params->u.fax.encoded_byte_align, |
| 54 | params->u.fax.columns, |
| 55 | params->u.fax.rows, |
| 56 | params->u.fax.end_of_block, |
| 57 | params->u.fax.black_is_1); |
| 58 | break; |
| 59 | |
| 60 | case FZ_IMAGE_JPEG: |
| 61 | if (l2factor) |
| 62 | { |
| 63 | our_l2factor = *l2factor; |
| 64 | if (our_l2factor > 3) |
| 65 | our_l2factor = 3; |
| 66 | *l2factor -= our_l2factor; |
| 67 | } |
| 68 | head = fz_open_dctd(ctx, tail, params->u.jpeg.color_transform, our_l2factor, NULL); |
| 69 | break; |
| 70 | |
| 71 | case FZ_IMAGE_JBIG2: |
| 72 | head = fz_open_jbig2d(ctx, tail, params->u.jbig2.globals); |
| 73 | break; |
| 74 | |
| 75 | case FZ_IMAGE_RLD: |
| 76 | head = fz_open_rld(ctx, tail); |
| 77 | break; |
| 78 | |
| 79 | case FZ_IMAGE_FLATE: |
| 80 | head = fz_open_flated(ctx, tail, 15); |
| 81 | if (params->u.flate.predictor > 1) |
| 82 | { |
| 83 | body = head; |
| 84 | head = fz_open_predict(ctx, body, |
| 85 | params->u.flate.predictor, |
| 86 | params->u.flate.columns, |
| 87 | params->u.flate.colors, |
| 88 | params->u.flate.bpc); |
| 89 | } |
| 90 | break; |
| 91 | |
| 92 | case FZ_IMAGE_LZW: |
| 93 | head = fz_open_lzwd(ctx, tail, params->u.lzw.early_change, 9, 0, 0); |
| 94 | if (params->u.flate.predictor > 1) |
| 95 | { |
| 96 | body = head; |
| 97 | head = fz_open_predict(ctx, body, |
| 98 | params->u.lzw.predictor, |
| 99 | params->u.lzw.columns, |
| 100 | params->u.lzw.colors, |
| 101 | params->u.lzw.bpc); |
| 102 | } |
| 103 | break; |
| 104 | } |
| 105 | } |
| 106 | fz_always(ctx) |
| 107 | fz_drop_stream(ctx, body); |
| 108 | fz_catch(ctx) |
| 109 | fz_rethrow(ctx); |
| 110 | |
| 111 | return head; |
| 112 | } |
| 113 | |
| 114 | fz_stream * |
| 115 | fz_open_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buffer) |
| 116 | { |
| 117 | return fz_open_image_decomp_stream_from_buffer(ctx, buffer, NULL); |
| 118 | } |
| 119 | |
| 120 | size_t |
| 121 | fz_compressed_buffer_size(fz_compressed_buffer *buffer) |
| 122 | { |
| 123 | if (buffer && buffer->buffer) |
| 124 | return (size_t)buffer->buffer->cap; |
| 125 | return 0; |
| 126 | } |
| 127 | |