int vw = vp.getWidth();
int vh = vp.getHeight();
Point2D a = new Point2D(0, 0);
Point2D b = new Point2D(vw, vh);
double scaleX = 1, scaleY = 1;
Transform t = isTransformable() ? vp.getTransform() : getTransform();
if (t != null)
{
scaleX = t.getScaleX();
scaleY = t.getScaleY();
t = t.getInverse();
t.transform(a, a);
t.transform(b, b);
}
double x1 = a.getX();
double y1 = a.getY();
double x2 = b.getX();
double y2 = b.getY();
for (int direction = X; direction <= Y; direction++)
{
boolean vertical = (direction == X);
double scale = vertical ? scaleX : scaleY;
double min = vertical ? x1 : y1;
double max = vertical ? x2 : y2;
for (int primSec = 0; primSec <= 1; primSec++)
{
int index = primSec * 2 + direction;
boolean isSecondary = (primSec == 1);
if (m_lines[index] == null)
{
continue;
}
int n = 0;
if (isSecondary)
{
// n = primarySize div secondary
// ASSUMPTION: primarySize is a multiple of secondarySize
n = (int) Math.round(m_sizes[direction] / m_sizes[index]);
}
Line line = m_lines[index];
double size = m_sizes[index];
double previousLineWidth = line.getStrokeWidth();
line.setStrokeWidth(previousLineWidth / scale);
DashArray previousDashes = line.getDashArray();
if (previousDashes != null)
{
double[] d = previousDashes.getNormalizedArray();
DashArray dashes = new DashArray();
for (int i = 0; i < d.length; i++)
{
dashes.push(d[i] / scale);
}
line.setDashArray(dashes);
}
long n1 = Math.round(min / size);
if (n1 * size < min)
{
n1++;
}
long n2 = Math.round(max / size);
if (n2 * size > max)
{
n2--;
}
Point2DArray points = line.getPoints();
Point2D p1 = points.getPoint(0);
Point2D p2 = points.getPoint(1);
if (vertical)
{
p1.setY(y1);
p2.setY(y2);
}
else
{
p1.setX(x1);
p2.setX(x2);
}
for (long ni = n1; ni <= n2; ni++)
{
if (isSecondary && (ni % n == 0)) // skip primary lines
{
continue;
}
if (vertical)
{
double x = ni * size;
p1.setX(x);
p2.setX(x);
}
else
{
double y = ni * size;
p1.setY(y);
p2.setY(y);
}
line.drawWithTransforms(context);
}
line.setStrokeWidth(previousLineWidth); // restore stroke width