julia: usability improvements; progressive rendering
This commit is contained in:
parent
671bc064c7
commit
ef32ed5892
110
apps/julia.c
110
apps/julia.c
@ -200,34 +200,100 @@ void usage(char * argv[]) {
|
|||||||
|
|
||||||
static void decors() {
|
static void decors() {
|
||||||
render_decorations(window, ctx, "Julia Fractals");
|
render_decorations(window, ctx, "Julia Fractals");
|
||||||
|
flip(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void redraw() {
|
static void do_line(gfx_context_t * ctx, int j) {
|
||||||
|
for (int i = 0; i < width; ++i) {
|
||||||
|
GFX_(i,j) = julia(i,j);
|
||||||
|
}
|
||||||
|
memcpy(&GFXR(ctx,0,decor_top_height+j),&GFX(ctx,0,decor_top_height+j),ctx->stride);
|
||||||
|
yutani_flip_region(yctx, window, decor_left_width, decor_top_height + j, width, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int step_res;
|
||||||
|
static int step_n;
|
||||||
|
static int step_y;
|
||||||
|
static int step_i;
|
||||||
|
static int processing = 0;
|
||||||
|
static clock_t time_before;
|
||||||
|
#define START_POINT -4
|
||||||
|
|
||||||
|
void start_processing(void) {
|
||||||
float _x = Maxx - Minx;
|
float _x = Maxx - Minx;
|
||||||
float _y = _x / width * height;
|
float _y = _x / width * height;
|
||||||
|
|
||||||
Miny = 0 - _y / 2;
|
Miny = 0 - _y / 2;
|
||||||
Maxy = _y / 2;
|
Maxy = _y / 2;
|
||||||
|
|
||||||
decors();
|
|
||||||
|
|
||||||
pixcorx = (Maxx - Minx) / width;
|
pixcorx = (Maxx - Minx) / width;
|
||||||
pixcory = (Maxy - Miny) / height;
|
pixcory = (Maxy - Miny) / height;
|
||||||
|
|
||||||
clock_t time_before = clock();
|
step_n = START_POINT;
|
||||||
|
step_y = 0;
|
||||||
|
step_i = 0;
|
||||||
|
step_res = 64;
|
||||||
|
|
||||||
for (int j = 0; j < height; ++j) {
|
processing = 1;
|
||||||
for (int i = 0; i < width; ++i) {
|
draw_fill(ctx, rgb(0,0,0));
|
||||||
GFX_(i,j) = julia(i,j);
|
|
||||||
}
|
|
||||||
yutani_flip_region(yctx, window, decor_left_width, decor_top_height + j, width, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
decors();
|
||||||
|
yutani_flip(yctx, window);
|
||||||
|
|
||||||
|
time_before = clock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_label(void) {
|
||||||
clock_t time_after = clock();
|
clock_t time_after = clock();
|
||||||
|
|
||||||
char description[100];
|
char description[100];
|
||||||
snprintf(description, 100, "<i>c</i> = %g + %g<i>i</i>, %ld ms", conx, cony, (time_after - time_before) / 1000);
|
snprintf(description, 100, "<i>c</i> = %g + %g<i>i</i>, %ld ms%s", conx, cony, (time_after - time_before) / 1000, step_n == 0 ? "*" : "");
|
||||||
markup_draw_string(ctx, decor_left_width + 2, window->height - decor_bottom_height - 2, description, rgb(255,255,255));
|
markup_draw_string(ctx, decor_left_width + 2, window->height - decor_bottom_height - 2, description, rgb(255,255,255));
|
||||||
|
flip(ctx);
|
||||||
|
yutani_flip(yctx,window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void step_once(void) {
|
||||||
|
if (step_n < 0 && step_y > height) {
|
||||||
|
flip(ctx);
|
||||||
|
yutani_flip(yctx,window);
|
||||||
|
step_res /= 2;
|
||||||
|
step_y = 0;
|
||||||
|
step_i = 0;
|
||||||
|
step_n++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (step_n >= height) {
|
||||||
|
processing = 0;
|
||||||
|
draw_label();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (step_n == 0) {
|
||||||
|
draw_label();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (step_n < 0) {
|
||||||
|
for (int x = 0, i = 0; x < width; x += step_res, i++) {
|
||||||
|
if ((step_n != START_POINT) && (step_i & 1) == 0 && (i & 1) == 0) continue;
|
||||||
|
|
||||||
|
uint32_t c = julia(x,step_y);
|
||||||
|
for (int _y = 0; _y < step_res && _y + step_y < height; _y++) {
|
||||||
|
for (int _x = 0; _x < step_res && _x + x < width; _x++) {
|
||||||
|
GFX_(_x+x,_y+step_y) = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
step_i += 1;
|
||||||
|
step_y += step_res;
|
||||||
|
} else if (step_n % 2) {
|
||||||
|
do_line(ctx,height/2 + step_n/2);
|
||||||
|
step_n++;
|
||||||
|
} else {
|
||||||
|
do_line(ctx,height/2 - step_n/2 - 1);
|
||||||
|
step_n++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize_finish(int w, int h) {
|
void resize_finish(int w, int h) {
|
||||||
@ -247,11 +313,8 @@ void resize_finish(int w, int h) {
|
|||||||
width = w - decor_left_width - decor_right_width;
|
width = w - decor_left_width - decor_right_width;
|
||||||
height = h - decor_top_height - decor_bottom_height;
|
height = h - decor_top_height - decor_bottom_height;
|
||||||
|
|
||||||
draw_fill(ctx, rgb(0,0,0));
|
start_processing();
|
||||||
decors();
|
|
||||||
yutani_window_resize_done(yctx, window);
|
yutani_window_resize_done(yctx, window);
|
||||||
|
|
||||||
redraw();
|
|
||||||
yutani_flip(yctx, window);
|
yutani_flip(yctx, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,18 +410,24 @@ int main(int argc, char * argv[]) {
|
|||||||
|
|
||||||
yutani_window_advertise_icon(yctx, window, "Julia Fractals", "julia");
|
yutani_window_advertise_icon(yctx, window, "Julia Fractals", "julia");
|
||||||
|
|
||||||
ctx = init_graphics_yutani(window);
|
ctx = init_graphics_yutani_double_buffer(window);
|
||||||
|
|
||||||
initialize_palette();
|
initialize_palette();
|
||||||
|
|
||||||
redraw();
|
start_processing();
|
||||||
yutani_flip(yctx, window);
|
|
||||||
|
|
||||||
int playing = 1;
|
int playing = 1;
|
||||||
int needs_redraw = 0;
|
int needs_redraw = 0;
|
||||||
|
|
||||||
while (playing) {
|
while (playing) {
|
||||||
|
|
||||||
|
if (processing && !yutani_query(yctx)) {
|
||||||
|
step_once();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
yutani_msg_t * m = yutani_poll(yctx);
|
yutani_msg_t * m = yutani_poll(yctx);
|
||||||
|
|
||||||
while (m) {
|
while (m) {
|
||||||
if (menu_process_event(yctx, m)) {
|
if (menu_process_event(yctx, m)) {
|
||||||
/* just decorations should be fine */
|
/* just decorations should be fine */
|
||||||
@ -445,8 +514,7 @@ int main(int argc, char * argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (needs_redraw) {
|
if (needs_redraw) {
|
||||||
redraw();
|
start_processing();
|
||||||
yutani_flip(yctx, window);
|
|
||||||
needs_redraw = 0;
|
needs_redraw = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user