summaryrefslogtreecommitdiff
path: root/fpdfsdk
diff options
context:
space:
mode:
authorJane Liu <janeliulwq@google.com>2017-08-16 11:25:35 -0400
committerChromium commit bot <commit-bot@chromium.org>2017-08-16 17:14:22 +0000
commitca89829775fec2968b51fe5abad86bad1b6a277b (patch)
treef276524600e7a4b8fa1cfb526302f330626cd815 /fpdfsdk
parenteb14e04c79c575146fe96c025dbf56b7440870c7 (diff)
downloadpdfium-ca89829775fec2968b51fe5abad86bad1b6a277b.tar.xz
API and test for retrieving metadata from image objects
Added FPDFImageObj_GetImageMetadata() for retriving the image metadata of image objects, including its dimension, DPI, bits per pixel, and colorspace. * Added a corresponding embedder test. Bug=pdfium:677 Change-Id: I4229334d1ac2125b21a46e2e44ea937ea2e94b51 Reviewed-on: https://pdfium-review.googlesource.com/10110 Reviewed-by: Lei Zhang <thestig@chromium.org> Reviewed-by: dsinclair <dsinclair@chromium.org> Commit-Queue: Jane Liu <janeliulwq@google.com>
Diffstat (limited to 'fpdfsdk')
-rw-r--r--fpdfsdk/fpdfedit_embeddertest.cpp47
-rw-r--r--fpdfsdk/fpdfeditimg.cpp72
-rw-r--r--fpdfsdk/fpdfview_c_api_test.c1
3 files changed, 120 insertions, 0 deletions
diff --git a/fpdfsdk/fpdfedit_embeddertest.cpp b/fpdfsdk/fpdfedit_embeddertest.cpp
index e62ef2149b..6dc177e2b5 100644
--- a/fpdfsdk/fpdfedit_embeddertest.cpp
+++ b/fpdfsdk/fpdfedit_embeddertest.cpp
@@ -1084,3 +1084,50 @@ TEST_F(FPDFEditEmbeddertest, GetImageFilters) {
UnloadPage(page);
}
+
+TEST_F(FPDFEditEmbeddertest, GetImageMetadata) {
+ ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
+ FPDF_PAGE page = LoadPage(0);
+ ASSERT_TRUE(page);
+
+ // Check that getting the metadata of a null object would fail.
+ FPDF_IMAGEOBJ_METADATA metadata;
+ EXPECT_FALSE(FPDFImageObj_GetImageMetadata(nullptr, page, &metadata));
+
+ // Check that receiving the metadata with a null metadata object would fail.
+ FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, 35);
+ EXPECT_FALSE(FPDFImageObj_GetImageMetadata(obj, page, nullptr));
+
+ // Check that when retrieving an image object's metadata without passing in
+ // |page|, all values are correct, with the last two being default values.
+ ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
+ ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, nullptr, &metadata));
+ EXPECT_EQ(92u, metadata.width);
+ EXPECT_EQ(68u, metadata.height);
+ EXPECT_NEAR(96.000000, metadata.horizontal_dpi, 0.001);
+ EXPECT_NEAR(96.000000, metadata.vertical_dpi, 0.001);
+ EXPECT_EQ(0u, metadata.bits_per_pixel);
+ EXPECT_EQ(FPDF_COLORSPACE_UNKNOWN, metadata.colorspace);
+
+ // Verify the metadata of a bitmap image with indexed colorspace.
+ ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page, &metadata));
+ EXPECT_EQ(92u, metadata.width);
+ EXPECT_EQ(68u, metadata.height);
+ EXPECT_NEAR(96.000000, metadata.horizontal_dpi, 0.001);
+ EXPECT_NEAR(96.000000, metadata.vertical_dpi, 0.001);
+ EXPECT_EQ(1u, metadata.bits_per_pixel);
+ EXPECT_EQ(FPDF_COLORSPACE_INDEXED, metadata.colorspace);
+
+ // Verify the metadata of an image with RGB colorspace.
+ obj = FPDFPage_GetObject(page, 37);
+ ASSERT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(obj));
+ ASSERT_TRUE(FPDFImageObj_GetImageMetadata(obj, page, &metadata));
+ EXPECT_EQ(126u, metadata.width);
+ EXPECT_EQ(106u, metadata.height);
+ EXPECT_NEAR(162.173752, metadata.horizontal_dpi, 0.001);
+ EXPECT_NEAR(162.555878, metadata.vertical_dpi, 0.001);
+ EXPECT_EQ(24u, metadata.bits_per_pixel);
+ EXPECT_EQ(FPDF_COLORSPACE_DEVICERGB, metadata.colorspace);
+
+ UnloadPage(page);
+}
diff --git a/fpdfsdk/fpdfeditimg.cpp b/fpdfsdk/fpdfeditimg.cpp
index f19e21c8ff..662ad23d76 100644
--- a/fpdfsdk/fpdfeditimg.cpp
+++ b/fpdfsdk/fpdfeditimg.cpp
@@ -9,14 +9,40 @@
#include "core/fpdfapi/cpdf_modulemgr.h"
#include "core/fpdfapi/page/cpdf_image.h"
#include "core/fpdfapi/page/cpdf_imageobject.h"
+#include "core/fpdfapi/page/cpdf_page.h"
#include "core/fpdfapi/page/cpdf_pageobject.h"
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_name.h"
+#include "core/fpdfapi/render/cpdf_dibsource.h"
#include "fpdfsdk/fsdk_define.h"
#include "third_party/base/ptr_util.h"
namespace {
+// These checks ensure the consistency of colorspace values across core/ and
+// public/.
+static_assert(PDFCS_DEVICEGRAY == FPDF_COLORSPACE_DEVICEGRAY,
+ "PDFCS_DEVICEGRAY value mismatch");
+static_assert(PDFCS_DEVICERGB == FPDF_COLORSPACE_DEVICERGB,
+ "PDFCS_DEVICERGB value mismatch");
+static_assert(PDFCS_DEVICECMYK == FPDF_COLORSPACE_DEVICECMYK,
+ "PDFCS_DEVICECMYK value mismatch");
+static_assert(PDFCS_CALGRAY == FPDF_COLORSPACE_CALGRAY,
+ "PDFCS_CALGRAY value mismatch");
+static_assert(PDFCS_CALRGB == FPDF_COLORSPACE_CALRGB,
+ "PDFCS_CALRGB value mismatch");
+static_assert(PDFCS_LAB == FPDF_COLORSPACE_LAB, "PDFCS_LAB value mismatch");
+static_assert(PDFCS_ICCBASED == FPDF_COLORSPACE_ICCBASED,
+ "PDFCS_ICCBASED value mismatch");
+static_assert(PDFCS_SEPARATION == FPDF_COLORSPACE_SEPARATION,
+ "PDFCS_SEPARATION value mismatch");
+static_assert(PDFCS_DEVICEN == FPDF_COLORSPACE_DEVICEN,
+ "PDFCS_DEVICEN value mismatch");
+static_assert(PDFCS_INDEXED == FPDF_COLORSPACE_INDEXED,
+ "PDFCS_INDEXED value mismatch");
+static_assert(PDFCS_PATTERN == FPDF_COLORSPACE_PATTERN,
+ "PDFCS_PATTERN value mismatch");
+
bool LoadJpegHelper(FPDF_PAGE* pages,
int nCount,
FPDF_PAGEOBJECT image_object,
@@ -226,3 +252,49 @@ FPDFImageObj_GetImageFilter(FPDF_PAGEOBJECT image_object,
return Utf16EncodeMaybeCopyAndReturnLength(wsFilters, buffer, buflen);
}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFImageObj_GetImageMetadata(FPDF_PAGEOBJECT image_object,
+ FPDF_PAGE page,
+ FPDF_IMAGEOBJ_METADATA* metadata) {
+ CPDF_PageObject* pObj = CPDFPageObjectFromFPDFPageObject(image_object);
+ if (!pObj || !pObj->IsImage() || !metadata)
+ return false;
+
+ CFX_RetainPtr<CPDF_Image> pImg = pObj->AsImage()->GetImage();
+ if (!pImg)
+ return false;
+
+ const int nPixelWidth = pImg->GetPixelWidth();
+ const int nPixelHeight = pImg->GetPixelHeight();
+ metadata->width = nPixelWidth;
+ metadata->height = nPixelHeight;
+
+ const float nWidth = pObj->m_Right - pObj->m_Left;
+ const float nHeight = pObj->m_Top - pObj->m_Bottom;
+ constexpr int nPointsPerInch = 72;
+ if (nWidth != 0 && nHeight != 0) {
+ metadata->horizontal_dpi = nPixelWidth / nWidth * nPointsPerInch;
+ metadata->vertical_dpi = nPixelHeight / nHeight * nPointsPerInch;
+ }
+
+ metadata->bits_per_pixel = 0;
+ metadata->colorspace = FPDF_COLORSPACE_UNKNOWN;
+
+ CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
+ if (!pPage || !pPage->m_pDocument.Get() || !pImg->GetStream())
+ return true;
+
+ auto pSource = pdfium::MakeRetain<CPDF_DIBSource>();
+ if (!pSource->StartLoadDIBSource(pPage->m_pDocument.Get(), pImg->GetStream(),
+ false, nullptr,
+ pPage->m_pPageResources.Get())) {
+ return true;
+ }
+
+ metadata->bits_per_pixel = pSource->GetBPP();
+ if (pSource->GetColorSpace())
+ metadata->colorspace = pSource->GetColorSpace()->GetFamily();
+
+ return true;
+}
diff --git a/fpdfsdk/fpdfview_c_api_test.c b/fpdfsdk/fpdfview_c_api_test.c
index 88b7465744..4dd4995cd2 100644
--- a/fpdfsdk/fpdfview_c_api_test.c
+++ b/fpdfsdk/fpdfview_c_api_test.c
@@ -138,6 +138,7 @@ int CheckPDFiumCApi() {
CHK(FPDFImageObj_GetImageDataRaw);
CHK(FPDFImageObj_GetImageFilterCount);
CHK(FPDFImageObj_GetImageFilter);
+ CHK(FPDFImageObj_GetImageMetadata);
CHK(FPDFPageObj_CreateNewPath);
CHK(FPDFPageObj_CreateNewRect);
CHK(FPDFPath_SetStrokeColor);