static fz_pixmap * pdf_image_get_pixmap(fz_context *ctx, fz_image *image_, int w, int h) { pdf_image *image = (pdf_image *)image_; fz_pixmap *tile; fz_stream *stm; int l2factor; pdf_image_key key; int native_l2factor; int indexed; /* Check for 'simple' images which are just pixmaps */ if (image->buffer == NULL) { tile = image->tile; if (!tile) return NULL; return fz_keep_pixmap(ctx, tile); /* That's all we can give you! */ } /* Ensure our expectations for tile size are reasonable */ if (w > image->base.w) w = image->base.w; if (h > image->base.h) h = image->base.h; /* What is our ideal factor? */ if (w == 0 || h == 0) l2factor = 0; else for (l2factor=0; image->base.w>>(l2factor+1) >= w && image->base.h>>(l2factor+1) >= h && l2factor < 8; l2factor++); /* Can we find any suitable tiles in the cache? */ key.refs = 1; key.image = &image->base; key.l2factor = l2factor; do { tile = fz_find_item(ctx, fz_free_pixmap_imp, &key, &pdf_image_store_type); if (tile) return tile; key.l2factor--; } while (key.l2factor >= 0); /* We need to make a new one. */ native_l2factor = l2factor; stm = fz_open_image_decomp_stream(ctx, image->buffer, &native_l2factor); indexed = fz_colorspace_is_indexed(image->base.colorspace); return decomp_image_from_stream(ctx, stm, image, 0, indexed, l2factor, native_l2factor, 1); }
static fz_pixmap * pdf_image_get_pixmap(fz_context *ctx, fz_image *image_, int w, int h) { pdf_image *image = (pdf_image *)image_; fz_pixmap *tile; fz_stream *stm; int factor; pdf_image_key key; /* Check for 'simple' images which are just pixmaps */ /* SumatraPDF: don't produce additional tiles for preloaded images */ if (image->tile || !image->buffer) { tile = image->tile; if (!tile) return NULL; return fz_keep_pixmap(ctx, tile); /* That's all we can give you! */ } /* Ensure our expectations for tile size are reasonable */ if (w > image->base.w) w = image->base.w; if (h > image->base.h) h = image->base.h; /* What is our ideal factor? */ if (w == 0 || h == 0) factor = 1; else for (factor=1; image->base.w/(2*factor) >= w && image->base.h/(2*factor) >= h && factor < 8; factor *= 2); /* Can we find any suitable tiles in the cache? */ key.refs = 1; key.image = &image->base; key.factor = factor; do { tile = fz_find_item(ctx, fz_free_pixmap_imp, &key, &pdf_image_store_type); if (tile) return tile; key.factor >>= 1; } while (key.factor > 0); /* We need to make a new one. */ stm = pdf_open_image_decomp_stream(ctx, image->buffer, &image->params, &factor); return decomp_image_from_stream(ctx, stm, image, 0, 0, factor, 0); }
pdf_font_desc * pdf_load_hail_mary_font(pdf_document *doc) { fz_context *ctx = doc->ctx; pdf_font_desc *fontdesc; pdf_font_desc *existing; if ((fontdesc = fz_find_item(ctx, pdf_free_font_imp, &hail_mary_store_type, &hail_mary_store_type))) { return fontdesc; } /* FIXME: Get someone with a clue about fonts to fix this */ fontdesc = pdf_load_simple_font_by_name(doc, NULL, "Helvetica"); existing = fz_store_item(ctx, &hail_mary_store_type, fontdesc, fontdesc->size, &hail_mary_store_type); assert(existing == NULL); return fontdesc; }
void * pdf_find_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key) { return fz_find_item(ctx, free, key, &pdf_obj_store_type); }
fz_pixmap * fz_image_get_pixmap(fz_context *ctx, fz_image *image, int w, int h) { fz_pixmap *tile; fz_stream *stm; int l2factor; fz_image_key key; int native_l2factor; int indexed; fz_image_key *keyp; /* Check for 'simple' images which are just pixmaps */ if (image->buffer == NULL) { tile = image->tile; if (!tile) return NULL; return fz_keep_pixmap(ctx, tile); /* That's all we can give you! */ } /* Ensure our expectations for tile size are reasonable */ if (w > image->w) w = image->w; if (h > image->h) h = image->h; /* What is our ideal factor? */ if (w == 0 || h == 0) l2factor = 0; else for (l2factor=0; image->w>>(l2factor+1) >= w && image->h>>(l2factor+1) >= h && l2factor < 8; l2factor++); /* Can we find any suitable tiles in the cache? */ key.refs = 1; key.image = image; key.l2factor = l2factor; do { tile = fz_find_item(ctx, fz_free_pixmap_imp, &key, &fz_image_store_type); if (tile) return tile; key.l2factor--; } while (key.l2factor >= 0); /* 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_TIFF: tile = fz_load_tiff(ctx, image->buffer->buffer->data, image->buffer->buffer->len); break; default: native_l2factor = l2factor; stm = fz_open_image_decomp_stream(ctx, image->buffer, &native_l2factor); indexed = fz_colorspace_is_indexed(image->colorspace); tile = fz_decomp_image_from_stream(ctx, stm, image, 0, indexed, l2factor, native_l2factor); break; } /* Now we try to cache the pixmap. Any failure here will just result * in us not caching. */ fz_var(keyp); fz_try(ctx) { fz_pixmap *existing_tile; keyp = fz_malloc_struct(ctx, fz_image_key); keyp->refs = 1; keyp->image = fz_keep_image(ctx, image); keyp->l2factor = l2factor; existing_tile = fz_store_item(ctx, keyp, tile, fz_pixmap_size(ctx, tile), &fz_image_store_type); if (existing_tile) { /* We already have a tile. This must have been produced by a * racing thread. We'll throw away ours and use that one. */ fz_drop_pixmap(ctx, tile); tile = existing_tile; } } fz_always(ctx) { fz_drop_image_key(ctx, keyp); } fz_catch(ctx) { /* Do nothing */ } return tile; }
void * pdf_find_item(fz_context *ctx, fz_store_drop_fn *drop, pdf_obj *key) { return fz_find_item(ctx, drop, key, &pdf_obj_store_type); }