ColorGenerator.java
001 /*
002  *  ColorGenerator.java
003  *
004  *  Copyright (c) 1995-2010, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Valentin Tablan, 11/07/2000
013  *
014  *  $Id: ColorGenerator.java 12006 2009-12-01 17:24:28Z thomas_heitz $
015  */
016 package gate.swing;
017 
018 import java.awt.Color;
019 import java.util.LinkedList;
020 
021 /**
022  * This class is used to generate random colours that are evenly distributed in
023  * the colours space.
024  *
025  */
026 public class ColorGenerator {
027 
028   /** Debug flag
029    */
030   private static final boolean DEBUG = false;
031 
032   /**
033    * Creates a new ColorGenerator
034    *
035    */
036   public ColorGenerator() {
037     for(int i = 0; i < 8; i++)availableSpacesList[inew LinkedList();
038     ColorSpace usedCS = new ColorSpace(0,0,0,255);
039     availableSpacesList[0].addLast(new ColorSpace(usedCS.baseR +
040                                                usedCS.radius/2,
041                                                usedCS.baseG,
042                                                usedCS.baseB,
043                                                usedCS.radius/2));
044     availableSpacesList[1].addLast(new ColorSpace(usedCS.baseR,
045                                                usedCS.baseG + usedCS.radius/2,
046                                                usedCS.baseB,
047                                                usedCS.radius/2));
048     availableSpacesList[2].addLast(new ColorSpace(usedCS.baseR +
049                                                usedCS.radius/2,
050                                                usedCS.baseG + usedCS.radius/2,
051                                                usedCS.baseB,
052                                                usedCS.radius/2));
053 
054     availableSpacesList[3].addLast(new ColorSpace(usedCS.baseR,
055                                                usedCS.baseG,
056                                                usedCS.baseB + usedCS.radius/2,
057                                                usedCS.radius/2));
058     availableSpacesList[4].addLast(new ColorSpace(usedCS.baseR +
059                                                usedCS.radius/2,
060                                                usedCS.baseG,
061                                                usedCS.baseB + usedCS.radius/2,
062                                                usedCS.radius/2));
063     availableSpacesList[5].addLast(new ColorSpace(usedCS.baseR,
064                                                usedCS.baseG + usedCS.radius/2,
065                                                usedCS.baseB + usedCS.radius/2,
066                                                usedCS.radius/2));
067   /*
068     availableSpacesList[6].addLast(new ColorSpace(usedCS.baseR +
069                                                usedCS.radius/2,
070                                                usedCS.baseG + usedCS.radius/2,
071                                                usedCS.baseB + usedCS.radius/2,
072                                                usedCS.radius/2));
073 
074   */
075   //    Color foo = getNextColor();
076   }
077 
078   /**
079    * Gets the next random colour
080    *
081    */
082   public Color getNextColor(){
083     ColorSpace usedCS;
084     listToRead = listToRead % 8;
085 
086     if(availableSpacesList[listToRead].isEmpty()){
087       usedCS = (ColorSpace)usedSpacesList.removeFirst();
088       availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
089                                                  usedCS.baseG,
090                                                  usedCS.baseB,
091                                                  usedCS.radius/2));
092       availableSpacesList[listToRead].addLast(new ColorSpace(
093                                                  usedCS.baseR + usedCS.radius/2,
094                                                  usedCS.baseG,
095                                                  usedCS.baseB,
096                                                  usedCS.radius/2));
097       availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
098                                                  usedCS.baseG + usedCS.radius/2,
099                                                  usedCS.baseB,
100                                                  usedCS.radius/2));
101       availableSpacesList[listToRead].addLast(new ColorSpace(
102                                                  usedCS.baseR + usedCS.radius/2,
103                                                  usedCS.baseG + usedCS.radius/2,
104                                                  usedCS.baseB,
105                                                  usedCS.radius/2));
106 
107       availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
108                                                  usedCS.baseG,
109                                                  usedCS.baseB + usedCS.radius/2,
110                                                  usedCS.radius/2));
111       availableSpacesList[listToRead].addLast(new ColorSpace(
112                                                  usedCS.baseR + usedCS.radius/2,
113                                                  usedCS.baseG,
114                                                  usedCS.baseB + usedCS.radius/2,
115                                                  usedCS.radius/2));
116       availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
117                                                  usedCS.baseG + usedCS.radius/2,
118                                                  usedCS.baseB + usedCS.radius/2,
119                                                  usedCS.radius/2));
120       availableSpacesList[listToRead].addLast(new ColorSpace(
121                                                  usedCS.baseR + usedCS.radius/2,
122                                                  usedCS.baseG + usedCS.radius/2,
123                                                  usedCS.baseB + usedCS.radius/2,
124                                                  usedCS.radius/2));
125 
126     }
127     usedCS = (ColorSpace)availableSpacesList[listToRead].removeFirst();
128     Color res = new Color(usedCS.baseR + usedCS.radius/2,
129                           usedCS.baseG + usedCS.radius/2,
130                           usedCS.baseB + usedCS.radius/2);
131     usedSpacesList.addLast(usedCS);
132     listToRead++;
133     res = res.brighter();
134     return res;
135   }
136 
137   /**
138    * Represents a colur space. A colour space is a cube in a tridimiensional
139    * space (where the axes represent red/green/blue values) defined by a point
140    * and a radius(the length of the edge).
141    */
142   class ColorSpace{
143     /**
144      * Creates a new ColorSpace
145      *
146      @param r
147      @param g
148      @param b
149      @param radius
150      */
151     ColorSpace(int r, int g, int b, int radius){
152       baseR = r;
153       baseG = g;
154       baseB = b;
155       this.radius = radius;
156     }
157 
158     /**      *
159      */
160     int baseR, baseG, baseB;
161     /**      */
162     int radius;
163   }
164 
165   /**    */
166   LinkedList[] availableSpacesList = new LinkedList[8];
167 
168   /**    */
169   LinkedList usedSpacesList = new LinkedList();
170 
171   /**    */
172   int listToRead = 0;
173 
174 // ColorGenerator