histogram.c revision 32001f49
132001f49Smrg/*
232001f49Smrg * Copyright (c) 1993-2003, Silicon Graphics, Inc.
332001f49Smrg * All Rights Reserved
432001f49Smrg *
532001f49Smrg * Permission to use, copy, modify, and distribute this software for any
632001f49Smrg * purpose and without fee is hereby granted, provided that the above
732001f49Smrg * copyright notice appear in all copies and that both the copyright
832001f49Smrg * notice and this permission notice appear in supporting documentation,
932001f49Smrg * and that the name of Silicon Graphics, Inc. not be used in
1032001f49Smrg * advertising or publicity pertaining to distribution of the software
1132001f49Smrg * without specific, written prior permission.
1232001f49Smrg *
1332001f49Smrg * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" AND
1432001f49Smrg * WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
1532001f49Smrg * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
1632001f49Smrg * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
1732001f49Smrg * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
1832001f49Smrg * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
1932001f49Smrg * OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, LOSS OF
2032001f49Smrg * PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD
2132001f49Smrg * PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN ADVISED OF
2232001f49Smrg * THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF
2332001f49Smrg * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE
2432001f49Smrg * OR PERFORMANCE OF THIS SOFTWARE.
2532001f49Smrg *
2632001f49Smrg * US Government Users Restricted Rights
2732001f49Smrg * Use, duplication, or disclosure by the Government is subject to
2832001f49Smrg * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
2932001f49Smrg * (c)(1)(ii) of the Rights in Technical Data and Computer Software
3032001f49Smrg * clause at DFARS 252.227-7013 and/or in similar or successor clauses
3132001f49Smrg * in the FAR or the DOD or NASA FAR Supplement.  Unpublished - rights
3232001f49Smrg * reserved under the copyright laws of the United States.
3332001f49Smrg *
3432001f49Smrg * Contractor/manufacturer is:
3532001f49Smrg *	Silicon Graphics, Inc.
3632001f49Smrg *	1500 Crittenden Lane
3732001f49Smrg *	Mountain View, CA  94043
3832001f49Smrg *	United State of America
3932001f49Smrg *
4032001f49Smrg * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
4132001f49Smrg */
4232001f49Smrg
4332001f49Smrg/*
4432001f49Smrg *  histogram.c
4532001f49Smrg *  Compute the histogram of the image.  This program illustrates the
4632001f49Smrg *  use of the glHistogram() function.
4732001f49Smrg */
4832001f49Smrg
4932001f49Smrg#include <GL/glew.h>
5032001f49Smrg#include "glut_wrap.h"
5132001f49Smrg#include <assert.h>
5232001f49Smrg#include <stdlib.h>
5332001f49Smrg#include <stdio.h>
5432001f49Smrg
5532001f49Smrg#define HISTOGRAM_SIZE  256   /* Must be a power of 2 */
5632001f49Smrg
5732001f49Smrg
5832001f49Smrgstatic GLubyte  *pixels;
5932001f49Smrgstatic GLsizei   width, height;
6032001f49Smrg
6132001f49Smrg
6232001f49Smrg
6332001f49Smrgstatic GLuint bswap(GLuint x)
6432001f49Smrg{
6532001f49Smrg   const GLuint ui = 1;
6632001f49Smrg   const GLubyte *ubp = (const GLubyte *) &ui;
6732001f49Smrg   if (*ubp == 1) {
6832001f49Smrg      /* we're on little endiang so byteswap x */
6932001f49Smrg      GLsizei y =  ((x >> 24)
7032001f49Smrg                    | ((x >> 8) & 0xff00)
7132001f49Smrg                    | ((x << 8) & 0xff0000)
7232001f49Smrg                    | ((x << 24) & 0xff000000));
7332001f49Smrg      return y;
7432001f49Smrg   }
7532001f49Smrg   else {
7632001f49Smrg      return x;
7732001f49Smrg   }
7832001f49Smrg}
7932001f49Smrg
8032001f49Smrg
8132001f49Smrgstatic GLubyte*
8232001f49SmrgreadImage( const char* filename, GLsizei* width, GLsizei *height )
8332001f49Smrg{
8432001f49Smrg    int       n;
8532001f49Smrg    GLubyte*  pixels;
8632001f49Smrg    size_t    num_read;
8732001f49Smrg
8832001f49Smrg    FILE* infile = fopen( filename, "rb" );
8932001f49Smrg
9032001f49Smrg    if ( !infile ) {
9132001f49Smrg	fprintf( stderr, "Unable to open file '%s'\n", filename );
9232001f49Smrg        exit(1);
9332001f49Smrg    }
9432001f49Smrg
9532001f49Smrg    num_read = fread( width, sizeof( GLsizei ), 1, infile );
9632001f49Smrg    assert(num_read == 1);
9732001f49Smrg    num_read = fread( height, sizeof( GLsizei ), 1, infile );
9832001f49Smrg    assert(num_read == 1);
9932001f49Smrg
10032001f49Smrg    *width = bswap(*width);
10132001f49Smrg    *height = bswap(*height);
10232001f49Smrg
10332001f49Smrg    n = 3 * (*width) * (*height);
10432001f49Smrg
10532001f49Smrg    pixels = (GLubyte *) malloc( n * sizeof( GLubyte ));
10632001f49Smrg    if ( !pixels ) {
10732001f49Smrg	fprintf( stderr, "Unable to malloc() bytes for pixels\n" );
10832001f49Smrg	fclose( infile );
10932001f49Smrg	return NULL;
11032001f49Smrg    }
11132001f49Smrg
11232001f49Smrg    num_read = fread( pixels, sizeof( GLubyte ), n, infile );
11332001f49Smrg    assert(num_read == n);
11432001f49Smrg
11532001f49Smrg    fclose( infile );
11632001f49Smrg
11732001f49Smrg    return pixels;
11832001f49Smrg}
11932001f49Smrg
12032001f49Smrgstatic void init(void)
12132001f49Smrg{
12232001f49Smrg   if (!glutExtensionSupported("GL_ARB_imaging")) {
12332001f49Smrg      fprintf(stderr, "Sorry, this program requires GL_ARB_imaging.\n");
12432001f49Smrg      exit(1);
12532001f49Smrg   }
12632001f49Smrg
12732001f49Smrg   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
12832001f49Smrg   glClearColor(0.0, 0.0, 0.0, 0.0);
12932001f49Smrg
13032001f49Smrg   glHistogram(GL_HISTOGRAM, HISTOGRAM_SIZE, GL_RGB, GL_FALSE);
13132001f49Smrg   glEnable(GL_HISTOGRAM);
13232001f49Smrg}
13332001f49Smrg
13432001f49Smrgstatic void display(void)
13532001f49Smrg{
13632001f49Smrg   int i;
13732001f49Smrg   GLushort values[HISTOGRAM_SIZE][3];
13832001f49Smrg
13932001f49Smrg   glClear(GL_COLOR_BUFFER_BIT);
14032001f49Smrg   glRasterPos2i(1, 1);
14132001f49Smrg   glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels);
14232001f49Smrg
14332001f49Smrg   glGetHistogram(GL_HISTOGRAM, GL_TRUE, GL_RGB, GL_UNSIGNED_SHORT, values);
14432001f49Smrg
14532001f49Smrg   /* Plot histogram */
14632001f49Smrg
14732001f49Smrg   glBegin(GL_LINE_STRIP);
14832001f49Smrg   glColor3f(1.0, 0.0, 0.0);
14932001f49Smrg   for ( i = 0; i < HISTOGRAM_SIZE; i++ )
15032001f49Smrg       glVertex2s(i, values[i][0]);
15132001f49Smrg   glEnd();
15232001f49Smrg
15332001f49Smrg   glBegin(GL_LINE_STRIP);
15432001f49Smrg   glColor3f(0.0, 1.0, 0.0);
15532001f49Smrg   for ( i = 0; i < HISTOGRAM_SIZE; i++ )
15632001f49Smrg       glVertex2s(i, values[i][1]);
15732001f49Smrg   glEnd();
15832001f49Smrg
15932001f49Smrg   glBegin(GL_LINE_STRIP);
16032001f49Smrg   glColor3f(0.0, 0.0, 1.0);
16132001f49Smrg   for ( i = 0; i < HISTOGRAM_SIZE; i++ )
16232001f49Smrg       glVertex2s(i, values[i][2]);
16332001f49Smrg   glEnd();
16432001f49Smrg   glFlush();
16532001f49Smrg}
16632001f49Smrg
16732001f49Smrgstatic void reshape(int w, int h)
16832001f49Smrg{
16932001f49Smrg   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
17032001f49Smrg   glMatrixMode(GL_PROJECTION);
17132001f49Smrg   glLoadIdentity();
17232001f49Smrg   glOrtho(0, 256, 0, 10000, -1.0, 1.0);
17332001f49Smrg   glMatrixMode(GL_MODELVIEW);
17432001f49Smrg}
17532001f49Smrg
17632001f49Smrgstatic void keyboard(unsigned char key, int x, int y)
17732001f49Smrg{
17832001f49Smrg   static GLboolean sink = GL_FALSE;
17932001f49Smrg
18032001f49Smrg   switch (key) {
18132001f49Smrg      case 's' :
18232001f49Smrg	  sink = !sink;
18332001f49Smrg	  glHistogram(GL_HISTOGRAM, HISTOGRAM_SIZE, GL_RGB, sink);
18432001f49Smrg	  break;
18532001f49Smrg
18632001f49Smrg      case 27:
18732001f49Smrg         exit(0);
18832001f49Smrg   }
18932001f49Smrg   glutPostRedisplay();
19032001f49Smrg
19132001f49Smrg}
19232001f49Smrg
19332001f49Smrg/*  Main Loop
19432001f49Smrg *  Open window with initial window size, title bar,
19532001f49Smrg *  RGBA display mode, and handle input events.
19632001f49Smrg */
19732001f49Smrgint main(int argc, char** argv)
19832001f49Smrg{
19932001f49Smrg   pixels = readImage("leeds.bin", &width, &height);
20032001f49Smrg
20132001f49Smrg   glutInit(&argc, argv);
20232001f49Smrg   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
20332001f49Smrg   glutInitWindowSize(width, height);
20432001f49Smrg   glutInitWindowPosition(100, 100);
20532001f49Smrg   glutCreateWindow(argv[0]);
20632001f49Smrg   glewInit();
20732001f49Smrg   init();
20832001f49Smrg   glutReshapeFunc(reshape);
20932001f49Smrg   glutKeyboardFunc(keyboard);
21032001f49Smrg   glutDisplayFunc(display);
21132001f49Smrg   glutMainLoop();
21232001f49Smrg   return 0;
21332001f49Smrg}
214