bool PdfCreator::AddImagePage(const char *data, size_t len, float imgDpi) { CrashIf(!ctx || !doc); if (!ctx || !doc) return false; const WCHAR *ext = GfxFileExtFromData(data, len); if (str::Eq(ext, L".jpg") || str::Eq(ext, L".jp2")) { Size size = BitmapSizeFromData(data, len); fz_image *image = nullptr; fz_try(ctx) { image = (str::Eq(ext, L".jpg") ? pack_jpeg : pack_jp2)(ctx, data, len, SizeI(size.Width, size.Height)); } fz_catch(ctx) { return false; } bool ok = AddImagePage(image, imgDpi); fz_drop_image(ctx, image); return ok; }
bool HtmlFormatter::EmitImage(ImageData* img) { CrashIf(!img->data); Size imgSize = BitmapSizeFromData(img->data, img->len); if (imgSize.Empty()) return false; SizeF newSize((REAL)imgSize.Width, (REAL)imgSize.Height); // move overly large images to a new line (if they don't fit entirely) if (!IsCurrLineEmpty() && (currX + newSize.Width > pageDx || currY + newSize.Height > pageDy)) FlushCurrLine(false); // move overly large images to a new page // (if they don't fit even when scaled down to 75%) REAL scalePage = std::min((pageDx - currX) / newSize.Width, pageDy / newSize.Height); if (currY > 0 && currY + newSize.Height * std::min(scalePage, 0.75f) > pageDy) ForceNewPage(); // if image is bigger than the available space, scale it down if (newSize.Width > pageDx - currX || newSize.Height > pageDy - currY) { REAL scale = std::min(scalePage, (pageDy - currY) / newSize.Height); // scale down images that follow right after a line // containing a single image as little as possible, // as they might be intended to be of the same size if (scale < scalePage && HasPreviousLineSingleImage(currPage->instructions)) { ForceNewPage(); scale = scalePage; } if (scale < 1) { newSize.Width = std::min(newSize.Width * scale, pageDx - currX); newSize.Height = std::min(newSize.Height * scale, pageDy - currY); } } RectF bbox(PointF(currX, 0), newSize); AppendInstr(DrawInstr::Image(img->data, img->len, bbox)); currX += bbox.Width; return true; }