1 /*
2 * tiff-rgb.c -- create a 24-bit Class R (rgb) TIFF file
3 *
4 * Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
5 *
6 * All Rights Reserved
7 *
8 * Permission to use, copy, modify, and distribute this software and its
9 * documentation for any purpose and without fee is hereby granted,
10 * provided that the above copyright notice appear in all copies and that
11 * both that copyright notice and this permission notice appear in
12 * supporting documentation, and that the name of Digital not be
13 * used in advertising or publicity pertaining to distribution of the
14 * software without specific, written prior permission.
15 *
16 * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
17 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
18 * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
19 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
21 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
22 * SOFTWARE.
23 */
24
25 #include <math.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29
30 #include "tiffio.h"
31
32 #define ROUND(x) (uint16_t) ((x) + 0.5)
33 #define CMSIZE 256
34 #define WIDTH 525
35 #define HEIGHT 512
36 #define TIFF_GAMMA 2.2
37
38 void Usage();
39 char * programName;
40
main(int argc,char ** argv)41 int main(int argc, char **argv)
42 {
43 char * input_file = NULL;
44 double image_gamma = TIFF_GAMMA;
45 int i, j;
46 TIFF * tif;
47 unsigned char * scan_line;
48 uint16_t red[CMSIZE], green[CMSIZE], blue[CMSIZE];
49 float refblackwhite[2*3];
50
51 programName = argv[0];
52
53 switch (argc) {
54 case 2:
55 image_gamma = TIFF_GAMMA;
56 input_file = argv[1];
57 break;
58 case 4:
59 if (!strcmp(argv[1], "-gamma")) {
60 image_gamma = atof(argv[2]);
61 input_file = argv[3];
62 } else
63 Usage();
64 break;
65 default:
66 Usage();
67 }
68
69 for (i = 0; i < CMSIZE; i++) {
70 if (i == 0)
71 red[i] = green[i] = blue[i] = 0;
72 else {
73 red[i] = ROUND((pow(i / 255.0, 1.0 / image_gamma) * 65535.0));
74 green[i] = ROUND((pow(i / 255.0, 1.0 / image_gamma) * 65535.0));
75 blue[i] = ROUND((pow(i / 255.0, 1.0 / image_gamma) * 65535.0));
76 }
77 }
78 refblackwhite[0] = 0.0; refblackwhite[1] = 255.0;
79 refblackwhite[2] = 0.0; refblackwhite[3] = 255.0;
80 refblackwhite[4] = 0.0; refblackwhite[5] = 255.0;
81
82 if ((tif = TIFFOpen(input_file, "w")) == NULL) {
83 fprintf(stderr, "can't open %s as a TIFF file\n", input_file);
84 exit(0);
85 }
86
87 TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, WIDTH);
88 TIFFSetField(tif, TIFFTAG_IMAGELENGTH, HEIGHT);
89 TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
90 TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
91 TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
92 TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
93 TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
94 TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
95 TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
96 #ifdef notdef
97 TIFFSetField(tif, TIFFTAG_WHITEPOINT, whitex, whitey);
98 TIFFSetField(tif, TIFFTAG_PRIMARYCHROMATICITIES, primaries);
99 #endif
100 TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refblackwhite);
101 TIFFSetField(tif, TIFFTAG_TRANSFERFUNCTION, red, green, blue);
102
103 scan_line = (unsigned char *) malloc(WIDTH * 3);
104
105 for (i = 0; i < 255; i++) {
106 for (j = 0; j < 75; j++) {
107 scan_line[j * 3] = 255;
108 scan_line[(j * 3) + 1] = 255 - i;
109 scan_line[(j * 3) + 2] = 255 - i;
110 }
111 for (j = 75; j < 150; j++) {
112 scan_line[j * 3] = 255 - i;
113 scan_line[(j * 3) + 1] = 255;
114 scan_line[(j * 3) + 2] = 255 - i;
115 }
116 for (j = 150; j < 225; j++) {
117 scan_line[j * 3] = 255 - i;
118 scan_line[(j * 3) + 1] = 255 - i;
119 scan_line[(j * 3) + 2] = 255;
120 }
121 for (j = 225; j < 300; j++) {
122 scan_line[j * 3] = (i - 1) / 2;
123 scan_line[(j * 3) + 1] = (i - 1) / 2;
124 scan_line[(j * 3) + 2] = (i - 1) / 2;
125 }
126 for (j = 300; j < 375; j++) {
127 scan_line[j * 3] = 255 - i;
128 scan_line[(j * 3) + 1] = 255;
129 scan_line[(j * 3) + 2] = 255;
130 }
131 for (j = 375; j < 450; j++) {
132 scan_line[j * 3] = 255;
133 scan_line[(j * 3) + 1] = 255 - i;
134 scan_line[(j * 3) + 2] = 255;
135 }
136 for (j = 450; j < 525; j++) {
137 scan_line[j * 3] = 255;
138 scan_line[(j * 3) + 1] = 255;
139 scan_line[(j * 3) + 2] = 255 - i;
140 }
141 TIFFWriteScanline(tif, scan_line, i, 0);
142 }
143 for (i = 255; i < 512; i++) {
144 for (j = 0; j < 75; j++) {
145 scan_line[j * 3] = i;
146 scan_line[(j * 3) + 1] = 0;
147 scan_line[(j * 3) + 2] = 0;
148 }
149 for (j = 75; j < 150; j++) {
150 scan_line[j * 3] = 0;
151 scan_line[(j * 3) + 1] = i;
152 scan_line[(j * 3) + 2] = 0;
153 }
154 for (j = 150; j < 225; j++) {
155 scan_line[j * 3] = 0;
156 scan_line[(j * 3) + 1] = 0;
157 scan_line[(j * 3) + 2] = i;
158 }
159 for (j = 225; j < 300; j++) {
160 scan_line[j * 3] = (i - 1) / 2;
161 scan_line[(j * 3) + 1] = (i - 1) / 2;
162 scan_line[(j * 3) + 2] = (i - 1) / 2;
163 }
164 for (j = 300; j < 375; j++) {
165 scan_line[j * 3] = 0;
166 scan_line[(j * 3) + 1] = i;
167 scan_line[(j * 3) + 2] = i;
168 }
169 for (j = 375; j < 450; j++) {
170 scan_line[j * 3] = i;
171 scan_line[(j * 3) + 1] = 0;
172 scan_line[(j * 3) + 2] = i;
173 }
174 for (j = 450; j < 525; j++) {
175 scan_line[j * 3] = i;
176 scan_line[(j * 3) + 1] = i;
177 scan_line[(j * 3) + 2] = 0;
178 }
179 TIFFWriteScanline(tif, scan_line, i, 0);
180 }
181
182 free(scan_line);
183 TIFFClose(tif);
184 exit(0);
185 }
186
187 void
Usage()188 Usage()
189 {
190 fprintf(stderr, "Usage: %s -gamma gamma tiff-image\n", programName);
191 exit(0);
192 }
193 /*
194 * Local Variables:
195 * mode: c
196 * c-basic-offset: 8
197 * fill-column: 78
198 * End:
199 */
200