implemented colormap management on X11 (glutSetColor etc).
authorJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 23 Aug 2022 22:12:39 +0000 (01:12 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 23 Aug 2022 22:12:39 +0000 (01:12 +0300)
Makefile
miniglut.c
miniglut.h

index 098a7da..c110e36 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,8 @@ ifeq ($(sys), mingw)
        LDFLAGS = -mconsole -lopengl32 -lgdi32 -lwinmm
 else
        ifeq ($(sys)-$(isx86), Linux-x86)
-               LDFLAGS = -lX11 -lGL
+               CFLAGS += -I/usr/X11R6/include
+               LDFLAGS = -L/usr/X11R6/lib -lX11 -lGL
        else
                # for other UNIX or non-x86 where sys_ and trig functions are not
                # implemented, just use libc
index 6856369..bbb980c 100644 (file)
@@ -33,6 +33,8 @@ along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 static Display *dpy;
 static Window win, root;
+static Colormap cmap;
+static int cmap_size;
 static int scr;
 static GLXContext ctx;
 static Atom xa_wm_proto, xa_wm_del_win;
@@ -366,6 +368,8 @@ int glutGet(unsigned int s)
                return ctx_info.srgb;
        case GLUT_WINDOW_CURSOR:
                return cur_cursor;
+       case GLUT_WINDOW_COLORMAP_SIZE:
+               return cmap_size;
        case GLUT_SCREEN_WIDTH:
                get_screen_size(&x, &y);
                return x;
@@ -821,6 +825,43 @@ void glutSetCursor(int cidx)
        cur_cursor = cidx;
 }
 
+void glutSetColor(int idx, float r, float g, float b)
+{
+       XColor color;
+
+       if(idx >= 0 && idx < cmap_size) {
+               color.pixel = idx;
+               color.red = (unsigned short)(r * 65535.0f);
+               color.green = (unsigned short)(g * 65535.0f);
+               color.blue = (unsigned short)(b * 65535.0f);
+               color.flags = DoRed | DoGreen | DoBlue;
+               XStoreColor(dpy, cmap, &color);
+       }
+}
+
+float glutGetColor(int idx, int comp)
+{
+       XColor color;
+
+       if(idx < 0 || idx >= cmap_size) {
+               return -1.0f;
+       }
+
+       color.pixel = idx;
+       XQueryColor(dpy, cmap, &color);
+       switch(comp) {
+       case GLUT_RED:
+               return color.red / 65535.0f;
+       case GLUT_GREEN:
+               return color.green / 65535.0f;
+       case GLUT_BLUE:
+               return color.blue / 65535.0f;
+       default:
+               break;
+       }
+       return -1.0f;
+}
+
 void glutSetKeyRepeat(int repmode)
 {
        if(repmode) {
@@ -924,13 +965,21 @@ static void create_window(const char *title)
        glXGetConfig(dpy, vi, GLX_SAMPLES_ARB, &ctx_info.samples);
        glXGetConfig(dpy, vi, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, &ctx_info.srgb);
 
+       if(!(cmap = XCreateColormap(dpy, root, vi->visual, mode & GLUT_INDEX ? AllocAll : AllocNone))) {
+               XFree(vi);
+               glXDestroyContext(dpy, ctx);
+               panic("Failed to create colormap\n");
+       }
+       cmap_size = GLUT_INDEX ? vi->colormap_size : 0;
+
        xattr.background_pixel = BlackPixel(dpy, scr);
-       xattr.colormap = XCreateColormap(dpy, root, vi->visual, AllocNone);
+       xattr.colormap = cmap;
        xattr_mask = CWBackPixel | CWColormap | CWBackPixmap | CWBorderPixel;
        if(!(win = XCreateWindow(dpy, root, init_x, init_y, init_width, init_height, 0,
                        vi->depth, InputOutput, vi->visual, xattr_mask, &xattr))) {
                XFree(vi);
                glXDestroyContext(dpy, ctx);
+               XFreeColormap(dpy, cmap);
                panic("Failed to create window\n");
        }
        XFree(vi);
@@ -1263,6 +1312,17 @@ void glutSetCursor(int cidx)
        }
 }
 
+void glutSetColor(int idx, float r, float g, float b)
+{
+       /* TODO */
+}
+
+float glutGetColor(int idx, int comp)
+{
+       /* TODO */
+       return 0;
+}
+
 void glutSetKeyRepeat(int repmode)
 {
 }
index af13791..71a8125 100644 (file)
@@ -84,7 +84,14 @@ enum {
        GLUT_INIT_WINDOW_Y,
        GLUT_INIT_WINDOW_WIDTH,
        GLUT_INIT_WINDOW_HEIGHT,
-       GLUT_ELAPSED_TIME
+       GLUT_ELAPSED_TIME,
+       GLUT_WINDOW_COLORMAP_SIZE,
+};
+
+enum {
+       GLUT_RED,
+       GLUT_GREEN,
+       GLUT_BLUE
 };
 
 enum {
@@ -154,6 +161,8 @@ void glutFullScreen(void);
 void glutSetWindowTitle(const char *title);
 void glutSetIconTitle(const char *title);
 void glutSetCursor(int cursor);
+void glutSetColor(int idx, float r, float g, float b);
+float glutGetColor(int idx, int comp);
 
 void glutIgnoreKeyRepeat(int ignore);
 void glutSetKeyRepeat(int repmode);