[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57271] trunk/blender/source/blender: text rendering: shadow offset was causing text to clip, now check for clipping without the shadow since not-drawing characters because of subtle effect is rather annoying .

Campbell Barton ideasman42 at gmail.com
Thu Jun 6 23:43:52 CEST 2013


Revision: 57271
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57271
Author:   campbellbarton
Date:     2013-06-06 21:43:52 +0000 (Thu, 06 Jun 2013)
Log Message:
-----------
text rendering: shadow offset was causing text to clip, now check for clipping without the shadow since not-drawing characters because of subtle effect is rather annoying.

Modified Paths:
--------------
    trunk/blender/source/blender/blenfont/intern/blf_glyph.c
    trunk/blender/source/blender/blenfont/intern/blf_internal.h
    trunk/blender/source/blender/blenlib/BLI_rect.h
    trunk/blender/source/blender/blenlib/intern/rct.c

Modified: trunk/blender/source/blender/blenfont/intern/blf_glyph.c
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_glyph.c	2013-06-06 20:44:48 UTC (rev 57270)
+++ trunk/blender/source/blender/blenfont/intern/blf_glyph.c	2013-06-06 21:43:52 UTC (rev 57271)
@@ -371,14 +371,20 @@
 	glColor4fv(color);
 }
 
-int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
+static void blf_glyph_calc_rect(rctf *rect, GlyphBLF *g, float x, float y)
 {
-	float dx, dx1;
-	float y1, y2;
-	float xo, yo;
+	rect->xmin = floor(x + g->pos_x);
+	rect->xmax = rect->xmin + g->width;
+	rect->ymin = y + g->pos_y;
+	rect->ymax = y + g->pos_y - g->height;
+}
 
