libdrawtext

changeset 7:10cfb642d0b8

added dtx_char_at_pt (not tested)
author John Tsiombikas <nuclear@mutantstargoat.com>
date Sun, 18 Sep 2011 01:30:30 +0300
parents 7e0c702f1223
children 87798d469b81
files examples/unicode/unicode.c src/drawtext.h src/font.c
diffstat 3 files changed, 38 insertions(+), 5 deletions(-) [+]
line diff
     1.1 --- a/examples/unicode/unicode.c	Sat Sep 17 10:09:58 2011 +0300
     1.2 +++ b/examples/unicode/unicode.c	Sun Sep 18 01:30:30 2011 +0300
     1.3 @@ -58,12 +58,23 @@
     1.4  }
     1.5  
     1.6  /* various UTF-8 strings */
     1.7 -const char *english_text = "Hello world!";
     1.8 +const char *english_text = "Hello g p world!";
     1.9  const char *greek_text = "\xce\x9a\xce\xbf\xcf\x8d\xcf\x81\xce\xb1\xcf\x83\xce\xb7";
    1.10  const char *russian_text = "\xd0\xa0\xd0\xb0\xd1\x81\xd1\x86\xd0\xb2\xd0\xb5\xd1\x82\xd0\xb0\xd0\xbb\xd0\xb8 \xd1\x8f\xd0\xb1\xd0\xbb\xd0\xbe\xd0\xbd\xd0\xb8 \xd0\xb8 \xd0\xb3\xd1\x80\xd1\x83\xd1\x88\xd0\xb8";
    1.11  const char *kanji_text = "\xe4\xb9\x97\xe4\xba\xac";
    1.12  const char *klingon_text = "\xef\xa3\xa3\xef\xa3\x9d\xef\xa3\x93\xef\xa3\x98\xef\xa3\x9d\xef\xa3\xa2\xef\xa3\xa1\xef\xa3\x9d\xef\xa3\x99";
    1.13  
    1.14 +void draw_box(struct dtx_box *box)
    1.15 +{
    1.16 +	glBegin(GL_LINE_LOOP);
    1.17 +	glColor3f(0, 1, 0);
    1.18 +	glVertex2f(box->x, box->y);
    1.19 +	glVertex2f(box->x + box->width, box->y);
    1.20 +	glVertex2f(box->x + box->width, box->y + box->height);
    1.21 +	glVertex2f(box->x, box->y + box->height);
    1.22 +	glEnd();
    1.23 +	glColor3f(1, 1, 1);
    1.24 +}
    1.25  
    1.26  void disp(void)
    1.27  {
     2.1 --- a/src/drawtext.h	Sat Sep 17 10:09:58 2011 +0300
     2.2 +++ b/src/drawtext.h	Sun Sep 18 01:30:30 2011 +0300
     2.3 @@ -169,6 +169,8 @@
     2.4   */
     2.5  float dtx_char_pos(const char *str, int n);
     2.6  
     2.7 +int dtx_char_at_pt(const char *str, float pt);
     2.8 +
     2.9  #ifdef __cplusplus
    2.10  }
    2.11  #endif
     3.1 --- a/src/font.c	Sat Sep 17 10:09:58 2011 +0300
     3.2 +++ b/src/font.c	Sun Sep 18 01:30:30 2011 +0300
     3.3 @@ -531,14 +531,14 @@
     3.4  			if(px + g->orig_x < x0) {
     3.5  				x0 = px + g->orig_x;
     3.6  			}
     3.7 -			if(py + g->orig_y < y0) {
     3.8 -				y0 = py + g->orig_y;
     3.9 +			if(py - g->orig_y < y0) {
    3.10 +				y0 = py - g->orig_y;
    3.11  			}
    3.12  			if(px + g->orig_x + g->width > x1) {
    3.13  				x1 = px + g->orig_x + g->width;
    3.14  			}
    3.15 -			if(py + g->orig_y + g->height > y1) {
    3.16 -				y1 = py + g->orig_y + g->height;
    3.17 +			if(py - g->orig_y + g->height > y1) {
    3.18 +				y1 = py - g->orig_y + g->height;
    3.19  			}
    3.20  		}
    3.21  	}
    3.22 @@ -581,6 +581,26 @@
    3.23  	return pos;
    3.24  }
    3.25  
    3.26 +int dtx_char_at_pt(const char *str, float pt)
    3.27 +{
    3.28 +	int i;
    3.29 +	float prev_pos = 0.0f, pos = 0.0f;
    3.30 +	struct dtx_glyphmap *gmap;
    3.31 +
    3.32 +	for(i=0; *str; i++) {
    3.33 +		int code = dtx_utf8_char_code(str);
    3.34 +		str = dtx_utf8_next_char((char*)str);
    3.35 +
    3.36 +		gmap = dtx_get_font_glyphmap(dtx_font, dtx_font_sz, code);
    3.37 +		pos += gmap->glyphs[i].advance;
    3.38 +
    3.39 +		if(fabs(pt - prev_pos) < fabs(pt - pos)) {
    3.40 +			break;
    3.41 +		}
    3.42 +		prev_pos = pos;
    3.43 +	}
    3.44 +	return i;
    3.45 +}
    3.46  
    3.47  struct dtx_glyphmap *dtx_proc_char(int code, float *xpos, float *ypos)
    3.48  {