Save screenshots to PNG, make tests compare screenshots.
This commit is contained in:
parent
759b526b3d
commit
b2819b485b
5
.gitignore
vendored
5
.gitignore
vendored
@ -11,7 +11,7 @@ mkfilepattern
|
||||
*.img.gz
|
||||
*.img.lz4
|
||||
*.img.info
|
||||
t_*.out
|
||||
*.out.???
|
||||
.gdb_history
|
||||
umka.fas
|
||||
umka.sym
|
||||
@ -21,7 +21,4 @@ tags
|
||||
*.out
|
||||
coverage.*
|
||||
covpreproc
|
||||
*.rgba
|
||||
*.rgb
|
||||
*.png
|
||||
*.skn
|
||||
|
14
README
14
README
@ -5,7 +5,7 @@ This is a common project for a set of KolibriOS developer tools which are based
|
||||
on original KolibriOS code wrapped and hacked as to run in the UNIX programming
|
||||
environment. The idea is to make userspace UNIX tools that use as much unchanged
|
||||
KolibriOS source as possible to test architecture-independent parts of the
|
||||
kernelin your favorite developer environment.
|
||||
kernel in your favorite developer environment.
|
||||
|
||||
|
||||
umka_shell
|
||||
@ -43,10 +43,14 @@ Framebuffer can be dumped to disk as image file.
|
||||
Troubleshooting
|
||||
---------------
|
||||
|
||||
gm convert -size 400x300 -depth 8 umka.rgba umka.png
|
||||
No troubles -- no shooting.
|
||||
|
||||
|
||||
Links
|
||||
-----
|
||||
Links & Acknowledgements
|
||||
------------------------
|
||||
|
||||
[1] https://github.com/libfuse/libfuse
|
||||
[1] Filesystem in Userspace library
|
||||
https://github.com/libfuse/libfuse
|
||||
|
||||
[2] LodePNG by Lode Vandevenne
|
||||
https://lodev.org/lodepng/
|
||||
|
9
makefile
9
makefile
@ -1,8 +1,8 @@
|
||||
FASM=fasm
|
||||
CC=gcc
|
||||
WARNINGS=-Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow -Wformat=2 -Wswitch -Wswitch-enum #-Wconversion -Wsign-conversion
|
||||
WARNINGS=-Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow -Wformat=2 -Wswitch #-Wswitch-enum #-Wconversion -Wsign-conversion
|
||||
CFLAGS=$(WARNINGS) -g -O0 -D_FILE_OFFSET_BITS=64 -Wno-address-of-packed-member -DNDEBUG -masm=intel
|
||||
CFLAGS_32=-m32
|
||||
CFLAGS_32=$(CFLAGS) -m32
|
||||
LDFLAGS=
|
||||
LDFLAGS_32=-m32
|
||||
|
||||
@ -11,7 +11,7 @@ all: umka_shell umka_fuse umka.sym umka.prp umka.lst tags tools/mkdirrange tools
|
||||
covpreproc: covpreproc.c
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
|
||||
|
||||
umka_shell: umka_shell.o umka.o trace.o trace_lbr.o cio.o
|
||||
umka_shell: umka_shell.o umka.o trace.o trace_lbr.o cio.o lodepng.o
|
||||
$(CC) $(LDFLAGS) $(LDFLAGS_32) $^ -o $@ -static
|
||||
|
||||
umka_fuse: umka_fuse.o umka.o cio.o
|
||||
@ -20,6 +20,9 @@ umka_fuse: umka_fuse.o umka.o cio.o
|
||||
umka.o umka.fas: umka.asm skin.skn
|
||||
INCLUDE="$(KOLIBRI)/kernel/trunk;$(KOLIBRI)/programs/develop/libraries/libcrash/trunk" $(FASM) $< umka.o -s umka.fas -m 1234567
|
||||
|
||||
lodepng.o: lodepng.c lodepng.h
|
||||
$(CC) $(CFLAGS_32) -c $<
|
||||
|
||||
skin.skn: $(KOLIBRI)/skins/Leency/Octo_flat/default.asm
|
||||
$(FASM) $< $@
|
||||
|
||||
|
11
syscalls.h
11
syscalls.h
@ -119,6 +119,17 @@ static inline void umka_sys_draw_rect(size_t x, size_t xsize,
|
||||
: "memory");
|
||||
}
|
||||
|
||||
static inline void umka_sys_get_screen_size(uint32_t *xsize, uint32_t *ysize) {
|
||||
uint32_t xysize;
|
||||
__asm__ __inline__ __volatile__ (
|
||||
"call i40"
|
||||
: "=a"(xysize)
|
||||
: "a"(14)
|
||||
: "memory");
|
||||
*xsize = (xysize >> 16) + 1;
|
||||
*ysize = (xysize & 0xffffu) + 1;
|
||||
}
|
||||
|
||||
static inline void umka_sys_draw_line(size_t x, size_t xend,
|
||||
size_t y, size_t yend,
|
||||
uint32_t color, int invert) {
|
||||
|
108
test/016_#f01_#draw_all.ref.log
Normal file
108
test/016_#f01_#draw_all.ref.log
Normal file
@ -0,0 +1,108 @@
|
||||
/> disk_add ../img/kolibri.img rd
|
||||
/rd/1: fat
|
||||
/> set_skin /sys/DEFAULT.SKN
|
||||
status: 0
|
||||
/> window_redraw 1
|
||||
/> draw_window 0 300 0 200 0x000088 1 1 1 0 1 4 hello
|
||||
/> set_pixel 0 0 0x0000ff
|
||||
/> set_pixel 1 1 0xff0000
|
||||
/> set_pixel 2 2 0x00ff00
|
||||
/> draw_line 10 510 10 510 0xff0000
|
||||
/> draw_rect 60 20 30 20 0x00ff00
|
||||
/> put_image chess_image.rgb 8 8 5 15
|
||||
/> put_image_palette chess_image.rgb 12 12 5 30 9 0
|
||||
/> write_text 10 70 0xffff00 hello 0 0 0 0 0 5 0
|
||||
/> set_button_style 0
|
||||
/> button 55 40 5 20 0xc0ffee 0xffffff 1 0
|
||||
/> set_button_style 1
|
||||
/> button 100 40 5 20 0xc1ffee 0xffffff 1 0
|
||||
/> display_number 0 10 4 0 0 1234 5 45 0xffff00 1 1 0 0 0x0000ff
|
||||
/> blit_bitmap chess_image.rgba 20 35 8 8 0 0 8 8 0 0 0 1 32
|
||||
/> window_redraw 2
|
||||
|
||||
/> set_window_caption hi_there 0
|
||||
/> move_window 220 35 150 200
|
||||
/> get_font_smoothing
|
||||
font smoothing: 2 - subpixel
|
||||
/> set_font_smoothing 0
|
||||
/> get_font_smoothing
|
||||
font smoothing: 0 - off
|
||||
|
||||
/> get_window_colors
|
||||
0x00586786 frame
|
||||
0x00fefefe grab
|
||||
0x00aea6a6 work_3d_dark
|
||||
0x00fbfbfb work_3d_light
|
||||
0x00333333 grab_text
|
||||
0x00ddd7cf work
|
||||
0x007887a6 work_button
|
||||
0x00fefefe work_button_text
|
||||
0x00000000 work_text
|
||||
0x007e7e7e work_graph
|
||||
/> set_window_colors 0 0 0 0 0 0 0 0 0 0
|
||||
|
||||
/> window_redraw 1
|
||||
/> draw_window 0 300 0 200 0x000088 1 1 1 0 1 4 hello
|
||||
/> set_pixel 0 0 0x0000ff
|
||||
/> set_pixel 1 1 0xff0000
|
||||
/> set_pixel 2 2 0x00ff00
|
||||
/> window_redraw 2
|
||||
|
||||
/> set_window_caption hi_2there 0
|
||||
|
||||
/> dump_win_stack 5
|
||||
0: 0
|
||||
1: 1
|
||||
2: 2
|
||||
3: 3
|
||||
4: 4
|
||||
/> dump_win_pos 5
|
||||
0: 0
|
||||
1: 1
|
||||
2: 2
|
||||
3: 3
|
||||
4: 4
|
||||
|
||||
/> process_info -1
|
||||
cpu_usage: 0
|
||||
window_stack_position: 2
|
||||
window_stack_value: 2
|
||||
process_name:
|
||||
memory_start: 0x00000000
|
||||
used_memory: 4294967295 (0xffffffff)
|
||||
pid: 0
|
||||
box: 220 35 150 200
|
||||
slot_state: 0
|
||||
client_box: 5 24 140 171
|
||||
wnd_state: 0x00
|
||||
/> get_skin_height
|
||||
24
|
||||
/> get_screen_area
|
||||
0 left
|
||||
0 top
|
||||
399 right
|
||||
299 bottom
|
||||
/> set_screen_area 0 20 350 250
|
||||
/> get_screen_area
|
||||
0 left
|
||||
20 top
|
||||
350 right
|
||||
250 bottom
|
||||
/> get_skin_margins
|
||||
6 left
|
||||
5 top
|
||||
65 right
|
||||
3 bottom
|
||||
|
||||
/> get_font_size
|
||||
0px
|
||||
/> set_font_size 16
|
||||
/> get_font_size
|
||||
16px
|
||||
|
||||
/> get_screen_size
|
||||
400x300
|
||||
|
||||
/> scrot 016_#f01_#draw_all.out.png
|
||||
|
||||
/> disk_del rd
|
BIN
test/016_#f01_#draw_all.ref.png
Normal file
BIN
test/016_#f01_#draw_all.ref.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
@ -50,6 +50,8 @@ get_font_size
|
||||
set_font_size 16
|
||||
get_font_size
|
||||
|
||||
scrot umka.rgba
|
||||
get_screen_size
|
||||
|
||||
scrot 016_#f01_#draw_all.out.png
|
||||
|
||||
disk_del rd
|
BIN
test/chess_image.rgb
Normal file
BIN
test/chess_image.rgb
Normal file
Binary file not shown.
BIN
test/chess_image.rgba
Normal file
BIN
test/chess_image.rgba
Normal file
Binary file not shown.
@ -1,20 +1,21 @@
|
||||
UMKA_SHELL=../umka_shell
|
||||
|
||||
xfs_tests := $(addsuffix .out, $(basename $(wildcard *\#xfs_*.t)))
|
||||
s05k_tests := $(addsuffix .out, $(basename $(wildcard *\#s05k_*.t)))
|
||||
s4k_tests := $(addsuffix .out, $(basename $(wildcard *\#s4k_*.t)))
|
||||
f30_tests := $(addsuffix .out, $(basename $(wildcard *\#f30_*.t)))
|
||||
f70_tests := $(addsuffix .out, $(basename $(wildcard *\#f70_*.t)))
|
||||
f70s0_tests := $(addsuffix .out, $(basename $(wildcard *\#f70s0_*.t)))
|
||||
f70s1_tests := $(addsuffix .out, $(basename $(wildcard *\#f70s1_*.t)))
|
||||
f70s5_tests := $(addsuffix .out, $(basename $(wildcard *\#f70s5_*.t)))
|
||||
lookup_tests := $(addsuffix .out, $(basename $(wildcard *\#lookup_*.t)))
|
||||
bug_tests := $(addsuffix .out, $(basename $(wildcard *\#bug_*.t)))
|
||||
xattr_tests := $(addsuffix .out, $(basename $(wildcard *\#xattr_*.t)))
|
||||
unicode_tests := $(addsuffix .out, $(basename $(wildcard *\#unicode_*.t)))
|
||||
v5_tests := $(addsuffix .out, $(basename $(wildcard *\#v5_*.t)))
|
||||
xfs_tests := $(addsuffix .out.log, $(basename $(wildcard *\#xfs_*.t)))
|
||||
s05k_tests := $(addsuffix .out.log, $(basename $(wildcard *\#s05k_*.t)))
|
||||
s4k_tests := $(addsuffix .out.log, $(basename $(wildcard *\#s4k_*.t)))
|
||||
f30_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f30_*.t)))
|
||||
f70_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70_*.t)))
|
||||
f70s0_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70s0_*.t)))
|
||||
f70s1_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70s1_*.t)))
|
||||
f70s5_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70s5_*.t)))
|
||||
lookup_tests := $(addsuffix .out.log, $(basename $(wildcard *\#lookup_*.t)))
|
||||
bug_tests := $(addsuffix .out.log, $(basename $(wildcard *\#bug_*.t)))
|
||||
xattr_tests := $(addsuffix .out.log, $(basename $(wildcard *\#xattr_*.t)))
|
||||
unicode_tests := $(addsuffix .out.log, $(basename $(wildcard *\#unicode_*.t)))
|
||||
v5_tests := $(addsuffix .out.log, $(basename $(wildcard *\#v5_*.t)))
|
||||
draw_tests := $(addsuffix .out.log, $(basename $(wildcard *\#draw_*.t)))
|
||||
|
||||
all: xfs s05k s4k f30 f70 f70s0 f70s1 f70s5 lookup bug xattr unicode v5
|
||||
all: xfs s05k s4k f30 f70 f70s0 f70s1 f70s5 lookup bug xattr unicode v5 draw
|
||||
@echo all tests passed
|
||||
|
||||
xfs: $(xfs_tests)
|
||||
@ -30,8 +31,9 @@ bug: $(bug_tests)
|
||||
xattr: $(xattr_tests)
|
||||
unicode: $(unicode_tests)
|
||||
v5: $(v5_tests)
|
||||
draw: $(draw_tests)
|
||||
|
||||
%.out: %.ref %.t
|
||||
$(UMKA_SHELL) < $(word 2, $^) > $@
|
||||
cmp $@ $<
|
||||
|
||||
%.out.log: %.ref.log %.t
|
||||
$(UMKA_SHELL) < $*.t > $@
|
||||
@ cmp $@ $<
|
||||
@ if [ -f "$*.ref.png" ]; then cmp $*.out.png $*.ref.png; fi
|
||||
|
28
umka_shell.c
28
umka_shell.c
@ -33,6 +33,7 @@
|
||||
#include "kolibri.h"
|
||||
#include "syscalls.h"
|
||||
#include "trace.h"
|
||||
#include "lodepng.h"
|
||||
|
||||
#define PATH_MAX 4096
|
||||
#define FGETS_BUF_LEN 4096
|
||||
@ -485,6 +486,14 @@ void kofu_draw_rect(int argc, char **argv) {
|
||||
umka_sys_draw_rect(x, xsize, y, ysize, color, gradient);
|
||||
}
|
||||
|
||||
void kofu_get_screen_size(int argc, char **argv) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
uint32_t xsize, ysize;
|
||||
umka_sys_get_screen_size(&xsize, &ysize);
|
||||
printf("%" PRIu32 "x%" PRIu32 "\n", xsize, ysize);
|
||||
}
|
||||
|
||||
void kofu_draw_line(int argc, char **argv) {
|
||||
size_t x = strtoul(argv[1], NULL, 0);
|
||||
size_t xend = strtoul(argv[2], NULL, 0);
|
||||
@ -564,18 +573,18 @@ void kofu_blit_bitmap(int argc, char **argv) {
|
||||
|
||||
void kofu_scrot(int argc, char **argv) {
|
||||
(void)argc;
|
||||
FILE *img = fopen(argv[1], "w");
|
||||
// const char *header = "P6\n1024 768\n255\n";
|
||||
// fwrite(header, strlen(header), 1, img);
|
||||
uint32_t xsize, ysize;
|
||||
umka_sys_get_screen_size(&xsize, &ysize);
|
||||
|
||||
uint32_t *lfb = kos_lfb_base;
|
||||
for (int y = 0; y < 300; y++) {
|
||||
for (int x = 0; x < 400; x++) {
|
||||
uint32_t p = *lfb++;
|
||||
p |= 0xff000000;
|
||||
fwrite(&p, 4, 1, img);
|
||||
for (size_t y = 0; y < ysize; y++) {
|
||||
for (size_t x = 0; x < xsize; x++) {
|
||||
*lfb++ |= 0xff000000;
|
||||
}
|
||||
}
|
||||
fclose(img);
|
||||
|
||||
unsigned error = lodepng_encode32_file(argv[1], (const unsigned char *)kos_lfb_base, xsize, ysize);
|
||||
if(error) printf("error %u: %s\n", error, lodepng_error_text(error));
|
||||
}
|
||||
|
||||
void kofu_cd(int argc, char **argv) {
|
||||
@ -876,6 +885,7 @@ func_table_t funcs[] = {
|
||||
{ "process_info", kofu_process_info },
|
||||
{ "window_redraw", kofu_window_redraw },
|
||||
{ "draw_rect", kofu_draw_rect },
|
||||
{ "get_screen_size", kofu_get_screen_size },
|
||||
{ "draw_line", kofu_draw_line },
|
||||
{ "display_number", kofu_display_number },
|
||||
{ "set_button_style", kofu_set_button_style },
|
||||
|
Loading…
Reference in New Issue
Block a user