aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scalam/plotting/colorSchemes.scala
blob: 270e77589b62f86687abff954f526a70a83f5d4c (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
package scalam.plotting

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

trait Color {
  def mColor: Expression
}
class RGB(r: Double, g: Double, b: Double) extends Color {
  def mColor = ArrayLiteral(DoubleLiteral(r), DoubleLiteral(g), DoubleLiteral(b)) 
}
case object Green extends RGB(0, 1, 0)
case object Red extends RGB(1, 0, 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 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 mColor = 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
}