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