ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/colrops.c
Revision: 2.2
Committed: Tue Feb 18 15:25:55 1992 UTC (32 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.1: +10 -1 lines
Log Message:
bug fix for small exponents in shiftcolrs()

File Contents

# Content
1 /* Copyright (c) 1990 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * Integer operations on COLR scanlines
9 */
10
11 #include "color.h"
12
13 #define MAXGSHIFT 15 /* maximum shift for gamma table */
14
15 static BYTE g_mant[256], g_nexp[256];
16
17 static BYTE g_bval[MAXGSHIFT+1][256];
18
19
20 setcolrgam(g) /* set gamma conversion */
21 double g;
22 {
23 extern double pow();
24 double mult;
25 register int i, j;
26 /* compute colr -> gamb mapping */
27 for (i = 0; i <= MAXGSHIFT; i++) {
28 mult = pow(0.5, (double)(i+8));
29 for (j = 0; j < 256; j++)
30 g_bval[i][j] = 256.0 * pow((j+.5)*mult, 1.0/g);
31 }
32 /* compute gamb -> colr mapping */
33 i = 0;
34 mult = 256.0;
35 for (j = 255; j > 0; j--) {
36 while ((g_mant[j] = mult * pow(j/256.0, g)) < 128) {
37 i++;
38 mult *= 2.0;
39 }
40 g_nexp[j] = i;
41 }
42 g_mant[0] = 0;
43 g_nexp[0] = COLXS;
44 }
45
46
47 colrs_gambs(scan, len) /* convert scanline of colrs to gamma bytes */
48 register COLR *scan;
49 int len;
50 {
51 register int i, expo;
52
53 while (len-- > 0) {
54 expo = scan[0][EXP] - COLXS;
55 if (expo < -MAXGSHIFT) {
56 if (expo < -MAXGSHIFT-8) {
57 scan[0][RED] =
58 scan[0][GRN] =
59 scan[0][BLU] = 0;
60 } else {
61 i = (-MAXGSHIFT-1) - expo;
62 scan[0][RED] =
63 g_bval[MAXGSHIFT][((scan[0][RED]>>i)+1)>>1];
64 scan[0][GRN] =
65 g_bval[MAXGSHIFT][((scan[0][GRN]>>i)+1)>>1];
66 scan[0][BLU] =
67 g_bval[MAXGSHIFT][((scan[0][BLU]>>i)+1)>>1];
68 }
69 } else if (expo > 0) {
70 if (expo > 8) {
71 scan[0][RED] =
72 scan[0][GRN] =
73 scan[0][BLU] = 255;
74 } else {
75 i = (scan[0][RED]<<1 | 1) << (expo-1);
76 scan[0][RED] = i > 255 ? 255 : g_bval[0][i];
77 i = (scan[0][GRN]<<1 | 1) << (expo-1);
78 scan[0][GRN] = i > 255 ? 255 : g_bval[0][i];
79 i = (scan[0][BLU]<<1 | 1) << (expo-1);
80 scan[0][BLU] = i > 255 ? 255 : g_bval[0][i];
81 }
82 } else {
83 scan[0][RED] = g_bval[-expo][scan[0][RED]];
84 scan[0][GRN] = g_bval[-expo][scan[0][GRN]];
85 scan[0][BLU] = g_bval[-expo][scan[0][BLU]];
86 }
87 scan[0][EXP] = COLXS;
88 scan++;
89 }
90 }
91
92
93 gambs_colrs(scan, len) /* convert gamma bytes to colr scanline */
94 register COLR *scan;
95 int len;
96 {
97 register int nexpo;
98
99 while (len-- > 0) {
100 nexpo = g_nexp[scan[0][RED]];
101 if (g_nexp[scan[0][GRN]] < nexpo)
102 nexpo = g_nexp[scan[0][GRN]];
103 if (g_nexp[scan[0][BLU]] < nexpo)
104 nexpo = g_nexp[scan[0][BLU]];
105 if (nexpo < g_nexp[scan[0][RED]])
106 scan[0][RED] = g_mant[scan[0][RED]]
107 >> (g_nexp[scan[0][RED]]-nexpo);
108 else
109 scan[0][RED] = g_mant[scan[0][RED]];
110 if (nexpo < g_nexp[scan[0][GRN]])
111 scan[0][GRN] = g_mant[scan[0][GRN]]
112 >> (g_nexp[scan[0][GRN]]-nexpo);
113 else
114 scan[0][GRN] = g_mant[scan[0][GRN]];
115 if (nexpo < g_nexp[scan[0][BLU]])
116 scan[0][BLU] = g_mant[scan[0][BLU]]
117 >> (g_nexp[scan[0][BLU]]-nexpo);
118 else
119 scan[0][BLU] = g_mant[scan[0][BLU]];
120 scan[0][EXP] = COLXS - nexpo;
121 scan++;
122 }
123 }
124
125
126 shiftcolrs(scan, len, adjust) /* shift a scanline of colors by 2^adjust */
127 register COLR *scan;
128 register int len;
129 register int adjust;
130 {
131 int minexp;
132
133 if (adjust == 0)
134 return;
135 minexp = adjust < 0 ? -adjust : 0;
136 while (len-- > 0) {
137 if (scan[0][EXP] <= minexp)
138 scan[0][RED] = scan[0][GRN] = scan[0][BLU] =
139 scan[0][EXP] = 0;
140 else
141 scan[0][EXP] += adjust;
142 scan++;
143 }
144 }
145
146
147 normcolrs(scan, len, adjust) /* normalize a scanline of colrs */
148 register COLR *scan;
149 int len;
150 int adjust;
151 {
152 register int c;
153 register int shift;
154
155 while (len-- > 0) {
156 shift = scan[0][EXP] + adjust - COLXS;
157 if (shift > 0) {
158 if (shift > 8) {
159 scan[0][RED] =
160 scan[0][GRN] =
161 scan[0][BLU] = 255;
162 } else {
163 shift--;
164 c = (scan[0][RED]<<1 | 1) << shift;
165 scan[0][RED] = c > 255 ? 255 : c;
166 c = (scan[0][GRN]<<1 | 1) << shift;
167 scan[0][GRN] = c > 255 ? 255 : c;
168 c = (scan[0][BLU]<<1 | 1) << shift;
169 scan[0][BLU] = c > 255 ? 255 : c;
170 }
171 } else if (shift < 0) {
172 if (shift < -8) {
173 scan[0][RED] =
174 scan[0][GRN] =
175 scan[0][BLU] = 0;
176 } else {
177 shift = -1-shift;
178 scan[0][RED] = ((scan[0][RED]>>shift)+1)>>1;
179 scan[0][GRN] = ((scan[0][GRN]>>shift)+1)>>1;
180 scan[0][BLU] = ((scan[0][BLU]>>shift)+1)>>1;
181 }
182 }
183 scan[0][EXP] = COLXS - adjust;
184 scan++;
185 }
186 }