X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fdraw%2Fdraw-test.c;h=0221fbb9a71a07fe4ca00c06ed98793b5524b2a7;hp=64080dfae59ae620745e78d6d7dedaf7d95838ff;hb=0f4cf599bc358c478a9e0a4b86f26704434a47e4;hpb=5139675bfad723e6a9a606e080541bb0b791f43b diff --git a/src/draw/draw-test.c b/src/draw/draw-test.c index 64080dfa..0221fbb9 100644 --- a/src/draw/draw-test.c +++ b/src/draw/draw-test.c @@ -16,11 +16,17 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#define IMAGE_SCALE 8 #define WIDTH 128 #define HEIGHT 64 -#define DEFAULT_WIDTH WIDTH -#define DEFAULT_HEIGHT HEIGHT +#define IMAGE_WIDTH (WIDTH * IMAGE_SCALE) +#define IMAGE_HEIGHT (HEIGHT * IMAGE_SCALE) + +#define DEFAULT_WIDTH IMAGE_WIDTH +#define DEFAULT_HEIGHT IMAGE_HEIGHT + +#define TIMEOUT 50 #define PASS_KEYS #include "frame.c" @@ -40,6 +46,7 @@ static struct ao_bitmap fb = { #define BIG_FONT FrutigerLT_Roman_64_font #define VOLT_FONT FrutigerLT_Roman_64_font #define SMALL_FONT NotoMono_12_font +#define TINY_FONT NotoMono_10_font #define LOGO_FONT BenguiatGothicStd_Bold_26_font #define LABEL_Y (int16_t) (SMALL_FONT.ascent) @@ -47,14 +54,15 @@ static struct ao_bitmap fb = { #define BOX_X 2 #define PAD_X 90 #define BOX_LABEL_X 30 -#define VOLT_LABEL_X 35 +#define VOLT_LABEL_X 25 #define RSSI_LABEL_X 15 #define PAD_LABEL_X 95 -#define SEP_X (PAD_X - 8) +#define SEP_X (PAD_X - 10) static int box_number = 1; static int pad_number = 1; -static int do_polys = 0; +static int do_polys = 1; +static int scan_number = 0; static const struct ao_coord trek[] = { { .x = 90, .y = 0 }, @@ -91,9 +99,16 @@ static const struct ao_coord bowtie[] = { static const struct ao_transform logo_transform = { .x_scale = 48, .x_off = 0, - .y_scale = 48, .y_off = 10, + .y_scale = 48, .y_off = 0, }; +#define SCAN_X (WIDTH - 100) / 2 +#define SCAN_Y 51 +#define SCAN_HEIGHT 4 +#define FOUND_Y 64 +#define FOUND_WIDTH 14 +#define MAX_VALID (WIDTH / FOUND_WIDTH) + static const struct ao_transform bowtie_transform = { .x_scale = 1, .x_off = 50, .y_scale = 1, .y_off = 20, @@ -103,15 +118,85 @@ static const float pad_volts = 12.3f; static const float lco_volts = 4.1f; static const int rssi = -30; +#define IMAGE_STRIDE ((IMAGE_WIDTH + 31) / 32) + +static uint32_t image_bits[IMAGE_STRIDE * IMAGE_HEIGHT]; + +static int boxes[] = { 1, 2, 3, 5, 8, 11, 13, 17, 19, 23, 29, 31, 37, 62, 97 }; + +static int max_box = 97; + +#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) + +static bool +valid_box(int box) +{ + size_t i; + if (box == 0) + return true; + for (i = 0; i < ARRAYSIZE(boxes); i++) + if (boxes[i] == box) + return true; + return false; +} + +static void +next_box(void) +{ + for (int n = box_number + 1; n <= max_box; n++) + if (valid_box(n)) { + box_number = n; + return; + } + box_number = 0; +} + +static void +prev_box(void) +{ + for (int n = box_number - 1; n >= 0; n--) + if (valid_box(n)) { + box_number = n; + return; + } + box_number = max_box; +} + void HandleExpose(Display *dpy, Window win, GC gc) { char str[64]; + int i; + int v; + int16_t b; ao_rect(&fb, 0, 0, WIDTH, HEIGHT, 0xffffffff, AO_COPY); + if (do_polys == 1) + current_timeout = TIMEOUT; + else + current_timeout = 0; switch (do_polys) { case 1: ao_logo(&fb, &logo_transform, &LOGO_FONT, 0x00000000, AO_COPY); + if (scan_number) { + ao_rect(&fb, SCAN_X, SCAN_Y, (int16_t) scan_number, SCAN_HEIGHT, 0x00000000, AO_COPY); + b = 0; + v = 0; + for (i = scan_number; i > 1; i--) { + if (valid_box(i)) { + v++; + if (v == MAX_VALID) + break; + } + } + for (; i <= scan_number; i++) { + if (valid_box(i)) { + sprintf(str, "%02d", i); + ao_text(&fb, &TINY_FONT, 0 + FOUND_WIDTH * b, FOUND_Y, str, 0x00000000, AO_COPY); + b++; + } + } + } break; case 2: ao_poly(&fb, trek, NCOORD_TREK, NULL, 0x00000000, AO_COPY); @@ -149,17 +234,32 @@ void HandleExpose(Display *dpy, Window win, GC gc) ao_text(&fb, &BIG_FONT, PAD_X, VALUE_Y, str, 0x00000000, AO_COPY); ao_text(&fb, &SMALL_FONT, PAD_LABEL_X, LABEL_Y, "Pad", 0x00000000, AO_COPY); - ao_line(&fb, SEP_X, 0, SEP_X, HEIGHT, 0x00000000, AO_COPY); + ao_rect(&fb, SEP_X, 0, 2, HEIGHT, 0x00000000, AO_COPY); } break; } break; } - XImage *image = XCreateImage(dpy, visual, 1, XYBitmap, 0, (char *) bits, WIDTH, HEIGHT, 32, STRIDE*4); + XImage *source_image = XCreateImage(dpy, visual, 1, XYBitmap, 0, (char *) bits, WIDTH, HEIGHT, 32, STRIDE*4); + XImage *image = XCreateImage(dpy, visual, 1, XYBitmap, 0, (char *) image_bits, IMAGE_WIDTH, IMAGE_HEIGHT, 32, IMAGE_STRIDE * 4); + int ix, iy; + int dx, dy; + + for (iy = 0; iy < HEIGHT; iy++) { + for (ix = 0; ix < WIDTH; ix++) { + unsigned long bit = XGetPixel(source_image, ix, iy); + for (dy = 0; dy < IMAGE_SCALE; dy++) { + + for (dx = 0; dx < IMAGE_SCALE; dx++) { + XPutPixel(image, ix * IMAGE_SCALE + dx, iy * IMAGE_SCALE + dy, bit); + } + } + } + } XSetForeground(dpy, gc, WhitePixel(dpy, screen)); XSetBackground(dpy, gc, BlackPixel(dpy, screen)); - XPutImage(dpy, win, gc, image, 0, 0, 0, 0, WIDTH, HEIGHT); + XPutImage(dpy, win, gc, image, 0, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT); free(image); } @@ -186,19 +286,32 @@ HandleKeyPress(Display *dpy, Window win, GC gc, XEvent *ev) } break; case 'b': - box_number++; - if (box_number > 99) - box_number = 0; + next_box(); break; case 'B': - box_number--; - if (box_number < 0) - box_number = 99; + prev_box(); break; - case 's': + case 'i': do_polys++; if (do_polys == 4) do_polys = 0; + if (do_polys == 1) + scan_number = 0; + break; + case 'I': + do_polys--; + if (do_polys < 0) + do_polys = 4; + if (do_polys == 1) + scan_number = 0; + break; + case 's': + if (scan_number < 99) + scan_number++; + break; + case 'S': + if (scan_number > 0) + scan_number--; break; case 'c': break; @@ -215,3 +328,18 @@ HandleKeyRelease(Display *dpy, Window win, GC gc, XEvent *ev) (void) gc; (void) ev; } + +void +HandleTimeout(Display *dpy, Window win, GC gc) +{ + if (do_polys == 1) { + if (scan_number < 99) + scan_number++; + else { + box_number = boxes[0]; + pad_number = 1; + do_polys = 0; + } + HandleExpose(dpy, win, gc); + } +}