diff --git a/src/HTMLRenderer/draw.cc b/src/HTMLRenderer/draw.cc
index d63b405..8ed7602 100644
--- a/src/HTMLRenderer/draw.cc
+++ b/src/HTMLRenderer/draw.cc
@@ -36,6 +36,13 @@ static bool is_horizontal_line(GfxSubpath * path)
&& (_equal(path->getY(0), path->getY(1))));
}
+static bool is_vertical_line(GfxSubpath * path)
+{
+ return ((path->getNumPoints() == 2)
+ && (!path->getCurve(1))
+ && (_equal(path->getX(0), path->getX(1))));
+}
+
static bool is_rectangle(GfxSubpath * path)
{
if (!(((path->getNumPoints() != 4) && (path->isClosed()))
@@ -94,17 +101,20 @@ static void get_shading_bbox(GfxState * state, GfxShading * shading,
/*
* Note that the coordinate system in HTML and PDF are different
- * In HTML:
- * UP = 0
- * RIGHT = PI / 2
- * DOWN = PI
- * LEFT = - PI / 2
*/
static double get_angle(double dx, double dy)
{
double r = hypot(dx, dy);
+ /*
+ * acos always returns [0, pi]
+ */
double ang = acos(dx / r);
+ /*
+ * for angle below x-axis
+ */
+ if(dy < 0)
+ ang = -ang;
return ang;
}
@@ -112,7 +122,7 @@ static double get_angle(double dx, double dy)
class LinearGradient
{
public:
- LinearGradient(GfxAxialShading * shading,
+ LinearGradient(GfxAxialShading * shading,
double x1, double y1, double x2, double y2);
void dumpto (ostream & out);
@@ -251,7 +261,23 @@ void HTMLRenderer::css_draw(GfxState *state, bool fill)
nullptr, 0,
nullptr, &stroke_color);
}
- else if (is_rectangle(subpath))
+ else if(is_vertical_line(subpath))
+ {
+ double x = subpath->getX(0);
+ double y1 = subpath->getY(0);
+ double y2 = subpath->getY(1);
+ if(y1 > y2) swap(y1, y2);
+
+ GfxRGB stroke_color;
+ state->getStrokeRGB(&stroke_color);
+
+ double lw = state->getLineWidth();
+
+ css_draw_rectangle(x-lw/2, y1, lw, y2-y1, state->getCTM(),
+ nullptr, 0,
+ nullptr, &stroke_color);
+ }
+ else if(is_rectangle(subpath))
{
close_text_line();
double x1 = subpath->getX(0);
@@ -305,7 +331,7 @@ void HTMLRenderer::css_draw_rectangle(double x, double y, double w, double h, co
double new_tm[6];
memcpy(new_tm, tm, sizeof(new_tm));
- _transform(new_tm, x, y);
+ _tm_transform(new_tm, x, y);
double scale = 1.0;
{
diff --git a/src/HTMLRenderer/link.cc b/src/HTMLRenderer/link.cc
index aa579c4..83cf6aa 100644
--- a/src/HTMLRenderer/link.cc
+++ b/src/HTMLRenderer/link.cc
@@ -267,7 +267,7 @@ void HTMLRenderer::processLink(AnnotLink * al)
html_fout << "border-style:none;";
}
- _transform(default_ctm, x, y);
+ _tm_transform(default_ctm, x, y);
html_fout << "position:absolute;"
<< "left:" << _round(x) << "px;"
diff --git a/src/include/util.h b/src/include/util.h
index 1ea84fe..5c1032b 100644
--- a/src/include/util.h
+++ b/src/include/util.h
@@ -47,7 +47,8 @@ static inline bool _tm_equal(const double * tm1, const double * tm2, int size =
return true;
}
-void _transform(const double * ctm, double & x, double & y, bool is_delta = false);
+void _tm_transform(const double * tm, double & x, double & y, bool is_delta = false);
+void _tm_multiply(double * tm_left, const double * tm_right);
static inline long long hash_ref(const Ref * id)
{
diff --git a/src/util.cc b/src/util.cc
index 9432cc8..a69654e 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -54,18 +54,31 @@ const std::map, std::pair
{{".js", 1}, {""}}
});
-void _transform(const double * ctm, double & x, double & y, bool is_delta)
+void _tm_transform(const double * tm, double & x, double & y, bool is_delta)
{
double xx = x, yy = y;
- x = ctm[0] * xx + ctm[2] * yy;
- y = ctm[1] * xx + ctm[3] * yy;
+ x = tm[0] * xx + tm[2] * yy;
+ y = tm[1] * xx + tm[3] * yy;
if(!is_delta)
{
- x += ctm[4];
- y += ctm[5];
+ x += tm[4];
+ y += tm[5];
}
}
+void _tm_multiply(double * tm_left, const double * tm_right)
+{
+ double old[4];
+ memcpy(old, tm_left, sizeof(old));
+
+ tm_left[0] = old[0] * tm_right[0] + old[2] * tm_right[1];
+ tm_left[1] = old[1] * tm_right[0] + old[3] * tm_right[1];
+ tm_left[2] = old[0] * tm_right[2] + old[2] * tm_right[3];
+ tm_left[3] = old[1] * tm_right[2] + old[3] * tm_right[3];
+ tm_left[4] += old[0] * tm_right[4] + old[2] * tm_right[5];
+ tm_left[5] += old[1] * tm_right[4] + old[3] * tm_right[5];
+}
+
bool isLegalUnicode(Unicode u)
{
/*