Data like brushes, starters,... now is loaded from assets in the android port, failed to merge some stuff...

This commit is contained in:
Pere Pujal i Carabantes 2018-01-19 08:53:49 +01:00
parent c6117bf501
commit df13e8d1bc
3 changed files with 160 additions and 28 deletions

View file

@ -39,6 +39,9 @@
#include "dirwalk.h"
#include "progressbar.h"
#ifdef __ANDROID__
#include "android_assets.h"
#endif
/*
The following section renames global variables defined in SDL_Pango.h to avoid errors during linking.
@ -278,20 +281,69 @@ void tp_ftw(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer
tp_ftw_str *dir_names = NULL;
int d_namlen;
int add_rsrc;
unsigned dlen;
dir[dirlen++] = '/';
dir[dirlen] = '\0';
//printf("processing directory %s %d\n", dir, dirlen);
dlen = dirlen;
/* Open the directory: */
d = opendir(dir);
#ifdef __ANDROID__
char *di;
AAssetDir *adir;
if (!d) /* Fallback into assets */
{
/* Remove the trailing '/' */
dlen = strlen(dir) - 1;
di = strndup(dir, dlen);
adir = open_asset_dir(di);
if (!adir)
return;
}
#else
if (!d)
return;
#endif
for (;;)
{
struct dirent *f = readdir(d);
struct dirent *f;
if (d)
f = readdir(d);
int filetype = TP_FTW_UNKNOWN;
#ifdef __ANDROID__
char *afilename;
if (!d)
{
afilename = AAssetDir_getNextFileName(adir);
if (afilename)
{
f = malloc(sizeof(struct dirent));
strncpy(f->d_name, afilename, sizeof(f->d_name));
f->d_type = DT_REG;
/* There is not _DIRENT_HAVE_D_NAMLEN currently on Android 4.3, but who knows in the future... */
#if defined(_DIRENT_HAVE_D_NAMLEN)
f->d_namlen = strlen(f->d_name);
#endif
/* AAssetDir_getNextFileName() only lists files, not (sub)dirs,
and we don't put any device or special file inside assets,
so it is a regular file */
filetype = TP_FTW_NORMAL;
}
else
break;
}
#endif
if (!f)
break;
if (f->d_name[0] == '.')
@ -393,7 +445,12 @@ void tp_ftw(SDL_Surface * screen, SDL_Texture * texture, SDL_Renderer * renderer
}
free(file_names);
#else
fn(screen, texture, renderer, dir, dirlen, file_names, num_file_names, locale);
#ifdef __ANDROID__
if (dlen != dirlen) /* First case only happens in Android files coming from assets */
fn(screen, texture, renderer, di, dlen, file_names, num_file_names, locale);
else
#endif
fn(screen, texture, renderer, dir, dirlen, file_names, num_file_names, locale);
#endif
}

View file

