Files
buildroot/package/miyoo/sdlbook/0006-define-RENDER_ONEPAGE-to-omit-following-page-bufferi.patch
Apaczer 59d7586ca6 BOARD: separate miyoo packages + concentrate RetroArch/libretro (#129)
MENU->Target packages ---> Miyoo Packages ---> ...
2024-10-15 20:07:21 +02:00

156 lines
5.2 KiB
Diff

From a999470df6328f26b59f88e18396a3e6c8d3466d Mon Sep 17 00:00:00 2001
From: Apaczer <94932128+Apaczer@users.noreply.github.com>
Date: Fri, 26 Apr 2024 21:19:20 +0200
Subject: [PATCH 6/7] define RENDER_ONEPAGE to omit following page buffering
- increases image swapping time with minimal RAM
- use get_page_bottom() to differentiate page size height
- change to start page with PAGEDOWN/UP keys
---
sdlbook.c | 64 +++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 53 insertions(+), 11 deletions(-)
diff --git a/sdlbook.c b/sdlbook.c
index 535a194..5d939e8 100644
--- a/sdlbook.c
+++ b/sdlbook.c
@@ -151,6 +151,14 @@ static void init_gfx() {
if(!spritesheet_init(&ss_font, bmp_font, FONT_W, FONT_H)) dprintf(2, "oops\n");
}
+static int get_page_bottom() {
+#ifndef RENDER_ONEPAGE
+ return page_dims.h;
+#else
+ return page_dims.h/2;
+#endif
+}
+
static int get_font_width(char letter) {
return ss_font.sprite_w;
}
@@ -184,7 +192,8 @@ static void draw() {
unsigned *ptr;
unsigned pitch;
int xoff = MAX((int)(ezsdl_get_width() - page_dims.w)/2, 0);
- int xmax = page_dims.w, ymax = page_dims.h*2;
+ int xmax = page_dims.w;
+ int ymax = get_page_bottom()*2;
if(scroll_line_v > ymax) return;
ymax = MIN(ezsdl_get_height(), ymax-scroll_line_v),
xmax = MIN(ezsdl_get_width(), xmax-scroll_line_h);
@@ -221,7 +230,7 @@ static void draw_borders() {
static void draw_bottom() {
int x, y, yline;
int xmax, ymax, ymin;
- ymin = page_dims.h*2-scroll_line_v;
+ ymin = get_page_bottom()*2-scroll_line_v;
if(ymin < 0) return;
void *pixels;
unsigned *ptr;
@@ -435,7 +444,10 @@ static void* prep_page(int pageno, ddjvu_rect_t *res_rect, ddjvu_rect_t *desired
}
static void* prep_pages(int *need_redraw) {
- ddjvu_rect_t p1rect, p2rect;
+ ddjvu_rect_t p1rect;
+#ifndef RENDER_ONEPAGE
+ ddjvu_rect_t p2rect;
+#endif
static int last_page = -1, last_scale = -1;
if(curr_page == last_page && last_scale == config_data.scale)
return image_data;
@@ -443,6 +455,7 @@ static void* prep_pages(int *need_redraw) {
last_scale = config_data.scale;
if(need_redraw) *need_redraw = 1;
char *p1data = prep_page(curr_page, &p1rect, 0);
+#ifndef RENDER_ONEPAGE
char *p2data = prep_page(curr_page+1, &p2rect, 0);
if(!p2data) {
/* probably last page hit */
@@ -457,15 +470,22 @@ static void* prep_pages(int *need_redraw) {
}
if(!(p1data && p2data)) return NULL;
assert(p1rect.w == p2rect.w && p1rect.h == p2rect.h);
+ int stored_images = 2;
+#else
+ if(!(p1data)) return NULL;
+ int stored_images = 1;
+#endif
size_t one_pic = p1rect.w*p1rect.h;
- unsigned* imgbuf = malloc(4 * one_pic * 2);
+ unsigned* imgbuf = malloc(4 * one_pic * stored_images);
convert_rgb24_to_rgba(p1data, p1rect.w, p1rect.h, imgbuf);
- convert_rgb24_to_rgba(p2data, p2rect.w, p2rect.h, imgbuf+one_pic);
page_dims = p1rect;
free(p1data);
+#ifndef RENDER_ONEPAGE
+ convert_rgb24_to_rgba(p2data, p2rect.w, p2rect.h, imgbuf+one_pic);
free(p2data);
+#endif
return imgbuf;
}
@@ -531,17 +551,39 @@ static int change_scale(int incr) {
static int change_scroll_v(int incr) {
int need_redraw = 1;
+#ifndef RENDER_ONEPAGE
+ int page_bottom_prv = scroll_line_v + incr + get_page_bottom();
+#else
+ int page_bottom_prv = scroll_line_v + get_page_bottom()*2 - ezsdl_get_height();
+
+ if(ezsdl_get_height() + incr >= page_dims.h || abs(incr) == get_page_bottom()) {
+ scroll_line_v = 0;
+ change_page(incr > 0 ? +1 : -1);
+ return need_redraw;
+ }
+#endif
if(scroll_line_v + incr < 0) {
if(curr_page == 0) scroll_line_v = 0;
else {
need_redraw = change_page(-1);
- scroll_line_v = MAX(scroll_line_v + incr + (int)page_dims.h, 0);
+ scroll_line_v = MAX(page_bottom_prv, 0);
}
- } else if(scroll_line_v + incr > page_dims.h/2 && curr_page >= page_count-1) {
+#ifndef RENDER_ONEPAGE
+ } else if(scroll_line_v + incr > (int)page_dims.h/2 && curr_page >= page_count-1) {
scroll_line_v = (int)page_dims.h/2;
- } else if(scroll_line_v + incr > page_dims.h) {
- scroll_line_v = scroll_line_v + incr - (int)page_dims.h;
+ } else if(scroll_line_v + incr > get_page_bottom()) {
+ scroll_line_v = scroll_line_v + incr - get_page_bottom();
need_redraw = change_page(+1);
+#else
+ } else if(scroll_line_v + incr > page_dims.h - ezsdl_get_height() && curr_page >= page_count-1) {
+ scroll_line_v = MAX((int)page_dims.h - ezsdl_get_height(),0);
+ } else if(scroll_line_v + incr > get_page_bottom() && ezsdl_get_height() > get_page_bottom()) {
+ scroll_line_v = scroll_line_v + incr - get_page_bottom();
+ need_redraw = change_page(+1);
+ } else if(scroll_line_v + incr > page_dims.h - ezsdl_get_height() && incr > 0) {
+ scroll_line_v = scroll_line_v + incr + ezsdl_get_height() - (int)page_dims.h;
+ need_redraw = change_page(+1);
+#endif
} else
scroll_line_v += incr;
return need_redraw;
@@ -849,10 +891,10 @@ int main(int argc, char **argv) {
need_redraw = change_scale(-10);
break;
case INPUT_PGDOWN:
- scroll_dist_v += page_dims.h;
+ scroll_dist_v += get_page_bottom();
break;
case INPUT_PGUP:
- scroll_dist_v -= page_dims.h;
+ scroll_dist_v -= get_page_bottom();
break;
case INPUT_UP:
if((event.mod & KMOD_LCTRL) || (event.mod & KMOD_RCTRL))
--
2.34.1