2 * Copyright (c) 1993-2003, Silicon Graphics, Inc.
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose and without fee is hereby granted, provided that the above
7 * copyright notice appear in all copies and that both the copyright
8 * notice and this permission notice appear in supporting documentation,
9 * and that the name of Silicon Graphics, Inc. not be used in
10 * advertising or publicity pertaining to distribution of the software
11 * without specific, written prior permission.
13 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" AND
14 * WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
16 * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
17 * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
18 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, LOSS OF
20 * PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD
21 * PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF
22 * THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE
24 * OR PERFORMANCE OF THIS SOFTWARE.
26 * US Government Users Restricted Rights
27 * Use, duplication, or disclosure by the Government is subject to
28 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
29 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
30 * clause at DFARS 252.227-7013 and/or in similar or successor clauses
31 * in the FAR or the DOD or NASA FAR Supplement. Unpublished - rights
32 * reserved under the copyright laws of the United States.
34 * Contractor/manufacturer is:
35 * Silicon Graphics, Inc.
36 * 1500 Crittenden Lane
37 * Mountain View, CA 94043
38 * United State of America
40 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
45 * Compute the histogram of the image. This program illustrates the
46 * use of the glHistogram() function.
55 #define HISTOGRAM_SIZE 256 /* Must be a power of 2 */
58 static GLubyte
*pixels
;
59 static GLsizei width
, height
;
63 static GLuint
bswap(GLuint x
)
66 const GLubyte
*ubp
= (const GLubyte
*) &ui
;
68 /* we're on little endiang so byteswap x */
69 GLsizei y
= ((x
>> 24)
71 | ((x
<< 8) & 0xff0000)
72 | ((x
<< 24) & 0xff000000));
82 readImage( const char* filename
, GLsizei
* width
, GLsizei
*height
)
88 FILE* infile
= fopen( filename
, "rb" );
91 fprintf( stderr
, "Unable to open file '%s'\n", filename
);
95 num_read
= fread( width
, sizeof( GLsizei
), 1, infile
);
96 assert(num_read
== 1);
97 num_read
= fread( height
, sizeof( GLsizei
), 1, infile
);
98 assert(num_read
== 1);
100 *width
= bswap(*width
);
101 *height
= bswap(*height
);
103 n
= 3 * (*width
) * (*height
);
105 pixels
= (GLubyte
*) malloc( n
* sizeof( GLubyte
));
107 fprintf( stderr
, "Unable to malloc() bytes for pixels\n" );
112 num_read
= fread( pixels
, sizeof( GLubyte
), n
, infile
);
113 assert(num_read
== n
);
120 static void init(void)
122 if (!glutExtensionSupported("GL_ARB_imaging")) {
123 fprintf(stderr
, "Sorry, this program requires GL_ARB_imaging.\n");
127 glPixelStorei(GL_UNPACK_ALIGNMENT
, 1);
128 glClearColor(0.0, 0.0, 0.0, 0.0);
130 glHistogram(GL_HISTOGRAM
, HISTOGRAM_SIZE
, GL_RGB
, GL_FALSE
);
131 glEnable(GL_HISTOGRAM
);
134 static void display(void)
137 GLushort values
[HISTOGRAM_SIZE
][3];
139 glClear(GL_COLOR_BUFFER_BIT
);
141 glDrawPixels(width
, height
, GL_RGB
, GL_UNSIGNED_BYTE
, pixels
);
143 glGetHistogram(GL_HISTOGRAM
, GL_TRUE
, GL_RGB
, GL_UNSIGNED_SHORT
, values
);
147 glBegin(GL_LINE_STRIP
);
148 glColor3f(1.0, 0.0, 0.0);
149 for ( i
= 0; i
< HISTOGRAM_SIZE
; i
++ )
150 glVertex2s(i
, values
[i
][0]);
153 glBegin(GL_LINE_STRIP
);
154 glColor3f(0.0, 1.0, 0.0);
155 for ( i
= 0; i
< HISTOGRAM_SIZE
; i
++ )
156 glVertex2s(i
, values
[i
][1]);
159 glBegin(GL_LINE_STRIP
);
160 glColor3f(0.0, 0.0, 1.0);
161 for ( i
= 0; i
< HISTOGRAM_SIZE
; i
++ )
162 glVertex2s(i
, values
[i
][2]);
167 static void reshape(int w
, int h
)
169 glViewport(0, 0, (GLsizei
) w
, (GLsizei
) h
);
170 glMatrixMode(GL_PROJECTION
);
172 glOrtho(0, 256, 0, 10000, -1.0, 1.0);
173 glMatrixMode(GL_MODELVIEW
);
176 static void keyboard(unsigned char key
, int x
, int y
)
178 static GLboolean sink
= GL_FALSE
;
183 glHistogram(GL_HISTOGRAM
, HISTOGRAM_SIZE
, GL_RGB
, sink
);
194 * Open window with initial window size, title bar,
195 * RGBA display mode, and handle input events.
197 int main(int argc
, char** argv
)
199 pixels
= readImage("leeds.bin", &width
, &height
);
201 glutInit(&argc
, argv
);
202 glutInitDisplayMode(GLUT_SINGLE
| GLUT_RGB
);
203 glutInitWindowSize(width
, height
);
204 glutInitWindowPosition(100, 100);
205 glutCreateWindow(argv
[0]);
208 glutReshapeFunc(reshape
);
209 glutKeyboardFunc(keyboard
);
210 glutDisplayFunc(display
);