diff --git a/.gitignore b/.gitignore index fac1da2..bfa1f44 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ /src/bin/Makefile /src/bin/Makefile.in /src/bin/rage +/src/bin/rage_thumb pkgbuild/PKGBUILD pkgbuild/pkg pkgbuild/src diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index b992fca..479d5ab 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -19,4 +19,17 @@ video.c video.h \ winvid.c winvid.h \ win.c win.h \ winlist.c winlist.h \ -config.c config.h +config.c config.h \ +sha1.c sha1.h + +internal_bindir = $(libdir)/rage/utils +internal_bin_PROGRAMS = rage_thumb + +rage_thumb_SOURCES = \ +thumb.c \ +sha1.c sha1.h + +rage_thumb_LDADD = @RAGE_LIBS@ +rage_thumb_CPPFLAGS = -I. \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" -DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" @RAGE_CFLAGS@ diff --git a/src/bin/sha1.c b/src/bin/sha1.c new file mode 100644 index 0000000..94661c3 --- /dev/null +++ b/src/bin/sha1.c @@ -0,0 +1,96 @@ +#include +#include + +#define SHSH(n, v) ((((v) << (n)) & 0xffffffff) | ((v) >> (32 - (n)))) + +int +sha1(unsigned char *data, int size, unsigned char *dst) +{ + unsigned int digest[5], word[80], wa, wb, wc, wd, we, t; + unsigned char buf[64], *d; + int idx, left, i; + const unsigned int magic[4] = + { + 0x5a827999, + 0x6ed9eba1, + 0x8f1bbcdc, + 0xca62c1d6 + }; + + idx = 0; + digest[0] = 0x67452301; + digest[1] = 0xefcdab89; + digest[2] = 0x98badcfe; + digest[3] = 0x10325476; + digest[4] = 0xc3d2e1f0; + + memset(buf, 0, sizeof(buf)); + for (left = size, d = data; left > 0; left--, d++) + { + if ((idx == 0) && (left < 64)) + { + memset(buf, 0, 60); + buf[60] = (size >> 24) & 0xff; + buf[61] = (size >> 16) & 0xff; + buf[62] = (size >> 8) & 0xff; + buf[63] = (size) & 0xff; + } + buf[idx] = *d; + idx++; + if ((idx == 64) || (left == 1)) + { + if ((left == 1) && (idx < 64)) buf[idx] = 0x80; + for (i = 0; i < 16; i++) + { + word[i] = (unsigned int)buf[(i * 4) ] << 24; + word[i] |= (unsigned int)buf[(i * 4) + 1] << 16; + word[i] |= (unsigned int)buf[(i * 4) + 2] << 8; + word[i] |= (unsigned int)buf[(i * 4) + 3]; + } + for (i = 16; i < 80; i++) + word[i] = SHSH(1, + word[i - 3 ] ^ word[i - 8 ] ^ + word[i - 14] ^ word[i - 16]); + wa = digest[0]; + wb = digest[1]; + wc = digest[2]; + wd = digest[3]; + we = digest[4]; + for (i = 0; i < 80; i++) + { + if (i < 20) + t = SHSH(5, wa) + ((wb & wc) | ((~wb) & wd)) + + we + word[i] + magic[0]; + else if (i < 40) + t = SHSH(5, wa) + (wb ^ wc ^ wd) + + we + word[i] + magic[1]; + else if (i < 60) + t = SHSH(5, wa) + ((wb & wc) | (wb & wd) | (wc & wd)) + + we + word[i] + magic[2]; + else if (i < 80) + t = SHSH(5, wa) + (wb ^ wc ^ wd) + + we + word[i] + magic[3]; + we = wd; + wd = wc; + wc = SHSH(30, wb); + wb = wa; + wa = t; + } + digest[0] += wa; + digest[1] += wb; + digest[2] += wc; + digest[3] += wd; + digest[4] += we; + idx = 0; + } + } + + t = htonl(digest[0]); digest[0] = t; + t = htonl(digest[1]); digest[1] = t; + t = htonl(digest[2]); digest[2] = t; + t = htonl(digest[3]); digest[3] = t; + t = htonl(digest[4]); digest[4] = t; + + memcpy(dst, digest, 5 * 4); + return 1; +} diff --git a/src/bin/sha1.h b/src/bin/sha1.h new file mode 100644 index 0000000..3c22364 --- /dev/null +++ b/src/bin/sha1.h @@ -0,0 +1 @@ +int sha1(unsigned char *data, int size, unsigned char *dst); diff --git a/src/bin/thumb.c b/src/bin/thumb.c new file mode 100644 index 0000000..397ac9f --- /dev/null +++ b/src/bin/thumb.c @@ -0,0 +1,88 @@ +#include +#include "sha1.h" + +static Evas_Object *win = NULL, *subwin = NULL, *image = NULL; +static Evas_Object *vidimage = NULL; +static int iw, ih; +static unsigned char sum[20]; +static Eet_File *ef; + +EAPI_MAIN int +elm_main(int argc, char **argv) +{ + char buf_base[PATH_MAX]; + char buf_file[PATH_MAX]; + unsigned int pos, incr; + + if (argc < 3) exit(1); + elm_need_efreet(); + + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR); + elm_app_compile_data_dir_set(PACKAGE_DATA_DIR); + elm_app_info_set(elm_main, "rage", "themes/default.edj"); + + elm_config_engine_set("buffer"); + win = elm_win_add(NULL, "Rage", ELM_WIN_BASIC); + subwin = elm_win_add(win, "inlined", ELM_WIN_INLINED_IMAGE); + image = elm_win_inlined_image_object_get(subwin); + + evas_object_show(subwin); + evas_object_show(win); + + elm_win_norender_push(subwin); + elm_win_norender_push(win); + + vidimage = evas_object_image_filled_add(evas_object_evas_get(subwin)); + evas_object_show(vidimage); + + evas_object_image_file_set(vidimage, argv[1], NULL); + evas_object_image_size_get(vidimage, &iw, &ih); + if (!sha1((unsigned char *)argv[1], strlen(argv[1]), sum)) exit(2); + if (!efreet_cache_home_get()) exit(3); + snprintf(buf_base, sizeof(buf_base), "%s/rage/thumb/%02x", + efreet_cache_home_get(), sum[0]); + snprintf(buf_file, sizeof(buf_base), + "%s/%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" + "%02x%02x%02x%02x%02x%02x%02x%02x.eet", + buf_base, + sum[1], sum[2], sum[3], + sum[4], sum[5], sum[6], sum[7], + sum[8], sum[9], sum[10], sum[11], + sum[12], sum[13], sum[14], sum[15], + sum[16], sum[17], sum[18], sum[19]); + if (!ecore_file_mkpath(buf_base)) exit(4); + ef = eet_open(buf_file, EET_FILE_MODE_WRITE); + if (!ef) exit(5); + pos = 0; + incr = atoi(argv[2]); + for (pos = 0; ; pos += incr) + { + int w, h; + int *pixels; + char key[128]; + + snprintf(key, sizeof(key), "%i", pos); + pos += incr; + evas_object_image_file_set(vidimage, argv[1], key); + evas_object_image_size_get(vidimage, &iw, &ih); + if ((iw <= 0) || (ih <= 0)) break; + w = 160; + h = (ih * 160) / iw; + if (h < 1) h = 1; + evas_object_resize(vidimage, w, h); + evas_object_resize(subwin, w, h); + elm_win_render(subwin); + pixels = evas_object_image_data_get(image, EINA_FALSE); + if (pixels) + { + eet_data_image_write(ef, key, pixels, w, h, + 0, 0, 70, EET_IMAGE_JPEG); + } + evas_object_image_data_set(image, pixels); + } + eet_close(ef); + elm_shutdown(); + return 0; +} +ELM_MAIN()