poppler/Annot.cc | 384 +++++++++++++++++++++++--------------------------- poppler/Annot.h | 3 poppler/Gfx.cc | 9 - poppler/Gfx.h | 2 test/pdf-inspector.cc | 3 5 files changed, 188 insertions(+), 213 deletions(-)
New commits: commit 5e4d8eeea0b9dba68420c164975418c76a53be85 Author: Carlos Garcia Campos <[email protected]> Date: Sat Jul 10 15:54:28 2010 +0200 [pdf-inspector] Do not render for printing diff --git a/test/pdf-inspector.cc b/test/pdf-inspector.cc index 24bebbd..d4a564d 100644 --- a/test/pdf-inspector.cc +++ b/test/pdf-inspector.cc @@ -132,6 +132,7 @@ PdfInspector::PdfInspector(void) } doc = NULL; output = new CairoOutputDev(); + output->setPrinting (gFalse); // set up initial widgets load (NULL); @@ -236,7 +237,7 @@ PdfInspector::analyze_page (int page) cairo_surface_destroy (surface); output->setCairo (cr); cairo_destroy (cr); - doc->displayPage (output, page + 1, 72, 72, 0, gFalse, gTrue, gTrue); + doc->displayPage (output, page + 1, 72, 72, 0, gFalse, gTrue, gFalse); output->setCairo (NULL); // Total time; commit e6824972a213a888ca0185b7ae0a75fc23f75797 Author: Carlos Garcia Campos <[email protected]> Date: Sat Jul 10 15:52:15 2010 +0200 [annots] Use a transparency group for markup annots without AP and opacity != 1 Fixes bug #623616. diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 484b4e2..cb66b65 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1246,6 +1246,57 @@ void Annot::drawCircleBottomRight(double cx, double cy, double r) { appearBuf->append("S\n"); } +void Annot::createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream) { + Object obj1, obj2; + Object appearDict; + + appearDict.initDict(xref); + appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); + appearDict.dictSet("Subtype", obj1.initName("Form")); + obj1.initArray(xref); + obj1.arrayAdd(obj2.initReal(bbox[0])); + obj1.arrayAdd(obj2.initReal(bbox[1])); + obj1.arrayAdd(obj2.initReal(bbox[2])); + obj1.arrayAdd(obj2.initReal(bbox[3])); + appearDict.dictSet("BBox", &obj1); + if (transparencyGroup) { + Object transDict; + transDict.initDict(xref); + transDict.dictSet("S", obj1.initName("Transparency")); + appearDict.dictSet("Group", &transDict); + } + if (resDict) + appearDict.dictSet("Resources", resDict); + + MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0, + appearBuf->getLength(), &appearDict); + mStream->setNeedFree(gTrue); + aStream->initStream(mStream); +} + +void Annot::createResourcesDict(char *formName, Object *formStream, + char *stateName, + double opacity, char *blendMode, + Object *resDict) { + Object gsDict, stateDict, formDict, obj1; + + gsDict.initDict(xref); + if (opacity != 1) { + gsDict.dictSet("CA", obj1.initReal(opacity)); + gsDict.dictSet("ca", obj1.initReal(opacity)); + } + if (blendMode) + gsDict.dictSet("BM", obj1.initName(blendMode)); + stateDict.initDict(xref); + stateDict.dictSet(stateName, &gsDict); + formDict.initDict(xref); + formDict.dictSet(formName, formStream); + + resDict->initDict(xref); + resDict->dictSet("ExtGState", &stateDict); + resDict->dictSet("XObject", &formDict); +} + GBool Annot::isVisible(GBool printing) { // check the flags if ((flags & flagHidden) || @@ -1271,7 +1322,7 @@ void Annot::draw(Gfx *gfx, GBool printing) { // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, 1, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } @@ -1883,22 +1934,21 @@ void AnnotText::draw(Gfx *gfx, GBool printing) { appearBuf->append (ANNOT_TEXT_AP_CIRCLE); appearBuf->append ("Q\n"); - Object appearDict, obj1, obj2; + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = bbox[3] = 24; + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream, resDict; - appearDict.initDict(xref); - appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - appearDict.dictSet("Subtype", obj1.initName("Form")); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(24)); - obj1.arrayAdd(obj2.initReal(24)); - appearDict.dictSet("BBox", &obj1); - - MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - appearStream->setNeedFree(gTrue); - appearance.initStream(appearStream); + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } delete appearBuf; rectx2 = rect->x1 + 24; @@ -1907,7 +1957,7 @@ void AnnotText::draw(Gfx *gfx, GBool printing) { // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, border, color, ca, + gfx->drawAnnot(&obj, border, color, rect->x1, rect->y1, rectx2, recty2); obj.free(); } @@ -1999,7 +2049,7 @@ void AnnotLink::draw(Gfx *gfx, GBool printing) { // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, border, color, 1, + gfx->drawAnnot(&obj, border, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } @@ -2368,28 +2418,28 @@ void AnnotLine::draw(Gfx *gfx, GBool printing) { appearBuf->append ("S\n"); appearBuf->append ("Q\n"); - Object appearDict, obj1, obj2; + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = rect->x2 - rect->x1; + bbox[3] = rect->y2 - rect->y1; + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream, resDict; - appearDict.initDict(xref); - appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - appearDict.dictSet("Subtype", obj1.initName("Form")); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(rect->x2 - rect->x1)); - obj1.arrayAdd(obj2.initReal(rect->y2 - rect->y1)); - appearDict.dictSet("BBox", &obj1); - - MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - appearStream->setNeedFree(gTrue); - appearance.initStream(appearStream); + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } delete appearBuf; } // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, ca, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } @@ -2480,13 +2530,13 @@ AnnotTextMarkup::~AnnotTextMarkup() { } } + + void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) { Object obj; double ca = 1; int i; Object obj1, obj2; - Object formDict, resDict; - MemStream *mStream; if (!isVisible (printing)) return; @@ -2581,100 +2631,35 @@ void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) { appearBuf->append ("f\n"); } - Object appearDict; - appearDict.initDict(xref); - appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - appearDict.dictSet("Subtype", obj1.initName("Form")); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(rect->x1)); - obj1.arrayAdd(obj2.initReal(rect->y1)); - obj1.arrayAdd(obj2.initReal(rect->x2)); - obj1.arrayAdd(obj2.initReal(rect->y2)); - appearDict.dictSet("BBox", &obj1); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(1)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(1)); - obj1.arrayAdd(obj2.initReal(-rect->x1)); - obj1.arrayAdd(obj2.initReal(-rect->y1)); - appearDict.dictSet("Matrix", &obj1); - - Object aStream; - mStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - mStream->setNeedFree(gTrue); - aStream.initStream(mStream); + Object aStream, resDict; + double bbox[4]; + bbox[0] = rect->x1; + bbox[1] = rect->y1; + bbox[2] = rect->x2; + bbox[3] = rect->y2; + createForm(bbox, gTrue, NULL, &aStream); delete appearBuf; - Object transDict; - formDict.initDict(xref); - formDict.dictSet ("Form", &aStream); - resDict.initDict(xref); - resDict.dictSet ("XObject", &formDict); - - transDict.initDict(xref); - transDict.dictSet ("S", obj1.initName("Transparency")); - - appearBuf = new GooString ("/Form Do"); - - formDict.initDict(xref); - formDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - formDict.dictSet("Subtype", obj1.initName("Form")); - formDict.dictSet("Group", &transDict); - formDict.dictSet("Resources", &resDict); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(rect->x2 - rect->x1)); - obj1.arrayAdd(obj2.initReal(rect->y2 - rect->y1)); - formDict.dictSet("BBox", &obj1); + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", 1, "Multiply", &resDict); + if (ca == 1) { + createForm(bbox, gFalse, &resDict, &appearance); + } else { + createForm(bbox, gTrue, &resDict, &aStream); + delete appearBuf; - mStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &formDict); - mStream->setNeedFree(gTrue); - aStream.initStream(mStream); + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } delete appearBuf; - - Object stateDict; - - formDict.initDict(xref); - formDict.dictSet ("HAForm", &aStream); - transDict.initDict(xref); - transDict.dictSet ("BM", obj1.initName("Multiply")); - stateDict.initDict(xref); - stateDict.dictSet ("R0", &transDict); - resDict.initDict(xref); - resDict.dictSet ("XObject", &formDict); - resDict.dictSet ("ExtGState", &stateDict); - - appearBuf = new GooString ("/R0 gs\n/HAForm Do"); - break; } - - formDict.initDict(xref); - formDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - formDict.dictSet("Subtype", obj1.initName("Form")); - if (type == typeHighlight) - formDict.dictSet("Resources", &resDict); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(rect->x2 - rect->x1)); - obj1.arrayAdd(obj2.initReal(rect->y2 - rect->y1)); - formDict.dictSet("BBox", &obj1); - - mStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &formDict); - mStream->setNeedFree(gTrue); - appearance.initStream(mStream); - delete appearBuf; } // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, ca, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } @@ -4036,7 +4021,7 @@ void AnnotWidget::draw(Gfx *gfx, GBool printing) { gfx->pushResources(dict); delete dict; } - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, 1, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); if (addDingbatsResource) { gfx->popResources(); @@ -4178,22 +4163,11 @@ void AnnotMovie::draw(Gfx *gfx, GBool printing) { appearBuf->append ("Q\n"); appearBuf->append ("Q\n"); - Object appearDict; - appearDict.initDict(xref); - appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - appearDict.dictSet("Subtype", obj1.initName("Form")); - appearDict.dictSet("Resources", &resDict); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initInt(0)); - obj1.arrayAdd(obj2.initInt(0)); - obj1.arrayAdd(obj2.initInt(width)); - obj1.arrayAdd(obj2.initInt(height)); - appearDict.dictSet("BBox", &obj1); - - MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - appearStream->setNeedFree(gTrue); - appearance.initStream(appearStream); + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = width; + bbox[3] = height; + createForm(bbox, gFalse, &resDict, &appearance); delete appearBuf; } poster.free(); @@ -4201,7 +4175,7 @@ void AnnotMovie::draw(Gfx *gfx, GBool printing) { // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, 1, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } @@ -4467,28 +4441,29 @@ void AnnotGeometry::draw(Gfx *gfx, GBool printing) { appearBuf->append ("S\n"); appearBuf->append ("Q\n"); - Object appearDict, obj1, obj2; + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = rect->x2 - rect->x1; + bbox[3] = rect->y2 - rect->y1; + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream; - appearDict.initDict(xref); - appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - appearDict.dictSet("Subtype", obj1.initName("Form")); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(rect->x2 - rect->x1)); - obj1.arrayAdd(obj2.initReal(rect->y2 - rect->y1)); - appearDict.dictSet("BBox", &obj1); - - MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - appearStream->setNeedFree(gTrue); - appearance.initStream(appearStream); + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + Object resDict; + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } delete appearBuf; } // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, ca, + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } @@ -4923,28 +4898,28 @@ void AnnotFileAttachment::draw(Gfx *gfx, GBool printing) { appearBuf->append (ANNOT_FILE_ATTACHMENT_AP_TAG); appearBuf->append ("Q\n"); - Object appearDict, obj1, obj2; + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = bbox[3] = 24; + if (ca == 1) { + createForm (bbox, gFalse, NULL, &appearance); + } else { + Object aStream; - appearDict.initDict(xref); - appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - appearDict.dictSet("Subtype", obj1.initName("Form")); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(24)); - obj1.arrayAdd(obj2.initReal(24)); - appearDict.dictSet("BBox", &obj1); - - MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - appearStream->setNeedFree(gTrue); - appearance.initStream(appearStream); + createForm (bbox, gTrue, NULL, &aStream); + delete appearBuf; + + Object resDict; + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } delete appearBuf; } // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, border, color, ca, + gfx->drawAnnot(&obj, border, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } @@ -5085,28 +5060,27 @@ void AnnotSound::draw(Gfx *gfx, GBool printing) { appearBuf->append (ANNOT_SOUND_AP_MIC); appearBuf->append ("Q\n"); - Object appearDict, obj1, obj2; + double bbox[4]; + bbox[0] = bbox[1] = 0; + bbox[2] = bbox[3] = 24; + if (ca == 1) { + createForm(bbox, gFalse, NULL, &appearance); + } else { + Object aStream, resDict; - appearDict.initDict(xref); - appearDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - appearDict.dictSet("Subtype", obj1.initName("Form")); - obj1.initArray(xref); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(0)); - obj1.arrayAdd(obj2.initReal(24)); - obj1.arrayAdd(obj2.initReal(24)); - appearDict.dictSet("BBox", &obj1); - - MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - appearStream->setNeedFree(gTrue); - appearance.initStream(appearStream); + createForm(bbox, gTrue, NULL, &aStream); + delete appearBuf; + + appearBuf = new GooString ("/GS0 gs\n/Fm0 Do"); + createResourcesDict("Fm0", &aStream, "GS0", ca, NULL, &resDict); + createForm(bbox, gFalse, &resDict, &appearance); + } delete appearBuf; } // draw the appearance stream appearance.fetch(xref, &obj); - gfx->drawAnnot(&obj, border, color, ca, + gfx->drawAnnot(&obj, border, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); } diff --git a/poppler/Annot.h b/poppler/Annot.h index 97f9a49..9228c2e 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -538,6 +538,9 @@ protected: void drawCircle(double cx, double cy, double r, GBool fill); void drawCircleTopLeft(double cx, double cy, double r); void drawCircleBottomRight(double cx, double cy, double r); + void createForm(double *bbox, GBool transparencyGroup, Object *resDict, Object *aStream); + void createResourcesDict(char *formName, Object *formStream, char *stateName, + double opacity, char *blendMode, Object *resDict); GBool isVisible(GBool printing); // Updates the field key of the annotation dictionary diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc index 221caef..50870cc 100644 --- a/poppler/Gfx.cc +++ b/poppler/Gfx.cc @@ -4592,7 +4592,7 @@ void Gfx::opMarkPoint(Object args[], int numArgs) { // misc //------------------------------------------------------------------------ -void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, double opacity, +void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, double xMin, double yMin, double xMax, double yMax) { Dict *dict, *resDict; Object matrixObj, bboxObj, resObj; @@ -4608,13 +4608,6 @@ void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, double int dashLength; int i; - if (opacity != 1) { - state->setFillOpacity(opacity); - out->updateFillOpacity(state); - state->setStrokeOpacity(opacity); - out->updateStrokeOpacity(state); - } - //~ can we assume that we're in default user space? //~ (i.e., baseMatrix = ctm) diff --git a/poppler/Gfx.h b/poppler/Gfx.h index f1a8964..cb42b5c 100644 --- a/poppler/Gfx.h +++ b/poppler/Gfx.h @@ -159,7 +159,7 @@ public: // Display an annotation, given its appearance (a Form XObject), // border style, and bounding box (in default user space). - void drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, double opacity, + void drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, double xMin, double yMin, double xMax, double yMax); // Save graphics state. commit 70ce0b6ea1a0d61f5048d2ae49c639d74a643b29 Author: Carlos Garcia Campos <[email protected]> Date: Fri Jul 9 17:04:00 2010 +0200 [annots] Clamp QuadPoints coords to annot rectangle instead of ignore points Fixes appearance stream generation for document attached to bug #623616. diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 2fe8ae3..484b4e2 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -90,6 +90,10 @@ // = (4 * (sqrt(2) - 1) / 3) * r #define bezierCircle 0.55228475 +// Ensures that x is between the limits set by low and high. +// If low is greater than high the result is undefined. +#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) + AnnotLineEndingStyle parseAnnotLineEndingStyle(GooString *string) { if (string != NULL) { if (!string->cmp("Square")) { @@ -320,37 +324,37 @@ AnnotQuadrilaterals::AnnotQuadrilaterals(Array *array, PDFRectangle *rect) { quadrilateralsLength = 0; if ((arrayLength % 8) == 0) { - int i = 0; + int i; quadsLength = arrayLength / 8; quads = (AnnotQuadrilateral **) gmallocn ((quadsLength), sizeof(AnnotQuadrilateral *)); memset(quads, 0, quadsLength * sizeof(AnnotQuadrilateral *)); - while (i < (quadsLength) && correct) { - for (int j = 0; j < 8 && correct; j++) { + for (i = 0; i < quadsLength; i++) { + for (int j = 0; j < 8; j++) { Object obj; if (array->get(i * 8 + j, &obj)->isNum()) { - quadArray[j] = obj.getNum(); - if (j % 2 == 1) { - if (quadArray[j] < rect->y1 || quadArray[j] > rect->y2) - correct = gFalse; - } else { - if (quadArray[j] < rect->x1 || quadArray[j] > rect->x2) - correct = gFalse; - } + if (j % 2 == 1) + quadArray[j] = CLAMP (obj.getNum(), rect->y1, rect->y2); + else + quadArray[j] = CLAMP (obj.getNum(), rect->x1, rect->x2); } else { correct = gFalse; + obj.free(); + error (-1, "Invalid QuadPoint in annot"); + break; } obj.free(); } - if (correct) - quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1], - quadArray[2], quadArray[3], - quadArray[4], quadArray[5], - quadArray[6], quadArray[7]); - i++; + if (!correct) + break; + + quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1], + quadArray[2], quadArray[3], + quadArray[4], quadArray[5], + quadArray[6], quadArray[7]); } if (correct) { _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
