diff options
-rw-r--r-- | source/blender/editors/include/UI_view2d.h | 4 | ||||
-rw-r--r-- | source/blender/editors/interface/view2d.c | 52 | ||||
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_draw.c | 57 |
3 files changed, 71 insertions, 42 deletions
diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h index 7ff312151c5..3c58e218f09 100644 --- a/source/blender/editors/include/UI_view2d.h +++ b/source/blender/editors/include/UI_view2d.h @@ -129,6 +129,7 @@ struct View2DScrollers; struct wmWindowManager; struct bScreen; struct ScrArea; +struct ARegion; struct bContext; struct rctf; @@ -181,6 +182,9 @@ void UI_view2d_getscale(struct View2D *v2d, float *x, float *y); short UI_view2d_mouse_in_scrollers(const struct bContext *C, struct View2D *v2d, int x, int y); +/* cached text drawing in v2d, to allow pixel-aligned draw as post process */ +void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y, char *str); +void UI_view2d_text_cache_draw(struct ARegion *ar); /* operators */ void ui_view2d_operatortypes(void); diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c index f2fc2deefbb..fc1de788f5f 100644 --- a/source/blender/editors/interface/view2d.c +++ b/source/blender/editors/interface/view2d.c @@ -1939,3 +1939,55 @@ short UI_view2d_mouse_in_scrollers (const bContext *C, View2D *v2d, int x, int y return 0; } +/* ******************* view2d text drawing cache ******************** */ + +/* assumes caches are used correctly, so for time being no local storage in v2d */ +static ListBase strings= {NULL, NULL}; + +typedef struct View2DString { + struct View2DString *next, *prev; + float col[4]; + char str[128]; + short mval[2]; +} View2DString; + + +void UI_view2d_text_cache_add(View2D *v2d, float x, float y, char *str) +{ + int mval[2]; + + UI_view2d_view_to_region(v2d, x, y, mval, mval+1); + + if(mval[0]!=V2D_IS_CLIPPED && mval[1]!=V2D_IS_CLIPPED) { + View2DString *v2s= MEM_callocN(sizeof(View2DString), "View2DString"); + + BLI_addtail(&strings, v2s); + BLI_strncpy(v2s->str, str, 128); + v2s->mval[0]= mval[0]; + v2s->mval[1]= mval[1]; + glGetFloatv(GL_CURRENT_COLOR, v2s->col); + } +} + +void UI_view2d_text_cache_draw(ARegion *ar) +{ + View2DString *v2s; + + // wmPushMatrix(); + ED_region_pixelspace(ar); + + for(v2s= strings.first; v2s; v2s= v2s->next) { + glColor3fv(v2s->col); + BLF_draw_default((float)v2s->mval[0], (float)v2s->mval[1], 0.0, v2s->str); + } + + // wmPopMatrix(); + + if(strings.first) + BLI_freelistN(&strings); +} + + +/* ******************************************************** */ + + diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 5e07689f536..a0b27cede05 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -55,7 +55,6 @@ #include "BIF_gl.h" #include "BIF_glutil.h" -#include "BLF_api.h" #include "ED_anim_api.h" #include "ED_space_api.h" @@ -72,6 +71,7 @@ #define SEQ_LEFTHANDLE 1 #define SEQ_RIGHTHANDLE 2 + /* Note, Dont use WHILE_SEQ while drawing! - it messes up transform, - Campbell */ int no_rightbox=0, no_leftbox= 0; @@ -329,7 +329,7 @@ static void drawseqwave(Scene *scene, View2D *v2d, Sequence *seq, float x1, floa } /* draw a handle, for each end of a sequence strip */ -static void draw_seq_handle(SpaceSeq *sseq, Sequence *seq, float pixelx, short direction) +static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short direction) { float v1[2], v2[2], v3[2], rx1=0, rx2=0; //for triangles and rect float x1, x2, y1, y2; @@ -337,7 +337,6 @@ static void draw_seq_handle(SpaceSeq *sseq, Sequence *seq, float pixelx, short d float minhandle, maxhandle; char str[32]; unsigned int whichsel=0; - View2D *v2d; x1= seq->startdisp; x2= seq->enddisp; @@ -345,8 +344,6 @@ static void draw_seq_handle(SpaceSeq *sseq, Sequence *seq, float pixelx, short d y1= seq->machine+SEQ_STRIP_OFSBOTTOM; y2= seq->machine+SEQ_STRIP_OFSTOP; - v2d = &sseq->v2d; - /* clamp handles to defined size in pixel space */ handsize = seq->handsize; minhandle = 7; @@ -404,13 +401,13 @@ static void draw_seq_handle(SpaceSeq *sseq, Sequence *seq, float pixelx, short d if (direction == SEQ_LEFTHANDLE) { sprintf(str, "%d", seq->startdisp); x1= rx1; - y1 -= 0.15; + y1 -= 0.45; } else { sprintf(str, "%d", seq->enddisp - 1); - x1= x2 - BLF_width_default(str) * pixelx; + x1= x2 - handsize*0.75; y1= y2 + 0.05; } - BLF_draw_default(x1, y1, 0.0f, str); + UI_view2d_text_cache_add(v2d, x1, y1, str); } } @@ -520,25 +517,12 @@ static void draw_seq_extensions(Scene *scene, SpaceSeq *sseq, Sequence *seq) /* draw info text on a sequence strip */ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float y1, float y2, char *background_col) { - float v1[2], v2[2]; - int len, size; - char str[32 + FILE_MAXDIR+FILE_MAXFILE], *strp; - int mval[2]; - - v1[1]= y1; - v2[1]= y2; - - v1[0]= x1; - UI_view2d_to_region_no_clip(v2d, v1[0], v1[1], mval, mval+1); - x1= mval[0]; - v2[0]= x2; - UI_view2d_to_region_no_clip(v2d, v2[0], v2[1], mval, mval+1); - x2= mval[0]; - size= x2-x1; + char str[32 + FILE_MAXDIR+FILE_MAXFILE]; if(seq->name[2]) { sprintf(str, "%d | %s: %s", seq->len, give_seqname(seq), seq->name+2); - }else{ + } + else{ if(seq->type == SEQ_META) { sprintf(str, "%d | %s", seq->len, give_seqname(seq)); } @@ -572,19 +556,6 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float } } - strp= str; - // XXX - /* The correct thing is used a Styla and set the clipping region. */ - while( (len= BLF_width_default(strp)) > size) { - if(len < 10) break; - if(strp[1]==0) break; - strp++; - } - - mval[0]= (x1+x2-len+1)/2; - mval[1]= 1; - UI_view2d_region_to_view(v2d, mval[0], mval[1], &x1, &x2); - if(seq->flag & SELECT){ cpack(0xFFFFFF); }else if ((((int)background_col[0] + (int)background_col[1] + (int)background_col[2]) / 3) < 50){ @@ -592,7 +563,8 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float }else{ cpack(0); } - BLF_draw_default(x1, y1+SEQ_STRIP_OFSBOTTOM, 0.0, strp); + + UI_view2d_text_cache_add(v2d, x1, y1+SEQ_STRIP_OFSBOTTOM, str); } /* draws a shaded strip, made from gradient + flat color + gradient */ @@ -693,8 +665,8 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence * if (!is_single_image) draw_seq_extensions(scene, sseq, seq); - draw_seq_handle(sseq, seq, pixelx, SEQ_LEFTHANDLE); - draw_seq_handle(sseq, seq, pixelx, SEQ_RIGHTHANDLE); + draw_seq_handle(v2d, seq, pixelx, SEQ_LEFTHANDLE); + draw_seq_handle(v2d, seq, pixelx, SEQ_RIGHTHANDLE); /* draw the strip outline */ x1= seq->startdisp; @@ -994,8 +966,6 @@ void drawseqspace(const bContext *C, ARegion *ar) float col[3]; int i; - - if(sseq->mainb != SEQ_DRAW_SEQUENCE) { draw_image_seq(scene, ar, sseq); return; @@ -1082,6 +1052,9 @@ void drawseqspace(const bContext *C, ARegion *ar) } } + /* text draw cached, in pixelspace now */ + UI_view2d_text_cache_draw(ar); + /* Draw markers */ // draw_markers_timespace(SCE_MARKERS, DRAW_MARKERS_LINES); |