Use SkMatrix to compute pdf transformation.

Bug: 28051413
Change-Id: Id17db12801a33955426d7e01d0af950b1c6468cf
This commit is contained in:
Philip P. Moltmann
2016-05-31 14:07:54 -07:00
parent d355ff07a5
commit 61a530742f
2 changed files with 28 additions and 23 deletions

View File

@@ -22,7 +22,6 @@
#include "fpdfview.h"
#include "fpdf_edit.h"
#include "fpdf_save.h"
#include "fsdk_rendercontext.h"
#include "fpdf_transformpage.h"
#pragma GCC diagnostic pop
@@ -176,7 +175,7 @@ static void nativeSetTransformAndClip(JNIEnv* env, jclass thiz, jlong documentPt
jlong transformPtr, jint clipLeft, jint clipTop, jint clipRight, jint clipBottom) {
FPDF_DOCUMENT document = reinterpret_cast<FPDF_DOCUMENT>(documentPtr);
CPDF_Page* page = (CPDF_Page*) FPDF_LoadPage(document, pageIndex);
FPDF_PAGE* page = (FPDF_PAGE*) FPDF_LoadPage(document, pageIndex);
if (!page) {
jniThrowException(env, "java/lang/IllegalStateException",
"cannot open page");
@@ -193,30 +192,32 @@ static void nativeSetTransformAndClip(JNIEnv* env, jclass thiz, jlong documentPt
return;
}
CFX_Matrix matrix;
SkMatrix* skTransform = reinterpret_cast<SkMatrix*>(transformPtr);
// PDF's coordinate system origin is left-bottom while in graphics it
// is the top-left. So, translate the PDF coordinates to ours.
SkMatrix reflectOnX = SkMatrix::MakeScale(1, -1);
SkMatrix moveUp = SkMatrix::MakeTrans(0, FPDF_GetPageHeight(page));
SkMatrix coordinateChange = SkMatrix::Concat(moveUp, reflectOnX);
// Apply the transformation what was created in our coordinates.
SkMatrix matrix = SkMatrix::Concat(*reinterpret_cast<SkMatrix*>(transformPtr),
coordinateChange);
// Translate the result back to PDF coordinates.
matrix.setConcat(coordinateChange, matrix);
SkScalar transformValues[6];
if (!skTransform->asAffine(transformValues)) {
if (!matrix.asAffine(transformValues)) {
jniThrowException(env, "java/lang/IllegalArgumentException",
"transform matrix has perspective. Only affine matrices are allowed.");
return;
}
// PDF's coordinate system origin is left-bottom while in graphics it
// is the top-left. So, translate the PDF coordinates to ours.
matrix.Set(1, 0, 0, -1, 0, page->GetPageHeight());
FS_MATRIX transform = {transformValues[SkMatrix::kAScaleX], transformValues[SkMatrix::kASkewY],
transformValues[SkMatrix::kASkewX], transformValues[SkMatrix::kAScaleY],
transformValues[SkMatrix::kATransX],
transformValues[SkMatrix::kATransY]};
// Apply the transformation what was created in our coordinates.
matrix.Concat(transformValues[SkMatrix::kAScaleX], transformValues[SkMatrix::kASkewY],
transformValues[SkMatrix::kASkewX], transformValues[SkMatrix::kAScaleY],
transformValues[SkMatrix::kATransX], transformValues[SkMatrix::kATransY]);
// Translate the result back to PDF coordinates.
matrix.Concat(1, 0, 0, -1, 0, page->GetPageHeight());
FS_MATRIX transform = {matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f};
FS_RECTF clip = {(float) clipLeft, (float) clipTop, (float) clipRight, (float) clipBottom};
FPDFPage_TransFormWithClip(page, &transform, &clip);

View File

@@ -212,19 +212,23 @@ static void renderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int destLeft, i
} else {
// PDF's coordinate system origin is left-bottom while
// in graphics it is the top-left, so remap the origin.
matrix.Set(1, 0, 0, -1, 0, pPage->GetPageHeight());
SkMatrix reflectOnX = SkMatrix::MakeScale(1, -1);
SkMatrix moveUp = SkMatrix::MakeTrans(0, FPDF_GetPageHeight(page));
SkMatrix m = SkMatrix::Concat(moveUp, reflectOnX);
// Concatenate transformation and origin transformation
m.setConcat(*transform, m);
SkScalar transformValues[6];
if (transform->asAffine(transformValues)) {
matrix.Concat(transformValues[SkMatrix::kAScaleX], transformValues[SkMatrix::kASkewY],
transformValues[SkMatrix::kASkewX], transformValues[SkMatrix::kAScaleY],
transformValues[SkMatrix::kATransX], transformValues[SkMatrix::kATransY]);
} else {
if (!m.asAffine(transformValues)) {
// Already checked for a return value of false in the caller, so this should never
// happen.
ALOGE("Error rendering page!");
}
matrix = {transformValues[SkMatrix::kAScaleX], transformValues[SkMatrix::kASkewY],
transformValues[SkMatrix::kASkewX], transformValues[SkMatrix::kAScaleY],
transformValues[SkMatrix::kATransX], transformValues[SkMatrix::kATransY]};
}
pageContext->AppendObjectList(pPage, &matrix);