source: trunk/lib/Colors.cc @ 941

Last change on this file since 941 was 941, checked in by Peter Johansson, 13 years ago

refs #419. Lifted some functions/code from Colors' privacy to be reachable also from Configuration class.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.1 KB
Line 
1// $Id: Colors.cc 941 2009-12-03 06:05:39Z peter $
2
3/*
4  Copyright (C) 2009 Jari Häkkinen
5
6  This file is part of svndigest, http://dev.thep.lu.se/svndigest
7
8  svndigest is free software; you can redistribute it and/or modify it
9  under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 3 of the License, or
11  (at your option) any later version.
12
13  svndigest is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with svndigest. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "Colors.h"
23
24#include "Configuration.h"
25
26#include <cstdlib>
27#include <ctype.h>
28
29namespace theplu {
30namespace svndigest {
31
32  Colors* Colors::instance_=NULL;
33
34
35  Colors::Colors(void)
36    : color_map_(13), next_color_(color_map_.begin())
37
38  {
39    color_map_[ 0].label="green";
40    color_map_[ 0].r=  0; color_map_[ 0].g=146; color_map_[ 0].b= 72;
41    color_map_[ 1].label="blue";
42    color_map_[ 1].r= 27; color_map_[ 1].g=117; color_map_[ 1].b=186;
43    color_map_[ 2].label="red";
44    color_map_[ 2].r=189; color_map_[ 2].g= 32; color_map_[ 2].b= 46;
45    color_map_[ 3].label="grey";
46    color_map_[ 3].r=131; color_map_[ 3].g=131; color_map_[ 3].b=131;
47    color_map_[ 4].label="orange";
48    color_map_[ 4].r=245; color_map_[ 4].g=145; color_map_[ 4].b= 32;
49    color_map_[ 5].label="brown";
50    color_map_[ 5].r=117; color_map_[ 5].g= 77; color_map_[ 5].b= 41;
51    color_map_[ 6].label="cyan";
52    color_map_[ 6].r= 40; color_map_[ 6].g=170; color_map_[ 6].b=225;
53    color_map_[ 7].label="lime";
54    color_map_[ 7].r=213; color_map_[ 7].g=221; color_map_[ 7].b= 38;
55    color_map_[ 8].label="purple";
56    color_map_[ 8].r=143; color_map_[ 8].g= 40; color_map_[ 8].b=140;
57    color_map_[ 9].label="lgrey";
58    color_map_[ 9].r=220; color_map_[ 9].g=220; color_map_[ 9].b=220;
59    color_map_[10].label="lbrown";
60    color_map_[10].r=194; color_map_[10].g=151; color_map_[10].b=106;
61    color_map_[11].label="pink";
62    color_map_[11].r=230; color_map_[11].g=125; color_map_[11].b=230;
63    color_map_[12].label="black";
64    color_map_[12].r=  0; color_map_[12].g=  0; color_map_[12].b=  0;
65
66    typedef std::map<std::string, std::string> ACmap;
67    const ACmap& authcols=Configuration::instance().author_colors();
68    // reserve sufficient size in vector here to avoid reallocation
69    // and iterators being invalidated
70    color_map_.reserve(color_map_.size()+authcols.size());
71    next_color_=color_map_.begin();
72    for (ACmap::const_iterator i=authcols.begin(); i!=authcols.end(); i++) {
73      color c;
74      c.label=i->first;
75      str2rgb(i->second, c.r, c.g, c.b);
76      next_color_=color_map_.insert(next_color_,c);
77      author_map_.insert(std::make_pair(c.label, next_color_++));
78    }
79  }
80
81
82  void Colors::get_color(const std::string& label, unsigned char& r,
83                           unsigned char& g, unsigned char& b)
84  {
85    std::map<std::string,std::vector<color>::iterator>::iterator i;
86    i = author_map_.lower_bound(label);
87    if (i==author_map_.end() || i->first != label) {
88      // no color defined for label, set color for label
89      i = author_map_.insert(i, std::make_pair(label, next_color_++));
90      if (next_color_==color_map_.end())
91        // end of color map reach, start over
92        next_color_=color_map_.begin();
93    }
94    r = i->second->r;
95    g = i->second->g;
96    b = i->second->b;
97  }
98
99
100  Colors& Colors::instance(void)
101  {
102    if (!instance_)
103      instance_ = new Colors;
104    return *instance_;
105  }
106
107
108  int to_decimal(int hex)
109  {
110    hex=toupper(hex);
111    if (hex>47 && hex<58) // 0--9
112      return hex-48;
113    if (hex>64 && hex<71) // A--F
114      return hex-55;
115    return -1;
116  }
117
118  void str2rgb(const std::string& str, unsigned char& r, unsigned char& g,
119               unsigned char& b)
120  {
121    if (str.size()==6) {
122      r = 16*to_decimal(str[0]) + to_decimal(str[1]);
123      g = 16*to_decimal(str[2]) + to_decimal(str[3]);
124      b = 16*to_decimal(str[4]) + to_decimal(str[5]);
125    }
126    else if (str.size()==3) {
127      r = 17*to_decimal(str[0]);
128      g = 17*to_decimal(str[1]);
129      b = 17*to_decimal(str[2]);
130    }
131    else 
132      throw std::runtime_error("invalid color format: " + str);
133  }
134
135
136}} // end of namespace svndigest and namespace theplu
Note: See TracBrowser for help on using the repository browser.