blob: 61c6d125fbe294888c8149cc96c4a1c6a3bef2f0 [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001
2/* Draw test patterns to help determine correct gamma value for a display.
3 When the intensities of the inner squares nearly match the intensities
4 of their frames (from some distance the borders should disappear) then
5 you've found the right gamma value.
6
7 You can set Mesa's gamma values (for red, green and blue) with the
8 MESA_GAMMA environment variable. But only on X windows!
9 For example:
10 setenv MESA_GAMMA 1.5 1.6 1.4
11 Sets the red gamma value to 1.5, green to 1.6 and blue to 1.4.
12 See the main README file for more information.
13
14 For more info about gamma correction see:
15 http://www.inforamp.net/~poynton/notes/colour_and_gamma/GammaFAQ.html
16
17 This program is in the public domain
18
19 Brian Paul 19 Oct 1995
20 Kai Schuetz 05 Jun 1999 */
21
22/* Conversion to GLUT by Mark J. Kilgard */
23
jtgafb833d1999-08-19 00:55:39 +000024
25#include <stdio.h>
26#include <string.h>
27#include <stdlib.h>
28#include <GL/glut.h>
29
30static void
31Reshape(int width, int height)
32{
33 glViewport(0, 0, (GLint) width, (GLint) height);
34
35 glMatrixMode(GL_PROJECTION);
36 glLoadIdentity();
37 glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
38 glMatrixMode(GL_MODELVIEW);
39 glShadeModel(GL_FLAT);
40}
41
42/* ARGSUSED1 */
43static void
44key_esc(unsigned char key, int x, int y)
45{
46 if(key == 27) exit(0); /* Exit on Escape */
47}
48
49static GLubyte p25[] = {
50 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
51 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
52 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
53 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
54 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
55 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
56 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
57 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
58 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
59 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
60 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
61 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
62 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
63 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
64 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
65 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
66};
67
68static GLubyte p50[] = {
69 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
70 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
71 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
72 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
73 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
74 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
75 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
76 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
77 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
78 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
79 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
80 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
81 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
82 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
83 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
84 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55,
85};
86
87static GLubyte p75[] = {
88 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
89 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
90 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
91 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
92 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
93 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
94 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
95 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
96 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
97 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
98 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
99 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
100 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
101 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
102 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
103 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
104};
105
106static GLubyte *stippletab[4] = {NULL, p25, p50, p75};
107
108static void
109gamma_ramp(GLfloat yoffs, GLfloat r, GLfloat g, GLfloat b)
110{
111 GLint d;
112
113 glColor3f(0.0, 0.0, 0.0); /* solid black, no stipple */
114 glRectf(-1.0, yoffs, -0.6, yoffs + 0.5);
115
116 for(d = 1; d < 4; d++) { /* increasing density from 25% to 75% */
117 GLfloat xcoord = (-1.0 + d*0.4);
Brian Paul586b4f62000-03-18 01:13:29 +0000118 GLfloat t = d * 0.25;
jtgafb833d1999-08-19 00:55:39 +0000119
Brian Paul586b4f62000-03-18 01:13:29 +0000120 glColor3f(r*t, g*t, b*t); /* draw outer rect */
jtgafb833d1999-08-19 00:55:39 +0000121 glRectf(xcoord, yoffs, xcoord+0.4, yoffs + 0.5);
122
123 glColor3f(0.0, 0.0, 0.0); /* "clear" inner rect */
124 glRectf(xcoord + 0.1, yoffs + 0.125, xcoord + 0.3, yoffs + 0.375);
125
126 glColor3f(r, g, b); /* draw stippled inner rect */
127 glEnable(GL_POLYGON_STIPPLE);
128 glPolygonStipple(stippletab[d]);
129 glRectf(xcoord + 0.1, yoffs + 0.125, xcoord + 0.3, yoffs + 0.375);
130 glDisable(GL_POLYGON_STIPPLE);
131 }
132 glColor3f(r, g, b); /* solid color, no stipple */
133 glRectf(0.6, yoffs, 1.0, yoffs + 0.5);
134}
135
136static void
137display(void)
138{
139 gamma_ramp( 0.5, 1.0, 1.0, 1.0); /* white ramp */
140 gamma_ramp( 0.0, 1.0, 0.0, 0.0); /* red ramp */
141 gamma_ramp(-0.5, 0.0, 1.0, 0.0); /* green ramp */
142 gamma_ramp(-1.0, 0.0, 0.0, 1.0); /* blue ramp */
143 glFlush();
144}
145
146int
147main(int argc, char **argv)
148{
Brian Paul263f4322009-12-18 08:12:55 -0700149 glutInitWindowSize(500, 400);
jtgafb833d1999-08-19 00:55:39 +0000150 glutInit(&argc, argv);
151 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
jtgafb833d1999-08-19 00:55:39 +0000152 glutCreateWindow("gamma test patterns");
153 glutReshapeFunc(Reshape);
154 glutDisplayFunc(display);
155 glutKeyboardFunc(key_esc);
156
157 glutMainLoop();
158 return 0; /* ANSI C requires main to return int. */
159}