2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009-2010 - 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.modules.renderer.JoGLView.mark;
14 import org.scilab.forge.scirenderer.shapes.appearance.Appearance;
15 import org.scilab.forge.scirenderer.shapes.appearance.Color;
16 import org.scilab.forge.scirenderer.texture.Texture;
17 import org.scilab.forge.scirenderer.texture.TextureDrawer;
18 import org.scilab.forge.scirenderer.texture.TextureDrawingTools;
19 import org.scilab.forge.scirenderer.texture.TextureManager;
20 import org.scilab.modules.graphic_objects.contouredObject.Mark;
21 import org.scilab.modules.graphic_objects.figure.ColorMap;
22 import org.scilab.modules.renderer.JoGLView.util.ColorFactory;
24 import java.awt.Dimension;
27 * @author Pierre Lando
29 public class MarkSpriteFactory {
32 * Return a mark sprite corresponding to the given scilab mark.
35 * @param spriteManager the current sprite manager.
36 * @param mark the scilab mark.
37 * @param colorMap the scilab color map.
38 * @return a mark sprite corresponding to the given scilab mark.
40 public static Texture getMarkSprite(TextureManager spriteManager, Mark mark, Integer selectedColor, ColorMap colorMap, Appearance appearance) {
44 * Compute the sprite pixel size.
46 if (mark.getMarkSizeUnit() == Mark.MarkSizeUnitType.TABULATED) {
47 // Special case for compatibility with older versions
48 // dot mark with tabulated size of 0 is a single pixel
49 // drawn in pixel size instead of tabulated size
50 if (mark.getStyle() == 0 && mark.getSize() == 0) {
53 finalSize = (8 + 2 * mark.getSize());
56 finalSize = mark.getSize();
59 Texture sprite = spriteManager.createTexture();
60 sprite.setDrawer(getSpriteDrawer(mark, selectedColor, finalSize, colorMap, appearance));
66 * Return the sprite drawer corresponding to the given mark.
67 * @param mark the mark to draw.
68 * @param finalSize the final mark size.
69 * @param colorMap the scilab colormap to use.
70 * @return the sprite drawer corresponding to the given mark.
72 private static TextureDrawer getSpriteDrawer(Mark mark, Integer selectedColor, int finalSize, ColorMap colorMap, Appearance usedAppearance) {
73 final Appearance appearance = new Appearance();
74 Integer markColor = selectedColor == null ? mark.getForeground() : selectedColor;
75 Color backgroundColor;
76 Color foregroundColor;
78 if (colorMap != null) {
79 backgroundColor = ColorFactory.createColor(colorMap, mark.getBackground());
80 foregroundColor = ColorFactory.createColor(colorMap, markColor);
82 backgroundColor = new Color(1f, 1f, 1f, 1f);
83 foregroundColor = new Color(0f, 0f, 0f, 1f);
86 if (mark.getBackground() != 0) {
87 appearance.setFillColor(backgroundColor);
89 appearance.setFillColor(new Color(0.0f, 0.0f, 0.0f, 0.0f));
91 appearance.setLineColor(foregroundColor);
92 if (usedAppearance != null) {
93 appearance.setLineWidth(usedAppearance.getLineWidth());
97 // when finalSize is 0 then a dot is drawn so we draw a dot with a PlusSpriteDrawer
98 // which is well exported with size equal to 1 (see bug 13551)
102 if (finalSize != 1) {
103 switch (mark.getStyle()) {
105 if (colorMap == null) {
106 return new DotSpriteDrawer(backgroundColor, finalSize);
108 return new DotSpriteDrawer(foregroundColor, finalSize);
111 return new PlusSpriteDrawer(appearance, finalSize);
113 return new CrossSpriteDrawer(appearance, finalSize);
115 return new StarSpriteDrawer(appearance, finalSize);
117 if (colorMap == null) {
118 return new FilledDiamondSpriteDrawer(backgroundColor, finalSize);
120 return new FilledDiamondSpriteDrawer(foregroundColor, finalSize);
123 return new DiamondSpriteDrawer(appearance, finalSize);
125 return new TriangleUpSpriteDrawer(appearance, finalSize);
127 return new TriangleDownSpriteDrawer(appearance, finalSize);
129 return new DiamondPlusSpriteDrawer(appearance, finalSize);
131 return new CircleSpriteDrawer(appearance, finalSize);
133 return new AsteriskSpriteDrawer(appearance, finalSize);
135 return new SquareSpriteDrawer(appearance, finalSize);
137 return new TriangleRightSpriteDrawer(appearance, finalSize);
139 return new TriangleLeftSpriteDrawer(appearance, finalSize);
141 return new PentagramSpriteDrawer(appearance, finalSize);
144 return new PlusSpriteDrawer(appearance, finalSize);
147 return new PlusSpriteDrawer(appearance, finalSize);
152 * Abstract class for all scilab mark sprites.
154 private static abstract class ScilabSpriteDrawer implements TextureDrawer {
155 protected final Appearance appearance;
156 protected final int size;
158 public ScilabSpriteDrawer(Appearance appearance, int size) {
159 this.appearance = appearance;
164 public OriginPosition getOriginPosition() {
165 return TextureDrawer.OriginPosition.CENTER;
169 public Dimension getTextureSize() {
171 /** Add a margin such that (0, 0) was pixel aligned. */
178 return new Dimension(size + margin, size + margin);
186 private static class DotSpriteDrawer extends ScilabSpriteDrawer {
187 private final Color color;
189 public DotSpriteDrawer(Color color, int size) {
195 public void draw(TextureDrawingTools textureDrawingTools) {
196 textureDrawingTools.fillDisc(0, 0, size, color);
204 private static class PlusSpriteDrawer extends ScilabSpriteDrawer {
206 public PlusSpriteDrawer(Appearance appearance, int size) {
207 super(appearance, size);
211 public void draw(TextureDrawingTools textureDrawingTools) {
212 textureDrawingTools.drawPlus(size, appearance);
220 private static class CrossSpriteDrawer extends ScilabSpriteDrawer {
221 private final int[] coordinate1;
222 private final int[] coordinate2;
224 public CrossSpriteDrawer(Appearance appearance, int size) {
225 super(appearance, size);
226 int r = (int) (size * Math.sqrt(2.0) / 2.0);
227 coordinate1 = new int[] { -r, -r, r, r};
228 coordinate2 = new int[] { -r, r, r, -r};
232 public void draw(TextureDrawingTools textureDrawingTools) {
233 textureDrawingTools.drawPolyline(coordinate1, appearance);
234 textureDrawingTools.drawPolyline(coordinate2, appearance);
242 private static class StarSpriteDrawer extends ScilabSpriteDrawer {
243 private final int[] coordinate1;
244 private final int[] coordinate2;
246 public StarSpriteDrawer(Appearance appearance, int size) {
247 super(appearance, size);
249 coordinate1 = new int[] { -r, 0, r, 0};
250 coordinate2 = new int[] { 0, -r, 0, r};
254 public void draw(TextureDrawingTools textureDrawingTools) {
255 textureDrawingTools.fillDisc(0, 0, size, appearance.getFillColor());
256 textureDrawingTools.drawCircle(0, 0, size, appearance);
257 textureDrawingTools.drawPolyline(coordinate1, appearance);
258 textureDrawingTools.drawPolyline(coordinate2, appearance);
263 * Filled diamond sprite
266 private static class FilledDiamondSpriteDrawer extends ScilabSpriteDrawer {
267 private final Appearance appearance;
268 private final int[] coordinates;
270 public FilledDiamondSpriteDrawer(Color color, int size) {
274 appearance = new Appearance();
275 appearance.setFillColor(color);
276 appearance.setLineColor(color);
278 coordinates = new int[] { -r, 0, 0, -r, +r, 0, 0, +r};
282 public void draw(TextureDrawingTools textureDrawingTools) {
283 textureDrawingTools.fillPolygon(coordinates, appearance);
288 * Abstract class for all the triangle mark sprites.
290 private static abstract class TriangleSpriteDrawer extends ScilabSpriteDrawer {
291 protected final int r;
292 protected final int basex;
293 protected final int basey;
294 protected int[] coordinates;
296 public TriangleSpriteDrawer(Appearance appearance, int size) {
297 super(appearance, size);
298 double tmpr = (double)(size / 2);
302 basex = (int) (tmpr * 0.5 * Math.sqrt(3));
303 basey = (int) (tmpr * 0.5);
307 public void draw(TextureDrawingTools textureDrawingTools) {
308 textureDrawingTools.fillPolygon(coordinates, appearance);
316 private static class DiamondSpriteDrawer extends ScilabSpriteDrawer {
317 protected final int[] coordinates;
319 public DiamondSpriteDrawer(Appearance appearance, int size) {
320 super(appearance, size);
323 coordinates = new int[] { -r, 0, 0, -r, r, 0, 0, r};
327 public void draw(TextureDrawingTools textureDrawingTools) {
328 textureDrawingTools.fillPolygon(coordinates, appearance);
336 private static class TriangleUpSpriteDrawer extends TriangleSpriteDrawer {
337 public TriangleUpSpriteDrawer(Appearance appearance, int size) {
338 super(appearance, size);
340 coordinates = new int[] { -basex, basey, 0, -r, basex, basey};
345 * Triangle down sprite
348 private static class TriangleDownSpriteDrawer extends TriangleSpriteDrawer {
349 public TriangleDownSpriteDrawer(Appearance appearance, int size) {
350 super(appearance, size);
352 coordinates = new int[] { -basex, -basey, basex, -basey, 0, r};
357 * Diamond plus sprite
360 private static class DiamondPlusSpriteDrawer extends DiamondSpriteDrawer {
361 private final int[] coordinate1;
362 private final int[] coordinate2;
364 public DiamondPlusSpriteDrawer(Appearance appearance, int size) {
365 super(appearance, size);
366 coordinate1 = new int[] {coordinates[0], coordinates[1], coordinates[4], coordinates[5]};
367 coordinate2 = new int[] {coordinates[2], coordinates[3], coordinates[6], coordinates[7]};
371 public void draw(TextureDrawingTools textureDrawingTools) {
372 super.draw(textureDrawingTools);
373 textureDrawingTools.drawPolyline(coordinate1, appearance);
374 textureDrawingTools.drawPolyline(coordinate2, appearance);
382 private static class CircleSpriteDrawer extends ScilabSpriteDrawer {
384 public CircleSpriteDrawer(Appearance appearance, int size) {
385 super(appearance, size);
389 public void draw(TextureDrawingTools textureDrawingTools) {
390 textureDrawingTools.fillDisc(0, 0, size, appearance.getFillColor());
391 textureDrawingTools.drawCircle(0, 0, size, appearance);
399 private static class AsteriskSpriteDrawer extends ScilabSpriteDrawer {
400 private final int[] coordinate1;
401 private final int[] coordinate2;
402 private final int[] coordinate3;
403 private final int[] coordinate4;
405 public AsteriskSpriteDrawer(Appearance appearance, int size) {
406 super(appearance, size);
408 coordinate1 = new int[] { -r, 0, r, 0};
409 coordinate2 = new int[] { 0, -r, 0, r};
410 r = (int) (r * Math.sqrt(2.0) / 2.0);
411 coordinate3 = new int[] { -r, -r, r, r};
412 coordinate4 = new int[] { -r, r, +r, -r};
416 public void draw(TextureDrawingTools textureDrawingTools) {
417 textureDrawingTools.drawPolyline(coordinate1, appearance);
418 textureDrawingTools.drawPolyline(coordinate2, appearance);
419 textureDrawingTools.drawPolyline(coordinate3, appearance);
420 textureDrawingTools.drawPolyline(coordinate4, appearance);
428 private static class SquareSpriteDrawer extends ScilabSpriteDrawer {
429 private final int[] coordinate;
431 public SquareSpriteDrawer(Appearance appearance, int size) {
432 super(appearance, size);
434 coordinate = new int[] { -r, -r, +r, -r, +r, +r, -r, +r};
438 public void draw(TextureDrawingTools textureDrawingTools) {
439 textureDrawingTools.fillPolygon(coordinate, appearance);
444 * Triangle right sprite
447 private static class TriangleRightSpriteDrawer extends TriangleSpriteDrawer {
448 public TriangleRightSpriteDrawer(Appearance appearance, int size) {
449 super(appearance, size);
451 coordinates = new int[] { -basey, basex, -basey, -basex, r, 0};
456 * Triangle left sprite
459 private static class TriangleLeftSpriteDrawer extends TriangleSpriteDrawer {
460 public TriangleLeftSpriteDrawer(Appearance appearance, int size) {
461 super(appearance, size);
463 coordinates = new int[] {basey, basex, -r, 0, basey, -basex};
468 * Pentagram sprite (five-pointed star)
471 private static class PentagramSpriteDrawer extends ScilabSpriteDrawer {
472 private final int[] coordinates;
474 private static final double COS_PI_OVER_10 = Math.cos(Math.PI / 10.0);
475 private static final double SIN_PI_OVER_10 = Math.sin(Math.PI / 10.0);
476 private static final double COS_3_PI_OVER_10 = Math.cos(3.0 * Math.PI / 10.0);
477 private static final double SIN_3_PI_OVER_10 = Math.sin(3.0 * Math.PI / 10.0);
479 public PentagramSpriteDrawer(Appearance appearance, int size) {
480 super(appearance, size);
484 double tmpy = SIN_PI_OVER_10 * (double)r;
486 int x = (int)(COS_PI_OVER_10 * (double)r);
487 int y = (int)(SIN_PI_OVER_10 * (double)r);
489 int x2 = (int)(COS_3_PI_OVER_10 * (double)r);
490 int y2 = (int)(SIN_3_PI_OVER_10 * (double)r);
492 double tmpinnr = tmpy / SIN_3_PI_OVER_10;
495 int xinn = (int)(tmpinnr * COS_3_PI_OVER_10);
498 int xinn2 = (int)(tmpinnr * COS_PI_OVER_10);
499 int yinn2 = (int)(tmpinnr * SIN_PI_OVER_10);
501 int innr = (int)tmpinnr;
503 coordinates = new int[] { -x2, y2, -xinn2, yinn2, -x, -y, -xinn, -yinn, 0, -r, xinn, -yinn, x, -y, xinn2, yinn2, x2, y2, 0, innr};
507 public void draw(TextureDrawingTools textureDrawingTools) {
508 textureDrawingTools.fillPolygon(coordinates, appearance);