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