2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009-2011 - DIGITEO - Pierre Lando
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution. The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12 package org.scilab.forge.scirenderer.implementation.g2d.texture;
14 import org.scilab.forge.scirenderer.implementation.g2d.motor.G2DStroke;
15 import org.scilab.forge.scirenderer.implementation.g2d.texture.G2DTextureManager;
16 import org.scilab.forge.scirenderer.shapes.appearance.Appearance;
17 import org.scilab.forge.scirenderer.shapes.appearance.Color;
18 import org.scilab.forge.scirenderer.texture.Texture;
19 import org.scilab.forge.scirenderer.texture.TextureDrawer;
20 import org.scilab.forge.scirenderer.texture.TextureDrawingTools;
21 import org.scilab.forge.scirenderer.texture.TextEntity;
23 import javax.swing.Icon;
24 import javax.swing.JLabel;
25 import java.awt.Dimension;
26 import java.awt.Graphics2D;
27 import java.awt.RenderingHints;
28 import java.awt.font.TextLayout;
29 import java.awt.geom.Ellipse2D;
30 import java.awt.geom.Rectangle2D;
34 * Implementation of {@link TextureDrawingTools}.
35 * This implementation create a {@link TextureBufferedImage} an fill it with sprite drawing.
37 * @author Pierre Lando
39 public class G2DTextureDrawingTools implements TextureDrawingTools {
41 private Graphics2D g2d;
46 * Default constructor.
47 * @param width the image width.
48 * @param height the image height.
49 * @param useSquareTexture true if square texture is needed.
51 public G2DTextureDrawingTools(Graphics2D g2d) {
55 public void setGraphics(Graphics2D g2d) {
59 public void accept(Texture texture) {
60 G2DTextureManager.G2DTexture t = (G2DTextureManager.G2DTexture) texture;
61 TextureDrawer drawer = t.getDrawer();
62 Dimension d = drawer.getTextureSize();
63 this.width = (int) d.getWidth();
64 this.height = (int) d.getHeight();
65 accept(drawer, this.width, this.height);
69 * Ask this image to accept a sprite drawer.
70 * This image will contain the drawing of the given drawer.
71 * @param spriteDrawer the given sprite drawer.
73 public void accept(TextureDrawer textureDrawer, int width, int height) {
74 // Change center coordinate to (0, 0).
75 if (textureDrawer.getOriginPosition() == TextureDrawer.OriginPosition.CENTER) {
76 g2d.translate(width / 2.0, height / 2.0);
79 boolean aa = g2d.getRenderingHint(RenderingHints.KEY_ANTIALIASING) == RenderingHints.VALUE_ANTIALIAS_ON;
81 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
83 textureDrawer.draw(this);
86 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
91 public void drawPlus(int size, Appearance appearance) {
94 int[] coords1 = new int[] { -r, 0, r, 0};
95 int[] coords2 = new int[] {0, -r, 0, r};
97 drawPolyline(coords1, appearance);
98 drawPolyline(coords2, appearance);
100 fillDisc(0, 0, 1, appearance.getLineColor());
105 public void drawPolyline(int[] coordinates, Appearance appearance) {
106 if (coordinates.length == 2) {
110 int nbPoint = coordinates.length / 2;
112 int[] xCoordinates = new int[nbPoint];
113 int[] yCoordinates = new int[nbPoint];
116 for (int i = 0; i < coordinates.length; i += 2) {
117 xCoordinates[k] = coordinates[i];
118 yCoordinates[k] = coordinates[i + 1];
122 g2d.setColor(appearance.getLineColor());
123 g2d.setStroke(G2DStroke.getStroke(appearance, 0));
125 g2d.drawPolyline(xCoordinates, yCoordinates, nbPoint);
129 public void fillPolygon(int[] coordinates, Appearance appearance) {
130 int nbPoint = coordinates.length / 2;
132 int[] xCoordinates = new int[nbPoint];
133 int[] yCoordinates = new int[nbPoint];
136 for (int i = 0; i < coordinates.length; i += 2) {
137 xCoordinates[k] = coordinates[i];
138 yCoordinates[k] = coordinates[i + 1];
142 if (appearance.getFillColor().getAlphaAsFloat() != 0) {
143 g2d.setColor(appearance.getFillColor());
144 g2d.fillPolygon(xCoordinates, yCoordinates, nbPoint);
147 if (!appearance.getLineColor().equals(appearance.getFillColor())) {
148 int usedLength = coordinates.length - (coordinates.length % 2);
149 int[] borderCoordinate = new int[usedLength + 2];
150 System.arraycopy(coordinates, 0, borderCoordinate, 0, usedLength);
151 borderCoordinate[usedLength] = coordinates[0];
152 borderCoordinate[usedLength + 1] = coordinates[1];
154 drawPolyline(borderCoordinate, appearance);
159 public void drawCircle(int x, int y, int diameter, Appearance appearance) {
160 g2d.setColor(appearance.getLineColor());
161 g2d.setStroke(G2DStroke.getStroke(appearance, 0));
162 double r = ((double) diameter) / 2;
163 g2d.draw(new Ellipse2D.Double(x - r, y - r, diameter, diameter));
167 public void fillDisc(int x, int y, int diameter, Color color) {
168 if (color.getAlphaAsFloat() != 0) {
170 double r = ((double) diameter) / 2;
171 g2d.fill(new Ellipse2D.Double(x - r, y - r, diameter, diameter));
176 public void draw(TextEntity textEntity, int x, int y) {
177 if (textEntity != null && textEntity.isValid()) {
178 if (textEntity.isTextAntiAliased()) {
179 g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
181 g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
184 if (textEntity.isTextUseFractionalMetrics()) {
185 g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
187 g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
189 g2d.setColor(textEntity.getTextColor());
190 TextLayout textLayout = new TextLayout(textEntity.getText(), textEntity.getFont(), g2d.getFontRenderContext());
191 Rectangle2D bounds = textLayout.getBounds();
192 g2d.setFont(textEntity.getFont());
193 g2d.drawString(textEntity.getText(), (float) (x - bounds.getX()), (float) (y + textLayout.getAscent()));
198 public void draw(Icon icon, int x, int y) {
199 icon.paintIcon(new JLabel(), g2d, x, y);
203 public void clear(Color color) {
205 g2d.fillRect(0, 0, width, height);