[poppler] poppler/poppler: CairoOutputDev.cc, 1.18,
1.18.2.1 GfxState.cc, 1.2, 1.2.2.1 GfxState.h, 1.2,
1.2.2.1 TextOutputDev.cc, 1.6.2.2, 1.6.2.3
Kristian Hogsberg
krh at freedesktop.org
Sat Aug 6 08:31:16 EST 2005
Update of /cvs/poppler/poppler/poppler
In directory gabe:/tmp/cvs-serv4524/poppler
Modified Files:
Tag: POPPLER_0_4_X
CairoOutputDev.cc GfxState.cc GfxState.h TextOutputDev.cc
Log Message:
2005-08-05 Kristian Høgsberg <krh at redhat.com>
* poppler/TextOutputDev.cc (visitLine): Round selection
coordinates in device space, so selection isn't fuzzy.
* poppler/GfxState.cc:
* poppler/GfxState.h: Add simple Matrix class.
Index: CairoOutputDev.cc
===================================================================
RCS file: /cvs/poppler/poppler/poppler/CairoOutputDev.cc,v
retrieving revision 1.18
retrieving revision 1.18.2.1
diff -u -d -r1.18 -r1.18.2.1
--- CairoOutputDev.cc 28 Jul 2005 05:52:43 -0000 1.18
+++ CairoOutputDev.cc 5 Aug 2005 22:31:14 -0000 1.18.2.1
@@ -264,14 +264,14 @@
j = 1;
while (j < subpath->getNumPoints()) {
if (subpath->getCurve(j)) {
+ state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1);
+ state->transform(subpath->getX(j+1), subpath->getY(j+1), &x2, &y2);
+ state->transform(subpath->getX(j+2), subpath->getY(j+2), &x3, &y3);
if (snapToGrid) {
x1 = round (x1); y1 = round (y1);
x2 = round (x2); y2 = round (y2);
x3 = round (x3); y3 = round (y3);
}
- state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1);
- state->transform(subpath->getX(j+1), subpath->getY(j+1), &x2, &y2);
- state->transform(subpath->getX(j+2), subpath->getY(j+2), &x3, &y3);
cairo_curve_to (cairo,
x1, y1,
x2, y2,
Index: GfxState.cc
===================================================================
RCS file: /cvs/poppler/poppler/poppler/GfxState.cc,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -d -r1.2 -r1.2.2.1
--- GfxState.cc 26 May 2005 12:52:38 -0000 1.2
+++ GfxState.cc 5 Aug 2005 22:31:14 -0000 1.2.2.1
@@ -28,6 +28,32 @@
return (x < 0) ? 0 : ((x > 1) ? 1 : x);
}
+GBool Matrix::invertTo(Matrix *other)
+{
+ double det;
+
+ det = 1 / (m[0] * m[3] - m[1] * m[2]);
+ other->m[0] = m[3] * det;
+ other->m[1] = -m[1] * det;
+ other->m[2] = -m[2] * det;
+ other->m[3] = m[0] * det;
+ other->m[4] = (m[2] * m[5] - m[3] * m[4]) * det;
+ other->m[5] = (m[1] * m[4] - m[0] * m[5]) * det;
+
+ return gTrue;
+}
+
+void Matrix::transform(double x, double y, double *tx, double *ty)
+{
+ double temp_x, temp_y;
+
+ temp_x = m[0] * x + m[2] * y + m[4];
+ temp_y = m[1] * x + m[3] * y + m[5];
+
+ *tx = temp_x;
+ *ty = temp_y;
+}
+
//------------------------------------------------------------------------
static char *gfxColorSpaceModeNames[] = {
Index: GfxState.h
===================================================================
RCS file: /cvs/poppler/poppler/poppler/GfxState.h,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -d -r1.2 -r1.2.2.1
--- GfxState.h 26 May 2005 12:52:38 -0000 1.2
+++ GfxState.h 5 Aug 2005 22:31:14 -0000 1.2.2.1
@@ -22,6 +22,15 @@
class PDFRectangle;
class GfxShading;
+class Matrix {
+public:
+ double m[6];
+
+ GBool invertTo(Matrix *other);
+ void transform(double x, double y, double *tx, double *ty);
+};
+
+
//------------------------------------------------------------------------
// GfxColor
//------------------------------------------------------------------------
@@ -878,6 +887,7 @@
// Accessors.
double *getCTM() { return ctm; }
+ void getCTM(Matrix *m) { memcpy (m->m, ctm, sizeof m->m); }
double getX1() { return px1; }
double getY1() { return py1; }
double getX2() { return px2; }
Index: TextOutputDev.cc
===================================================================
RCS file: /cvs/poppler/poppler/poppler/TextOutputDev.cc,v
retrieving revision 1.6.2.2
retrieving revision 1.6.2.3
diff -u -d -r1.6.2.2 -r1.6.2.3
--- TextOutputDev.cc 5 Aug 2005 19:07:47 -0000 1.6.2.2
+++ TextOutputDev.cc 5 Aug 2005 22:31:14 -0000 1.6.2.3
@@ -3254,6 +3254,7 @@
{
double x1, y1, x2, y2, margin;
int i;
+ Matrix ctm, ictm;
state->setFillColor(box_color);
out->updateFillColor(state);
@@ -3264,6 +3265,19 @@
x2 = ceil (line->edge[edge_end]);
y2 = ceil (line->yMax + margin);
+ state->getCTM (&ctm);
+ ctm.transform(line->edge[edge_begin], line->yMin - margin, &x1, &y1);
+ ctm.transform(line->edge[edge_end], line->yMax + margin, &x2, &y2);
+
+ x1 = floor (x1);
+ y1 = floor (y1);
+ x2 = ceil (x2);
+ y2 = ceil (y2);
+
+ ctm.invertTo (&ictm);
+ ictm.transform(x1, y1, &x1, &y1);
+ ictm.transform(x2, y2, &x2, &y2);
+
state->moveTo(x1, y1);
state->lineTo(x2, y1);
state->lineTo(x2, y2);
More information about the poppler
mailing list