rayfract

annotate src/imtk/layout.c @ 10:1496aae2e7d4

- simplified build by including dependences in the source tree - added make dep tracking - added mingw cross-build rules - added readme & licence
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 31 Jul 2023 18:58:56 +0300
parents
children
rev   line source
nuclear@10 1 #include <string.h>
nuclear@10 2 #include <assert.h>
nuclear@10 3 #include "imtk.h"
nuclear@10 4
nuclear@10 5 struct layout {
nuclear@10 6 int box[4], span[4];
nuclear@10 7 int spacing;
nuclear@10 8 int dir;
nuclear@10 9 };
nuclear@10 10
nuclear@10 11 #define MAX_STACK_DEPTH 4
nuclear@10 12 static struct layout st[MAX_STACK_DEPTH];
nuclear@10 13 static int top = 0;
nuclear@10 14
nuclear@10 15 int imtk_layout_push(void)
nuclear@10 16 {
nuclear@10 17 int newtop = top + 1;
nuclear@10 18
nuclear@10 19 assert(newtop < MAX_STACK_DEPTH);
nuclear@10 20 if(newtop >= MAX_STACK_DEPTH) {
nuclear@10 21 return -1;
nuclear@10 22 }
nuclear@10 23
nuclear@10 24 st[newtop] = st[top++];
nuclear@10 25 return 0;
nuclear@10 26 }
nuclear@10 27
nuclear@10 28 int imtk_layout_pop(void)
nuclear@10 29 {
nuclear@10 30 assert(top > 0);
nuclear@10 31 if(top <= 0) {
nuclear@10 32 return -1;
nuclear@10 33 }
nuclear@10 34 top--;
nuclear@10 35 return 0;
nuclear@10 36 }
nuclear@10 37
nuclear@10 38 void imtk_layout_start(int x, int y)
nuclear@10 39 {
nuclear@10 40 st[top].box[0] = st[top].span[0] = x;
nuclear@10 41 st[top].box[1] = st[top].span[1] = y;
nuclear@10 42 st[top].box[2] = st[top].box[3] = st[top].span[2] = st[top].span[3] = 0;
nuclear@10 43 /* st[top].spacing = sp;
nuclear@10 44 st[top].dir = dir;*/
nuclear@10 45 }
nuclear@10 46
nuclear@10 47 void imtk_layout_dir(int dir)
nuclear@10 48 {
nuclear@10 49 st[top].dir = dir;
nuclear@10 50 if(dir == IMTK_VERTICAL) {
nuclear@10 51 imtk_layout_newline();
nuclear@10 52 }
nuclear@10 53 }
nuclear@10 54
nuclear@10 55 void imtk_layout_spacing(int spacing)
nuclear@10 56 {
nuclear@10 57 st[top].spacing = spacing;
nuclear@10 58 }
nuclear@10 59
nuclear@10 60 void imtk_layout_advance(int width, int height)
nuclear@10 61 {
nuclear@10 62 int max_span_y, max_box_y;
nuclear@10 63
nuclear@10 64 st[top].span[2] += width + st[top].spacing;
nuclear@10 65
nuclear@10 66 if(height > st[top].span[3]) {
nuclear@10 67 st[top].span[3] = height;
nuclear@10 68 }
nuclear@10 69
nuclear@10 70 max_span_y = st[top].span[1] + st[top].span[3];
nuclear@10 71 max_box_y = st[top].box[1] + st[top].box[3];
nuclear@10 72
nuclear@10 73 if(max_span_y > max_box_y) {
nuclear@10 74 st[top].box[3] = max_span_y - st[top].box[1];
nuclear@10 75 }
nuclear@10 76 if(st[top].span[2] > st[top].box[2]) {
nuclear@10 77 st[top].box[2] = st[top].span[2];
nuclear@10 78 }
nuclear@10 79
nuclear@10 80 if(st[top].dir == IMTK_VERTICAL) {
nuclear@10 81 imtk_layout_newline();
nuclear@10 82 }
nuclear@10 83 }
nuclear@10 84
nuclear@10 85 void imtk_layout_newline(void)
nuclear@10 86 {
nuclear@10 87 st[top].span[0] = st[top].box[0];
nuclear@10 88 st[top].span[1] = st[top].box[1] + st[top].box[3] + st[top].spacing;
nuclear@10 89 st[top].span[2] = st[top].span[3] = 0;
nuclear@10 90 }
nuclear@10 91
nuclear@10 92 void imtk_layout_get_pos(int *x, int *y)
nuclear@10 93 {
nuclear@10 94 *x = st[top].span[0] + st[top].span[2];
nuclear@10 95 *y = st[top].span[1];
nuclear@10 96 }
nuclear@10 97
nuclear@10 98 void imtk_layout_get_bounds(int *bbox)
nuclear@10 99 {
nuclear@10 100 memcpy(bbox, st[top].box, sizeof st[top].box);
nuclear@10 101 }
nuclear@10 102
nuclear@10 103 int imtk_layout_contains(int x, int y)
nuclear@10 104 {
nuclear@10 105 if(x < st[top].box[0] || x >= st[top].box[0] + st[top].box[2]) {
nuclear@10 106 return 0;
nuclear@10 107 }
nuclear@10 108 if(y < st[top].box[1] || y >= st[top].box[1] + st[top].box[3]) {
nuclear@10 109 return 0;
nuclear@10 110 }
nuclear@10 111 return 1;
nuclear@10 112 }