com.kitfox.svg.pattern.PatternPaintContext Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of svg-salamander Show documentation
Show all versions of svg-salamander Show documentation
SVG Salamander - tools and components for SVG rendering, manipulation and animation
The newest version!
/*
* PatternPaintContext.java
*
*
* The Salamander Project - 2D and 3D graphics libraries in Java
* Copyright (C) 2004 Mark McKay
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Mark McKay can be contacted at [email protected]. Salamander and other
* projects can be found at http://www.kitfox.com
*
* Created on April 1, 2004, 3:37 AM
*/
package com.kitfox.svg.pattern;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
/**
* @author Mark McKay
* @author Mark McKay
*/
public class PatternPaintContext implements PaintContext
{
BufferedImage source; //Image we're rendering from
Rectangle deviceBounds; //int size of rectangle we're rendering to
// AffineTransform userXform; //xform from user space to device space
// AffineTransform distortXform; //distortion applied to this pattern
AffineTransform xform; //distortion applied to this pattern
int sourceWidth;
int sourceHeight;
//Raster we use to build tile
BufferedImage buf;
/** Creates a new instance of PatternPaintContext */
public PatternPaintContext(BufferedImage source, Rectangle deviceBounds, AffineTransform userXform, AffineTransform distortXform)
{
//System.err.println("Bounds " + deviceBounds);
this.source = source;
this.deviceBounds = deviceBounds;
try {
// this.distortXform = distortXform.createInverse();
// this.userXform = userXform.createInverse();
// xform = userXform.createInverse();
// xform.concatenate(distortXform.createInverse());
xform = distortXform.createInverse();
xform.concatenate(userXform.createInverse());
}
catch (Exception e) { e.printStackTrace(); }
sourceWidth = source.getWidth();
sourceHeight = source.getHeight();
}
public void dispose() {
}
public ColorModel getColorModel() {
return source.getColorModel();
}
public Raster getRaster(int x, int y, int w, int h)
{
//System.err.println("" + x + ", " + y + ", " + w + ", " + h);
if (buf == null || buf.getWidth() != w || buf.getHeight() != buf.getHeight())
{
buf = new BufferedImage(w, h, source.getType());
}
// Point2D.Float srcPt = new Point2D.Float(), srcPt2 = new Point2D.Float(), destPt = new Point2D.Float();
Point2D.Float srcPt = new Point2D.Float(), destPt = new Point2D.Float();
for (int j = 0; j < h; j++)
{
for (int i = 0; i < w; i++)
{
destPt.setLocation(i + x, j + y);
xform.transform(destPt, srcPt);
// userXform.transform(destPt, srcPt2);
// distortXform.transform(srcPt2, srcPt);
int ii = ((int)srcPt.x) % sourceWidth;
if (ii < 0) ii += sourceWidth;
int jj = ((int)srcPt.y) % sourceHeight;
if (jj < 0) jj += sourceHeight;
buf.setRGB(i, j, source.getRGB(ii, jj));
}
}
return buf.getData();
}
public static void main(String[] argv)
{
int i = -4;
System.err.println("Hello " + (i % 4));
}
}