GLES3 Fixes for ninepatch margins when patch size is smaller than the patch texture resolution

Scaled ninepatch margins in screen space to be relative of the ninepatch size when the patch size is smaller than the patch texture resolution.
This commit is contained in:
Valentin Zagura 2019-10-07 13:19:27 +01:00
parent 6ee84f53a9
commit 100d05cbec

View file

@ -379,14 +379,16 @@ uniform bool np_draw_center;
// left top right bottom in pixel coordinates // left top right bottom in pixel coordinates
uniform vec4 np_margins; uniform vec4 np_margins;
float map_ninepatch_axis(float pixel, float draw_size, float tex_pixel_size, float margin_begin, float margin_end, int np_repeat, inout int draw_center) { float map_ninepatch_axis(float pixel, float draw_size, float tex_pixel_size, float margin_begin, float margin_end, float s_ratio, int np_repeat, inout int draw_center) {
float tex_size = 1.0 / tex_pixel_size; float tex_size = 1.0 / tex_pixel_size;
if (pixel < margin_begin) { float screen_margin_begin = margin_begin / s_ratio;
return pixel * tex_pixel_size; float screen_margin_end = margin_end / s_ratio;
} else if (pixel >= draw_size - margin_end) { if (pixel < screen_margin_begin) {
return (tex_size - (draw_size - pixel)) * tex_pixel_size; return pixel * s_ratio * tex_pixel_size;
} else if (pixel >= draw_size - screen_margin_end) {
return (tex_size - (draw_size - pixel) * s_ratio) * tex_pixel_size;
} else { } else {
if (!np_draw_center) { if (!np_draw_center) {
draw_center--; draw_center--;
@ -394,22 +396,22 @@ float map_ninepatch_axis(float pixel, float draw_size, float tex_pixel_size, flo
if (np_repeat == 0) { //stretch if (np_repeat == 0) { //stretch
//convert to ratio //convert to ratio
float ratio = (pixel - margin_begin) / (draw_size - margin_begin - margin_end); float ratio = (pixel - screen_margin_begin) / (draw_size - screen_margin_begin - screen_margin_end);
//scale to source texture //scale to source texture
return (margin_begin + ratio * (tex_size - margin_begin - margin_end)) * tex_pixel_size; return (margin_begin + ratio * (tex_size - margin_begin - margin_end)) * tex_pixel_size;
} else if (np_repeat == 1) { //tile } else if (np_repeat == 1) { //tile
//convert to ratio //convert to ratio
float ofs = mod((pixel - margin_begin), tex_size - margin_begin - margin_end); float ofs = mod((pixel - screen_margin_begin), tex_size - margin_begin - margin_end);
//scale to source texture //scale to source texture
return (margin_begin + ofs) * tex_pixel_size; return (margin_begin + ofs) * tex_pixel_size;
} else if (np_repeat == 2) { //tile fit } else if (np_repeat == 2) { //tile fit
//convert to ratio //convert to ratio
float src_area = draw_size - margin_begin - margin_end; float src_area = draw_size - screen_margin_begin - screen_margin_end;
float dst_area = tex_size - margin_begin - margin_end; float dst_area = tex_size - margin_begin - margin_end;
float scale = max(1.0, floor(src_area / max(dst_area, 0.0000001) + 0.5)); float scale = max(1.0, floor(src_area / max(dst_area, 0.0000001) + 0.5));
//convert to ratio //convert to ratio
float ratio = (pixel - margin_begin) / src_area; float ratio = (pixel - screen_margin_begin) / src_area;
ratio = mod(ratio * scale, 1.0); ratio = mod(ratio * scale, 1.0);
return (margin_begin + ratio * dst_area) * tex_pixel_size; return (margin_begin + ratio * dst_area) * tex_pixel_size;
} }
@ -431,9 +433,11 @@ void main() {
#ifdef USE_NINEPATCH #ifdef USE_NINEPATCH
int draw_center = 2; int draw_center = 2;
float s_ratio = max((1.0 / color_texpixel_size.x) / abs(dst_rect.z), (1.0 / color_texpixel_size.y) / abs(dst_rect.w));
s_ratio = max(1.0, s_ratio);
uv = vec2( uv = vec2(
map_ninepatch_axis(pixel_size_interp.x, abs(dst_rect.z), color_texpixel_size.x, np_margins.x, np_margins.z, np_repeat_h, draw_center), map_ninepatch_axis(pixel_size_interp.x, abs(dst_rect.z), color_texpixel_size.x, np_margins.x, np_margins.z, s_ratio, np_repeat_h, draw_center),
map_ninepatch_axis(pixel_size_interp.y, abs(dst_rect.w), color_texpixel_size.y, np_margins.y, np_margins.w, np_repeat_v, draw_center)); map_ninepatch_axis(pixel_size_interp.y, abs(dst_rect.w), color_texpixel_size.y, np_margins.y, np_margins.w, s_ratio, np_repeat_v, draw_center));
if (draw_center == 0) { if (draw_center == 0) {
color.a = 0.0; color.a = 0.0;