minmax.c revision 32001f49
1/* 2 * Copyright (c) 1993-2003, Silicon Graphics, Inc. 3 * All Rights Reserved 4 * 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. 12 * 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. 25 * 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. 33 * 34 * Contractor/manufacturer is: 35 * Silicon Graphics, Inc. 36 * 1500 Crittenden Lane 37 * Mountain View, CA 94043 38 * United State of America 39 * 40 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc. 41 */ 42 43/* 44 * minmax.c 45 * Determine the minimum and maximum values of a group of pixels. 46 * This demonstrates use of the glMinmax() call. 47 */ 48#include <GL/glew.h> 49#include "glut_wrap.h" 50#include <assert.h> 51#include <stdlib.h> 52#include <stdio.h> 53 54 55static GLubyte *pixels; 56static GLsizei width, height; 57 58 59static GLuint bswap(GLuint x) 60{ 61 const GLuint ui = 1; 62 const GLubyte *ubp = (const GLubyte *) &ui; 63 if (*ubp == 1) { 64 /* we're on little endiang so byteswap x */ 65 GLsizei y = ((x >> 24) 66 | ((x >> 8) & 0xff00) 67 | ((x << 8) & 0xff0000) 68 | ((x << 24) & 0xff000000)); 69 return y; 70 } 71 else { 72 return x; 73 } 74} 75 76 77static GLubyte * 78readImage( const char* filename, GLsizei* width, GLsizei *height ) 79{ 80 int n; 81 GLubyte* pixels; 82 size_t num_read; 83 84 FILE* infile = fopen( filename, "rb" ); 85 86 if ( !infile ) { 87 fprintf( stderr, "Unable to open file '%s'\n", filename ); 88 return NULL; 89 } 90 91 num_read = fread( width, sizeof( GLsizei ), 1, infile ); 92 assert(num_read == 1); 93 num_read = fread( height, sizeof( GLsizei ), 1, infile ); 94 assert(num_read == 1); 95 96 *width = bswap(*width); 97 *height = bswap(*height); 98 99 n = 3 * (*width) * (*height); 100 101 pixels = (GLubyte *) malloc( n * sizeof( GLubyte )); 102 if ( !pixels ) { 103 fprintf( stderr, "Unable to malloc() bytes for pixels\n" ); 104 fclose( infile ); 105 return NULL; 106 } 107 108 num_read = fread( pixels, sizeof( GLubyte ), n, infile ); 109 assert(num_read == n); 110 111 fclose( infile ); 112 113 return pixels; 114} 115 116static void init(void) 117{ 118 if (!glutExtensionSupported("GL_ARB_imaging")) { 119 fprintf(stderr, "Sorry, this program requires GL_ARB_imaging.\n"); 120 exit(1); 121 } 122 123 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 124 glClearColor(0.0, 0.0, 0.0, 0.0); 125 126 glMinmax(GL_MINMAX, GL_RGB, GL_FALSE); 127 glEnable(GL_MINMAX); 128} 129 130static void display(void) 131{ 132 GLubyte values[6]; 133 134 glClear(GL_COLOR_BUFFER_BIT); 135 glRasterPos2i(1, 1); 136 glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels); 137 glFlush(); 138 139 glGetMinmax(GL_MINMAX, GL_TRUE, GL_RGB, GL_UNSIGNED_BYTE, values); 140 printf(" Red : min = %d max = %d\n", values[0], values[3]); 141 printf(" Green : min = %d max = %d\n", values[1], values[4]); 142 printf(" Blue : min = %d max = %d\n", values[2], values[5]); 143} 144 145static void reshape(int w, int h) 146{ 147 glViewport(0, 0, (GLsizei) w, (GLsizei) h); 148 glMatrixMode(GL_PROJECTION); 149 glLoadIdentity(); 150 glOrtho(0, w, 0, h, -1.0, 1.0); 151 glMatrixMode(GL_MODELVIEW); 152} 153 154static void keyboard(unsigned char key, int x, int y) 155{ 156 switch (key) { 157 case 27: 158 exit(0); 159 } 160} 161 162/* Main Loop 163 * Open window with initial window size, title bar, 164 * RGBA display mode, and handle input events. 165 */ 166int main(int argc, char** argv) 167{ 168 pixels = readImage("leeds.bin", &width, &height); 169 170 glutInit(&argc, argv); 171 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 172 glutInitWindowSize(width, height); 173 glutInitWindowPosition(100, 100); 174 glutCreateWindow(argv[0]); 175 glewInit(); 176 init(); 177 glutReshapeFunc(reshape); 178 glutKeyboardFunc(keyboard); 179 glutDisplayFunc(display); 180 glutMainLoop(); 181 return 0; 182} 183