Index: apps/plugins/imageviewer/imageviewer.c =================================================================== --- apps/plugins/imageviewer/imageviewer.c (リビジョン 28863) +++ apps/plugins/imageviewer/imageviewer.c (作業コピー) @@ -148,8 +148,9 @@ for (i = 0; i < tree->filesindir && buf_size > sizeof(char**); i++) { - if (!(dircache[i].attr & ATTR_DIRECTORY) - && get_image_type(dircache[i].name) != IMAGE_UNKNOWN) + /* add all files (i.e. exclude all directory). will be filtered out + when loading. */ + if (!(dircache[i].attr & ATTR_DIRECTORY)) { file_pt[entries] = dircache[i].name; /* Set Selected File. */ Index: apps/plugins/imageviewer/image_decoder.c =================================================================== --- apps/plugins/imageviewer/image_decoder.c (リビジョン 28863) +++ apps/plugins/imageviewer/image_decoder.c (作業コピー) @@ -32,6 +32,7 @@ /* check file type by extention */ enum image_type get_image_type(const char *name) { + enum image_type type = IMAGE_UNKNOWN; static const struct { char *ext; enum image_type type; @@ -42,18 +43,56 @@ { ".jpeg", IMAGE_JPEG }, { ".png", IMAGE_PNG }, }; + static const struct { + char *magic; /* magic number */ + int length; /* length of the magic number */ + enum image_type type; + } magic_list[] = { + { "\x42\x4d", 2, IMAGE_BMP }, + { "\xff\xd8\xff\xe0", 4, IMAGE_JPEG }, + { "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a", 8, IMAGE_PNG }, + }; const char *ext = rb->strrchr(name, '.'); - int i; - if (!ext) - return IMAGE_UNKNOWN; - - for (i = 0; i < (int)ARRAYLEN(ext_list); i++) + int i, fd; + char buf[12]; + /* check extention */ + if (ext) { + for (i = 0; i < (int)ARRAYLEN(ext_list); i++) + { + if (!rb->strcasecmp(ext, ext_list[i].ext)) + { + type = ext_list[i].type; + break; + } + } + ext++; /* skip dot */ + } + else { - if (!rb->strcasecmp(ext, ext_list[i].ext)) - return ext_list[i].type; + ext = "???"; } - return IMAGE_UNKNOWN; + + fd = rb->open(name, O_RDONLY); + if (fd >= 0) { + rb->memset(buf, 0, sizeof buf); + rb->read(fd, buf, sizeof buf); + rb->close(fd); + for (i = 0; i < (int)ARRAYLEN(magic_list); i++) + { + if (!rb->memcmp(buf, magic_list[i].magic, magic_list[i].length)) + { + if (type != magic_list[i].type) { + rb->splashf(HZ*1, + "File extension is not correct: %s -> %s", + ext, decoder_names[type]); + } + type = magic_list[i].type; + break; + } + } + } + return type; } static void *decoder_handle = NULL; Index: apps/plugins/imageviewer/image_decoder.h =================================================================== --- apps/plugins/imageviewer/image_decoder.h (リビジョン 28863) +++ apps/plugins/imageviewer/image_decoder.h (作業コピー) @@ -39,8 +39,11 @@ size_t size; }; +/* check file type by magic number or file extension */ enum image_type get_image_type(const char *name); +/* load image decoder */ const struct image_decoder *load_decoder(struct loader_info *loader_info); +/* release the loaded decoder */ void release_decoder(void); #endif /* _IMAGE_DECODER_H */