# HG changeset patch # User John Tsiombikas # Date 1303096546 -10800 # Node ID 9c7987064bb07f363d827e8930d73c5c0284d2a8 # Parent 17c9525b2e35366449aec7539d1f85e0d2aa69a0 - fixed the frame drawing a bit - added global alpha value and various drawing parameters - backported the checkbox check mark from glamtk - fixed progress bar drawing so that the bevels of the trough and the bar won't overlap diff -r 17c9525b2e35 -r 9c7987064bb0 src/checkbox.c --- a/src/checkbox.c Sun Apr 17 18:20:23 2011 +0300 +++ b/src/checkbox.c Mon Apr 18 06:15:46 2011 +0300 @@ -41,6 +41,21 @@ static void draw_checkbox(int id, const char *label, int x, int y, int state, int over) { static const int sz = CHECKBOX_SIZE; + static float v[][2] = { + {-0.2, 0.63}, /* 0 */ + {0.121, 0.325}, /* 1 */ + {0.15, 0.5}, /* 2 */ + {0.28, 0.125}, /* 3 */ + {0.38, 0.33}, /* 4 */ + {0.42, -0.122}, /* 5 */ + {0.58, 0.25}, /* 6 */ + {0.72, 0.52}, /* 7 */ + {0.625, 0.65}, /* 8 */ + {0.89, 0.78}, /* 9 */ + {0.875, 0.92}, /* 10 */ + {1.13, 1.145} /* 11 */ + }; +#define TRI(a, b, c) (glVertex2fv(v[a]), glVertex2fv(v[b]), glVertex2fv(v[c])) if(over) { glColor4fv(imtk_get_color(IMTK_FOCUS_COLOR)); @@ -53,19 +68,29 @@ glColor4fv(imtk_get_color(IMTK_TEXT_COLOR)); if(state) { - glPushAttrib(GL_LINE_BIT); - glLineWidth(2); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glTranslatef(x, y + sz, 0); + glScalef(sz * 1.2, -sz * 1.3, 1); - glBegin(GL_LINES); - glVertex2f(x + 2, y + 2); - glVertex2f(x + sz - 2, y + sz - 2); - glVertex2f(x + sz - 2, y + 2); - glVertex2f(x + 2, y + sz - 2); + glBegin(GL_TRIANGLES); + glColor4fv(imtk_get_color(IMTK_CHECK_COLOR)); + TRI(0, 1, 2); + TRI(1, 3, 2); + TRI(3, 4, 2); + TRI(3, 5, 4); + TRI(4, 5, 6); + TRI(4, 6, 7); + TRI(4, 7, 8); + TRI(8, 7, 9); + TRI(8, 9, 10); + TRI(10, 9, 11); glEnd(); - glPopAttrib(); + glPopMatrix(); } + glColor4fv(imtk_get_color(IMTK_TEXT_COLOR)); imtk_draw_string(x + sz + 5, y + sz - 2, label); } diff -r 17c9525b2e35 -r 9c7987064bb0 src/draw.c --- a/src/draw.c Sun Apr 17 18:20:23 2011 +0300 +++ b/src/draw.c Mon Apr 18 06:15:46 2011 +0300 @@ -9,9 +9,15 @@ {0.7, 0.7, 0.7, 1.0}, /* base color */ {0.85, 0.85, 0.85, 1.0}, /* focus color */ {1.0, 1.0, 1.0, 1.0}, /* lit bevel */ - {0.3, 0.3, 0.3, 1.0} /* shadowed bevel */ + {0.3, 0.3, 0.3, 1.0}, /* shadowed bevel */ + {0.8, 0.25, 0.18, 1.0}, /* cursor color */ + {0.4, 0.5, 0.9, 1.0}, /* selection color */ + {0.63, 0.078, 0.078, 1.0} /* check color */ }; +static float alpha = 1.0; +static float bevel = 1.0; + void imtk_set_color(int col, float r, float g, float b, float a) { assert(col >= 0 && col < sizeof colors / sizeof *colors); @@ -24,7 +30,30 @@ float *imtk_get_color(int col) { - return colors[col]; + static float ret[4]; + memcpy(ret, colors + col, sizeof ret); + ret[3] *= alpha; + return ret; +} + +void imtk_set_alpha(float a) +{ + alpha = a; +} + +float imtk_get_alpha(void) +{ + return alpha; +} + +void imtk_set_bevel_width(float b) +{ + bevel = b; +} + +float imtk_get_bevel_width(void) +{ + return bevel; } void imtk_draw_rect(int x, int y, int w, int h, float *color_rgba) @@ -43,20 +72,45 @@ void imtk_draw_frame(int x, int y, int w, int h, int style) { float tcol[4], bcol[4]; + float b = imtk_get_bevel_width(); switch(style) { case FRAME_INSET: - memcpy(tcol, colors[IMTK_BEVEL_SHAD_COLOR], sizeof tcol); - memcpy(bcol, colors[IMTK_BEVEL_LIT_COLOR], sizeof bcol); + memcpy(tcol, imtk_get_color(IMTK_BEVEL_SHAD_COLOR), sizeof tcol); + memcpy(bcol, imtk_get_color(IMTK_BEVEL_LIT_COLOR), sizeof bcol); break; case FRAME_OUTSET: default: - memcpy(tcol, colors[IMTK_BEVEL_LIT_COLOR], sizeof tcol); - memcpy(bcol, colors[IMTK_BEVEL_SHAD_COLOR], sizeof bcol); + memcpy(tcol, imtk_get_color(IMTK_BEVEL_LIT_COLOR), sizeof tcol); + memcpy(bcol, imtk_get_color(IMTK_BEVEL_SHAD_COLOR), sizeof bcol); } - glBegin(GL_LINES); + glBegin(GL_QUADS); + glColor4fv(tcol); + glVertex2f(x, y); + glVertex2f(x + b, y + b); + glVertex2f(x + w - b, y + b); + glVertex2f(x + w, y); + + glVertex2f(x + b, y + b); + glVertex2f(x, y); + glVertex2f(x, y + h); + glVertex2f(x + b, y + h - b); + + glColor4fv(bcol); + glVertex2f(x + b, y + h - b); + glVertex2f(x + w - b, y + h - b); + glVertex2f(x + w, y + h); + glVertex2f(x, y + h); + + glVertex2f(x + w - b, y + b); + glVertex2f(x + w, y); + glVertex2f(x + w, y + h); + glVertex2f(x + w - b, y + h - b); + glEnd(); + + /*glBegin(GL_LINES); glColor4fv(tcol); glVertex2f(x, y + h); glVertex2f(x, y); @@ -67,7 +121,7 @@ glVertex2f(x + w, y + h); glVertex2f(x + w, y + h); glVertex2f(x, y + h); - glEnd(); + glEnd();*/ } diff -r 17c9525b2e35 -r 9c7987064bb0 src/draw.h --- a/src/draw.h Sun Apr 17 18:20:23 2011 +0300 +++ b/src/draw.h Mon Apr 18 06:15:46 2011 +0300 @@ -6,22 +6,14 @@ #else #include #endif - -enum { - IMTK_TEXT_COLOR, - IMTK_BASE_COLOR, - IMTK_FOCUS_COLOR, - IMTK_BEVEL_LIT_COLOR, - IMTK_BEVEL_SHAD_COLOR -}; - +#include "imtk.h" enum { FRAME_OUTSET, FRAME_INSET }; -void imtk_set_color(int col, float r, float g, float b, float a); +/*void imtk_set_color(int col, float r, float g, float b, float a); in imtk.h */ float *imtk_get_color(int col); void imtk_draw_rect(int x, int y, int w, int h, float *color_rgba); void imtk_draw_frame(int x, int y, int w, int h, int style); diff -r 17c9525b2e35 -r 9c7987064bb0 src/imtk.c --- a/src/imtk.c Sun Apr 17 18:20:23 2011 +0300 +++ b/src/imtk.c Mon Apr 18 06:15:46 2011 +0300 @@ -2,7 +2,6 @@ #include #include #include -#include #include #ifndef __APPLE__ #include @@ -11,8 +10,14 @@ #endif #include "imtk.h" #include "state.h" +#include "draw.h" +void imtk_post_redisplay(void) +{ + glutPostRedisplay(); +} + void imtk_begin(void) { int width, height; @@ -33,6 +38,9 @@ glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); + glEnable(GL_BLEND); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } void imtk_end(void) @@ -45,35 +53,14 @@ glPopMatrix(); } - -void imtk_post_redisplay(void) +void imtk_label(const char *str, int x, int y) { - glutPostRedisplay(); + glColor4fv(imtk_get_color(IMTK_TEXT_COLOR)); + imtk_draw_string(x, y, str); } -/*int imtk_listbox(int id, const char *list, int sel, int x, int y) -{ - int i; - assert(id >= 0); - - if(!list) { - return -1; - } - - if(id & 1) { - id++; - } - - for(i=0; *list; i++) { - if(imtk_button(id + i * 2 + 1, list, x, y + i * 20)) { - sel = i; - } - list += strlen(list) + 1; - } - return sel; -} - +/* int imtk_combobox(int id, char *textbuf, size_t buf_sz, const char *list, int sel, int x, int y) { imtk_textbox(id + 1, textbuf, buf_sz, x, y); @@ -84,44 +71,4 @@ } return sel; } - -char *imtk_create_list(const char *first, ...) -{ - int sz; - char *buf, *item; - va_list ap; - - if(!first) { - return 0; - } - - sz = strlen(first) + 2; - if(!(buf = malloc(sz))) { - return 0; - } - memcpy(buf, first, sz - 2); - buf[sz - 1] = buf[sz - 2] = 0; - - va_start(ap, first); - while((item = va_arg(ap, char*))) { - int len = strlen(item); - char *tmp = realloc(buf, sz + len + 1); - if(!tmp) { - free(buf); - return 0; - } - buf = tmp; - - memcpy(buf + sz - 1, item, len); - sz += len + 1; - buf[sz - 1] = buf[sz - 2] = 0; - } - va_end(ap); - - return buf; -} - -void imtk_free_list(char *list) -{ - free(list); -}*/ +*/ diff -r 17c9525b2e35 -r 9c7987064bb0 src/imtk.h --- a/src/imtk.h Sun Apr 17 18:20:23 2011 +0300 +++ b/src/imtk.h Mon Apr 18 06:15:46 2011 +0300 @@ -20,6 +20,17 @@ IMTK_RIGHT_BUTTON }; +enum { + IMTK_TEXT_COLOR, + IMTK_BASE_COLOR, + IMTK_FOCUS_COLOR, + IMTK_BEVEL_LIT_COLOR, + IMTK_BEVEL_SHAD_COLOR, + IMTK_CURSOR_COLOR, + IMTK_SELECTION_COLOR, + IMTK_CHECK_COLOR +}; + #ifdef __cplusplus extern "C" { @@ -38,6 +49,7 @@ void imtk_begin(void); void imtk_end(void); +void imtk_label(const char *str, int x, int y); int imtk_button(int id, const char *label, int x, int y); int imtk_checkbox(int id, const char *label, int x, int y, int state); void imtk_textbox(int id, char *textbuf, size_t buf_sz, int x, int y); @@ -52,6 +64,13 @@ char *imtk_create_list(const char *first, ...); void imtk_free_list(char *list); +/* defined in draw.c */ +void imtk_set_color(int col, float r, float g, float b, float a); +void imtk_set_alpha(float a); +float imtk_get_alpha(void); +void imtk_set_bevel_width(float b); +float imtk_get_bevel_width(void); + #ifdef __cplusplus } #endif diff -r 17c9525b2e35 -r 9c7987064bb0 src/progress.c --- a/src/progress.c Sun Apr 17 18:20:23 2011 +0300 +++ b/src/progress.c Mon Apr 18 06:15:46 2011 +0300 @@ -1,7 +1,8 @@ #include "imtk.h" #include "draw.h" -#define SLIDER_SIZE 100 +#define PROGR_SIZE 100 +#define PROGR_HEIGHT 15 static void draw_progress(int id, float pos, int x, int y); @@ -12,18 +13,19 @@ static void draw_progress(int id, float pos, int x, int y) { - int bar_size = SLIDER_SIZE * pos; + int bar_size = PROGR_SIZE * pos; + float b = imtk_get_bevel_width(); if(pos < 0.0) pos = 0.0; if(pos > 1.0) pos = 1.0; /* through */ - imtk_draw_rect(x - 1, y - 1, SLIDER_SIZE + 1, 18, imtk_get_color(IMTK_BASE_COLOR)); - imtk_draw_frame(x - 1, y - 1, SLIDER_SIZE + 2, 17, FRAME_INSET); + imtk_draw_rect(x - b, y - b, PROGR_SIZE + b * 2, PROGR_HEIGHT + b * 2, imtk_get_color(IMTK_BASE_COLOR)); + imtk_draw_frame(x - b, y - b, PROGR_SIZE + b * 2, PROGR_HEIGHT + b * 2, FRAME_INSET); if(pos > 0.0) { /* bar */ - imtk_draw_rect(x, y, bar_size, 15, imtk_get_color(IMTK_BASE_COLOR)); - imtk_draw_frame(x, y, bar_size, 15, FRAME_OUTSET); + imtk_draw_rect(x, y, bar_size, PROGR_HEIGHT, imtk_get_color(IMTK_BASE_COLOR)); + imtk_draw_frame(x, y, bar_size, PROGR_HEIGHT, FRAME_OUTSET); } } diff -r 17c9525b2e35 -r 9c7987064bb0 src/textbox.c --- a/src/textbox.c Sun Apr 17 18:20:23 2011 +0300 +++ b/src/textbox.c Mon Apr 18 06:15:46 2011 +0300 @@ -76,7 +76,7 @@ if(imtk_has_focus(id)) { glBegin(GL_LINES); - glColor4f(0.8, 0.25, 0.18, imtk_get_color(IMTK_TEXT_COLOR)[3]); + glColor4fv(imtk_get_color(IMTK_CURSOR_COLOR)); glVertex2f(x + strsz + 3, y + 2); glVertex2f(x + strsz + 3, y + 18); glVertex2f(x + strsz + 4, y + 2); diff -r 17c9525b2e35 -r 9c7987064bb0 test.c --- a/test.c Sun Apr 17 18:20:23 2011 +0300 +++ b/test.c Mon Apr 18 06:15:46 2011 +0300 @@ -53,6 +53,9 @@ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 60.0); + /*imtk_set_color(IMTK_BEVEL_LIT_COLOR, 0.3, 0.3, 0.3, 0.5); + imtk_set_color(IMTK_BEVEL_SHAD_COLOR, 0.3, 0.3, 0.3, 0.5);*/ + glutMainLoop(); return 0; } @@ -61,15 +64,31 @@ { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glViewport(200, 0, xsz - 200, ysz); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluPerspective(45.0, (float)(xsz - 200) / (float)ysz, 1.0, 1000.0); + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_LIGHTING); + glDisable(GL_DEPTH_TEST); + + glBegin(GL_QUADS); + glColor3f(0.3, 0.4, 0.8); + glVertex2f(-1, -1); + glVertex2f(1, -1); + glColor3f(0.7, 0.3, 0.2); + glVertex2f(1, 1); + glVertex2f(-1, 1); + glEnd(); + + glPopAttrib(); + glPopMatrix(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glTranslatef(0, 0, -8); + glTranslatef(0, 0, -4); glRotatef(25, 1, 0, 0); glRotatef(angle, 0, 1, 0); @@ -93,9 +112,6 @@ } - glViewport(0, 0, 200, ysz); - imtk_set_viewport(200, ysz); - gui(); glutSwapBuffers(); @@ -113,13 +129,13 @@ imtk_begin(); - glBegin(GL_QUADS); + /*glBegin(GL_QUADS); glColor3f(0.6, 0.6, 0.6); glVertex2f(0, 0); glVertex2f(200, 0); glVertex2f(200, glutGet(GLUT_WINDOW_HEIGHT)); glVertex2f(0, glutGet(GLUT_WINDOW_HEIGHT)); - glEnd(); + glEnd();*/ if(imtk_button(IMUID, "red", 30, 50)) { float color[] = {1, 0.4, 0.3, 1}; @@ -158,6 +174,9 @@ imtk_progress(IMUID, val / 360.0, 30, 420); + imtk_label("alpha:", 24, 473); + imtk_set_alpha(imtk_slider(IMUID, imtk_get_alpha(), 0.0, 1.0, 60, 470)); + if(imtk_button(IMUID, "Quit", 30, 500)) { exit(0); } @@ -171,6 +190,11 @@ ysz = y; glViewport(0, 0, x, y); + imtk_set_viewport(x, y); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45.0, (float)xsz / (float)ysz, 1.0, 1000.0); } void keyb(unsigned char key, int x, int y)