Merge of r4266, r4308, r4309:
Image filter changes: *) The "image_filter_sharpen" directive. *) Cosmetics. *) Fixed "rotate" to always work when combined with "resize/crop".
This commit is contained in:
parent
def9ecde1a
commit
7a35eab981
1 changed files with 78 additions and 4 deletions
|
@ -41,6 +41,7 @@ typedef struct {
|
||||||
ngx_uint_t height;
|
ngx_uint_t height;
|
||||||
ngx_uint_t angle;
|
ngx_uint_t angle;
|
||||||
ngx_uint_t jpeg_quality;
|
ngx_uint_t jpeg_quality;
|
||||||
|
ngx_uint_t sharpen;
|
||||||
|
|
||||||
ngx_flag_t transparency;
|
ngx_flag_t transparency;
|
||||||
|
|
||||||
|
@ -48,6 +49,7 @@ typedef struct {
|
||||||
ngx_http_complex_value_t *hcv;
|
ngx_http_complex_value_t *hcv;
|
||||||
ngx_http_complex_value_t *acv;
|
ngx_http_complex_value_t *acv;
|
||||||
ngx_http_complex_value_t *jqcv;
|
ngx_http_complex_value_t *jqcv;
|
||||||
|
ngx_http_complex_value_t *shcv;
|
||||||
|
|
||||||
size_t buffer_size;
|
size_t buffer_size;
|
||||||
} ngx_http_image_filter_conf_t;
|
} ngx_http_image_filter_conf_t;
|
||||||
|
@ -105,13 +107,15 @@ static char *ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
void *conf);
|
void *conf);
|
||||||
static char *ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf,
|
static char *ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf,
|
||||||
ngx_command_t *cmd, void *conf);
|
ngx_command_t *cmd, void *conf);
|
||||||
|
static char *ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf);
|
||||||
static ngx_int_t ngx_http_image_filter_init(ngx_conf_t *cf);
|
static ngx_int_t ngx_http_image_filter_init(ngx_conf_t *cf);
|
||||||
|
|
||||||
|
|
||||||
static ngx_command_t ngx_http_image_filter_commands[] = {
|
static ngx_command_t ngx_http_image_filter_commands[] = {
|
||||||
|
|
||||||
{ ngx_string("image_filter"),
|
{ ngx_string("image_filter"),
|
||||||
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE13|NGX_CONF_TAKE2,
|
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,
|
||||||
ngx_http_image_filter,
|
ngx_http_image_filter,
|
||||||
NGX_HTTP_LOC_CONF_OFFSET,
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
0,
|
0,
|
||||||
|
@ -124,6 +128,13 @@ static ngx_command_t ngx_http_image_filter_commands[] = {
|
||||||
0,
|
0,
|
||||||
NULL },
|
NULL },
|
||||||
|
|
||||||
|
{ ngx_string("image_filter_sharpen"),
|
||||||
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
|
||||||
|
ngx_http_image_filter_sharpen,
|
||||||
|
NGX_HTTP_LOC_CONF_OFFSET,
|
||||||
|
0,
|
||||||
|
NULL },
|
||||||
|
|
||||||
{ ngx_string("image_filter_transparency"),
|
{ ngx_string("image_filter_transparency"),
|
||||||
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||||||
ngx_conf_set_flag_slot,
|
ngx_conf_set_flag_slot,
|
||||||
|
@ -724,7 +735,7 @@ static ngx_buf_t *
|
||||||
ngx_http_image_resize(ngx_http_request_t *r, ngx_http_image_filter_ctx_t *ctx)
|
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,
|
int sx, sy, dx, dy, ox, oy, ax, ay, size,
|
||||||
colors, palette, transparent,
|
colors, palette, transparent, sharpen,
|
||||||
red, green, blue, t;
|
red, green, blue, t;
|
||||||
u_char *out;
|
u_char *out;
|
||||||
ngx_buf_t *b;
|
ngx_buf_t *b;
|
||||||
|
@ -948,6 +959,11 @@ transparent:
|
||||||
gdImageColorTransparent(dst, gdImageColorExact(dst, red, green, blue));
|
gdImageColorTransparent(dst, gdImageColorExact(dst, red, green, blue));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sharpen = ngx_http_image_filter_get_value(r, conf->shcv, conf->sharpen);
|
||||||
|
if (sharpen > 0) {
|
||||||
|
gdImageSharpen(dst, sharpen);
|
||||||
|
}
|
||||||
|
|
||||||
out = ngx_http_image_out(r, ctx->type, dst, &size);
|
out = ngx_http_image_out(r, ctx->type, dst, &size);
|
||||||
|
|
||||||
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
|
||||||
|
@ -1156,6 +1172,7 @@ ngx_http_image_filter_create_conf(ngx_conf_t *cf)
|
||||||
|
|
||||||
conf->filter = NGX_CONF_UNSET_UINT;
|
conf->filter = NGX_CONF_UNSET_UINT;
|
||||||
conf->jpeg_quality = NGX_CONF_UNSET_UINT;
|
conf->jpeg_quality = NGX_CONF_UNSET_UINT;
|
||||||
|
conf->sharpen = NGX_CONF_UNSET_UINT;
|
||||||
conf->angle = NGX_CONF_UNSET_UINT;
|
conf->angle = NGX_CONF_UNSET_UINT;
|
||||||
conf->transparency = NGX_CONF_UNSET;
|
conf->transparency = NGX_CONF_UNSET;
|
||||||
conf->buffer_size = NGX_CONF_UNSET_SIZE;
|
conf->buffer_size = NGX_CONF_UNSET_SIZE;
|
||||||
|
@ -1191,6 +1208,12 @@ ngx_http_image_filter_merge_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||||
conf->jqcv = prev->jqcv;
|
conf->jqcv = prev->jqcv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_conf_merge_uint_value(conf->sharpen, prev->sharpen, 0);
|
||||||
|
|
||||||
|
if (conf->shcv == NULL) {
|
||||||
|
conf->shcv = prev->shcv;
|
||||||
|
}
|
||||||
|
|
||||||
ngx_conf_merge_uint_value(conf->angle, prev->angle, 0);
|
ngx_conf_merge_uint_value(conf->angle, prev->angle, 0);
|
||||||
if (conf->acv == NULL) {
|
if (conf->acv == NULL) {
|
||||||
conf->acv = prev->acv;
|
conf->acv = prev->acv;
|
||||||
|
@ -1239,7 +1262,11 @@ ngx_http_image_filter(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||||
} else if (cf->args->nelts == 3) {
|
} else if (cf->args->nelts == 3) {
|
||||||
|
|
||||||
if (ngx_strcmp(value[i].data, "rotate") == 0) {
|
if (ngx_strcmp(value[i].data, "rotate") == 0) {
|
||||||
|
if (imcf->filter != NGX_HTTP_IMAGE_RESIZE
|
||||||
|
&& imcf->filter != NGX_HTTP_IMAGE_CROP)
|
||||||
|
{
|
||||||
imcf->filter = NGX_HTTP_IMAGE_ROTATE;
|
imcf->filter = NGX_HTTP_IMAGE_ROTATE;
|
||||||
|
}
|
||||||
|
|
||||||
ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
|
ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
|
||||||
|
|
||||||
|
@ -1382,7 +1409,7 @@ ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
"invalid parameter \"%V\"", &value[1]);
|
"invalid value \"%V\"", &value[1]);
|
||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1401,6 +1428,53 @@ ngx_http_image_filter_jpeg_quality(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ngx_http_image_filter_sharpen(ngx_conf_t *cf, ngx_command_t *cmd,
|
||||||
|
void *conf)
|
||||||
|
{
|
||||||
|
ngx_http_image_filter_conf_t *imcf = conf;
|
||||||
|
|
||||||
|
ngx_str_t *value;
|
||||||
|
ngx_int_t n;
|
||||||
|
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) {
|
||||||
|
n = ngx_http_image_filter_value(&value[1]);
|
||||||
|
|
||||||
|
if (n < 0) {
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid value \"%V\"", &value[1]);
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
imcf->sharpen = (ngx_uint_t) n;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
imcf->shcv = ngx_palloc(cf->pool, sizeof(ngx_http_complex_value_t));
|
||||||
|
if (imcf->shcv == NULL) {
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
*imcf->shcv = cv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGX_CONF_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static ngx_int_t
|
static ngx_int_t
|
||||||
ngx_http_image_filter_init(ngx_conf_t *cf)
|
ngx_http_image_filter_init(ngx_conf_t *cf)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue