~ubuntu-branches/ubuntu/quantal/tiff/quantal

« back to all changes in this revision

Viewing changes to contrib/dbs/tiff-grayscale.c

  • Committer: Bazaar Package Importer
  • Author(s): Jay Berkenbilt
  • Date: 2009-08-28 15:44:23 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20090828154423-7oisj77n302jrroa
Tags: 3.9.1-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: tiff-grayscale.c,v 1.4 2004/09/03 08:26:08 dron Exp $ */
 
2
 
 
3
/*
 
4
 * tiff-grayscale.c -- create a Class G (grayscale) TIFF file
 
5
 *      with a gray response curve in linear optical density
 
6
 *
 
7
 * Copyright 1990 by Digital Equipment Corporation, Maynard, Massachusetts.
 
8
 *
 
9
 *                        All Rights Reserved
 
10
 *
 
11
 * Permission to use, copy, modify, and distribute this software and its
 
12
 * documentation for any purpose and without fee is hereby granted,
 
13
 * provided that the above copyright notice appear in all copies and that
 
14
 * both that copyright notice and this permission notice appear in
 
15
 * supporting documentation, and that the name of Digital not be
 
16
 * used in advertising or publicity pertaining to distribution of the
 
17
 * software without specific, written prior permission.
 
18
 *
 
19
 * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 
20
 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 
21
 * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
 
22
 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 
23
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 
24
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 
25
 * SOFTWARE.
 
26
 */
 
27
 
 
28
#include <math.h>
 
29
#include <stdio.h>
 
30
#include <stdlib.h>
 
31
#include <string.h>
 
32
 
 
33
#include "tiffio.h"
 
34
 
 
35
#define WIDTH       512
 
36
#define HEIGHT      WIDTH
 
37
 
 
38
char *              programName;
 
39
void                Usage();
 
40
 
 
41
int main(int argc, char **argv)
 
42
{
 
43
    int             bits_per_pixel = 8, cmsize, i, j, k,
 
44
                    gray_index, chunk_size = 32, nchunks = 16;
 
45
    unsigned char * scan_line;
 
46
    uint16 *        gray;
 
47
    float           refblackwhite[2*1];
 
48
    TIFF *          tif;
 
49
 
 
50
    programName = argv[0];
 
51
 
 
52
    if (argc != 4)
 
53
        Usage();
 
54
 
 
55
    if (!strcmp(argv[1], "-depth"))
 
56
         bits_per_pixel = atoi(argv[2]);
 
57
    else
 
58
         Usage();
 
59
 
 
60
    switch (bits_per_pixel) {
 
61
        case 8:
 
62
            nchunks = 16;
 
63
            chunk_size = 32;
 
64
            break;
 
65
        case 4:
 
66
            nchunks = 4;
 
67
            chunk_size = 128;
 
68
            break;
 
69
        case 2:
 
70
            nchunks = 2;
 
71
            chunk_size = 256;
 
72
            break;
 
73
        default:
 
74
            Usage();
 
75
    }
 
76
 
 
77
    cmsize = nchunks * nchunks;
 
78
    gray = (uint16 *) malloc(cmsize * sizeof(uint16));
 
79
 
 
80
    gray[0] = 3000;
 
81
    for (i = 1; i < cmsize; i++)
 
82
        gray[i] = (uint16) (-log10((double) i / (cmsize - 1)) * 1000);
 
83
 
 
84
    refblackwhite[0] = 0.0;
 
85
    refblackwhite[1] = (float)((1L<<bits_per_pixel) - 1);
 
86
 
 
87
    if ((tif = TIFFOpen(argv[3], "w")) == NULL) {
 
88
        fprintf(stderr, "can't open %s as a TIFF file\n", argv[3]);
 
89
        return 0;
 
90
    }
 
91
 
 
92
    TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, WIDTH);
 
93
    TIFFSetField(tif, TIFFTAG_IMAGELENGTH, HEIGHT);
 
94
    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bits_per_pixel);
 
95
    TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
 
96
    TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
 
97
    TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
 
98
    TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
 
99
    TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
 
100
    TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refblackwhite);
 
101
    TIFFSetField(tif, TIFFTAG_TRANSFERFUNCTION, gray);
 
102
    TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
 
103
 
 
104
    scan_line = (unsigned char *) malloc(WIDTH / (8 / bits_per_pixel));
 
105
 
 
106
    for (i = 0; i < HEIGHT; i++) {
 
107
        for (j = 0, k = 0; j < WIDTH;) {
 
108
            gray_index = (j / chunk_size) + ((i / chunk_size) * nchunks);
 
109
 
 
110
            switch (bits_per_pixel) {
 
111
            case 8:
 
112
                scan_line[k++] = gray_index;
 
113
                j++;
 
114
                break;
 
115
            case 4:
 
116
                scan_line[k++] = (gray_index << 4) + gray_index;
 
117
                j += 2;
 
118
                break;
 
119
            case 2:
 
120
                scan_line[k++] = (gray_index << 6) + (gray_index << 4)
 
121
                    + (gray_index << 2) + gray_index;
 
122
                j += 4;
 
123
                break;
 
124
            }
 
125
        }
 
126
        TIFFWriteScanline(tif, scan_line, i, 0);
 
127
    }
 
128
 
 
129
    free(scan_line);
 
130
    TIFFClose(tif);
 
131
    return 0;
 
132
}
 
133
 
 
134
void
 
135
Usage()
 
136
{
 
137
    fprintf(stderr, "Usage: %s -depth (8 | 4 | 2) tiff-image\n", programName);
 
138
    exit(0);
 
139
}