+void blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
+{
+	rctf rect;
+
 	if ((!g->width) || (!g->height))
-		return 1;
+		return;
 
 	if (g->build_tex == 0) {
 		GlyphCacheBLF *gc = font->glyph_cache;
@@ -440,30 +446,16 @@
 		g->build_tex = 1;
 	}
 
-	xo = 0.0f;
-	yo = 0.0f;
+	blf_glyph_calc_rect(&rect, g, x, y);
 
-	if (font->flags & BLF_SHADOW) {
-		xo = x;
-		yo = y;
-		x += font->shadow_x;
-		y += font->shadow_y;
-	}
-
-	dx = floor(x + g->pos_x);
-	dx1 = dx + g->width;
-	y1 = y + g->pos_y;
-	y2 = y + g->pos_y - g->height;
-
 	if (font->flags & BLF_CLIPPING) {
-		if (!BLI_rctf_isect_pt(&font->clip_rec, dx + font->pos[0], y1 + font->pos[1]))
-			return 0;
-		if (!BLI_rctf_isect_pt(&font->clip_rec, dx + font->pos[0], y2 + font->pos[1]))
-			return 0;
-		if (!BLI_rctf_isect_pt(&font->clip_rec, dx1 + font->pos[0], y2 + font->pos[1]))
-			return 0;
-		if (!BLI_rctf_isect_pt(&font->clip_rec, dx1 + font->pos[0], y1 + font->pos[1]))
-			return 0;
+		/* intentionally check clipping without shadow offset */
+		rctf rect_test = rect;
+		BLI_rctf_translate(&rect_test, font->pos[0], font->pos[1]);
+
+		if (!BLI_rctf_inside_rctf(&font->clip_rec, &rect_test)) {
+			return;
+		}
 	}
 
 	if (font->tex_bind_state != g->tex) {
@@ -471,42 +463,36 @@
 	}
 
 	if (font->flags & BLF_SHADOW) {
+		rctf rect_ofs;
+		blf_glyph_calc_rect(&rect_ofs, g, x + font->shadow_x, y + font->shadow_y);
 
 		switch (font->shadow) {
 			case 3:
-				blf_texture3_draw(font->shadow_col, g->uv, dx, y1, dx1, y2);
+				blf_texture3_draw(font->shadow_col, g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 				break;
 			case 5:
-				blf_texture5_draw(font->shadow_col, g->uv, dx, y1, dx1, y2);
+				blf_texture5_draw(font->shadow_col, g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 				break;
 			default:
 				glColor4fv(font->shadow_col);
-				blf_texture_draw(g->uv, dx, y1, dx1, y2);
+				blf_texture_draw(g->uv, rect_ofs.xmin, rect_ofs.ymin, rect_ofs.xmax, rect_ofs.ymax);
 				break;
 		}
 
 		glColor4fv(font->orig_col);
-
-		x = xo;
-		y = yo;
-
-		dx = floor(x + g->pos_x);
-		dx1 = dx + g->width;
-		y1 = y + g->pos_y;
-		y2 = y + g->pos_y - g->height;
 	}
 
 	switch (font->blur) {
 		case 3:
-			blf_texture3_draw(font->orig_col, g->uv, dx, y1, dx1, y2);
+			blf_texture3_draw(font->orig_col, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
 			break;
 		case 5:
-			blf_texture5_draw(font->orig_col, g->uv, dx, y1, dx1, y2);
+			blf_texture5_draw(font->orig_col, g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
 			break;
 		default:
-			blf_texture_draw(g->uv, dx, y1, dx1, y2);
+			blf_texture_draw(g->uv, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
 			break;
 	}
 
-	return 1;
+	return;
 }

Modified: trunk/blender/source/blender/blenfont/intern/blf_internal.h
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_internal.h	2013-06-06 20:44:48 UTC (rev 57270)
+++ trunk/blender/source/blender/blenfont/intern/blf_internal.h	2013-06-06 21:43:52 UTC (rev 57271)
@@ -71,6 +71,6 @@
 struct GlyphBLF *blf_glyph_add(struct FontBLF *font, unsigned int index, unsigned int c);
 
 void blf_glyph_free(struct GlyphBLF *g);
-int blf_glyph_render(struct FontBLF *font, struct GlyphBLF *g, float x, float y);
+void blf_glyph_render(struct FontBLF *font, struct GlyphBLF *g, float x, float y);
 
 #endif /* __BLF_INTERNAL_H__ */

Modified: trunk/blender/source/blender/blenlib/BLI_rect.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_rect.h	2013-06-06 20:44:48 UTC (rev 57270)
+++ trunk/blender/source/blender/blenlib/BLI_rect.h	2013-06-06 21:43:52 UTC (rev 57271)
@@ -74,8 +74,10 @@
 bool BLI_rctf_isect_pt_v(const struct rctf *rect, const float xy[2]);
 bool BLI_rcti_isect_segment(const struct rcti *rect, const int s1[2], const int s2[2]);
 bool BLI_rctf_isect_segment(const struct rctf *rect, const float s1[2], const float s2[2]);
+bool BLI_rcti_inside_rcti(rcti *rct_a, const rcti *rct_b);
+bool BLI_rctf_inside_rctf(rctf *rct_a, const rctf *rct_b);
+void BLI_rcti_union(struct rcti *rcti1, const struct rcti *rcti2);
 void BLI_rctf_union(struct rctf *rctf1, const struct rctf *rctf2);
-void BLI_rcti_union(struct rcti *rcti1, const struct rcti *rcti2);
 void BLI_rcti_rctf_copy(struct rcti *dst, const struct rctf *src);
 void BLI_rctf_rcti_copy(struct rctf *dst, const struct rcti *src);
 

Modified: trunk/blender/source/blender/blenlib/intern/rct.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/rct.c	2013-06-06 20:44:48 UTC (rev 57270)
+++ trunk/blender/source/blender/blenlib/intern/rct.c	2013-06-06 21:43:52 UTC (rev 57271)
@@ -101,6 +101,25 @@
 	return true;
 }
 
+/**
+ * is \a rct_b inside \a rct_a
+ */
+bool BLI_rctf_inside_rctf(rctf *rct_a, const rctf *rct_b)
+{
+	return ((rct_a->xmin <= rct_b->xmin) &&
+	        (rct_a->xmax >= rct_b->xmax) &&
+	        (rct_a->ymin <= rct_b->ymin) &&
+	        (rct_a->ymax >= rct_b->ymax));
+}
+bool BLI_rcti_inside_rcti(rcti *rct_a, const rcti *rct_b)
+{
+	return ((rct_a->xmin <= rct_b->xmin) &&
+	        (rct_a->xmax >= rct_b->xmax) &&
+	        (rct_a->ymin <= rct_b->ymin) &&
+	        (rct_a->ymax >= rct_b->ymax));
+}
+
+
 /* based closely on 'isect_line_line_v2_int', but in modified so corner cases are treated as intersections */
 static int isect_segments_i(const int v1[2], const int v2[2], const int v3[2], const int v4[2])
 {




More information about the Bf-blender-cvs mailing list