X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fresourcepixmap.C;h=53c116d6bf93f2a1994398d97c7cd9c5286e4212;hp=8c874bb904fc745e751551bd21a68449718e686e;hb=de541aa9508555c35ea284d5b03617fc9c7cd026;hpb=620f70a943c1f47880ec68a908aa03bf463e741f diff --git a/cinelerra-5.1/cinelerra/resourcepixmap.C b/cinelerra-5.1/cinelerra/resourcepixmap.C index 8c874bb9..53c116d6 100644 --- a/cinelerra-5.1/cinelerra/resourcepixmap.C +++ b/cinelerra-5.1/cinelerra/resourcepixmap.C @@ -155,7 +155,7 @@ void ResourcePixmap::draw_data(TrackCanvas *canvas, int refresh_w = 0; // Ignore if called by resourcethread. -// if( mode == IGNORE_THREAD ) return; + if( mode == IGNORE_THREAD ) return; int y = 0; if( edit->track->show_titles() ) @@ -236,32 +236,50 @@ VFrame *ResourcePixmap::change_title_color(VFrame *title_bg, int color) int bpp = BC_CModels::calculate_pixelsize(colormodel); int tw = title_bg->get_w(), tw1 = tw-1, th = title_bg->get_h(); VFrame *title_bar = new VFrame(tw, th, colormodel); - uint8_t cr = (color>>16), cg = (color>>8), cb = (color>>0); uint8_t **bar_rows = title_bar->get_rows(); const uint8_t gap_grey = 0x4a; - if( th > 0 ) { - uint8_t *cp = bar_rows[0]; - for( int x=0; x 3 ) cp[3] = 0xff; - cp += bpp; + union { unsigned rgba; struct { uint8_t r,g,b,a; }; } c; + c.r = color>>16; c.g = color>>8; c.b = color>>0; c.a = 0xff; + if( BC_CModels::has_alpha(colormodel) && // fast path + BC_CModels::calculate_pixelsize(colormodel) == sizeof(unsigned) ) { + const unsigned gap_rgba = (0xff<<24) | + (gap_grey<<16) | (gap_grey<<8) | (gap_grey<<0); + if( th > 0 ) { + unsigned *bp = (unsigned *)bar_rows[0]; + for( int i=tw; --i>=0; ) *bp++ = gap_rgba; } - } - for( int y=1; y 0 ) { - cp[0] = cp[1] = cp[2] = gap_grey; - if( bpp > 3 ) cp[3] = 0xff; - cp += bpp; + for( int y=1; y 0 ) *bp++ = gap_rgba; + for( int i=tw1; --i>0; ++bp ) *bp = c.rgba; + if( tw > 1 ) *bp = gap_rgba; } - for( int x=1; x 3 ) cp[3] = 0xff; - cp += bpp; + } + else { + if( th > 0 ) { + uint8_t *cp = bar_rows[0]; + for( int x=0; x 3 ) cp[3] = 0xff; + cp += bpp; + } } - if( tw > 1 ) { - cp[0] = cp[1] = cp[2] = gap_grey; - if( bpp > 3 ) cp[3] = 0xff; + for( int y=1; y 0 ) { + cp[0] = cp[1] = cp[2] = gap_grey; + if( bpp > 3 ) cp[3] = 0xff; + cp += bpp; + } + for( int x=1; x 3 ) cp[3] = 0xff; + cp += bpp; + } + if( tw > 1 ) { + cp[0] = cp[1] = cp[2] = gap_grey; + if( bpp > 3 ) cp[3] = 0xff; + } } } return title_bar; @@ -270,17 +288,28 @@ VFrame *ResourcePixmap::change_title_color(VFrame *title_bg, int color) VFrame *ResourcePixmap::change_picon_alpha(VFrame *picon_frame, int alpha) { uint8_t **picon_rows = picon_frame->get_rows(); - int w = picon_frame->get_w(), h = picon_frame->get_h(); + int pw = picon_frame->get_w(), ph = picon_frame->get_h(); int color_model = picon_frame->get_color_model(); int bpp = BC_CModels::calculate_pixelsize(color_model); - VFrame *frame = new VFrame(w, h, BC_RGBA8888); + VFrame *frame = new VFrame(pw, ph, BC_RGBA8888); uint8_t **rows = frame->get_rows(); - for( int y=0; y=0; ++bp,++rp ) *rp = (*bp & 0xffffff) | a; + } + } + else { + for( int y=0; y pixmap_w ) w -= w - pixmap_w; @@ -316,7 +345,7 @@ void ResourcePixmap::draw_title(TrackCanvas *canvas, text_x = MAX(left_margin, text_x); //printf("ResourcePixmap::draw_title 1 %d\n", text_x); canvas->draw_text(text_x, // 2, - canvas->get_text_ascent(mwindow->theme->title_font) + 2, + canvas->get_text_ascent(mwindow->theme->title_font) + yS(2), title, strlen(title), this); } @@ -335,7 +364,6 @@ SET_TRACE IndexState *index_state = indexable->index_state; double asset_over_session = (double)indexable->get_sample_rate() / mwindow->edl->session->sample_rate; - // Develop strategy for drawing // printf("ResourcePixmap::draw_audio_resource %d %p %d\n", // __LINE__, @@ -345,52 +373,54 @@ SET_TRACE { case INDEX_NOTTESTED: return; - break; // Disabled. All files have an index. // case INDEX_TOOSMALL: // draw_audio_source(canvas, edit, x, w); // break; case INDEX_BUILDING: - case INDEX_READY: - { + case INDEX_READY: { IndexFile indexfile(mwindow, indexable); if( !indexfile.open_index() ) { if( index_state->index_zoom > - mwindow->edl->local_session->zoom_sample * + mwindow->edl->local_session->zoom_sample * asset_over_session ) { -//printf("ResourcePixmap::draw_audio_resource %d\n", __LINE__); - draw_audio_source(canvas, edit, x, w); } else { -//printf("ResourcePixmap::draw_audio_resource %d\n", __LINE__); - indexfile.draw_index(canvas, - this, - edit, - x, - w); -SET_TRACE + indexfile.draw_index(canvas, this, edit, x, w); } - indexfile.close_index(); -SET_TRACE } break; } } + if( !mwindow->preferences->rectify_audio ) { + int center_pixel = calculate_center_pixel(edit->track); + canvas->set_line_dashes(1); + canvas->set_color(mwindow->theme->zero_crossing_color); + canvas->draw_line(x, center_pixel, x + w, center_pixel, this); + canvas->set_line_dashes(0); + } } -void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, int w) +int ResourcePixmap::calculate_center_pixel(Track *track) { - w++; - Indexable *indexable = edit->get_source(); int rect_audio = mwindow->preferences->rectify_audio; int center_pixel = !rect_audio ? mwindow->edl->local_session->zoom_track / 2 : mwindow->edl->local_session->zoom_track ; - if( edit->track->show_titles() ) + if( track->show_titles() ) center_pixel += mwindow->theme->get_image("title_bg_data")->get_h(); + return center_pixel; +} + +void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, int w) +{ + w++; + Indexable *indexable = edit->get_source(); + int center_pixel = calculate_center_pixel(edit->track); + int rect_audio = mwindow->preferences->rectify_audio; int64_t scale_y = !rect_audio ? mwindow->edl->local_session->zoom_y : mwindow->edl->local_session->zoom_y * 2; @@ -493,9 +523,9 @@ void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, i y2 = CLIP(y1, 0, y_max); //printf("ResourcePixmap::draw_audio_source %d %d %d\n", __LINE__, y1, y2); if( !rect_audio ) - canvas->draw_line(x1, y0, x2, y2, this); + canvas->draw_bline(x1, y0, x2, y2, this); else - canvas->draw_line(x2, center_pixel, x2, y2, this); + canvas->draw_bline(x2, center_pixel, x2, y2, this); } } @@ -565,7 +595,7 @@ void ResourcePixmap::draw_wave(TrackCanvas *canvas, { int rect_audio = mwindow->preferences->rectify_audio; if( rect_audio ) { low = fabs(low); high = fabs(high); } - int top_pixel = mwindow->edl->session->show_titles ? 0 : + int top_pixel = !mwindow->edl->session->show_titles ? 0 : mwindow->theme->get_image("title_bg_data")->get_h(); int center_pixel = !rect_audio ? mwindow->edl->local_session->zoom_track / 2 + top_pixel : @@ -664,7 +694,7 @@ void ResourcePixmap::draw_subttl_resource(TrackCanvas *canvas, Edit *edit, int x { SEdit *sedit = (SEdit *)edit; char *text = sedit->get_text(); - if( !*text || w < 10 ) return; + if( !*text || w < xS(10) ) return; int center_pixel = canvas->resource_h() / 2; if( edit->track->show_titles() ) center_pixel += mwindow->theme->get_image("title_bg_data")->get_h(); @@ -678,7 +708,7 @@ void ResourcePixmap::draw_subttl_resource(TrackCanvas *canvas, Edit *edit, int x canvas->set_color(color); int ch = canvas->get_text_height(font); int hh = canvas->get_text_height(font,text) + ch/2; - int y1 = y_max - hh - 10; + int y1 = y_max - hh - yS(10); if( y1 < 0 ) y1 = 0; canvas->draw_text(x1, y1, text, -1, this); }