diff --git a/legacy/ethumb/src/bin/ethumbd.c b/legacy/ethumb/src/bin/ethumbd.c index 3b9aaef7e0..a1df48f079 100644 --- a/legacy/ethumb/src/bin/ethumbd.c +++ b/legacy/ethumb/src/bin/ethumbd.c @@ -64,6 +64,8 @@ struct _Ethumb_Setup int format : 1; int aspect : 1; int crop : 1; + int quality : 1; + int compress : 1; int directory : 1; int category : 1; int frame : 1; @@ -75,6 +77,8 @@ struct _Ethumb_Setup int format; int aspect; float cx, cy; + int quality; + int compress; const char *directory; const char *category; const char *theme_file; @@ -468,6 +472,8 @@ _ethumbd_pipe_write_setup(int fd, int type, const void *data) case ETHUMBD_FDO: case ETHUMBD_FORMAT: case ETHUMBD_ASPECT: + case ETHUMBD_QUALITY: + case ETHUMBD_COMPRESS: case ETHUMBD_SIZE_W: case ETHUMBD_SIZE_H: case ETHUMBD_DOCUMENT_PAGE: @@ -522,6 +528,10 @@ _process_setup(struct _Ethumbd *ed) _ethumbd_pipe_write_setup(fd, ETHUMBD_CROP_X, &setup->cx); _ethumbd_pipe_write_setup(fd, ETHUMBD_CROP_Y, &setup->cy); } + if (setup->flags.quality) + _ethumbd_pipe_write_setup(fd, ETHUMBD_QUALITY, &setup->quality); + if (setup->flags.compress) + _ethumbd_pipe_write_setup(fd, ETHUMBD_COMPRESS, &setup->compress); if (setup->flags.directory) _ethumbd_pipe_write_setup(fd, ETHUMBD_DIRECTORY, setup->directory); if (setup->flags.category) @@ -1182,6 +1192,49 @@ _ethumb_dbus_crop_set(struct _Ethumb_Object *eobject, DBusMessageIter *iter, str return 1; } +static int +_ethumb_dbus_quality_set(struct _Ethumb_Object *eobject, DBusMessageIter *iter, struct _Ethumb_Request *request) +{ + int type; + int quality; + + type = dbus_message_iter_get_arg_type(iter); + if (type != DBUS_TYPE_INT32 && type != DBUS_TYPE_INT64) + { + ERR("invalid param for quality_set.\n"); + return 0; + } + + dbus_message_iter_get_basic(iter, &quality); + DBG("setting quality to: %d\n", quality); + request->setup.flags.quality = 1; + request->setup.quality = quality; + + return 1; +} + + +static int +_ethumb_dbus_compress_set(struct _Ethumb_Object *eobject, DBusMessageIter *iter, struct _Ethumb_Request *request) +{ + int type; + int compress; + + type = dbus_message_iter_get_arg_type(iter); + if (type != DBUS_TYPE_INT32 && type != DBUS_TYPE_INT64) + { + ERR("invalid param for compress_set.\n"); + return 0; + } + + dbus_message_iter_get_basic(iter, &compress); + DBG("setting compress to: %d\n", compress); + request->setup.flags.compress = 1; + request->setup.compress = compress; + + return 1; +} + static int _ethumb_dbus_frame_set(struct _Ethumb_Object *eobject, DBusMessageIter *iter, struct _Ethumb_Request *request) { @@ -1305,6 +1358,8 @@ static struct { "format", _ethumb_dbus_format_set }, { "aspect", _ethumb_dbus_aspect_set }, { "crop", _ethumb_dbus_crop_set }, + { "quality", _ethumb_dbus_quality_set }, + { "compress", _ethumb_dbus_compress_set }, { "frame", _ethumb_dbus_frame_set }, { "directory", _ethumb_dbus_directory_set }, { "category", _ethumb_dbus_category_set }, diff --git a/legacy/ethumb/src/bin/ethumbd_child.c b/legacy/ethumb/src/bin/ethumbd_child.c index 4b790c5911..8e953c2aca 100644 --- a/legacy/ethumb/src/bin/ethumbd_child.c +++ b/legacy/ethumb/src/bin/ethumbd_child.c @@ -367,6 +367,36 @@ _ec_crop_set(struct _Ethumbd_Child *ec, Ethumb *e) return 1; } +static int +_ec_quality_set(struct _Ethumbd_Child *ec, Ethumb *e) +{ + int r; + int value; + + r = _ec_read_safe(ec->pipein, &value, sizeof(value)); + if (!r) + return 0; + ethumb_thumb_quality_set(e, value); + DBG("quality = %d\n", value); + + return 1; +} + +static int +_ec_compress_set(struct _Ethumbd_Child *ec, Ethumb *e) +{ + int r; + int value; + + r = _ec_read_safe(ec->pipein, &value, sizeof(value)); + if (!r) + return 0; + ethumb_thumb_compress_set(e, value); + DBG("compress = %d\n", value); + + return 1; +} + static int _ec_frame_set(struct _Ethumbd_Child *ec, Ethumb *e) { @@ -484,6 +514,12 @@ _ec_setup_process(struct _Ethumbd_Child *ec, int index, int type) case ETHUMBD_CROP_X: _ec_crop_set(ec, e); break; + case ETHUMBD_QUALITY: + _ec_quality_set(ec, e); + break; + case ETHUMBD_COMPRESS: + _ec_compress_set(ec, e); + break; case ETHUMBD_FRAME_FILE: _ec_frame_set(ec, e); break; diff --git a/legacy/ethumb/src/bin/ethumbd_private.h b/legacy/ethumb/src/bin/ethumbd_private.h index c67229effd..666b684244 100644 --- a/legacy/ethumb/src/bin/ethumbd_private.h +++ b/legacy/ethumb/src/bin/ethumbd_private.h @@ -19,6 +19,8 @@ enum Ethubmd_Setup_Option ETHUMBD_ASPECT, ETHUMBD_CROP_X, ETHUMBD_CROP_Y, + ETHUMBD_QUALITY, + ETHUMBD_COMPRESS, ETHUMBD_DIRECTORY, ETHUMBD_CATEGORY, ETHUMBD_FRAME_FILE, diff --git a/legacy/ethumb/src/lib/Ethumb.c b/legacy/ethumb/src/lib/Ethumb.c index da909f7525..275c160228 100644 --- a/legacy/ethumb/src/lib/Ethumb.c +++ b/legacy/ethumb/src/lib/Ethumb.c @@ -188,6 +188,8 @@ ethumb_new(void) ethumb->th = THUMB_SIZE_NORMAL; ethumb->crop_x = 0.5; ethumb->crop_y = 0.5; + ethumb->quality = 80; + ethumb->compress = 9; ee = ecore_evas_buffer_new(1, 1); e = ecore_evas_get(ee); @@ -375,6 +377,36 @@ ethumb_thumb_crop_align_get(const Ethumb *e, float *x, float *y) if (y) *y = e->crop_y; } +EAPI void +ethumb_thumb_quality_set(Ethumb *e, int quality) +{ + EINA_SAFETY_ON_NULL_RETURN(e); + + e->quality = quality; +} + +EAPI int +ethumb_thumb_quality_get(const Ethumb *e) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(e, 0); + return e->quality; +} + +EAPI void +ethumb_thumb_compress_set(Ethumb *e, int compress) +{ + EINA_SAFETY_ON_NULL_RETURN(e); + + e->compress = compress; +} + +EAPI int +ethumb_thumb_compress_get(const Ethumb *e) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(e, 0); + return e->compress; +} + EAPI Eina_Bool ethumb_frame_set(Ethumb *e, const char *theme_file, const char *group, const char *swallow) { @@ -865,6 +897,7 @@ ethumb_image_save(Ethumb *e) { Eina_Bool r; char *dname; + char flags[256]; evas_damage_rectangle_add(e->sub_e, 0, 0, e->rw, e->rh); evas_render(e->sub_e); @@ -887,8 +920,9 @@ ethumb_image_save(Ethumb *e) return EINA_FALSE; } - r = evas_object_image_save(e->o, e->thumb_path, e->thumb_key, - "quality=85"); + snprintf(flags, sizeof(flags), "quality=%d compress=%d", + e->quality, e->compress); + r = evas_object_image_save(e->o, e->thumb_path, e->thumb_key, flags); if (!r) { diff --git a/legacy/ethumb/src/lib/Ethumb.h b/legacy/ethumb/src/lib/Ethumb.h index 70db3e5117..95aca939e9 100644 --- a/legacy/ethumb/src/lib/Ethumb.h +++ b/legacy/ethumb/src/lib/Ethumb.h @@ -89,6 +89,12 @@ EAPI Ethumb_Thumb_Aspect ethumb_thumb_aspect_get(const Ethumb *e) EINA_WARN_UNUS EAPI void ethumb_thumb_crop_align_set(Ethumb *e, float x, float y) EINA_ARG_NONNULL(1); EAPI void ethumb_thumb_crop_align_get(const Ethumb *e, float *x, float *y) EINA_ARG_NONNULL(1); +EAPI void ethumb_thumb_quality_set(Ethumb *e, int quality) EINA_ARG_NONNULL(1); +EAPI int ethumb_thumb_quality_get(const Ethumb *e) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT EINA_PURE; + +EAPI void ethumb_thumb_compress_set(Ethumb *e, int compress) EINA_ARG_NONNULL(1); +EAPI int ethumb_thumb_compress_get(const Ethumb *e) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT EINA_PURE; + EAPI Eina_Bool ethumb_frame_set(Ethumb *e, const char *theme_file, const char *group, const char *swallow) EINA_ARG_NONNULL(1); EAPI void ethumb_frame_get(const Ethumb *e, const char **theme_file, const char **group, const char **swallow) EINA_ARG_NONNULL(1); diff --git a/legacy/ethumb/src/lib/client/Ethumb_Client.c b/legacy/ethumb/src/lib/client/Ethumb_Client.c index c1338ad8c6..c363f42095 100644 --- a/legacy/ethumb/src/lib/client/Ethumb_Client.c +++ b/legacy/ethumb/src/lib/client/Ethumb_Client.c @@ -598,7 +598,7 @@ ethumb_client_ethumb_setup(Ethumb_Client *client) DBusMessageIter iter, aiter, diter, viter, vaiter; Ethumb *e = client->ethumb; const char *entry; - int tw, th, format, aspect; + int tw, th, format, aspect, quality, compress; float cx, cy; const char *theme_file, *group, *swallow; const char *directory, *category; @@ -654,6 +654,16 @@ ethumb_client_ethumb_setup(Ethumb_Client *client) dbus_message_iter_close_container(&viter, &vaiter); _close_variant_iter(viter); + _open_variant_iter("quality", "i", viter); + quality = ethumb_thumb_quality_get(e); + dbus_message_iter_append_basic(&viter, DBUS_TYPE_INT32, &quality); + _close_variant_iter(viter); + + _open_variant_iter("compress", "i", viter); + compress = ethumb_thumb_compress_get(e); + dbus_message_iter_append_basic(&viter, DBUS_TYPE_INT32, &compress); + _close_variant_iter(viter); + _open_variant_iter("frame", "(ayayay)", viter); dbus_message_iter_open_container(&viter, DBUS_TYPE_STRUCT, NULL, &vaiter); ethumb_frame_get(e, &theme_file, &group, &swallow); @@ -1048,6 +1058,38 @@ ethumb_client_crop_align_get(const Ethumb_Client *client, float *x, float *y) ethumb_thumb_crop_align_get(client->ethumb, x, y); } +EAPI void +ethumb_client_quality_set(Ethumb_Client *client, int quality) +{ + EINA_SAFETY_ON_NULL_RETURN(client); + + ethumb_thumb_quality_set(client->ethumb, quality); +} + +EAPI int +ethumb_client_quality_get(const Ethumb_Client *client) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(client, 0); + + return ethumb_thumb_quality_get(client->ethumb); +} + +EAPI void +ethumb_client_compress_set(Ethumb_Client *client, int compress) +{ + EINA_SAFETY_ON_NULL_RETURN(client); + + ethumb_thumb_compress_set(client->ethumb, compress); +} + +EAPI int +ethumb_client_compress_get(const Ethumb_Client *client) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(client, 0); + + return ethumb_thumb_compress_get(client->ethumb); +} + EAPI Eina_Bool ethumb_client_frame_set(Ethumb_Client *client, const char *file, const char *group, const char *swallow) { diff --git a/legacy/ethumb/src/lib/client/Ethumb_Client.h b/legacy/ethumb/src/lib/client/Ethumb_Client.h index e60b46d97e..edf09b0905 100644 --- a/legacy/ethumb/src/lib/client/Ethumb_Client.h +++ b/legacy/ethumb/src/lib/client/Ethumb_Client.h @@ -62,6 +62,10 @@ EAPI void ethumb_client_aspect_set(Ethumb_Client *client, Ethumb_Thumb_Aspect a) EAPI Ethumb_Thumb_Aspect ethumb_client_aspect_get(const Ethumb_Client *client); EAPI void ethumb_client_crop_align_set(Ethumb_Client *client, float x, float y); EAPI void ethumb_client_crop_align_get(const Ethumb_Client *client, float *x, float *y); +EAPI void ethumb_client_quality_set(Ethumb_Client *client, int quality); +EAPI int ethumb_client_quality_get(const Ethumb_Client *client); +EAPI void ethumb_client_compress_set(Ethumb_Client *client, int compress); +EAPI int ethumb_client_compress_get(const Ethumb_Client *client); EAPI Eina_Bool ethumb_client_frame_set(Ethumb_Client *client, const char *file, const char *group, const char *swallow); EAPI void ethumb_client_dir_path_set(Ethumb_Client *client, const char *path); EAPI const char * ethumb_client_dir_path_get(const Ethumb_Client *client); diff --git a/legacy/ethumb/src/lib/ethumb_private.h b/legacy/ethumb/src/lib/ethumb_private.h index c6975cc47f..a0ba51c95f 100644 --- a/legacy/ethumb/src/lib/ethumb_private.h +++ b/legacy/ethumb/src/lib/ethumb_private.h @@ -19,6 +19,8 @@ struct _Ethumb int format; int aspect; float crop_x, crop_y; + int quality; + int compress; const char *src_path; const char *src_key; const char *thumb_path;