File: t_hue.cpp

package info (click to toggle)
glhack 1.2-8.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 26,744 kB
  • sloc: ansic: 208,571; cpp: 13,139; yacc: 2,005; makefile: 1,152; lex: 377; sh: 121; awk: 89; sed: 11
file content (104 lines) | stat: -rw-r--r-- 2,305 bytes parent folder | download | duplicates (7)
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
99
100
101
102
103
104
//------------------------------------------------------------------------
//  HUE handling
//------------------------------------------------------------------------
//
//  EdTile (C) 2001-2002 Andrew Apted
//
//  This program is free software; you can redistribute it and/or
//  modify it under the terms of the GNU General Public License
//  as published by the Free Software Foundation; either version 2
//  of the License, or (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//------------------------------------------------------------------------

using namespace std;

#include "z_config.h"
#include "z_rgb.h"
#include "z_hsv.h"

#include "t_hue.h"
#include "t_colmap.h"
#include "t_tiles.h"


struct HueTuple
{
  Hue_t h;
  Pix_t pix;

  int hsv_val;
};


HueSet::HueSet(const ColorMapping *colmap) :
    cmap(colmap), num_pix(0), num_grp(0)
{
  HueTuple *hue_map = new HueTuple [cmap->num_cols];
  Pix_t i;

  /* Step 1. Sort colors based on hue.
   */
  for (i=0; i < cmap->num_cols; i++)
  {
///!!!    HsvCol hsv(cmap->c_array[i]);

///!!!    hue_map[i].h = cmap->LookupHue(i);
///!!!    hue_map[i].pix = i;
///!!!    hue_map[i].hsv_val = hsv.v;
  } 

  qsort(hue_map, cmap->num_cols, sizeof(HueTuple), & HueTupleComparer);

  i=0;

  /* Step 2. Pack colors of same hue into groups.
   */
  while (i < cmap->num_cols)
  {
    if (hue_map[i].h == NO_HUE)
    {
      i++;
      continue;
    }

    grp_start[num_grp] = num_pix;
    grp_len[num_grp]   = 0;

    Hue_t cur_hue = hue_map[i].h;
    
    for (; i < cmap->num_cols && hue_map[i].h == cur_hue; i++)
    {
      pix_arr[num_pix++] = hue_map[i].pix;
      grp_len[num_grp]++;
    }

    num_grp++;

    ASSERT(num_grp <= max_grp);
    ASSERT(num_pix <= max_pix);
  }
}

HueSet::~HueSet()
{
  /* nothing to do */
}
 
int HueSet::HueTupleComparer(const void *A, const void *B)
{
  const HueTuple *C = (const HueTuple *) A;
  const HueTuple *D = (const HueTuple *) B;

  if (C->h != D->h)
    return C->h - D->h;

  /* put brightest first, dimmest last */ 
  return D->hsv_val - C->hsv_val;
}