summaryrefslogtreecommitdiffstats
path: root/src/types/SVGNumber.js
blob: 25c87c19d24c5beb942a5681661646c0453c57f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { numberAndUnit } from '../modules/core/regex.js'

// Module for unit conversions
export default class SVGNumber {
  // Initialize
  constructor (...args) {
    this.init(...args)
  }

  convert (unit) {
    return new SVGNumber(this.value, unit)
  }

  // Divide number
  divide (number) {
    number = new SVGNumber(number)
    return new SVGNumber(this / number, this.unit || number.unit)
  }

  init (value, unit) {
    unit = Array.isArray(value) ? value[1] : unit
    value = Array.isArray(value) ? value[0] : value

    // initialize defaults
    this.value = 0
    this.unit = unit || ''

    // parse value
    if (typeof value === 'number') {
      // ensure a valid numeric value
      this.value = isNaN(value) ? 0 : !isFinite(value) ? (value < 0 ? -3.4e+38 : +3.4e+38) : value
    } else if (typeof value === 'string') {
      unit = value.match(numberAndUnit)

      if (unit) {
        // make value numeric
        this.value = parseFloat(unit[1])

        // normalize
        if (unit[5] === '%') {
          this.value /= 100
        } else if (unit[5] === 's') {
          this.value *= 1000
        }

        // store unit
        this.unit = unit[5]
      }
    } else {
      if (value instanceof SVGNumber) {
        this.value = value.valueOf()
        this.unit = value.unit
      }
    }

    return this
  }

  // Subtract number
  minus (number) {
    number = new SVGNumber(number)
    return new SVGNumber(this - number, this.unit || number.unit)
  }

  // Add number
  plus (number) {
    number = new SVGNumber(number)
    return new SVGNumber(this + number, this.unit || number.unit)
  }

  // Multiply number
  times (number) {
    number = new SVGNumber(number)
    return new SVGNumber(this * number, this.unit || number.unit)
  }

  toArray () {
    return [ this.value, this.unit ]
  }

  toJSON () {
    return this.toString()
  }

  toString () {
    return (this.unit === '%'
      ? ~~(this.value * 1e8) / 1e6
      : this.unit === 's'
        ? this.value / 1e3
        : this.value
    ) + this.unit
  }

  valueOf () {
    return this.value
  }

}
="w"> DASHARRAY = "dashArray"; private static final String TRANSFORM = "transform"; private static final String FONTSIZE = "fontSize"; private static final String FONTNAME = "fontName"; private static final String CLIP = "clip"; private static final String GSTATE = "gstate"; private Color color = Color.black; private Color backcolor = Color.white; private Paint paint = null; private Paint backPaint = null; private int lineCap = 0; private int lineJoin = 0; private float lineWidth = 1; private float miterLimit = 0; private boolean text = false; private int dashOffset = 0; private int[] dashArray = new int[0]; private AffineTransform transform = new AffineTransform(); private float fontSize = 0; private String fontName = ""; private Shape clip = null; private PDFGState gstate = null; ArrayList stateStack = new ArrayList(); public PDFState() { } // this call should be used when the q operator is used // so that the state is known when popped public void push() { HashMap saveMap = new HashMap(); saveMap.put(COLOR, color); saveMap.put(BACKCOLOR, backcolor); saveMap.put(PAINT, paint); saveMap.put(BACKPAINT, backPaint); saveMap.put(LINECAP, new Integer(lineCap)); saveMap.put(LINEJOIN, new Integer(lineJoin)); saveMap.put(LINEWIDTH, new Float(lineWidth)); saveMap.put(MITERLIMIT, new Float(miterLimit)); saveMap.put(TEXT, new Boolean(text)); saveMap.put(DASHOFFSET, new Integer(dashOffset)); saveMap.put(DASHARRAY, dashArray); saveMap.put(TRANSFORM, transform); saveMap.put(FONTSIZE, new Float(fontSize)); saveMap.put(FONTNAME, fontName); saveMap.put(CLIP, clip); saveMap.put(GSTATE, gstate); stateStack.add(saveMap); transform = new AffineTransform(); } public void pop() { if (getStackLevel() > 0) { HashMap saveMap = (HashMap)stateStack.get(stateStack.size() - 1); stateStack.remove(stateStack.size() - 1); color = (Color)saveMap.get(COLOR); backcolor = (Color)saveMap.get(BACKCOLOR); paint = (Paint)saveMap.get(PAINT); backPaint = (Paint)saveMap.get(BACKPAINT); lineCap = ((Integer)saveMap.get(LINECAP)).intValue(); lineJoin = ((Integer)saveMap.get(LINEJOIN)).intValue(); lineWidth = ((Float)saveMap.get(LINEWIDTH)).floatValue(); miterLimit = ((Float)saveMap.get(MITERLIMIT)).floatValue(); text = ((Boolean)saveMap.get(TEXT)).booleanValue(); dashOffset = ((Integer)saveMap.get(DASHOFFSET)).intValue(); dashArray = (int[])saveMap.get(DASHARRAY); transform = (AffineTransform)saveMap.get(TRANSFORM); fontSize = ((Float)saveMap.get(FONTSIZE)).floatValue(); fontName = (String)saveMap.get(FONTNAME); clip = (Shape)saveMap.get(CLIP); gstate = (PDFGState)saveMap.get(GSTATE); } } public int getStackLevel() { return stateStack.size(); } public void restoreLevel(int stack) { int pos = stack; while(stateStack.size() > pos + 1) { stateStack.remove(stateStack.size() - 1); } if (stateStack.size() > pos) { pop(); } } public boolean setLineDash(int[] array, int offset) { return false; } public boolean setColor(Color col) { if (!col.equals(color)) { color = col; return true; } return false; } public boolean setBackColor(Color col) { if (!col.equals(backcolor)) { backcolor = col; return true; } return false; } public boolean setPaint(Paint p) { if (paint == null) { if (p != null) { paint = p; return true; } } else if (!paint.equals(p)) { paint = p; return true; } return false; } /** * For clips it can start a new state */ public boolean checkClip(Shape cl) { if (clip == null) { if (cl != null) { return true; } } else if (!new Area(clip).equals(new Area(cl))) { return true; } return false; } public void setClip(Shape cl) { if (clip != null) { Area newClip = new Area(clip); newClip.intersect(new Area(cl)); clip = new GeneralPath(newClip); } else { clip = cl; } } public boolean checkTransform(AffineTransform tf) { return !tf.equals(transform); } /** * Set a new transform. * This transform is appended to the transform of * the current graphic state. */ public void setTransform(AffineTransform tf) { transform.concatenate(tf); } /** * Get the current transform. * This gets the combination of all transforms in the * current state. */ public AffineTransform getTransform() { AffineTransform tf; AffineTransform at = new AffineTransform(); for (Iterator iter = stateStack.iterator(); iter.hasNext();) { HashMap map = (HashMap)iter.next(); tf = (AffineTransform)map.get(TRANSFORM); at.concatenate(tf); } at.concatenate(transform); return at; } /** * Get the grapics state. * This gets the combination of all graphic states for * the current context. * This is the graphic state set with the gs operator not * the other graphic state changes. */ public PDFGState getGState() { PDFGState defaultState = PDFGState.DEFAULT; PDFGState state; PDFGState newstate = new PDFGState(0); newstate.addValues(defaultState); for (Iterator iter = stateStack.iterator(); iter.hasNext(); ) { HashMap map = (HashMap)iter.next(); state = (PDFGState)map.get(GSTATE); if (state != null) { newstate.addValues(state); } } if (gstate != null) { newstate.addValues(gstate); } return newstate; } }