File poppler-0.12.4-table-overlap.patch of Package poppler

--- poppler-0.12.4/poppler/TextOutputDev.cc.orig	2010-05-04 13:05:34.000000000 +0200
+++ poppler-0.12.4/poppler/TextOutputDev.cc	2010-05-04 13:07:50.000000000 +0200
@@ -3024,6 +3024,7 @@ void TextPage::coalesce(GBool physLayout
   int numTables = 0;
   int tableId = -1;
   int correspondenceX, correspondenceY;
+  int overlapX, overlapY;
   double xCentre1, yCentre1, xCentre2, yCentre2;
   double xCentre3, yCentre3, xCentre4, yCentre4;
   double deltaX, deltaY;
@@ -3098,6 +3099,8 @@ void TextPage::coalesce(GBool physLayout
       tableId = -1;
       correspondenceX = 0;
       correspondenceY = 0;
+      overlapX = 0;
+      overlapY = 0;
       deltaX = 0.0;
       deltaY = 0.0;
 
@@ -3127,39 +3130,55 @@ void TextPage::coalesce(GBool physLayout
       xCentre4 = (fblk4->xMax + fblk4->xMin) / 2.0;
       yCentre4 = (fblk4->yMax + fblk4->yMin) / 2.0;
 
+      // do blocks overlap in x ?
+      if (blk1->xMax > fblk2->xMin ||
+          blk1->xMax > fblk4->xMin ||
+          fblk3->xMax > fblk2->xMin ||
+          fblk3->xMax > fblk4->xMin)
+        overlapX++;
+
+      // do blocks overlap in y ?
+      if (blk1->yMax > fblk3->yMin ||
+          blk1->yMax > fblk4->yMin ||
+          fblk2->yMax > fblk3->yMin ||
+          fblk2->yMax > fblk4->yMin)
+        overlapY++;
+
       // are blocks centrally aligned in x ?
-      if (abs (xCentre1 - xCentre3) <= deltaX &&
-          abs (xCentre2 - xCentre4) <= deltaX)
+      if (fabs (xCentre1 - xCentre3) <= deltaX &&
+          fabs (xCentre2 - xCentre4) <= deltaX)
         correspondenceX++;
 
       // are blocks centrally aligned in y ?
-      if (abs (yCentre1 - yCentre2) <= deltaY &&
-          abs (yCentre3 - yCentre4) <= deltaY)
+      if (fabs (yCentre1 - yCentre2) <= deltaY &&
+          fabs (yCentre3 - yCentre4) <= deltaY)
         correspondenceY++;
 
       // are blocks aligned to the left ?
-      if (abs (blk1->xMin - fblk3->xMin) <= deltaX &&
-          abs (fblk2->xMin - fblk4->xMin) <= deltaX)
+      if (fabs (blk1->xMin - fblk3->xMin) <= deltaX &&
+          fabs (fblk2->xMin - fblk4->xMin) <= deltaX)
         correspondenceX++;
 
       // are blocks aligned to the right ?
-      if (abs (blk1->xMax - fblk3->xMax) <= deltaX &&
-          abs (fblk2->xMax - fblk4->xMax) <= deltaX)
+      if (fabs (blk1->xMax - fblk3->xMax) <= deltaX &&
+          fabs (fblk2->xMax - fblk4->xMax) <= deltaX)
         correspondenceX++;
 
       // are blocks aligned to the top ?
-      if (abs (blk1->yMin - fblk2->yMin) <= deltaY &&
-          abs (fblk3->yMin - fblk4->yMin) <= deltaY)
+      if (fabs (blk1->yMin - fblk2->yMin) <= deltaY &&
+          fabs (fblk3->yMin - fblk4->yMin) <= deltaY)
         correspondenceY++;
 
       // are blocks aligned to the bottom ?
-      if (abs (blk1->yMax - fblk2->yMax) <= deltaY &&
-          abs (fblk3->yMax - fblk4->yMax) <= deltaY)
+      if (fabs (blk1->yMax - fblk2->yMax) <= deltaY &&
+          fabs (fblk3->yMax - fblk4->yMax) <= deltaY)
         correspondenceY++;
 
-      // are blocks aligned in x and y ?
+      // are blocks aligned in x and y and don't overlap ?
       if (correspondenceX > 0 &&
-          correspondenceY > 0) {
+          correspondenceY > 0 &&
+          overlapX == 0 &&
+          overlapY == 0) {
 
         // find maximal tableId
         tableId = tableId < fblk4->tableId ? fblk4->tableId : tableId;
openSUSE Build Service is sponsored by