void WPdfImage::drawImage(const WRectF& rect, const std::string& imgUrl, int imgWidth, int imgHeight, const WRectF& srect) { HPDF_Image img = 0; if (Uri::isDataUri(imgUrl)) { Uri::Uri uri = Uri::parseDataUri(imgUrl); if ("image/png" == uri.mimeType) img = HPDF_LoadPngImageFromMem(pdf_, (HPDF_BYTE*)uri.data.c_str(), uri.data.size()); else if ("image/jpeg" == uri.mimeType) img = HPDF_LoadJpegImageFromMem(pdf_, (HPDF_BYTE*)uri.data.c_str(), uri.data.size()); } else { std::string mimeType = Image::identifyImageFileMimeType(imgUrl); if ("image/png" == mimeType) img = HPDF_LoadPngImageFromFile2(pdf_, imgUrl.c_str()); else if ("image/jpeg" == mimeType) img = HPDF_LoadJpegImageFromFile(pdf_, imgUrl.c_str()); } if (!img) throw WException("WPdfImage::drawImage(): cannot load image: " + imgUrl); double x = rect.x(); double y = rect.y(); double width = rect.width(); double height = rect.height(); HPDF_Page_GSave(page_); if (srect.x() != 0 || srect.y() != 0 || srect.width() != imgWidth || srect.height() != imgHeight) { double scaleX = width / imgWidth; double scaleY = height / imgHeight; x -= srect.x() * scaleX; y -= srect.y() * scaleY; width *= scaleX; height *= scaleY; HPDF_Page_Rectangle(page_, rect.x(), rect.y(), rect.width(), rect.height()); HPDF_Page_Clip(page_); } HPDF_Page_Concat(page_, 1, 0, 0, -1, x, y + height); // revert upside-down HPDF_Page_DrawImage(page_, img, 0, 0, width, height); HPDF_Page_GRestore(page_); }
void WPdfImage::drawImage(const WRectF& rect, const std::string& imgUrl, int imgWidth, int imgHeight, const WRectF& srect) { HPDF_Image img = nullptr; if (DataUri::isDataUri(imgUrl)) { #define HAVE_LOAD_FROM_MEM HPDF_MAJOR_VERSION > 2 || (HPDF_MAJOR_VERSION == 2 && (HPDF_MINOR_VERSION >= 2)) #if HAVE_LOAD_FROM_MEM DataUri uri(imgUrl); if ("image/png" == uri.mimeType) img = HPDF_LoadPngImageFromMem(pdf_, (HPDF_BYTE*)&uri.data[0], uri.data.size()); else if ("image/jpeg" == uri.mimeType) img = HPDF_LoadJpegImageFromMem(pdf_, (HPDF_BYTE*)&uri.data[0], uri.data.size()); #else LOG_ERROR("drawImage: data URI support requires libharu 2.2.0 or later"); #endif } else { std::string mimeType = ImageUtils::identifyMimeType(imgUrl); if ("image/png" == mimeType) img = HPDF_LoadPngImageFromFile2(pdf_, imgUrl.c_str()); else if ("image/jpeg" == mimeType) img = HPDF_LoadJpegImageFromFile(pdf_, imgUrl.c_str()); } if (!img) throw WException("WPdfImage::drawImage(): cannot load image: " + imgUrl); double x = rect.x(); double y = rect.y(); double width = rect.width(); double height = rect.height(); HPDF_Page_GSave(page_); if (srect.x() != 0 || srect.y() != 0 || srect.width() != imgWidth || srect.height() != imgHeight) { double scaleX = width / imgWidth; double scaleY = height / imgHeight; x -= srect.x() * scaleX; y -= srect.y() * scaleY; width *= scaleX; height *= scaleY; HPDF_Page_Rectangle(page_, rect.x(), rect.y(), rect.width(), rect.height()); HPDF_Page_Clip(page_); } HPDF_Page_Concat(page_, 1, 0, 0, -1, x, y + height); // revert upside-down HPDF_Page_DrawImage(page_, img, 0, 0, width, height); HPDF_Page_GRestore(page_); }