summaryrefslogtreecommitdiff
path: root/apps/plugins/imageviewer/imageviewer.c
diff options
context:
space:
mode:
authorRoman Artiukhin <bahusdrive@gmail.com>2024-10-14 21:33:40 +0300
committerChristian Soffke <christian.soffke@gmail.com>2024-10-28 12:46:51 -0400
commit55a5bfe7409677a26437651798abbc6d87b56089 (patch)
tree7ab7d96f52ee15257b174e75f15abae1f09b74cf /apps/plugins/imageviewer/imageviewer.c
parentc1bcebd9986b1e2120fd05ead67754d444dae7d3 (diff)
downloadrockbox-55a5bfe7409677a26437651798abbc6d87b56089.tar.gz
rockbox-55a5bfe7409677a26437651798abbc6d87b56089.zip
View Album Art from WPS context menu
Add ability to imageviewer to view current track embedded/folder album art Add "View Album Art" WPS context menu item Change-Id: I49caebd38e5e3e2910d418bbeaa5e51da0e6bd93
Diffstat (limited to 'apps/plugins/imageviewer/imageviewer.c')
-rw-r--r--apps/plugins/imageviewer/imageviewer.c98
1 files changed, 82 insertions, 16 deletions
diff --git a/apps/plugins/imageviewer/imageviewer.c b/apps/plugins/imageviewer/imageviewer.c
index ba5f8fec16..77286bd37d 100644
--- a/apps/plugins/imageviewer/imageviewer.c
+++ b/apps/plugins/imageviewer/imageviewer.c
@@ -838,16 +838,12 @@ static void get_view(struct image_info *info, int *p_cx, int *p_cy)
838} 838}
839 839
840/* load, decode, display the image */ 840/* load, decode, display the image */
841static int load_and_show(char* filename, struct image_info *info) 841static int load_and_show(char *filename, struct image_info *info,
842 int offset, int filesize, int status)
842{ 843{
843 int status;
844 int cx, cy; 844 int cx, cy;
845 ssize_t remaining; 845 ssize_t remaining;
846 846
847 rb->lcd_clear_display();
848
849 /* suppress warning while running slideshow */
850 status = get_image_type(filename, iv_api.running_slideshow);
851 if (status == IMAGE_UNKNOWN) { 847 if (status == IMAGE_UNKNOWN) {
852 /* file isn't supported image file, skip this. */ 848 /* file isn't supported image file, skip this. */
853 file_pt[curfile] = NULL; 849 file_pt[curfile] = NULL;
@@ -855,6 +851,8 @@ static int load_and_show(char* filename, struct image_info *info)
855 } 851 }
856 852
857reload_decoder: 853reload_decoder:
854 rb->lcd_clear_display();
855
858 if (image_type != status) /* type of image is changed, load decoder. */ 856 if (image_type != status) /* type of image is changed, load decoder. */
859 { 857 {
860 struct loader_info loader_info = { 858 struct loader_info loader_info = {
@@ -881,11 +879,10 @@ reload_decoder:
881 if (rb->button_get(false) == IMGVIEW_MENU) 879 if (rb->button_get(false) == IMGVIEW_MENU)
882 status = PLUGIN_ABORT; 880 status = PLUGIN_ABORT;
883 else 881 else
884 status = imgdec->load_image(filename, info, buf, &remaining); 882 status = imgdec->load_image(filename, info, buf, &remaining, offset, filesize);
885 883
886 if (status == PLUGIN_JPEG_PROGRESSIVE) 884 if (status == PLUGIN_JPEG_PROGRESSIVE)
887 { 885 {
888 rb->lcd_clear_display();
889 status = IMAGE_JPEG_PROGRESSIVE; 886 status = IMAGE_JPEG_PROGRESSIVE;
890 goto reload_decoder; 887 goto reload_decoder;
891 } 888 }
@@ -1035,6 +1032,47 @@ reload_decoder:
1035 return status; 1032 return status;
1036} 1033}
1037 1034
1035static bool find_album_art(int *offset, int *filesize, int *status)
1036{
1037#ifndef HAVE_ALBUMART
1038 (void)offset;(void)filesize;(void)status;
1039 return false;
1040#else
1041 struct mp3entry *current_track = rb->audio_current_track();
1042
1043 if (current_track == NULL)
1044 {
1045 return false;
1046 }
1047
1048 switch (current_track->albumart.type)
1049 {
1050 case AA_TYPE_BMP:
1051 (*status) = IMAGE_BMP;
1052 break;
1053 case AA_TYPE_PNG:
1054 (*status) = IMAGE_PNG;
1055 break;
1056 case AA_TYPE_JPG:
1057 (*status) = IMAGE_JPEG;
1058 break;
1059 default:
1060 if (rb->search_albumart_files(current_track, "", np_file, MAX_PATH))
1061 {
1062 (*status) = get_image_type(np_file, false);
1063 return true;
1064 } else
1065 {
1066 return false;
1067 }
1068 }
1069 rb->strcpy(np_file, current_track->path);
1070 (*offset) = current_track->albumart.pos;
1071 (*filesize) = current_track->albumart.size;
1072 return true;
1073#endif
1074}
1075
1038/******************** Plugin entry point *********************/ 1076/******************** Plugin entry point *********************/
1039 1077
1040enum plugin_status plugin_start(const void* parameter) 1078enum plugin_status plugin_start(const void* parameter)
@@ -1044,13 +1082,28 @@ enum plugin_status plugin_start(const void* parameter)
1044 long greysize; /* helper */ 1082 long greysize; /* helper */
1045#endif 1083#endif
1046 1084
1047 if(!parameter) {rb->splash(HZ*2, "No file"); return PLUGIN_ERROR; } 1085 int offset = 0, filesize = 0, status;
1048 1086
1049 rb->strcpy(np_file, parameter); 1087 bool is_album_art = false;
1050 if (get_image_type(np_file, false) == IMAGE_UNKNOWN) 1088 if (!parameter)
1051 { 1089 {
1052 rb->splash(HZ*2, "Unsupported file"); 1090 if (!find_album_art(&offset, &filesize, &status))
1053 return PLUGIN_ERROR; 1091 {
1092 rb->splash(HZ * 2, "No file");
1093 return PLUGIN_ERROR;
1094 }
1095
1096 entries = 1;
1097 is_album_art = true;
1098 }
1099 else
1100 {
1101 rb->strcpy(np_file, parameter);
1102 if ((status = get_image_type(np_file, false)) == IMAGE_UNKNOWN)
1103 {
1104 rb->splash(HZ * 2, "Unsupported file");
1105 return PLUGIN_ERROR;
1106 }
1054 } 1107 }
1055 1108
1056#ifdef USE_PLUG_BUF 1109#ifdef USE_PLUG_BUF
@@ -1060,7 +1113,10 @@ enum plugin_status plugin_start(const void* parameter)
1060 buf = rb->plugin_get_audio_buffer(&buf_size); 1113 buf = rb->plugin_get_audio_buffer(&buf_size);
1061#endif 1114#endif
1062 1115
1063 get_pic_list(); 1116 if(!is_album_art)
1117 {
1118 get_pic_list();
1119 }
1064 1120
1065#ifdef USEGSLIB 1121#ifdef USEGSLIB
1066 if (!grey_init(buf, buf_size, GREY_ON_COP, 1122 if (!grey_init(buf, buf_size, GREY_ON_COP,
@@ -1100,8 +1156,18 @@ enum plugin_status plugin_start(const void* parameter)
1100 1156
1101 do 1157 do
1102 { 1158 {
1103 condition = load_and_show(np_file, &image_info); 1159 condition = load_and_show(np_file, &image_info, offset, filesize, status);
1104 } while (condition >= PLUGIN_OTHER); 1160 if (condition >= PLUGIN_OTHER)
1161 {
1162 if(!is_album_art)
1163 {
1164 /* suppress warning while running slideshow */
1165 status = get_image_type(np_file, iv_api.running_slideshow);
1166 }
1167 continue;
1168 }
1169 break;
1170 } while (true);
1105 release_decoder(); 1171 release_decoder();
1106 1172
1107 if (rb->memcmp(&settings, &old_settings, sizeof (settings))) 1173 if (rb->memcmp(&settings, &old_settings, sizeof (settings)))