@ -45,7 +45,7 @@ void show_progress_bar_(SDL_Surface * screen, SDL_Texture * texture, SDL_Rendere
return;
newtime = SDL_GetTicks();
if (newtime > oldtime + 15) // trying not to eat some serious CPU time!
if (newtime > oldtime + 15) /* trying not to eat some serious CPU time! */
{
for (x = 0; x < screen->w; x = x + 65)
{
@ -62,8 +62,6 @@ void show_progress_bar_(SDL_Surface * screen, SDL_Texture * texture, SDL_Rendere
prog_bar_ctr++;
// FIXME SDL2
// SDL_UpdateRect(screen, 0, screen->h - 24, screen->w, 24);
r.x = 0;
r.y = screen->h - 24;
r.w = screen->w;
@ -71,11 +69,9 @@ void show_progress_bar_(SDL_Surface * screen, SDL_Texture * texture, SDL_Rendere
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);
/* Docs says one should clear the renderer, even if this means a refresh of the whole thing. */
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
}
oldtime = newtime;

View file

@ -47,21 +47,21 @@
#endif
#ifndef VIDEO_BPP
/*# define VIDEO_BPP 15 *//* saves memory */
/*# define VIDEO_BPP 16 *//* causes discoloration */
/*# define VIDEO_BPP 24 *//* compromise */
/*# define VIDEO_BPP 15 *//* saves memory */
/*# define VIDEO_BPP 16 *//* causes discoloration */
/*# define VIDEO_BPP 24 *//* compromise */
#define VIDEO_BPP 32 /* might be fastest, if conversion funcs removed */
#endif
/* #define CORNER_SHAPES *//* need major work! */
/* #define CORNER_SHAPES *//* need major work! */
/* Method for printing images: */
#define PRINTMETHOD_PS /* Direct to PostScript */
/*#define PRINTMETHOD_PNM_PS *//* Output PNM, assuming it gets printed */
/*#define PRINTMETHOD_PNG_PNM_PS *//* Output PNG, assuming it gets printed */
/*#define PRINTMETHOD_PNM_PS *//* Output PNM, assuming it gets printed */
/*#define PRINTMETHOD_PNG_PNM_PS *//* Output PNG, assuming it gets printed */
#define MAX_PATH 256
@ -306,6 +306,7 @@ typedef struct safer_dirent
#define AUTOSAVE_GOING_BACKGROUND
#include "android_print.h"
#include "android_assets.h"
#else
@ -562,7 +563,7 @@ static void mtw(wchar_t * wtok, char *tok)
int TP_EventFilter(void *data, const SDL_Event * event);
/* #define fmemopen_alternative *//* Uncomment this to test the fmemopen alternative in systems were fmemopen exists */
/* #define fmemopen_alternative *//* Uncomment this to test the fmemopen alternative in systems were fmemopen exists */
#if defined (WIN32) || defined (__APPLE__) || defined(__NetBSD__) || defined(__sun) || defined(__ANDROID__) /* MINGW/MSYS, NetBSD, and MacOSX need it, at least for now */
#define fmemopen_alternative
@ -676,7 +677,7 @@ typedef struct
Uint8 rows, cols;
} grid_dims;
/* static SDL_Rect r_screen; *//* was 640x480 @ 0,0 -- but this isn't so useful */
/* static SDL_Rect r_screen; *//* was 640x480 @ 0,0 -- but this isn't so useful */
static SDL_Rect r_canvas; /* was 448x376 @ 96,0 */
static SDL_Rect r_tools; /* was 96x336 @ 0,40 */
static SDL_Rect r_sfx;
@ -688,6 +689,8 @@ static SDL_Rect r_ttoolopt; /* was 96x40 @ 544,0 (title for tool options) */
static SDL_Rect r_tuxarea; /* was 640x56 */
static SDL_Rect r_label;
static SDL_Rect old_dest;
static SDL_Rect r_tir; /* Text input rectangle */
static float render_scale; /* Scale factor for the render */
static int button_w; /* was 48 */
static int button_h; /* was 48 */
@ -701,7 +704,7 @@ static grid_dims gd_tools; /* was 2x7 */
static grid_dims gd_sfx;
static grid_dims gd_toolopt; /* was 2x7 */
/* static grid_dims gd_open; *//* was 4x4 */
/* static grid_dims gd_open; *//* was 4x4 */
static grid_dims gd_colors; /* was 17x1 */
#define HEIGHTOFFSET (((WINDOW_HEIGHT - 480) / 48) * 48)
@ -2241,6 +2244,10 @@ static void mainloop(void)
valhat_y = 0;
done = 0;
keyglobal = 0;
r_tir.x = 0;
r_tir.y = 0;
r_tir.w = 0;
r_tir.h = 0;
if (NUM_TOOLS > 14 + TOOLOFFSET)
{
@ -2703,6 +2710,15 @@ static void mainloop(void)
charsize(event.key.keysym.unicode), iswprint(key_unicode) ? L"" : L"not ", key_down);
#endif
#endif
/* Set the text input rectangle for system onscreen keyboards */
if (onscreen_keyboard && !kbd)
{
r_tir.y = (float)cursor_y / render_scale;
r_tir.x = (float)cursor_x / render_scale;
SDL_SetTextInputRect(&r_tir);
SDL_StartTextInput();
}
/* Discard previous # of redraw characters */
if ((int)texttool_len <= redraw)
@ -3026,7 +3042,15 @@ static void mainloop(void)
PROMPT_TIP_LEFTCLICK_YES,
"", img_mouse, img_mouse_click, NULL, 1, event.button.x, event.button.y);
if (cur_tool == TOOL_TEXT || cur_tool == TOOL_LABEL)
do_render_cur_text(0);
{
if (onscreen_keyboard && !kbd)
{
r_tir.y = (float)event.button.y / render_scale;
SDL_SetTextInputRect(&r_tir);
SDL_StartTextInput();
}
do_render_cur_text(0);
}
draw_tux_text(TUX_BORED, "", 0);
}
}
@ -3156,6 +3180,8 @@ static void mainloop(void)
if (onscreen_keyboard && !kbd)
{
r_tir.y = (float)event.button.y / render_scale;
SDL_SetTextInputRect(&r_tir);
SDL_StartTextInput();
}
if (!font_thread_done)
@ -4465,6 +4491,13 @@ static void mainloop(void)
}
else if (cur_tool == TOOL_TEXT || cur_tool == TOOL_LABEL)
{
if (onscreen_keyboard && !kbd)
{
r_tir.y = (float)old_y / render_scale;
SDL_SetTextInputRect(&r_tir);
SDL_StartTextInput();
}
/* Text and Label Tools! */
if (cur_tool == TOOL_LABEL && cur_label == LABEL_SELECT)
{
@ -4515,6 +4548,8 @@ static void mainloop(void)
if (onscreen_keyboard && !kbd)
{
r_tir.y = (float)old_y / render_scale;
SDL_SetTextInputRect(&r_tir);
SDL_StartTextInput();
}
do_render_cur_text(0);
@ -4595,6 +4630,8 @@ static void mainloop(void)
if (onscreen_keyboard && !kbd)
{
r_tir.y = (float)cursor_y / render_scale;
SDL_SetTextInputRect(&r_tir);
SDL_StartTextInput();
}
}
@ -7617,7 +7654,11 @@ static void load_stamps(SDL_Surface * screen)
default_stamp_size = compute_default_scale_factor(1.0);
load_stamp_dir(screen, homedirdir);
#ifndef __ANDROID__
load_stamp_dir(screen, DATA_PREFIX "stamps");
#else
load_stamp_dir(screen, ASSETS_STAMPS_DIR);
#endif
#ifdef __APPLE__
load_stamp_dir(screen, "Resources/stamps");
load_stamp_dir(screen, "/Library/Application Support/TuxPaint/stamps");
@ -13487,8 +13528,8 @@ static void do_png_embed_data(png_structp png_ptr)
for (y = 0; y < current_node->save_height; y++)
{
pix =
getpixels[current_node->label_node_surface->format->
BytesPerPixel] (current_node->label_node_surface, x, y);
getpixels[current_node->label_node_surface->format->BytesPerPixel] (current_node->
label_node_surface, x, y);
SDL_GetRGBA(pix, current_label_node->label_node_surface->format, &r, &g, &b, &a);
fwrite(&a, alpha_size, 1, lfi);
@ -16390,6 +16431,8 @@ static void do_render_cur_text(int do_blit)
w = tmp_surf->w;
h = tmp_surf->h;
r_tir.h = (float)tmp_surf->h / render_scale;
r_tir.w = (float)tmp_surf->w / render_scale;
cursor_textwidth = w;
}
@ -18503,6 +18546,33 @@ static int do_new_dialog(void)
closedir(d);
}
#ifdef __ANDROID__
else if (dirname[places_to_look][0] != "/")
{
/* Try inside android assets only if it is a relative path */
AAssetDir *ad = open_asset_dir(dirname[places_to_look]);
const char *afilename = (const char *)NULL;
while ((afilename = AAssetDir_getNextFileName(ad)) != NULL)
{
f = malloc(sizeof(struct dirent));
strncpy(f->d_name, afilename, sizeof(f->d_name));
memcpy(&(fs[num_files_in_dirs].f), f, sizeof(struct dirent));
fs[num_files_in_dirs].place = places_to_look;
free(f);
num_files_in_dirs++;
if (num_files_in_dirs >= things_alloced)
{
things_alloced = things_alloced + 32;
fs = (struct dirent2 *)realloc(fs, sizeof(struct dirent2) * things_alloced);
}
}
}
#endif
}
@ -21968,12 +22038,14 @@ static void parse_file_options(struct cfginfo *restrict tmpcfg, const char *file
*arg++ = '\0';
#ifdef __linux__
#ifndef __ANDROID__
/* Perform shell expansion */
wordexp_t result;
wordexp(arg, &result, 0);
arg = strdup(result.we_wordv[0]);
wordfree(&result);
#endif
#endif
/* FIXME: leaking mem here, but the trouble is that these
@ -21982,7 +22054,9 @@ static void parse_file_options(struct cfginfo *restrict tmpcfg, const char *file
of the strings end up being kept around */
parse_one_option(tmpcfg, str, strdup(arg), filename);
#ifdef __linux__
#ifndef __ANDROID__
free(arg);
#endif
#endif
}
fclose(fi);
@ -23004,6 +23078,7 @@ static void setup(void)
SDL_Thread *fontconfig_thread;
#endif
render_scale = 1.0;
#ifdef _WIN32
@ -23027,9 +23102,7 @@ static void setup(void)
if (disable_screensaver == 0)
{
putenv((char *)"SDL_VIDEO_ALLOW_SCREENSAVER=1");
if (SDL_MAJOR_VERSION < 1 ||
(SDL_MAJOR_VERSION >= 1 && SDL_MINOR_VERSION < 2) ||
(SDL_MAJOR_VERSION >= 1 && SDL_MINOR_VERSION >= 2 && SDL_PATCHLEVEL < 12))
if (SDL_MAJOR_VERSION < 2 || (SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL < 2))
{
fprintf(stderr, "Note: 'allowscreensaver' requires SDL 1.2.12 or higher\n");
}
@ -23245,6 +23318,7 @@ static void setup(void)
/* Keep things squared */
ww = window_scale_w * ww;
hh = window_scale_w * hh;
render_scale = window_scale_w;
SDL_RenderSetScale(renderer, window_scale_w, window_scale_w);
}
@ -23252,6 +23326,7 @@ static void setup(void)
{
ww = window_scale_h * ww;
hh = window_scale_h * hh;
render_scale = window_scale_h;
SDL_RenderSetScale(renderer, window_scale_h, window_scale_h);
}
@ -23267,7 +23342,6 @@ static void setup(void)
screen = SDL_CreateRGBSurface(0, ww, hh, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
if (screen == NULL)
{
fprintf(stderr,
@ -24167,9 +24241,14 @@ int main(int argc, char *argv[])
/* do not add code (slowness) here unless required for scanning fonts */
progname = argv[0];
#if defined(DEBUG) && defined(__APPLE__)
#if defined(DEBUG)
#if defined(__APPLE__)
/* EP added block to log messages */
freopen("/tmp/tuxpaint.log", "w", stdout); /* redirect stdout to a file */
#elif defined (__ANDROID__)
freopen("/mnt/sdcard/tuxpaint/tuxpaint.log", "w", stdout); /* redirect stdout to a file */
#endif
dup2(fileno(stdout), fileno(stderr)); /* redirect stderr to stdout */
setvbuf(stdout, NULL, _IONBF, 0); /* we don't want buffering to avoid de-sync'ing stdout and stderr */
setvbuf(stderr, NULL, _IONBF, 0); /* we don't want buffering to avoid de-sync'ing stdout and stderr */
@ -24192,7 +24271,7 @@ int main(int argc, char *argv[])
* file may not exist on the runtime system, however, so we copy the file
* into our app bundle at compile time, and tell Fontconfig here to look for
* the file within the app bundle. */
putenv((char*) "FONTCONFIG_PATH=Resources/etc");
putenv((char *)"FONTCONFIG_PATH=Resources/etc");
#endif
#ifdef FORKED_FONTS