image_filter enhancement
ivan babrou
ibobrik at gmail.com
Fri Feb 22 05:52:42 UTC 2013
Is there anything else I should fix?
On 7 January 2013 17:01, ivan babrou <ibobrik at gmail.com> wrote:
> Btw, here's latest version with zero-termination and other fixes:
>
> diff --git a/ngx_http_image_filter_module.c
> b/ngx_http_image_filter_module.c
> index 3aee1a4..b086e3c 100644
> --- a/ngx_http_image_filter_module.c
> +++ b/ngx_http_image_filter_module.c
> @@ -32,6 +32,11 @@
> #define NGX_HTTP_IMAGE_GIF 2
> #define NGX_HTTP_IMAGE_PNG 3
>
> +#define NGX_HTTP_IMAGE_OFFSET_CENTER 0
> +#define NGX_HTTP_IMAGE_OFFSET_LEFT 1
> +#define NGX_HTTP_IMAGE_OFFSET_RIGHT 2
> +#define NGX_HTTP_IMAGE_OFFSET_TOP 3
> +#define NGX_HTTP_IMAGE_OFFSET_BOTTOM 4
>
> #define NGX_HTTP_IMAGE_BUFFERED 0x08
>
> @@ -43,11 +48,15 @@ typedef struct {
> ngx_uint_t angle;
> ngx_uint_t jpeg_quality;
> ngx_uint_t sharpen;
> + ngx_uint_t offset_x;
> + ngx_uint_t offset_y;
>
> ngx_flag_t transparency;
>
> ngx_http_complex_value_t *wcv;
> ngx_http_complex_value_t *hcv;
> + ngx_http_complex_value_t *oxcv;
> + ngx_http_complex_value_t *oycv;
> ngx_http_complex_value_t *acv;
> ngx_http_complex_value_t *jqcv;
> ngx_http_complex_value_t *shcv;
> @@ -66,6 +75,8 @@ typedef struct {
> ngx_uint_t height;
> ngx_uint_t max_width;
> ngx_uint_t max_height;
> + ngx_uint_t offset_x;
> + ngx_uint_t offset_y;
> ngx_uint_t angle;
>
> ngx_uint_t phase;
> @@ -110,6 +121,8 @@ static char
> *ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf,
> ngx_command_t *cmd, void *conf);
> static char *ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t
> *cmd,
> void *conf);
> +static char *ngx_http_image_filter_offset(ngx_conf_t *cf, ngx_command_t
> *cmd,
> + void *conf);
> static ngx_int_t ngx_http_image_filter_init(ngx_conf_t *cf);
>
>
> @@ -150,6 +163,13 @@ static ngx_command_t
> ngx_http_image_filter_commands[] = {
> offsetof(ngx_http_image_filter_conf_t, buffer_size),
> NULL },
>
> + { ngx_string("image_filter_crop_offset"),
> +
> NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
> + ngx_http_image_filter_offset,
> + NGX_HTTP_LOC_CONF_OFFSET,
> + 0,
> + NULL },
> +
> ngx_null_command
> };
>
> @@ -737,7 +757,8 @@ ngx_http_image_resize(ngx_http_request_t *r,
> ngx_http_image_filter_ctx_t *ctx)
> {
> int sx, sy, dx, dy, ox, oy, ax, ay, size,
> colors, palette, transparent, sharpen,
> - red, green, blue, t;
> + red, green, blue, t,
> + offset_x, offset_y;
> u_char *out;
> ngx_buf_t *b;
> ngx_uint_t resize;
> @@ -932,8 +953,24 @@ transparent:
> return NULL;
> }
>
> - ox /= 2;
> - oy /= 2;
> + offset_x = ngx_http_image_filter_get_value(r, conf->oxcv,
> + conf->offset_x);
> + offset_y = ngx_http_image_filter_get_value(r, conf->oycv,
> + conf->offset_y);
> +
> + if (offset_x == NGX_HTTP_IMAGE_OFFSET_LEFT) {
> + ox = 0;
> +
> + } else if (offset_x == NGX_HTTP_IMAGE_OFFSET_CENTER) {
> + ox /= 2;
> + }
> +
> + if (offset_y == NGX_HTTP_IMAGE_OFFSET_TOP) {
> + oy = 0;
> +
> + } else if (offset_y == NGX_HTTP_IMAGE_OFFSET_CENTER) {
> + oy /= 2;
> + }
>
> ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
> "image crop: %d x %d @ %d x %d",
> @@ -1141,17 +1178,43 @@ ngx_http_image_filter_get_value(ngx_http_request_t
> *r,
>
>
> static ngx_uint_t
> -ngx_http_image_filter_value(ngx_str_t *value)
> +ngx_http_image_filter_value(ngx_str_t *v)
> {
> ngx_int_t n;
>
> - if (value->len == 1 && value->data[0] == '-') {
> + if (v->len == 1 && v->data[0] == '-') {
> return (ngx_uint_t) -1;
> }
>
> - n = ngx_atoi(value->data, value->len);
> + n = ngx_atoi(v->data, v->len);
> +
> + if (n == NGX_ERROR) {
> +
> + if (v->len == sizeof("left") - 1
> + && ngx_strncmp(v->data, "left", v->len) == 0)
> + {
> + return NGX_HTTP_IMAGE_OFFSET_LEFT;
> +
> + } else if (v->len == sizeof("right") - 1
> + && ngx_strncmp(v->data, "right", sizeof("right") - 1)
> == 0)
> + {
> + return NGX_HTTP_IMAGE_OFFSET_RIGHT;
> +
> + } else if (v->len == sizeof("top") - 1
> + && ngx_strncmp(v->data, "top", sizeof("top") - 1) == 0)
> + {
> + return NGX_HTTP_IMAGE_OFFSET_TOP;
>
> - if (n > 0) {
> + } else if (v->len == sizeof("bottom") - 1
> + && ngx_strncmp(v->data, "bottom", sizeof("bottom") -
> 1) == 0)
> + {
> + return NGX_HTTP_IMAGE_OFFSET_BOTTOM;
> +
> + } else {
> + return NGX_HTTP_IMAGE_OFFSET_CENTER;
> + }
> +
> + } else if (n > 0) {
> return (ngx_uint_t) n;
> }
>
> @@ -1175,6 +1238,8 @@ ngx_http_image_filter_create_conf(ngx_conf_t *cf)
> conf->angle = NGX_CONF_UNSET_UINT;
> conf->transparency = NGX_CONF_UNSET;
> conf->buffer_size = NGX_CONF_UNSET_SIZE;
> + conf->offset_x = NGX_CONF_UNSET_UINT;
> + conf->offset_y = NGX_CONF_UNSET_UINT;
>
> return conf;
> }
> @@ -1230,6 +1295,24 @@ ngx_http_image_filter_merge_conf(ngx_conf_t *cf,
> void *parent, void *child)
> ngx_conf_merge_size_value(conf->buffer_size, prev->buffer_size,
> 1 * 1024 * 1024);
>
> + if (conf->offset_x == NGX_CONF_UNSET_UINT) {
> + ngx_conf_merge_uint_value(conf->offset_x, prev->offset_x,
> + NGX_HTTP_IMAGE_OFFSET_CENTER);
> +
> + if (conf->oxcv == NULL) {
> + conf->oxcv = prev->oxcv;
> + }
> + }
> +
> + if (conf->offset_y == NGX_CONF_UNSET_UINT) {
> + ngx_conf_merge_uint_value(conf->offset_y, prev->offset_y,
> + NGX_HTTP_IMAGE_OFFSET_CENTER);
> +
> + if (conf->oycv == NULL) {
> + conf->oycv = prev->oycv;
> + }
> + }
> +
> return NGX_CONF_OK;
> }
>
> @@ -1481,6 +1564,66 @@ ngx_http_image_filter_sharpen(ngx_conf_t *cf,
> ngx_command_t *cmd,
> }
>
>
> +static char *
> +ngx_http_image_filter_offset(ngx_conf_t *cf, ngx_command_t *cmd,
> + void *conf)
> +{
> + ngx_http_image_filter_conf_t *imcf = conf;
> +
> + ngx_str_t *value;
> + ngx_http_complex_value_t cv;
> + ngx_http_compile_complex_value_t ccv;
> +
> + value = cf->args->elts;
> +
> + ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
> +
> + ccv.cf = cf;
> + ccv.value = &value[1];
> + ccv.complex_value = &cv;
> +
> + if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
> + return NGX_CONF_ERROR;
> + }
> +
> + if (cv.lengths == NULL) {
> + imcf->offset_x = ngx_http_image_filter_value(&value[1]);
> +
> + } else {
> + imcf->oxcv = ngx_palloc(cf->pool,
> sizeof(ngx_http_complex_value_t));
> + if (imcf->oxcv == NULL) {
> + return NGX_CONF_ERROR;
> + }
> +
> + *imcf->oxcv = cv;
> + }
> +
> + ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
> +
> + ccv.cf = cf;
> + ccv.value = &value[2];
> + ccv.complex_value = &cv;
> +
> + if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
> + return NGX_CONF_ERROR;
> + }
> +
> + if (cv.lengths == NULL) {
> + imcf->offset_y = ngx_http_image_filter_value(&value[2]);
> +
> + } else {
> + imcf->oycv = ngx_palloc(cf->pool,
> sizeof(ngx_http_complex_value_t));
> + if (imcf->oycv == NULL) {
> + return NGX_CONF_ERROR;
> + }
> +
> + *imcf->oycv = cv;
> + }
> +
> + return NGX_CONF_OK;
> +}
> +
> +
> static ngx_int_t
> ngx_http_image_filter_init(ngx_conf_t *cf)
> {
>
>
>
> On 25 December 2012 20:05, Maxim Dounin <mdounin at mdounin.ru> wrote:
>
>> Hello!
>>
>> On Thu, Dec 20, 2012 at 09:01:38PM +0400, ivan babrou wrote:
>>
>> > I've send patch for configuration semantics in separate thread.
>> >
>> > Here's lastest version of my patch that may be applied after. Is there
>> > something else that I should fix?
>>
>> I would like to see clarification on how are you going to handle
>> just bare numbers specified. As of now the code seems to don't do
>> any special processing and seems to assume all values are correct,
>> which might not be true and will result in some mostly arbitray
>> crop offset selection. It might make sense to actually support
>> percents as in Maxim Bublis's patch[1].
>>
>> [1] http://mailman.nginx.org/pipermail/nginx-devel/2012-April/002156.html
>>
>> [...]
>>
>> > @@ -1151,7 +1188,24 @@ ngx_http_image_filter_value(ngx_str_t *value)
>> >
>> > n = ngx_atoi(value->data, value->len);
>> >
>> > - if (n > 0) {
>> > + if (n == NGX_ERROR) {
>> > + if (ngx_strncmp(value->data, "left", value->len) == 0) {
>> > + return NGX_HTTP_IMAGE_OFFSET_LEFT;
>> > +
>> > + } else if (ngx_strncmp(value->data, "right", value->len) == 0)
>> {
>> > + return NGX_HTTP_IMAGE_OFFSET_RIGHT;
>> > +
>> > + } else if (ngx_strncmp(value->data, "top", value->len) == 0) {
>> > + return NGX_HTTP_IMAGE_OFFSET_TOP;
>> > +
>> > + } else if (ngx_strncmp(value->data, "bottom", value->len) ==
>> 0) {
>> > + return NGX_HTTP_IMAGE_OFFSET_BOTTOM;
>> > +
>> > + } else {
>> > + return NGX_HTTP_IMAGE_OFFSET_CENTER;
>> > + }
>> > +
>> > + } else if (n > 0) {
>> > return (ngx_uint_t) n;
>> > }
>> >
>>
>> The ngx_strncmp() checks are incorrect, see here:
>> http://mailman.nginx.org/pipermail/nginx-devel/2012-December/003065.html
>>
>> You may also move them below "if (n > 0)" the check for better
>> readability.
>>
>> > @@ -1175,6 +1229,8 @@ ngx_http_image_filter_create_conf(ngx_conf_t *cf)
>> > conf->angle = NGX_CONF_UNSET_UINT;
>> > conf->transparency = NGX_CONF_UNSET;
>> > conf->buffer_size = NGX_CONF_UNSET_SIZE;
>> > + conf->crop_offset_x = NGX_CONF_UNSET_UINT;
>> > + conf->crop_offset_y = NGX_CONF_UNSET_UINT;
>>
>> The "crop_" prefix probably should be dropped here for better
>> readability (and to match other names in the code like "oxcv").
>>
>> [...]
>>
>> --
>> Maxim Dounin
>> http://nginx.com/support.html
>>
>> _______________________________________________
>> nginx-devel mailing list
>> nginx-devel at nginx.org
>> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>>
>
>
>
> --
> Regards, Ian Babrou
> http://bobrik.name http://twitter.com/ibobrik skype:i.babrou
>
--
Regards, Ian Babrou
http://bobrik.name http://twitter.com/ibobrik skype:i.babrou
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20130222/b82a6662/attachment-0001.html>
More information about the nginx-devel
mailing list