1 /*
2  * Copyright (c) 2016 Helmut Neemann
3  * Use of this source code is governed by the GPL v3 license
4  * that can be found in the LICENSE file.
5  */
6 package de.neemann.digital.draw.shapes;
7 
8 import de.neemann.digital.core.element.ElementAttributes;
9 import de.neemann.digital.core.element.Keys;
10 import de.neemann.digital.draw.graphics.*;
11 
12 /**
13  * The shape to show a seven seg display.
14  * The state of the different segments is requested by calling {@link SevenShape#getStyle(int)}.
15  */
16 public abstract class SevenShape implements Shape {
17 
18     static final int HEIGHT = 7;
19 
20     /**
21      * the Frame of the display
22      */
23     public static final Polygon FRAME = Polygon.createFromPath("m -10,1 L 70,1 70,139 -10,139 z");
24     private static final Polygon[] POLYGONS = new Polygon[]{
25             Polygon.createFromPath("m 12.04,5.0 L 52.8,5.0 58.15,10.61 52.28,16.22 11.52,16.22 6.17,10.61 z"), // 0,
26             Polygon.createFromPath("m 59.49,12.01 L 64.84,17.62 62.74,62.99 56.87,68.6 51.52,62.99 53.62,17.62 z"), // 1,
27             Polygon.createFromPath("m 56.74,71.4 L 62.09,77.01 60.0,122.38 54.13,127.99 48.78,122.38 50.88,77.01 z"), // 2,
28             Polygon.createFromPath("m 6.55,123.78 L 47.32,123.78 52.67,129.39 46.8,135.0 6.04,135.0 0.69,129.39 z"), // 3,
29             Polygon.createFromPath("m 1.96,71.4 L 7.31,77.01 5.22,122.38 -0.64,127.99 -5.99,122.38 -3.9,77.01 z"), // 4,
30             Polygon.createFromPath("m 4.7,12.01 L 10.05,17.62 7.96,62.99 2.09,68.6 -3.25,62.99 -1.15,17.62 z"), // 5,
31             Polygon.createFromPath("m 9.3,64.39 L 50.06,64.39 55.41,70.0 49.54,75.61 8.78,75.61 3.43,70.0 z"), // 6,
32     };
33     private static final Vector DOT = new Vector(58, 127);
34 
35     private final Style onStyle;
36     private final Style offStyle;
37     private final int size;
38 
39     /**
40      * Creates a new instance
41      *
42      * @param attr the attributes
43      */
SevenShape(ElementAttributes attr)44     public SevenShape(ElementAttributes attr) {
45         onStyle = Style.NORMAL.deriveFillStyle(attr.get(Keys.COLOR));
46         offStyle = Style.NORMAL.deriveFillStyle(ColorKey.GRID);
47         size = attr.get(Keys.SEVEN_SEG_SIZE);
48     }
49 
50     @Override
drawTo(Graphic graphic, Style highLight)51     public void drawTo(Graphic graphic, Style highLight) {
52         Transform tr = createTransform(size);
53         graphic.drawPolygon(FRAME.transform(tr), Style.NORMAL);
54         for (int i = 0; i < 7; i++)
55             graphic.drawPolygon(POLYGONS[i].transform(tr), getStyleInt(i));
56 
57         graphic.drawCircle(DOT.transform(tr), DOT.add(8, 8).transform(tr), getStyleInt(7));
58     }
59 
createTransform(int size)60     static Transform createTransform(int size) {
61         if (size == 2)
62             return Transform.IDENTITY;
63         else {
64             final TransformTranslate tr1 = new TransformTranslate(-70, -139);
65             final TransformTranslate tr2 = new TransformTranslate(70, 139);
66             float s = (2 + size) / 4f;
67             final TransformMatrix trm = new TransformMatrix(s, 0, 0, s, 0, 0);
68             return Transform.mul(tr1, Transform.mul(trm, tr2));
69         }
70     }
71 
getStyleInt(int i)72     private Style getStyleInt(int i) {
73         if (getStyle(i))
74             return onStyle;
75         else
76             return offStyle;
77     }
78 
79     /**
80      * Returns the state of the segment
81      *
82      * @param i the segments number
83      * @return true if activated
84      */
getStyle(int i)85     protected abstract boolean getStyle(int i);
86 
87 }
88