aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scalam/plotting/colorSchemes.scala
blob: 066457577639bfd91267a9b1dc76a610384e800d (plain) (blame)
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
package scalam.plotting

import scalam.DataSet
import scalam.m.ast._

trait Color {
  def expression: Expression
}
class RGB(r: Double, g: Double, b: Double) extends Color {
  def expression = ArrayLiteral(DoubleLiteral(r), DoubleLiteral(g), DoubleLiteral(b)) 
}

case object Red extends RGB(1, 0, 0)
case object Green extends RGB(0, 1, 0)
case object Blue extends RGB(0, 0, 1)
case object Magenta extends RGB(1, 0, 1)
case object Cyan extends RGB(0, 1, 1)
case object Yellow extends RGB(1, 1, 0)
case object Black extends RGB(0, 0, 0)


trait ColorScheme {self =>
  def apply(dataSets: Seq[DataSet]): Map[DataSet, Color]
}

class MColorScheme(val function: Identifier) extends ColorScheme {
  private val ColorVariable = Identifier("cc")
  
  def initial(dataSets: Seq[DataSet]) = Assign(ColorVariable, Function(function, IntLiteral(dataSets.length)))

  def apply(dataSets: Seq[DataSet]) = (for ((d, i) <- dataSets.zipWithIndex) yield d -> new Color {
    def expression = IndexMatrix(ColorVariable, IntLiteral(i + 1), SliceLiteral)
  }).toMap
  
}

case class Uniform(color: Color) extends ColorScheme {
  def apply(dataSets: Seq[DataSet]) = dataSets.map(_ -> color).toMap
}
object HSV extends MColorScheme(Identifier("hsv"))
object JET extends MColorScheme(Identifier("jet"))


/*
trait ColorScheme { self =>
  def color(dataSet: DataSet): Color
  
  def except(special: Map[DataSet, Color]) = new ColorScheme {
    private val exceptions: Map[DataSet, Color] = special 
    def color(dataSet: DataSet) = {
      exceptions.getOrElse(dataSet, self.color(dataSet))
    }
  }
}


trait ColorSchemeFactory[C <: ColorScheme] { self =>
  
  def apply(dataSets: Seq[DataSet]): C
  
  def except(special: Map[DataSet, Color]) = new ColorSchemeFactory[ColorScheme] {
    def apply(dataSets: Seq[DataSet]) = self.apply(dataSets) except special
  }
}

trait MColorScheme extends ColorScheme {
  protected val function: Identifier
  protected val dataSets: Seq[DataSet]
  private val indices: Map[DataSet, Int] = dataSets.zipWithIndex.toMap
  
  private val ColorVariable = Identifier("cc")
  
  def initial = Assign(ColorVariable, Call(function, IntLiteral(dataSets.length)))
  
  def color(dataSet: DataSet) = new Color{
    def expression = IndexMatrix(ColorVariable, IntLiteral(indices(dataSet) + 1), SliceLiteral) 
  }
}

class HSV(protected val dataSets: Seq[DataSet]) extends MColorScheme {val function = Identifier("hsv")}
object HSV extends ColorSchemeFactory[HSV] {def apply(dataSets: Seq[DataSet]) = new HSV(dataSets)}

class JET(protected val dataSets: Seq[DataSet]) extends MColorScheme {val function = Identifier("jet")}
object JET extends ColorSchemeFactory[JET] {def apply(dataSets: Seq[DataSet]) = new JET(dataSets)}

case class Uniform(color: Color) extends ColorScheme {
  def color(dataSet: DataSet) = color
}
*/