From 58d202d275eb3887524f1f784f9cfab720bef26c Mon Sep 17 00:00:00 2001 From: Pere Pujal i Carabantes Date: Wed, 29 Apr 2015 00:34:02 +0200 Subject: [PATCH] Progressbar seems to work again --- src/dirwalk.c | 10 +++---- src/dirwalk.h | 4 +-- src/fonts.c | 74 +++++++++++++++++++++++------------------------ src/fonts.h | 6 ++-- src/progressbar.c | 17 +++++++++-- src/progressbar.h | 2 +- src/tuxpaint.c | 17 +++++++---- 7 files changed, 74 insertions(+), 56 deletions(-) diff --git a/src/dirwalk.c b/src/dirwalk.c index 8aabf02c1..b55c57435 100644 --- a/src/dirwalk.c +++ b/src/dirwalk.c @@ -67,7 +67,7 @@ ///////////////// directory walking callers and callbacks ////////////////// -void loadfont_callback(SDL_Surface * screen, const char *restrict const dir, +void loadfont_callback(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, const char *restrict const dir, unsigned dirlen, tp_ftw_str * files, unsigned i, const char *restrict const locale) { dirlen = dirlen; @@ -76,7 +76,7 @@ void loadfont_callback(SDL_Surface * screen, const char *restrict const dir, { int loadable = 0; const char *restrict const cp = strchr(files[i].str, '.'); - show_progress_bar(screen); + show_progress_bar_(screen, texture, renderer); if (cp) { // need gcc 3.4 for the restrict in this location @@ -261,7 +261,7 @@ int compare_ftw_str(const void *v1, const void *v2) return -strcmp(s1, s2); /* FIXME: Should we try strcasecmp, to group things together despite uppercase/lowercase in filenames (e.g., Jigsaw* vs jigsaw* Starters)??? -bjk 2009.10.11 */ } -void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen, +void tp_ftw(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, char *restrict const dir, unsigned dirlen, int rsrc, void (*fn) (SDL_Surface * screen, const char *restrict const dir, unsigned dirlen, tp_ftw_str * files, @@ -376,7 +376,7 @@ void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen, } closedir(d); - show_progress_bar(screen); + show_progress_bar_(screen, texture, renderer); dir[dirlen] = '\0'; // repair it (clobbered for stat() call above) if (1 || file_names) // Now ALWAYS calling callback function, so stamp loader can notice top-level directories (even if there are only subdirs, and no files, inside) -bjk 2007.05.16 @@ -401,7 +401,7 @@ void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen, { memcpy(dir + dirlen, dir_names[num_dir_names].str, dir_names[num_dir_names].len + 1); - tp_ftw(screen, dir, dirlen + dir_names[num_dir_names].len, rsrc, fn, locale); + tp_ftw(screen, texture, renderer, dir, dirlen + dir_names[num_dir_names].len, rsrc, fn, locale); free(dir_names[num_dir_names].str); } free(dir_names); diff --git a/src/dirwalk.h b/src/dirwalk.h index ad1bdfd39..61339e9f0 100644 --- a/src/dirwalk.h +++ b/src/dirwalk.h @@ -45,10 +45,10 @@ typedef struct tp_ftw_str } tp_ftw_str; -void loadfont_callback(SDL_Surface * screen, const char *restrict const dir, +void loadfont_callback(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, const char *restrict const dir, unsigned dirlen, tp_ftw_str * files, unsigned i, const char *restrict const locale); int compare_ftw_str(const void *v1, const void *v2); -void tp_ftw(SDL_Surface * screen, char *restrict const dir, unsigned dirlen, +void tp_ftw(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, char *restrict const dir, unsigned dirlen, int rsrc, void (*fn) (SDL_Surface * screen, const char *restrict const dir, unsigned dirlen, tp_ftw_str * files, diff --git a/src/fonts.c b/src/fonts.c index cce8c2787..4c853edd3 100644 --- a/src/fonts.c +++ b/src/fonts.c @@ -927,79 +927,79 @@ static void groupfonts(void) } -static void loadfonts_locale_filter(SDL_Surface * screen, const char *const dir, const char *restrict const locale) +static void loadfonts_locale_filter(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, const char *const dir, const char *restrict const locale) { char buf[TP_FTW_PATHSIZE]; unsigned dirlen = strlen(dir); memcpy(buf, dir, dirlen); - tp_ftw(screen, buf, dirlen, 1, loadfont_callback, locale); + tp_ftw(screen, texture, renderer, buf, dirlen, 1, loadfont_callback, locale); } -static void loadfonts(SDL_Surface * screen, const char *const dir) +static void loadfonts(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, const char *const dir) { - loadfonts_locale_filter(screen, dir, NULL); + loadfonts_locale_filter(screen, texture, renderer, dir, NULL); } -/* static */ int load_user_fonts(SDL_Surface * screen, void *vp, const char *restrict const locale) +/* static */ int load_user_fonts(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, void *vp, const char *restrict const locale) { char *homedirdir; (void) vp; // junk passed by threading library - loadfonts_locale_filter(screen, DATA_PREFIX "fonts", locale); + loadfonts_locale_filter(screen, texture, renderer, DATA_PREFIX "fonts", locale); if (!no_system_fonts) { #ifdef WIN32 homedirdir = GetSystemFontDir(); - loadfonts(screen, homedirdir); + loadfonts(screen, texture, renderer, homedirdir); free(homedirdir); #elif defined(__BEOS__) - loadfonts(screen, "/boot/home/config/font/ttffonts"); - loadfonts(screen, "/usr/share/fonts"); - loadfonts(screen, "/usr/X11R6/lib/X11/fonts"); + loadfonts(screen, texture, renderer, "/boot/home/config/font/ttffonts"); + loadfonts(screen, texture, renderer, "/usr/share/fonts"); + loadfonts(screen, texture, renderer, "/usr/X11R6/lib/X11/fonts"); #elif defined(__HAIKU__) dev_t volume = dev_for_path("/boot"); char buffer[B_PATH_NAME_LENGTH+B_FILE_NAME_LENGTH]; status_t result; result = find_directory(B_SYSTEM_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer)); - loadfonts(screen, buffer); + loadfonts(screen, texture, renderer, buffer); result = find_directory(B_COMMON_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer)); - loadfonts(screen, buffer); + loadfonts(screen, texture, renderer, buffer); result = find_directory(B_USER_FONTS_DIRECTORY, volume, false, buffer, sizeof(buffer)); - loadfonts(screen, buffer); + loadfonts(screen, texture, renderer, buffer); #elif defined(__APPLE__) - loadfonts(screen, "/System/Library/Fonts"); - loadfonts(screen, "/Library/Fonts"); - loadfonts(screen, macosx.fontsPath); - loadfonts(screen, "/usr/share/fonts"); - loadfonts(screen, "/usr/X11R6/lib/X11/fonts"); + loadfonts(screen, texture, renderer, "/System/Library/Fonts"); + loadfonts(screen, texture, renderer, "/Library/Fonts"); + loadfonts(screen, texture, renderer, macosx.fontsPath); + loadfonts(screen, texture, renderer, "/usr/share/fonts"); + loadfonts(screen, texture, renderer, "/usr/X11R6/lib/X11/fonts"); #elif defined(__sun__) - loadfonts(screen, "/usr/openwin/lib/X11/fonts"); - loadfonts(screen, "/usr/share/fonts"); - loadfonts(screen, "/usr/X11R6/lib/X11/fonts"); + loadfonts(screen, texture, renderer, "/usr/openwin/lib/X11/fonts"); + loadfonts(screen, texture, renderer, "/usr/share/fonts"); + loadfonts(screen, texture, renderer, "/usr/X11R6/lib/X11/fonts"); #else - loadfonts(screen, "/usr/share/feh/fonts"); - loadfonts(screen, "/usr/share/fonts"); - loadfonts(screen, "/usr/X11R6/lib/X11/fonts"); - loadfonts(screen, "/usr/share/texmf/fonts"); - loadfonts(screen, "/usr/share/grace/fonts/type1"); - loadfonts(screen, "/usr/share/hatman/fonts"); - loadfonts(screen, "/usr/share/icewm/themes/jim-mac"); - loadfonts(screen, "/usr/share/vlc/skins2/fonts"); - loadfonts(screen, "/usr/share/xplanet/fonts"); + loadfonts(screen, texture, renderer, "/usr/share/feh/fonts"); + loadfonts(screen, texture, renderer, "/usr/share/fonts"); + loadfonts(screen, texture, renderer, "/usr/X11R6/lib/X11/fonts"); + loadfonts(screen, texture, renderer, "/usr/share/texmf/fonts"); + loadfonts(screen, texture, renderer, "/usr/share/grace/fonts/type1"); + loadfonts(screen, texture, renderer, "/usr/share/hatman/fonts"); + loadfonts(screen, texture, renderer, "/usr/share/icewm/themes/jim-mac"); + loadfonts(screen, texture, renderer, "/usr/share/vlc/skins2/fonts"); + loadfonts(screen, texture, renderer, "/usr/share/xplanet/fonts"); #endif } homedirdir = get_fname("fonts", DIR_DATA); - loadfonts(screen, homedirdir); + loadfonts(screen, texture, renderer, homedirdir); free(homedirdir); #ifdef WIN32 homedirdir = get_fname("data/fonts", DIR_DATA); - loadfonts(screen, homedirdir); + loadfonts(screen, texture, renderer, homedirdir); free(homedirdir); #endif @@ -1014,7 +1014,7 @@ static void loadfonts(SDL_Surface * screen, const char *const dir) #ifdef FORKED_FONTS -void run_font_scanner(SDL_Surface * screen, const char *restrict const locale) +void run_font_scanner(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, const char *restrict const locale) { int sv[2]; int size, i; @@ -1044,7 +1044,7 @@ void run_font_scanner(SDL_Surface * screen, const char *restrict const locale) sched_yield(); // try to let the parent run right now SDL_Init(SDL_INIT_NOPARACHUTE); TTF_Init(); - load_user_fonts(screen, NULL, locale); + load_user_fonts(screen, texture, renderer, NULL, locale); size = 0; i = num_font_families; @@ -1144,7 +1144,7 @@ void run_font_scanner(SDL_Surface * screen, const char *restrict const locale) } -void receive_some_font_info(SDL_Surface * screen) +void receive_some_font_info(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer) { char *buf = NULL; unsigned buf_size = 0; @@ -1182,7 +1182,7 @@ void receive_some_font_info(SDL_Surface * screen) p = (struct pollfd) { font_socket_fd, POLLIN, 0}; - show_progress_bar(screen); + show_progress_bar_(screen, texture, renderer); poll(&p, 1, 29); // try not to burn CPU time continue; case EINTR: @@ -1206,7 +1206,7 @@ void receive_some_font_info(SDL_Surface * screen) return; } - show_progress_bar(screen); + show_progress_bar_(screen, texture, renderer); walk = buf; num_font_families = *(unsigned char *) walk++; num_font_families += *(unsigned char *) walk++ << 8u; diff --git a/src/fonts.h b/src/fonts.h index 4b4b1d553..d3b18b8ba 100644 --- a/src/fonts.h +++ b/src/fonts.h @@ -114,8 +114,8 @@ int TuxPaint_Font_FontHeight(TuxPaint_Font * tpf); #ifdef FORKED_FONTS void reliable_write(int fd, const void *buf, size_t count); static void reliable_read(int fd, void *buf, size_t count); -void run_font_scanner(SDL_Surface * screen, const char *restrict const locale); -void receive_some_font_info(SDL_Surface * screen); +void run_font_scanner(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, const char *restrict const locale); +void receive_some_font_info(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer); #endif ////////////////////////////////////////////////////////////////////// @@ -194,6 +194,6 @@ TuxPaint_Font *load_locale_font(TuxPaint_Font * fallback, int size); void sdl_color_to_pango_color(SDL_Color sdl_color, SDLPango_Matrix *pango_color); #endif -int load_user_fonts(SDL_Surface * screen, void *vp, const char *restrict const locale); +int load_user_fonts(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer, void *vp, const char *restrict const locale); #endif diff --git a/src/progressbar.c b/src/progressbar.c index c2341ff4c..c049b64f7 100644 --- a/src/progressbar.c +++ b/src/progressbar.c @@ -34,9 +34,9 @@ SDL_Surface *img_progress; int progress_bar_disabled, prog_bar_ctr; -void show_progress_bar(SDL_Surface * screen) +void show_progress_bar_(SDL_Surface * screen, SDL_Texture *texture, SDL_Renderer *renderer) { - SDL_Rect dest, src; + SDL_Rect dest, src, r; int x; static Uint32 oldtime; Uint32 newtime; @@ -64,6 +64,19 @@ void show_progress_bar(SDL_Surface * screen) // FIXME SDL2 // SDL_UpdateRect(screen, 0, screen->h - 24, screen->w, 24); + r.x = 0; + r.y = screen->h - 24; + r.w = screen->w; + r.h = 24; + + SDL_UpdateTexture(texture, &r, screen->pixels + ((screen->h - 24) * screen->pitch), screen->pitch); + + // NOTE docs says one should clear the renderer, however this means a refresh of the whole thing. + // SDL_RenderClear(renderer); + // SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderCopy(renderer, texture, &r, &r); + + SDL_RenderPresent(renderer); } oldtime = newtime; diff --git a/src/progressbar.h b/src/progressbar.h index 7e72f30d8..75df115e9 100644 --- a/src/progressbar.h +++ b/src/progressbar.h @@ -36,6 +36,6 @@ extern SDL_Surface *img_progress; extern int progress_bar_disabled, prog_bar_ctr; -void show_progress_bar(SDL_Surface * screen); +void show_progress_bar_(SDL_Surface * screen, SDL_Texture *texture, SDL_Renderer *renderer); #endif diff --git a/src/tuxpaint.c b/src/tuxpaint.c index 1943f1285..a2e502e14 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -915,6 +915,11 @@ static void SDL_UpdateRect(SDL_Surface * screen, Sint32 x, Sint32 y, Sint32 w, S SDL_RenderPresent(renderer); } +static void show_progress_bar(SDL_Surface * screen) +{ + show_progress_bar_(screen, texture, renderer); +} + /* Update a rect. based on two x/y coords (not necessarly in order): */ static void update_screen(int x1, int y1, int x2, int y2) @@ -3129,7 +3134,7 @@ printf("screenrectr_tools %d, %d, %d, %d\n", r_tools.x, r_tools.y, r_tools.w, r_ waiting_for_fonts = 1; #ifdef FORKED_FONTS - receive_some_font_info(screen); + receive_some_font_info(screen, texture, renderer); #else while (!font_thread_done && !font_thread_aborted) { @@ -6608,7 +6613,7 @@ static void load_brush_dir(SDL_Surface * screen, const char *restrict const dir) unsigned dirlen = strlen(dir); memcpy(buf, dir, dirlen); - tp_ftw(screen, buf, dirlen, 0, loadbrush_callback, NULL); + tp_ftw(screen, texture, renderer, buf, dirlen, 0, loadbrush_callback, NULL); } SDL_Surface *mirror_surface(SDL_Surface * s) @@ -7538,7 +7543,7 @@ static void load_stamp_dir(SDL_Surface * screen, const char *const dir) unsigned dirlen = strlen(dir); memcpy(buf, dir, dirlen); load_stamp_basedir = dir; - tp_ftw(screen, buf, dirlen, 0, loadstamp_callback, NULL); + tp_ftw(screen, texture, renderer, buf, dirlen, 0, loadstamp_callback, NULL); } @@ -7574,7 +7579,7 @@ static void load_stamps(SDL_Surface * screen) #ifndef FORKED_FONTS static int load_user_fonts_stub(void *vp) { - return load_user_fonts(screen, vp, NULL); + return load_user_fonts(screen, texture, renderer, vp, NULL); } #endif @@ -23568,7 +23573,7 @@ VIDEO_BPP, SDL_SWSURFACE);*/ #ifdef DEBUG printf("Now running font scanner\n"); fflush(stdout); #endif - run_font_scanner(screen, lang_prefixes[get_current_language()]); + run_font_scanner(screen, texture, renderer, lang_prefixes[get_current_language()]); #endif #endif @@ -24318,7 +24323,7 @@ int main(int argc, char *argv[]) #ifdef DEBUG printf("Running font scanner\n"); fflush(stdout); #endif - run_font_scanner(screen, lang_prefixes[get_current_language()]); + run_font_scanner(screen, texture, renderer, lang_prefixes[get_current_language()]); #else #ifdef DEBUG printf("NOT running font scanner\n"); fflush(stdout);