GRASS Programmer's Manual  6.5.svn(2014)-r66266
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pngdriver/Color_table.c
Go to the documentation of this file.
1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 
5 #include <grass/gis.h>
6 #include <grass/colors.h>
7 #include "pngdriver.h"
8 
9 static int r_shift, g_shift, b_shift, a_shift;
10 static int Red[256], Grn[256], Blu[256];
11 
12 static void set_color(int i, int red, int grn, int blu)
13 {
14  png_palette[i][0] = red;
15  png_palette[i][1] = grn;
16  png_palette[i][2] = blu;
17  png_palette[i][3] = 0;
18 }
19 
20 static void init_colors_rgb(void)
21 {
22  NCOLORS = 1 << 24;
23 
24  if (G_is_little_endian()) {
25  b_shift = 0;
26  g_shift = 8;
27  r_shift = 16;
28  a_shift = 24;
29  }
30  else {
31  b_shift = 24;
32  g_shift = 16;
33  r_shift = 8;
34  a_shift = 0;
35  }
36 }
37 
38 static void init_colors_indexed(void)
39 {
40  int n_pixels;
41  int r, g, b;
42  int i;
43 
44  NCOLORS = 256;
45 
46  n_pixels = 0;
47 
48  if (has_alpha)
49  /* transparent color should be the first!
50  * Its RGB value doesn't matter since we fake RGB-to-index. */
51  set_color(n_pixels++, 0, 0, 0);
52 
53  for (r = 0; r < 6; r++) {
54  for (g = 0; g < 6; g++) {
55  for (b = 0; b < 6; b++) {
56  int red = r * 0xFF / 5;
57  int grn = g * 0xFF / 5;
58  int blu = b * 0xFF / 5;
59 
60  set_color(n_pixels++, red, grn, blu);
61  }
62  }
63  }
64 
65  while (n_pixels < NCOLORS)
66  set_color(n_pixels++, 0, 0, 0);
67 
68  for (i = 0; i < 256; i++) {
69  int k = i * 6 / 256;
70 
71  Red[i] = k * 6 * 6;
72  Grn[i] = k * 6;
73  Blu[i] = k;
74  }
75 }
76 
77 void init_color_table(void)
78 {
79  if (true_color)
80  init_colors_rgb();
81  else
82  init_colors_indexed();
83 }
84 
85 static int get_color_rgb(int r, int g, int b, int a)
86 {
87  return (r << r_shift) + (g << g_shift) + (b << b_shift) + (a << a_shift);
88 }
89 
90 static int get_color_indexed(int r, int g, int b, int a)
91 {
92  if (has_alpha && a >= 128)
93  return 0;
94 
95  return Red[r] + Grn[g] + Blu[b] + has_alpha;
96 }
97 
98 static void get_pixel_rgb(unsigned int pixel, int *r, int *g, int *b, int *a)
99 {
100  *r = (pixel >> r_shift) & 0xFF;
101  *g = (pixel >> g_shift) & 0xFF;
102  *b = (pixel >> b_shift) & 0xFF;
103  *a = (pixel >> a_shift) & 0xFF;
104 }
105 
106 static void get_pixel_indexed(unsigned int pixel, int *r, int *g, int *b,
107  int *a)
108 {
109  *r = png_palette[pixel][0];
110  *g = png_palette[pixel][1];
111  *b = png_palette[pixel][2];
112  *a = png_palette[pixel][3];
113 }
114 
115 
116 void get_pixel(unsigned int pixel, int *r, int *g, int *b, int *a)
117 {
118  if (true_color)
119  get_pixel_rgb(pixel, r, g, b, a);
120  else
121  get_pixel_indexed(pixel, r, g, b, a);
122 }
123 
124 unsigned int get_color(int r, int g, int b, int a)
125 {
126  return true_color ? get_color_rgb(r, g, b, a)
127  : get_color_indexed(r, g, b, a);
128 }
129 
130 int PNG_lookup_color(int r, int g, int b)
131 {
132  return true_color ? ((r << 16) | (g << 8) | (b << 0))
133  : Red[r] + Grn[g] + Blu[b] + has_alpha;
134 }
float b
Definition: named_colr.c:8
int has_alpha
void get_pixel(unsigned int pixel, int *r, int *g, int *b, int *a)
float r
Definition: named_colr.c:8
int true_color
void init_color_table(void)
int NCOLORS
Definition: driver/init.c:30
float g
Definition: named_colr.c:8
int G_is_little_endian(void)
Tests for little ENDIAN.
Definition: endian.c:29
unsigned char png_palette[256][4]
int PNG_lookup_color(int r, int g, int b)
unsigned int get_color(int r, int g, int b, int a)