소스 검색

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.

Valentin Zagura 6 년 전
부모
커밋
100d05cbec
1개의 변경된 파일15개의 추가작업 그리고 11개의 파일을 삭제
  1. 15 11
      drivers/gles3/shaders/canvas.glsl

+ 15 - 11
drivers/gles3/shaders/canvas.glsl

@@ -379,14 +379,16 @@ uniform bool np_draw_center;
 // left top right bottom in pixel coordinates
 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;
 
-	if (pixel < margin_begin) {
-		return pixel * tex_pixel_size;
-	} else if (pixel >= draw_size - margin_end) {
-		return (tex_size - (draw_size - pixel)) * tex_pixel_size;
+	float screen_margin_begin = margin_begin / s_ratio;
+	float screen_margin_end = margin_end / s_ratio;
+	if (pixel < screen_margin_begin) {
+		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 {
 		if (!np_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
 			//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
 			return (margin_begin + ratio * (tex_size - margin_begin - margin_end)) * tex_pixel_size;
 		} else if (np_repeat == 1) { //tile
 			//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
 			return (margin_begin + ofs) * tex_pixel_size;
 		} else if (np_repeat == 2) { //tile fit
 			//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 scale = max(1.0, floor(src_area / max(dst_area, 0.0000001) + 0.5));
 
 			//convert to ratio
-			float ratio = (pixel - margin_begin) / src_area;
+			float ratio = (pixel - screen_margin_begin) / src_area;
 			ratio = mod(ratio * scale, 1.0);
 			return (margin_begin + ratio * dst_area) * tex_pixel_size;
 		}
@@ -431,9 +433,11 @@ void main() {
 #ifdef USE_NINEPATCH
 
 	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(
-			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.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.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, s_ratio, np_repeat_v, draw_center));
 
 	if (draw_center == 0) {
 		color.a = 0.0;