diff options
Diffstat (limited to 'apps/plugins')
-rw-r--r-- | apps/plugins/jpeg.c | 407 | ||||
-rw-r--r-- | apps/plugins/searchengine/dbinterface.c | 8 | ||||
-rw-r--r-- | apps/plugins/searchengine/dbinterface.h | 4 |
3 files changed, 336 insertions, 83 deletions
diff --git a/apps/plugins/jpeg.c b/apps/plugins/jpeg.c index e11680f8d6..78eb98ff80 100644 --- a/apps/plugins/jpeg.c +++ b/apps/plugins/jpeg.c | |||
@@ -10,10 +10,11 @@ | |||
10 | * JPEG image viewer | 10 | * JPEG image viewer |
11 | * (This is a real mess if it has to be coded in one single C file) | 11 | * (This is a real mess if it has to be coded in one single C file) |
12 | * | 12 | * |
13 | * File scrolling addition (C) 2005 Alexander Spyridakis | ||
13 | * Copyright (C) 2004 Jörg Hohensohn aka [IDC]Dragon | 14 | * Copyright (C) 2004 Jörg Hohensohn aka [IDC]Dragon |
14 | * Grayscale framework (c) 2004 Jens Arnold | 15 | * Grayscale framework (C) 2004 Jens Arnold |
15 | * Heavily borrowed from the IJG implementation (c) Thomas G. Lane | 16 | * Heavily borrowed from the IJG implementation (C) Thomas G. Lane |
16 | * Small & fast downscaling IDCT (c) 2002 by Guido Vollbeding JPEGclub.org | 17 | * Small & fast downscaling IDCT (C) 2002 by Guido Vollbeding JPEGclub.org |
17 | * | 18 | * |
18 | * All files in this archive are subject to the GNU General Public License. | 19 | * All files in this archive are subject to the GNU General Public License. |
19 | * See the file COPYING in the source tree root for full license agreement. | 20 | * See the file COPYING in the source tree root for full license agreement. |
@@ -40,16 +41,21 @@ PLUGIN_HEADER | |||
40 | #define JPEG_LEFT BUTTON_LEFT | 41 | #define JPEG_LEFT BUTTON_LEFT |
41 | #define JPEG_RIGHT BUTTON_RIGHT | 42 | #define JPEG_RIGHT BUTTON_RIGHT |
42 | #define JPEG_QUIT BUTTON_OFF | 43 | #define JPEG_QUIT BUTTON_OFF |
44 | #define JPEG_NEXT BUTTON_F3 | ||
45 | #define JPEG_PREVIOUS BUTTON_F2 | ||
46 | |||
43 | 47 | ||
44 | #elif CONFIG_KEYPAD == ONDIO_PAD | 48 | #elif CONFIG_KEYPAD == ONDIO_PAD |
45 | #define JPEG_ZOOM_PRE BUTTON_MENU | 49 | #define JPEG_ZOOM_PRE BUTTON_MENU |
46 | #define JPEG_ZOOM_IN (BUTTON_MENU | BUTTON_REL) | 50 | #define JPEG_ZOOM_IN (BUTTON_MENU | BUTTON_REL) |
47 | #define JPEG_ZOOM_OUT (BUTTON_MENU | BUTTON_REPEAT) | 51 | #define JPEG_ZOOM_OUT (BUTTON_MENU | BUTTON_DOWN) |
48 | #define JPEG_UP BUTTON_UP | 52 | #define JPEG_UP BUTTON_UP |
49 | #define JPEG_DOWN BUTTON_DOWN | 53 | #define JPEG_DOWN BUTTON_DOWN |
50 | #define JPEG_LEFT BUTTON_LEFT | 54 | #define JPEG_LEFT BUTTON_LEFT |
51 | #define JPEG_RIGHT BUTTON_RIGHT | 55 | #define JPEG_RIGHT BUTTON_RIGHT |
52 | #define JPEG_QUIT BUTTON_OFF | 56 | #define JPEG_QUIT BUTTON_OFF |
57 | #define JPEG_NEXT (BUTTON_MENU | BUTTON_RIGHT) | ||
58 | #define JPEG_PREVIOUS (BUTTON_MENU | BUTTON_LEFT) | ||
53 | 59 | ||
54 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ | 60 | #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ |
55 | (CONFIG_KEYPAD == IRIVER_H300_PAD) | 61 | (CONFIG_KEYPAD == IRIVER_H300_PAD) |
@@ -60,6 +66,13 @@ PLUGIN_HEADER | |||
60 | #define JPEG_LEFT BUTTON_LEFT | 66 | #define JPEG_LEFT BUTTON_LEFT |
61 | #define JPEG_RIGHT BUTTON_RIGHT | 67 | #define JPEG_RIGHT BUTTON_RIGHT |
62 | #define JPEG_QUIT BUTTON_OFF | 68 | #define JPEG_QUIT BUTTON_OFF |
69 | #if (CONFIG_KEYPAD == IRIVER_H100_PAD) | ||
70 | #define JPEG_NEXT BUTTON_ON | ||
71 | #define JPEG_PREVIOUS BUTTON_REC | ||
72 | #else | ||
73 | #define JPEG_NEXT BUTTON_REC | ||
74 | #define JPEG_PREVIOUS BUTTON_ON | ||
75 | #endif | ||
63 | 76 | ||
64 | #elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD) | 77 | #elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD) |
65 | #define JPEG_ZOOM_IN BUTTON_SCROLL_FWD | 78 | #define JPEG_ZOOM_IN BUTTON_SCROLL_FWD |
@@ -68,7 +81,9 @@ PLUGIN_HEADER | |||
68 | #define JPEG_DOWN BUTTON_PLAY | 81 | #define JPEG_DOWN BUTTON_PLAY |
69 | #define JPEG_LEFT BUTTON_LEFT | 82 | #define JPEG_LEFT BUTTON_LEFT |
70 | #define JPEG_RIGHT BUTTON_RIGHT | 83 | #define JPEG_RIGHT BUTTON_RIGHT |
71 | #define JPEG_QUIT BUTTON_SELECT | 84 | #define JPEG_QUIT (BUTTON_SELECT | BUTTON_MENU) |
85 | #define JPEG_NEXT (BUTTON_SELECT | BUTTON_RIGHT) | ||
86 | #define JPEG_PREVIOUS (BUTTON_SELECT |BUTTON_LEFT) | ||
72 | 87 | ||
73 | #elif CONFIG_KEYPAD == IAUDIO_X5_PAD | 88 | #elif CONFIG_KEYPAD == IAUDIO_X5_PAD |
74 | #define JPEG_ZOOM_IN_PRE BUTTON_MENU | 89 | #define JPEG_ZOOM_IN_PRE BUTTON_MENU |
@@ -79,6 +94,9 @@ PLUGIN_HEADER | |||
79 | #define JPEG_LEFT BUTTON_LEFT | 94 | #define JPEG_LEFT BUTTON_LEFT |
80 | #define JPEG_RIGHT BUTTON_RIGHT | 95 | #define JPEG_RIGHT BUTTON_RIGHT |
81 | #define JPEG_QUIT BUTTON_POWER | 96 | #define JPEG_QUIT BUTTON_POWER |
97 | #define JPEG_NEXT BUTTON_PLAY | ||
98 | #define JPEG_PREVIOUS BUTTON_REC | ||
99 | |||
82 | #endif | 100 | #endif |
83 | 101 | ||
84 | /* different graphics libraries */ | 102 | /* different graphics libraries */ |
@@ -93,6 +111,24 @@ PLUGIN_HEADER | |||
93 | #define MYXLCD(fn) xlcd_ ## fn | 111 | #define MYXLCD(fn) xlcd_ ## fn |
94 | #endif | 112 | #endif |
95 | 113 | ||
114 | #define MAX_X_SIZE LCD_WIDTH*8 | ||
115 | |||
116 | /* Min memory allowing us to use the plugin buffer | ||
117 | * and thus not stopping the music | ||
118 | * *Very* rough estimation: | ||
119 | * Max 10 000 dir entries * 4bytes/entry (char **) = 40000 bytes | ||
120 | * + 20k code size = 60 000 | ||
121 | * + 50k min for jpeg = 120 000 | ||
122 | */ | ||
123 | #define MIN_MEM 120000 | ||
124 | |||
125 | /* Headings */ | ||
126 | #define DIR_PREV 1 | ||
127 | #define DIR_NEXT -1 | ||
128 | #define DIR_NONE 0 | ||
129 | |||
130 | #define PLUGIN_OTHER 10 /* State code for output with return. */ | ||
131 | |||
96 | /******************************* Globals ***********************************/ | 132 | /******************************* Globals ***********************************/ |
97 | 133 | ||
98 | static struct plugin_api* rb; | 134 | static struct plugin_api* rb; |
@@ -825,7 +861,7 @@ int process_markers(unsigned char* p_src, long size, struct jpeg* p_jpeg) | |||
825 | p_jpeg->hufftable[i].huffmancodes_dc[j] = *p_src++; | 861 | p_jpeg->hufftable[i].huffmancodes_dc[j] = *p_src++; |
826 | } | 862 | } |
827 | } /* while */ | 863 | } /* while */ |
828 | p_src = p_temp+marker_size - 2; // skip possible residue | 864 | p_src = p_temp+marker_size - 2; /* skip possible residue */ |
829 | } | 865 | } |
830 | break; | 866 | break; |
831 | 867 | ||
@@ -1757,7 +1793,6 @@ struct t_disp | |||
1757 | int x, y; | 1793 | int x, y; |
1758 | }; | 1794 | }; |
1759 | 1795 | ||
1760 | |||
1761 | /************************* Globals ***************************/ | 1796 | /************************* Globals ***************************/ |
1762 | 1797 | ||
1763 | /* decompressed image in the possible sizes (1,2,4,8), wasting the other */ | 1798 | /* decompressed image in the possible sizes (1,2,4,8), wasting the other */ |
@@ -1766,10 +1801,30 @@ struct t_disp disp[9]; | |||
1766 | /* my memory pool (from the mp3 buffer) */ | 1801 | /* my memory pool (from the mp3 buffer) */ |
1767 | char print[32]; /* use a common snprintf() buffer */ | 1802 | char print[32]; /* use a common snprintf() buffer */ |
1768 | unsigned char* buf; /* up to here currently used by image(s) */ | 1803 | unsigned char* buf; /* up to here currently used by image(s) */ |
1769 | int buf_size; | 1804 | |
1770 | unsigned char* buf_root; /* the root of the images */ | 1805 | /* the remaining free part of the buffer for compressed+uncompressed images */ |
1806 | unsigned char* buf_images; | ||
1807 | |||
1808 | int buf_size, buf_images_size; | ||
1809 | /* the root of the images, hereafter are decompresed ones */ | ||
1810 | unsigned char* buf_root; | ||
1771 | int root_size; | 1811 | int root_size; |
1772 | 1812 | ||
1813 | int ds, ds_min, ds_max; /* downscaling and limits */ | ||
1814 | static struct jpeg jpg; /* too large for stack */ | ||
1815 | |||
1816 | static struct tree_context *tree; | ||
1817 | |||
1818 | /* the current full file name */ | ||
1819 | static char np_file[MAX_PATH]; | ||
1820 | int curfile = 0, direction = DIR_NONE, entries = 0; | ||
1821 | |||
1822 | /* list of the jpeg files */ | ||
1823 | char **file_pt; | ||
1824 | /* are we using the plugin buffer or the audio buffer? */ | ||
1825 | bool plug_buf = false; | ||
1826 | |||
1827 | |||
1773 | /************************* Implementation ***************************/ | 1828 | /************************* Implementation ***************************/ |
1774 | 1829 | ||
1775 | #ifdef HAVE_LCD_COLOR | 1830 | #ifdef HAVE_LCD_COLOR |
@@ -1919,6 +1974,105 @@ void yuv_bitmap_part(unsigned char *src[3], int csub_x, int csub_y, | |||
1919 | } | 1974 | } |
1920 | #endif | 1975 | #endif |
1921 | 1976 | ||
1977 | |||
1978 | /* support function for qsort() */ | ||
1979 | static int compare(const void* p1, const void* p2) | ||
1980 | { | ||
1981 | return rb->strcasecmp(*((char **)p1), *((char **)p2)); | ||
1982 | } | ||
1983 | |||
1984 | bool jpg_ext(const char ext[]) | ||
1985 | { | ||
1986 | if(!rb->strcasecmp(ext,".jpg") || | ||
1987 | !rb->strcasecmp(ext,".jpe") || | ||
1988 | !rb->strcasecmp(ext,".jpeg")) | ||
1989 | return true; | ||
1990 | else | ||
1991 | return false; | ||
1992 | } | ||
1993 | |||
1994 | /*Read directory contents for scrolling. */ | ||
1995 | void get_pic_list(void) | ||
1996 | { | ||
1997 | int i; | ||
1998 | long int str_len = 0; | ||
1999 | char *pname; | ||
2000 | tree = rb->tree_get_context(); | ||
2001 | |||
2002 | #if PLUGIN_BUFFER_SIZE >= MIN_MEM | ||
2003 | file_pt = rb->plugin_get_buffer(&buf_size); | ||
2004 | #else | ||
2005 | file_pt = rb->plugin_get_audio_buffer(&buf_size); | ||
2006 | #endif | ||
2007 | |||
2008 | for(i = 0; i < tree->filesindir; i++) | ||
2009 | { | ||
2010 | if(jpg_ext(rb->strrchr(&tree->name_buffer[str_len],'.'))) | ||
2011 | file_pt[entries++] = &tree->name_buffer[str_len]; | ||
2012 | |||
2013 | str_len += rb->strlen(&tree->name_buffer[str_len]) + 1; | ||
2014 | } | ||
2015 | |||
2016 | rb->qsort(file_pt, entries, sizeof(char**), compare); | ||
2017 | |||
2018 | /* Remove path and leave only the name.*/ | ||
2019 | pname = rb->strrchr(np_file,'/'); | ||
2020 | pname++; | ||
2021 | |||
2022 | /* Find Selected File. */ | ||
2023 | for(i = 0; i < entries; i++) | ||
2024 | if(!rb->strcmp(file_pt[i], pname)) | ||
2025 | curfile = i; | ||
2026 | } | ||
2027 | |||
2028 | int change_filename(int direct) | ||
2029 | { | ||
2030 | int count = 0; | ||
2031 | direction = direct; | ||
2032 | |||
2033 | if(direct == DIR_PREV) | ||
2034 | { | ||
2035 | do | ||
2036 | { | ||
2037 | count++; | ||
2038 | if(curfile == 0) | ||
2039 | curfile = entries - 1; | ||
2040 | else | ||
2041 | curfile--; | ||
2042 | }while(file_pt[curfile] == '\0' && count < entries); | ||
2043 | /* we "erase" the file name if we encounter | ||
2044 | * a non-supported file, so skip it now */ | ||
2045 | } | ||
2046 | else /* DIR_NEXT/DIR_NONE */ | ||
2047 | { | ||
2048 | do | ||
2049 | { | ||
2050 | count++; | ||
2051 | if(curfile == entries - 1) | ||
2052 | curfile = 0; | ||
2053 | else | ||
2054 | curfile++; | ||
2055 | }while(file_pt[curfile] == '\0' && count < entries); | ||
2056 | } | ||
2057 | |||
2058 | if(count == entries && file_pt[curfile] == '\0') | ||
2059 | { | ||
2060 | rb->splash(HZ,true,"No supported files"); | ||
2061 | return PLUGIN_ERROR; | ||
2062 | } | ||
2063 | if(rb->strlen(tree->currdir) > 1) | ||
2064 | { | ||
2065 | rb->strcpy(np_file, tree->currdir); | ||
2066 | rb->strcat(np_file, "/"); | ||
2067 | } | ||
2068 | else | ||
2069 | rb->strcpy(np_file, tree->currdir); | ||
2070 | |||
2071 | rb->strcat(np_file, file_pt[curfile]); | ||
2072 | |||
2073 | return PLUGIN_OTHER; | ||
2074 | } | ||
2075 | |||
1922 | /* switch off overlay, for handling SYS_ events */ | 2076 | /* switch off overlay, for handling SYS_ events */ |
1923 | void cleanup(void *parameter) | 2077 | void cleanup(void *parameter) |
1924 | { | 2078 | { |
@@ -1931,7 +2085,7 @@ void cleanup(void *parameter) | |||
1931 | #define VSCROLL (LCD_HEIGHT/8) | 2085 | #define VSCROLL (LCD_HEIGHT/8) |
1932 | #define HSCROLL (LCD_WIDTH/10) | 2086 | #define HSCROLL (LCD_WIDTH/10) |
1933 | 2087 | ||
1934 | #define ZOOM_IN 100 // return codes for below function | 2088 | #define ZOOM_IN 100 /* return codes for below function */ |
1935 | #define ZOOM_OUT 101 | 2089 | #define ZOOM_OUT 101 |
1936 | 2090 | ||
1937 | /* interactively scroll around the image */ | 2091 | /* interactively scroll around the image */ |
@@ -1952,6 +2106,8 @@ int scroll_bmp(struct t_disp* pdisp) | |||
1952 | switch(button) | 2106 | switch(button) |
1953 | { | 2107 | { |
1954 | case JPEG_LEFT: | 2108 | case JPEG_LEFT: |
2109 | if (!(ds < ds_max) && entries > 0 && jpg.x_size <= MAX_X_SIZE) | ||
2110 | return change_filename(DIR_PREV); | ||
1955 | case JPEG_LEFT | BUTTON_REPEAT: | 2111 | case JPEG_LEFT | BUTTON_REPEAT: |
1956 | move = MIN(HSCROLL, pdisp->x); | 2112 | move = MIN(HSCROLL, pdisp->x); |
1957 | if (move > 0) | 2113 | if (move > 0) |
@@ -1975,6 +2131,8 @@ int scroll_bmp(struct t_disp* pdisp) | |||
1975 | break; | 2131 | break; |
1976 | 2132 | ||
1977 | case JPEG_RIGHT: | 2133 | case JPEG_RIGHT: |
2134 | if (!(ds < ds_max) && entries > 0 && jpg.x_size <= MAX_X_SIZE) | ||
2135 | return change_filename(DIR_NEXT); | ||
1978 | case JPEG_RIGHT | BUTTON_REPEAT: | 2136 | case JPEG_RIGHT | BUTTON_REPEAT: |
1979 | move = MIN(HSCROLL, pdisp->width - pdisp->x - LCD_WIDTH); | 2137 | move = MIN(HSCROLL, pdisp->width - pdisp->x - LCD_WIDTH); |
1980 | if (move > 0) | 2138 | if (move > 0) |
@@ -2044,7 +2202,17 @@ int scroll_bmp(struct t_disp* pdisp) | |||
2044 | MYLCD_UPDATE(); | 2202 | MYLCD_UPDATE(); |
2045 | } | 2203 | } |
2046 | break; | 2204 | break; |
2047 | 2205 | ||
2206 | case JPEG_NEXT: | ||
2207 | if (entries > 0) | ||
2208 | return change_filename(DIR_NEXT); | ||
2209 | break; | ||
2210 | |||
2211 | case JPEG_PREVIOUS: | ||
2212 | if (entries > 0) | ||
2213 | return change_filename(DIR_PREV); | ||
2214 | break; | ||
2215 | |||
2048 | case JPEG_ZOOM_IN: | 2216 | case JPEG_ZOOM_IN: |
2049 | #ifdef JPEG_ZOOM_PRE | 2217 | #ifdef JPEG_ZOOM_PRE |
2050 | if (lastbutton != JPEG_ZOOM_PRE) | 2218 | if (lastbutton != JPEG_ZOOM_PRE) |
@@ -2101,16 +2269,6 @@ void cb_progess(int current, int total) | |||
2101 | rb->lcd_update_rect(0, LCD_HEIGHT-8, LCD_WIDTH, 8); | 2269 | rb->lcd_update_rect(0, LCD_HEIGHT-8, LCD_WIDTH, 8); |
2102 | } | 2270 | } |
2103 | 2271 | ||
2104 | /* helper to align a buffer to a given power of two */ | ||
2105 | void align(unsigned char** ppbuf, int* plen, int align) | ||
2106 | { | ||
2107 | unsigned int orig = (unsigned int)*ppbuf; | ||
2108 | unsigned int aligned = (orig + (align-1)) & ~(align-1); | ||
2109 | |||
2110 | *plen -= aligned - orig; | ||
2111 | *ppbuf = (unsigned char*)aligned; | ||
2112 | } | ||
2113 | |||
2114 | int jpegmem(struct jpeg *p_jpg, int ds) | 2272 | int jpegmem(struct jpeg *p_jpg, int ds) |
2115 | { | 2273 | { |
2116 | int size; | 2274 | int size; |
@@ -2236,7 +2394,8 @@ struct t_disp* get_image(struct jpeg* p_jpg, int ds) | |||
2236 | #endif | 2394 | #endif |
2237 | if (status) | 2395 | if (status) |
2238 | { | 2396 | { |
2239 | rb->splash(HZ*2, true, "decode error %d", status); | 2397 | rb->splash(HZ, true, "decode error %d", status); |
2398 | file_pt[curfile] = '\0'; | ||
2240 | return NULL; | 2399 | return NULL; |
2241 | } | 2400 | } |
2242 | time = *rb->current_tick - time; | 2401 | time = *rb->current_tick - time; |
@@ -2280,63 +2439,98 @@ void get_view(struct t_disp* p_disp, int* p_cx, int* p_cy) | |||
2280 | 2439 | ||
2281 | 2440 | ||
2282 | /* load, decode, display the image */ | 2441 | /* load, decode, display the image */ |
2283 | int plugin_main(char* filename) | 2442 | int load_and_show(char* filename) |
2284 | { | 2443 | { |
2285 | int fd; | 2444 | int fd; |
2286 | int filesize; | 2445 | int filesize; |
2287 | #ifdef USEGSLIB | ||
2288 | int grayscales; | ||
2289 | long graysize; // helper | ||
2290 | #endif | ||
2291 | unsigned char* buf_jpeg; /* compressed JPEG image */ | 2446 | unsigned char* buf_jpeg; /* compressed JPEG image */ |
2292 | static struct jpeg jpg; /* too large for stack */ | ||
2293 | int status; | 2447 | int status; |
2294 | int ds, ds_min, ds_max; /* scaling and limits */ | ||
2295 | struct t_disp* p_disp; /* currenly displayed image */ | 2448 | struct t_disp* p_disp; /* currenly displayed image */ |
2296 | int cx, cy; /* view center */ | 2449 | int cx, cy; /* view center */ |
2297 | 2450 | ||
2298 | fd = rb->open(filename, O_RDONLY); | 2451 | fd = rb->open(filename, O_RDONLY); |
2299 | if (fd < 0) | 2452 | if (fd < 0) |
2300 | { | 2453 | { |
2301 | rb->splash(HZ*2, true, "fopen err"); | 2454 | rb->snprintf(print,sizeof(print),"err opening %s:%d",filename,fd); |
2455 | rb->splash(HZ, true, print); | ||
2302 | return PLUGIN_ERROR; | 2456 | return PLUGIN_ERROR; |
2303 | } | 2457 | } |
2304 | filesize = rb->filesize(fd); | 2458 | filesize = rb->filesize(fd); |
2305 | |||
2306 | rb->memset(&disp, 0, sizeof(disp)); | 2459 | rb->memset(&disp, 0, sizeof(disp)); |
2307 | 2460 | ||
2308 | buf = rb->plugin_get_audio_buffer(&buf_size); /* start munching memory */ | 2461 | buf = buf_images + filesize; |
2309 | 2462 | buf_size = buf_images_size - filesize; | |
2310 | |||
2311 | #ifdef USEGSLIB | ||
2312 | /* initialize the grayscale buffer: 32 bitplanes for 33 shades of gray. */ | ||
2313 | grayscales = gray_init(rb, buf, buf_size, false, LCD_WIDTH, LCD_HEIGHT/8, | ||
2314 | 32, &graysize) + 1; | ||
2315 | buf += graysize; | ||
2316 | buf_size -= graysize; | ||
2317 | if (grayscales < 33 || buf_size <= 0) | ||
2318 | { | ||
2319 | rb->splash(HZ*2, true, "gray buf error"); | ||
2320 | rb->close(fd); | ||
2321 | return PLUGIN_ERROR; | ||
2322 | } | ||
2323 | #else | ||
2324 | xlcd_init(rb); | ||
2325 | #endif | ||
2326 | |||
2327 | |||
2328 | /* allocate JPEG buffer */ | 2463 | /* allocate JPEG buffer */ |
2329 | align(&buf, &buf_size, 2); /* 16 bit align */ | 2464 | buf_jpeg = buf_images; |
2330 | buf_jpeg = buf; | 2465 | |
2331 | buf += filesize; | ||
2332 | buf_size -= filesize; | ||
2333 | buf_root = buf; /* we can start the decompressed images behind it */ | 2466 | buf_root = buf; /* we can start the decompressed images behind it */ |
2334 | root_size = buf_size; | 2467 | root_size = buf_size; |
2335 | if (buf_size <= 0) | 2468 | |
2469 | if (buf_size <= 0) | ||
2336 | { | 2470 | { |
2337 | rb->splash(HZ*2, true, "out of memory"); | 2471 | #if PLUGIN_BUFFER_SIZE >= MIN_MEM |
2338 | rb->close(fd); | 2472 | if(plug_buf) |
2339 | return PLUGIN_ERROR; | 2473 | { |
2474 | rb->close(fd); | ||
2475 | rb->lcd_setfont(FONT_SYSFIXED); | ||
2476 | rb->lcd_clear_display(); | ||
2477 | rb->snprintf(print,sizeof(print),"%s:",rb->strrchr(filename,'/')+1); | ||
2478 | rb->lcd_puts(0,0,print); | ||
2479 | rb->lcd_puts(0,1,"Not enough plugin memory!"); | ||
2480 | rb->lcd_puts(0,2,"Zoom In: Stop playback."); | ||
2481 | if(entries>1) | ||
2482 | rb->lcd_puts(0,3,"Left/Right: Skip File."); | ||
2483 | rb->lcd_puts(0,4,"Off: Quit."); | ||
2484 | rb->lcd_update(); | ||
2485 | rb->lcd_setfont(FONT_UI); | ||
2486 | |||
2487 | rb->button_clear_queue(); | ||
2488 | |||
2489 | while (1) | ||
2490 | { | ||
2491 | int button = rb->button_get(true); | ||
2492 | switch(button) | ||
2493 | { | ||
2494 | case JPEG_ZOOM_IN: | ||
2495 | plug_buf = false; | ||
2496 | buf_images = | ||
2497 | rb->plugin_get_audio_buffer(&buf_images_size); | ||
2498 | /*try again this file, now using the audio buffer */ | ||
2499 | return PLUGIN_OTHER; | ||
2500 | |||
2501 | case JPEG_QUIT: | ||
2502 | return PLUGIN_OK; | ||
2503 | |||
2504 | case JPEG_LEFT: | ||
2505 | if(entries>1) | ||
2506 | { | ||
2507 | rb->lcd_clear_display(); | ||
2508 | return change_filename(DIR_PREV); | ||
2509 | } | ||
2510 | break; | ||
2511 | |||
2512 | case JPEG_RIGHT: | ||
2513 | if(entries>1) | ||
2514 | { | ||
2515 | rb->lcd_clear_display(); | ||
2516 | return change_filename(DIR_NEXT); | ||
2517 | } | ||
2518 | break; | ||
2519 | default: | ||
2520 | if(rb->default_event_handler_ex(button, cleanup, NULL) | ||
2521 | == SYS_USB_CONNECTED) | ||
2522 | return PLUGIN_USB_CONNECTED; | ||
2523 | |||
2524 | } | ||
2525 | } | ||
2526 | } | ||
2527 | else | ||
2528 | #endif | ||
2529 | { | ||
2530 | rb->splash(HZ, true, "Out of Memory"); | ||
2531 | rb->close(fd); | ||
2532 | return PLUGIN_ERROR; | ||
2533 | } | ||
2340 | } | 2534 | } |
2341 | 2535 | ||
2342 | #ifdef HAVE_LCD_COLOR | 2536 | #ifdef HAVE_LCD_COLOR |
@@ -2345,30 +2539,40 @@ int plugin_main(char* filename) | |||
2345 | rb->lcd_clear_display(); | 2539 | rb->lcd_clear_display(); |
2346 | #endif | 2540 | #endif |
2347 | 2541 | ||
2348 | rb->snprintf(print, sizeof(print), "loading %d bytes", filesize); | 2542 | rb->lcd_clear_display(); |
2543 | rb->snprintf(print, sizeof(print), "%s:", rb->strrchr(filename,'/')+1); | ||
2349 | rb->lcd_puts(0, 0, print); | 2544 | rb->lcd_puts(0, 0, print); |
2350 | rb->lcd_update(); | 2545 | rb->lcd_update(); |
2546 | |||
2547 | rb->snprintf(print, sizeof(print), "loading %d bytes", filesize); | ||
2548 | rb->lcd_puts(0, 1, print); | ||
2549 | rb->lcd_update(); | ||
2351 | 2550 | ||
2352 | rb->read(fd, buf_jpeg, filesize); | 2551 | rb->read(fd, buf_jpeg, filesize); |
2353 | rb->close(fd); | 2552 | rb->close(fd); |
2354 | 2553 | ||
2355 | rb->snprintf(print, sizeof(print), "decoding markers"); | 2554 | rb->snprintf(print, sizeof(print), "decoding markers"); |
2356 | rb->lcd_puts(0, 1, print); | 2555 | rb->lcd_puts(0, 2, print); |
2357 | rb->lcd_update(); | 2556 | rb->lcd_update(); |
2557 | |||
2558 | |||
2358 | 2559 | ||
2359 | rb->memset(&jpg, 0, sizeof(jpg)); /* clear info struct */ | 2560 | rb->memset(&jpg, 0, sizeof(jpg)); /* clear info struct */ |
2360 | /* process markers, unstuffing */ | 2561 | /* process markers, unstuffing */ |
2361 | status = process_markers(buf_jpeg, filesize, &jpg); | 2562 | status = process_markers(buf_jpeg, filesize, &jpg); |
2563 | |||
2362 | if (status < 0 || (status & (DQT | SOF0)) != (DQT | SOF0)) | 2564 | if (status < 0 || (status & (DQT | SOF0)) != (DQT | SOF0)) |
2363 | { /* bad format or minimum components not contained */ | 2565 | { /* bad format or minimum components not contained */ |
2364 | rb->splash(HZ*2, true, "unsupported %d", status); | 2566 | rb->splash(HZ, true, "unsupported %d", status); |
2365 | return PLUGIN_ERROR; | 2567 | file_pt[curfile] = '\0'; |
2568 | return change_filename(direction); | ||
2366 | } | 2569 | } |
2570 | |||
2367 | if (!(status & DHT)) /* if no Huffman table present: */ | 2571 | if (!(status & DHT)) /* if no Huffman table present: */ |
2368 | default_huff_tbl(&jpg); /* use default */ | 2572 | default_huff_tbl(&jpg); /* use default */ |
2369 | build_lut(&jpg); /* derive Huffman and other lookup-tables */ | 2573 | build_lut(&jpg); /* derive Huffman and other lookup-tables */ |
2370 | 2574 | ||
2371 | rb->snprintf(print, sizeof(print), "image %d*%d", jpg.x_size, jpg.y_size); | 2575 | rb->snprintf(print, sizeof(print), "image %dx%d", jpg.x_size, jpg.y_size); |
2372 | rb->lcd_puts(0, 2, print); | 2576 | rb->lcd_puts(0, 2, print); |
2373 | rb->lcd_update(); | 2577 | rb->lcd_update(); |
2374 | 2578 | ||
@@ -2376,9 +2580,11 @@ int plugin_main(char* filename) | |||
2376 | ds_min = min_downscale(&jpg, buf_size); /* check memory constraint */ | 2580 | ds_min = min_downscale(&jpg, buf_size); /* check memory constraint */ |
2377 | if (ds_min == 0) | 2581 | if (ds_min == 0) |
2378 | { | 2582 | { |
2379 | rb->splash(HZ*2, true, "too large"); | 2583 | rb->splash(HZ, true, "too large"); |
2380 | return PLUGIN_ERROR; | 2584 | file_pt[curfile] = '\0'; |
2585 | return change_filename(direction); | ||
2381 | } | 2586 | } |
2587 | |||
2382 | ds = ds_max; /* initials setting */ | 2588 | ds = ds_max; /* initials setting */ |
2383 | cx = jpg.x_size/ds/2; /* center the view */ | 2589 | cx = jpg.x_size/ds/2; /* center the view */ |
2384 | cy = jpg.y_size/ds/2; | 2590 | cy = jpg.y_size/ds/2; |
@@ -2387,11 +2593,11 @@ int plugin_main(char* filename) | |||
2387 | { | 2593 | { |
2388 | p_disp = get_image(&jpg, ds); /* decode or fetch from cache */ | 2594 | p_disp = get_image(&jpg, ds); /* decode or fetch from cache */ |
2389 | if (p_disp == NULL) | 2595 | if (p_disp == NULL) |
2390 | return PLUGIN_ERROR; | 2596 | return change_filename(direction); |
2391 | 2597 | ||
2392 | set_view(p_disp, cx, cy); | 2598 | set_view(p_disp, cx, cy); |
2393 | 2599 | ||
2394 | rb->snprintf(print, sizeof(print), "showing %d*%d", | 2600 | rb->snprintf(print, sizeof(print), "showing %dx%d", |
2395 | p_disp->width, p_disp->height); | 2601 | p_disp->width, p_disp->height); |
2396 | rb->lcd_puts(0, 3, print); | 2602 | rb->lcd_puts(0, 3, print); |
2397 | rb->lcd_update(); | 2603 | rb->lcd_update(); |
@@ -2460,12 +2666,8 @@ int plugin_main(char* filename) | |||
2460 | #endif | 2666 | #endif |
2461 | 2667 | ||
2462 | } | 2668 | } |
2463 | while (status != PLUGIN_OK && status != PLUGIN_USB_CONNECTED); | 2669 | while (status != PLUGIN_OK && status != PLUGIN_USB_CONNECTED |
2464 | 2670 | && status != PLUGIN_OTHER); | |
2465 | #ifdef USEGSLIB | ||
2466 | gray_release(); /* deinitialize */ | ||
2467 | #endif | ||
2468 | |||
2469 | return status; | 2671 | return status; |
2470 | } | 2672 | } |
2471 | 2673 | ||
@@ -2473,10 +2675,61 @@ int plugin_main(char* filename) | |||
2473 | 2675 | ||
2474 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter) | 2676 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter) |
2475 | { | 2677 | { |
2476 | rb = api; /* copy to global api pointer */ | 2678 | rb = api; |
2679 | |||
2680 | int condition; | ||
2681 | #ifdef USEGSLIB | ||
2682 | int grayscales; | ||
2683 | long graysize; /* helper */ | ||
2684 | #endif | ||
2685 | |||
2686 | rb->strcpy(np_file, parameter); | ||
2687 | get_pic_list(); | ||
2688 | |||
2689 | #if PLUGIN_BUFFER_SIZE >= MIN_MEM | ||
2690 | if(rb->pcm_is_playing()) | ||
2691 | { | ||
2692 | buf = rb->plugin_get_buffer(&buf_size) + | ||
2693 | (entries * sizeof(char**)); | ||
2694 | buf_size -= (entries * sizeof(char**)); | ||
2695 | plug_buf = true; | ||
2696 | } | ||
2697 | else | ||
2698 | buf = rb->plugin_get_audio_buffer(&buf_size); | ||
2699 | #else | ||
2700 | buf = rb->plugin_get_audio_buffer(&buf_size) + | ||
2701 | (entries * sizeof(char**)); | ||
2702 | buf_size -= (entries * sizeof(char**)); | ||
2703 | #endif | ||
2704 | |||
2705 | #ifdef USEGSLIB | ||
2706 | /* initialize the grayscale buffer: 32 bitplanes for 33 shades of gray. */ | ||
2707 | grayscales = gray_init(rb, buf, buf_size, false, LCD_WIDTH, LCD_HEIGHT/8, | ||
2708 | 32, &graysize) + 1; | ||
2709 | buf += graysize; | ||
2710 | buf_size -= graysize; | ||
2711 | if (grayscales < 33 || buf_size <= 0) | ||
2712 | { | ||
2713 | rb->splash(HZ, true, "gray buf error"); | ||
2714 | return PLUGIN_ERROR; | ||
2715 | } | ||
2716 | #else | ||
2717 | xlcd_init(rb); | ||
2718 | #endif | ||
2719 | |||
2720 | buf_images = buf; buf_images_size = buf_size; | ||
2721 | |||
2722 | do | ||
2723 | { | ||
2724 | condition = load_and_show(np_file); | ||
2725 | }while (condition != PLUGIN_OK && condition != PLUGIN_USB_CONNECTED | ||
2726 | && condition != PLUGIN_ERROR); | ||
2477 | 2727 | ||
2478 | return plugin_main((char*)parameter); | 2728 | #ifdef USEGSLIB |
2729 | gray_release(); /* deinitialize */ | ||
2730 | #endif | ||
2731 | |||
2732 | return condition; | ||
2479 | } | 2733 | } |
2480 | 2734 | ||
2481 | #endif /* HAVE_LCD_BITMAP && ((LCD_DEPTH >= 8) || !defined(SIMULATOR))*/ | 2735 | #endif /* HAVE_LCD_BITMAP && ((LCD_DEPTH >= 8) || !defined(SIMULATOR))*/ |
2482 | |||
diff --git a/apps/plugins/searchengine/dbinterface.c b/apps/plugins/searchengine/dbinterface.c index e10510604d..c3f1c7bfef 100644 --- a/apps/plugins/searchengine/dbinterface.c +++ b/apps/plugins/searchengine/dbinterface.c | |||
@@ -33,18 +33,18 @@ | |||
33 | 33 | ||
34 | #define FILERECORD2OFFSET(_x_) (rb->tagdbheader->filestart + _x_ * FILEENTRY_SIZE) | 34 | #define FILERECORD2OFFSET(_x_) (rb->tagdbheader->filestart + _x_ * FILEENTRY_SIZE) |
35 | 35 | ||
36 | struct entry *currententry; | 36 | struct dbentry *currententry; |
37 | struct dbglobals dbglobal; | 37 | struct dbglobals dbglobal; |
38 | static struct entry *entryarray; | 38 | static struct dbentry *entryarray; |
39 | 39 | ||
40 | int database_init() { | 40 | int database_init() { |
41 | char *p; | 41 | char *p; |
42 | unsigned int i; | 42 | unsigned int i; |
43 | // allocate room for all entries | 43 | // allocate room for all entries |
44 | entryarray=(struct entry *)my_malloc(sizeof(struct entry)*rb->tagdbheader->filecount); | 44 | entryarray=(struct dbentry *)my_malloc(sizeof(struct dbentry)*rb->tagdbheader->filecount); |
45 | p=(char *)entryarray; | 45 | p=(char *)entryarray; |
46 | // zero all entries. | 46 | // zero all entries. |
47 | for(i=0;i<sizeof(struct entry)*rb->tagdbheader->filecount;i++) | 47 | for(i=0;i<sizeof(struct dbentry)*rb->tagdbheader->filecount;i++) |
48 | *(p++)=0; | 48 | *(p++)=0; |
49 | if(!*rb->tagdb_initialized) { | 49 | if(!*rb->tagdb_initialized) { |
50 | if(!rb->tagdb_init()) { | 50 | if(!rb->tagdb_init()) { |
diff --git a/apps/plugins/searchengine/dbinterface.h b/apps/plugins/searchengine/dbinterface.h index e762297d8f..f4560a805a 100644 --- a/apps/plugins/searchengine/dbinterface.h +++ b/apps/plugins/searchengine/dbinterface.h | |||
@@ -23,7 +23,7 @@ struct dbglobals { | |||
23 | int currententryindex; | 23 | int currententryindex; |
24 | }; | 24 | }; |
25 | 25 | ||
26 | struct entry { | 26 | struct dbentry { |
27 | int loadedfiledata, | 27 | int loadedfiledata, |
28 | loadedsongdata, | 28 | loadedsongdata, |
29 | loadedrundbdata, | 29 | loadedrundbdata, |
@@ -50,7 +50,7 @@ struct entry { | |||
50 | short samplerate; | 50 | short samplerate; |
51 | }; | 51 | }; |
52 | 52 | ||
53 | extern struct entry *currententry; | 53 | extern struct dbentry *currententry; |
54 | extern struct dbglobals dbglobal; | 54 | extern struct dbglobals dbglobal; |
55 | 55 | ||
56 | int database_init(void); | 56 | int database_init(void); |