Пример #1
0
fz_stream *
fz_open_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buffer)
{
	int l2factor = 0;

	return fz_open_image_decomp_stream_from_buffer(ctx, buffer, &l2factor);
}
Пример #2
0
static fz_pixmap *
standard_image_get_pixmap(fz_context *ctx, fz_image *image, int w, int h, int *l2factor)
{
    int native_l2factor;
    fz_stream *stm;
    int indexed;
    fz_pixmap *tile;

    /* We need to make a new one. */
    /* First check for ones that we can't decode using streams */
    switch (image->buffer->params.type)
    {
    case FZ_IMAGE_PNG:
        tile = fz_load_png(ctx, image->buffer->buffer->data, image->buffer->buffer->len);
        break;
    case FZ_IMAGE_GIF:
        tile = fz_load_gif(ctx, image->buffer->buffer->data, image->buffer->buffer->len);
        break;
    case FZ_IMAGE_TIFF:
        tile = fz_load_tiff(ctx, image->buffer->buffer->data, image->buffer->buffer->len);
        break;
    case FZ_IMAGE_JXR:
        tile = fz_load_jxr(ctx, image->buffer->buffer->data, image->buffer->buffer->len);
        break;
    case FZ_IMAGE_JPEG:
        /* Scan JPEG stream and patch missing height values in header */
    {
        unsigned char *s = image->buffer->buffer->data;
        unsigned char *e = s + image->buffer->buffer->len;
        unsigned char *d;
        for (d = s + 2; s < d && d < e - 9 && d[0] == 0xFF; d += (d[2] << 8 | d[3]) + 2)
        {
            if (d[1] < 0xC0 || (0xC3 < d[1] && d[1] < 0xC9) || 0xCB < d[1])
                continue;
            if ((d[5] == 0 && d[6] == 0) || ((d[5] << 8) | d[6]) > image->h)
            {
                d[5] = (image->h >> 8) & 0xFF;
                d[6] = image->h & 0xFF;
            }
        }
    }
    /* fall through */

    default:
        native_l2factor = l2factor ? *l2factor : 0;
        stm = fz_open_image_decomp_stream_from_buffer(ctx, image->buffer, l2factor);
        if (l2factor)
            native_l2factor -= *l2factor;

        indexed = fz_colorspace_is_indexed(ctx, image->colorspace);
        tile = fz_decomp_image_from_stream(ctx, stm, image, indexed, native_l2factor);

        /* CMYK JPEGs in XPS documents have to be inverted */
        if (image->invert_cmyk_jpeg &&
                image->buffer->params.type == FZ_IMAGE_JPEG &&
                image->colorspace == fz_device_cmyk(ctx) &&
                image->buffer->params.u.jpeg.color_transform)
        {
            fz_invert_pixmap(ctx, tile);
        }

        break;
    }