summaryrefslogtreecommitdiffstats
path: root/minui
diff options
context:
space:
mode:
Diffstat (limited to 'minui')
-rw-r--r--minui/Android.mk1
-rw-r--r--minui/minui.h6
-rw-r--r--minui/resources.cpp44
3 files changed, 28 insertions, 23 deletions
diff --git a/minui/Android.mk b/minui/Android.mk
index 97724fbf0..3057f452c 100644
--- a/minui/Android.mk
+++ b/minui/Android.mk
@@ -41,6 +41,7 @@ include $(BUILD_STATIC_LIBRARY)
# Used by OEMs for factory test images.
include $(CLEAR_VARS)
+LOCAL_CLANG := true
LOCAL_MODULE := libminui
LOCAL_WHOLE_STATIC_LIBRARIES += libminui
LOCAL_SHARED_LIBRARIES := libpng
diff --git a/minui/minui.h b/minui/minui.h
index bdde083f3..fb0bbe10c 100644
--- a/minui/minui.h
+++ b/minui/minui.h
@@ -84,6 +84,8 @@ int ev_get_epollfd();
// Resources
//
+bool matches_locale(const char* prefix, const char* locale);
+
// res_create_*_surface() functions return 0 if no error, else
// negative.
//
@@ -101,8 +103,8 @@ int res_create_display_surface(const char* name, GRSurface** pSurface);
// should have a 'Frames' text chunk whose value is the number of
// frames this image represents. The pixel data itself is interlaced
// by row.
-int res_create_multi_display_surface(const char* name,
- int* frames, GRSurface*** pSurface);
+int res_create_multi_display_surface(const char* name, int* frames,
+ int* fps, GRSurface*** pSurface);
// Load a single alpha surface from a grayscale PNG image.
int res_create_alpha_surface(const char* name, GRSurface** pSurface);
diff --git a/minui/resources.cpp b/minui/resources.cpp
index 5e4789277..40d3c2c88 100644
--- a/minui/resources.cpp
+++ b/minui/resources.cpp
@@ -32,8 +32,6 @@
#include "minui.h"
-extern char* locale;
-
#define SURFACE_DATA_ALIGNMENT 8
static GRSurface* malloc_surface(size_t data_size) {
@@ -237,14 +235,14 @@ int res_create_display_surface(const char* name, GRSurface** pSurface) {
return result;
}
-int res_create_multi_display_surface(const char* name, int* frames, GRSurface*** pSurface) {
+int res_create_multi_display_surface(const char* name, int* frames, int* fps,
+ GRSurface*** pSurface) {
GRSurface** surface = NULL;
int result = 0;
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
png_uint_32 width, height;
png_byte channels;
- int i;
png_textp text;
int num_text;
unsigned char* p_row;
@@ -257,14 +255,23 @@ int res_create_multi_display_surface(const char* name, int* frames, GRSurface***
if (result < 0) return result;
*frames = 1;
+ *fps = 20;
if (png_get_text(png_ptr, info_ptr, &text, &num_text)) {
- for (i = 0; i < num_text; ++i) {
+ for (int i = 0; i < num_text; ++i) {
if (text[i].key && strcmp(text[i].key, "Frames") == 0 && text[i].text) {
*frames = atoi(text[i].text);
- break;
+ } else if (text[i].key && strcmp(text[i].key, "FPS") == 0 && text[i].text) {
+ *fps = atoi(text[i].text);
}
}
printf(" found frames = %d\n", *frames);
+ printf(" found fps = %d\n", *fps);
+ }
+
+ if (frames <= 0 || fps <= 0) {
+ printf("bad number of frames (%d) and/or FPS (%d)\n", *frames, *fps);
+ result = -10;
+ goto exit;
}
if (height % *frames != 0) {
@@ -278,7 +285,7 @@ int res_create_multi_display_surface(const char* name, int* frames, GRSurface***
result = -8;
goto exit;
}
- for (i = 0; i < *frames; ++i) {
+ for (int i = 0; i < *frames; ++i) {
surface[i] = init_display_surface(width, height / *frames);
if (surface[i] == NULL) {
result = -8;
@@ -307,7 +314,7 @@ exit:
if (result < 0) {
if (surface) {
- for (i = 0; i < *frames; ++i) {
+ for (int i = 0; i < *frames; ++i) {
if (surface[i]) free(surface[i]);
}
free(surface);
@@ -363,21 +370,16 @@ int res_create_alpha_surface(const char* name, GRSurface** pSurface) {
return result;
}
-static int matches_locale(const char* loc, const char* locale) {
- if (locale == NULL) return 0;
-
- if (strcmp(loc, locale) == 0) return 1;
-
- // if loc does *not* have an underscore, and it matches the start
- // of locale, and the next character in locale *is* an underscore,
- // that's a match. For instance, loc == "en" matches locale ==
- // "en_US".
+// This function tests if a locale string stored in PNG (prefix) matches
+// the locale string provided by the system (locale).
+bool matches_locale(const char* prefix, const char* locale) {
+ if (locale == NULL) return false;
- int i;
- for (i = 0; loc[i] != 0 && loc[i] != '_'; ++i);
- if (loc[i] == '_') return 0;
+ // Return true if the whole string of prefix matches the top part of
+ // locale. For instance, prefix == "en" matches locale == "en_US";
+ // and prefix == "zh_CN" matches locale == "zh_CN_#Hans".
- return (strncmp(locale, loc, i) == 0 && locale[i] == '_');
+ return (strncmp(prefix, locale, strlen(prefix)) == 0);
}
int res_create_localized_alpha_surface(const char* name,