nuclear@3: #include nuclear@2: #include nuclear@1: #include nuclear@2: #include nuclear@0: #include nuclear@0: #ifndef __APPLE__ nuclear@0: #include nuclear@0: #else nuclear@0: #include nuclear@0: #endif nuclear@0: #include "imtk.h" nuclear@7: #include "state.h" nuclear@13: #include "draw.h" nuclear@1: nuclear@0: nuclear@13: void imtk_post_redisplay(void) nuclear@13: { nuclear@13: glutPostRedisplay(); nuclear@13: } nuclear@13: nuclear@0: void imtk_begin(void) nuclear@0: { nuclear@7: int width, height; nuclear@7: nuclear@20: glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); nuclear@20: nuclear@20: glDisable(GL_DEPTH_TEST); nuclear@20: glDisable(GL_STENCIL_TEST); nuclear@20: glDisable(GL_ALPHA_TEST); nuclear@20: glDisable(GL_TEXTURE_1D); nuclear@20: glDisable(GL_TEXTURE_2D); nuclear@20: glDisable(GL_CULL_FACE); nuclear@20: glDisable(GL_SCISSOR_TEST); nuclear@20: glDisable(GL_LIGHTING); nuclear@20: glEnable(GL_BLEND); nuclear@20: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); nuclear@20: nuclear@20: nuclear@7: imtk_get_viewport(&width, &height); nuclear@7: nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glPushMatrix(); nuclear@0: glLoadIdentity(); nuclear@0: glTranslatef(-1, 1, 0); nuclear@7: glScalef(2.0 / width, -2.0 / height, 1.0); nuclear@2: nuclear@2: glMatrixMode(GL_MODELVIEW); nuclear@2: glPushMatrix(); nuclear@2: glLoadIdentity(); nuclear@0: } nuclear@0: nuclear@0: void imtk_end(void) nuclear@0: { nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glPopMatrix(); nuclear@2: glMatrixMode(GL_MODELVIEW); nuclear@2: glPopMatrix(); nuclear@20: nuclear@20: glPopAttrib(); nuclear@0: } nuclear@0: nuclear@13: void imtk_label(const char *str, int x, int y) nuclear@0: { nuclear@20: if(x == IMTK_AUTO || y == IMTK_AUTO) { nuclear@20: imtk_layout_get_pos(&x, &y); nuclear@20: } nuclear@20: nuclear@13: glColor4fv(imtk_get_color(IMTK_TEXT_COLOR)); nuclear@21: imtk_draw_string(x, y + 14, str); nuclear@20: imtk_layout_advance(imtk_string_size(str), 12); nuclear@0: } nuclear@0: nuclear@1: nuclear@20: static int box[4], span[4]; nuclear@20: static int spacing; nuclear@20: static int layout; nuclear@20: nuclear@20: void imtk_layout_start(int x, int y, int sp, int dir) nuclear@4: { nuclear@20: box[0] = span[0] = x; nuclear@20: box[1] = span[1] = y; nuclear@20: box[2] = box[3] = span[2] = span[3] = 0; nuclear@20: spacing = sp; nuclear@20: layout = dir; nuclear@20: } nuclear@4: nuclear@20: void imtk_layout_dir(int dir) nuclear@20: { nuclear@20: layout = dir; nuclear@20: if(dir == IMTK_VERTICAL) { nuclear@20: imtk_layout_newline(); nuclear@4: } nuclear@4: } nuclear@20: nuclear@20: void imtk_layout_advance(int width, int height) nuclear@20: { nuclear@20: int max_span_y, max_box_y; nuclear@20: nuclear@20: span[2] += width + spacing; nuclear@20: nuclear@20: if(height > span[3]) { nuclear@20: span[3] = height; nuclear@20: } nuclear@20: nuclear@20: max_span_y = span[1] + span[3]; nuclear@20: max_box_y = box[1] + box[3]; nuclear@20: nuclear@20: if(max_span_y > max_box_y) { nuclear@20: box[3] = max_span_y - box[1]; nuclear@20: } nuclear@22: if(span[2] > box[2]) { nuclear@22: box[2] = span[2]; nuclear@22: } nuclear@20: nuclear@20: if(layout == IMTK_VERTICAL) { nuclear@20: imtk_layout_newline(); nuclear@20: } nuclear@20: } nuclear@20: nuclear@20: void imtk_layout_newline(void) nuclear@20: { nuclear@20: span[0] = box[0]; nuclear@20: span[1] = box[1] + box[3] + spacing; nuclear@20: span[2] = span[3] = 0; nuclear@20: } nuclear@20: nuclear@20: void imtk_layout_get_pos(int *x, int *y) nuclear@20: { nuclear@20: *x = span[0] + span[2]; nuclear@20: *y = span[1]; nuclear@20: } nuclear@20: nuclear@20: void imtk_layout_get_bounds(int *bbox) nuclear@20: { nuclear@20: memcpy(bbox, box, sizeof box); nuclear@20: }