X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fresourcepixmap.C;h=b0bc49b7ffbf5020ce8764ac5024ff1ddccbe763;hp=eb27656179f97795e7bc18d79c5cc9b533d29f0b;hb=052becff04e4f4a4240a87c6b2f2f4023b65d247;hpb=c6a143f0f3e245d79881da50e61e6f35c556d88d diff --git a/cinelerra-5.1/cinelerra/resourcepixmap.C b/cinelerra-5.1/cinelerra/resourcepixmap.C index eb276561..b0bc49b7 100644 --- a/cinelerra-5.1/cinelerra/resourcepixmap.C +++ b/cinelerra-5.1/cinelerra/resourcepixmap.C @@ -194,16 +194,13 @@ void ResourcePixmap::draw_data(TrackCanvas *canvas, refresh_w = pixmap_w; // Draw background image - if( refresh_w > 0 ) - mwindow->theme->draw_resource_bg(canvas, - this, - edit_x, - edit_w, - pixmap_x, - refresh_x, - y, - refresh_x + refresh_w, - mwindow->edl->local_session->zoom_track + y); + if( refresh_w > 0 ) { + int x1 = refresh_x, x2 = x1 + refresh_w; + int y1 = y, y2 = y1 + mwindow->edl->local_session->zoom_track; + int color = mwindow->get_title_color(edit); + mwindow->theme->draw_resource_bg(canvas, this, color, + edit_x, edit_w, pixmap_x, x1,y1, x2,y2); + } //printf("ResourcePixmap::draw_data 70\n"); @@ -214,28 +211,18 @@ void ResourcePixmap::draw_data(TrackCanvas *canvas, { case TRACK_AUDIO: draw_audio_resource(canvas, - edit, - refresh_x, - refresh_w); + edit, refresh_x, refresh_w); break; case TRACK_VIDEO: - draw_video_resource(canvas, - edit, - edit_x, - edit_w, - pixmap_x, - pixmap_w, - refresh_x, - refresh_w, + draw_video_resource(canvas, edit, edit_x, edit_w, + pixmap_x, pixmap_w, refresh_x, refresh_w, mode); break; case TRACK_SUBTITLE: - draw_subttl_resource(canvas, - edit, - refresh_x, - refresh_w); + draw_subttl_resource(canvas, edit, + refresh_x, refresh_w); break; } } @@ -245,24 +232,89 @@ SET_TRACE VFrame *ResourcePixmap::change_title_color(VFrame *title_bg, int color) { - if( color < 0 ) return title_bg; int colormodel = title_bg->get_color_model(); int bpp = BC_CModels::calculate_pixelsize(colormodel); - int tw = title_bg->get_w(), th = title_bg->get_h(); + 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(); - for( int y=0; y 3 ) cp[3] = 0xff; - cp += bpp; + const uint8_t gap_grey = 0x4a; + 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 ) *bp++ = gap_rgba; + for( int i=tw1; --i>0; ++bp ) *bp = c.rgba; + if( tw > 1 ) *bp = gap_rgba; + } + } + else { + if( th > 0 ) { + uint8_t *cp = bar_rows[0]; + for( int x=0; x 3 ) cp[3] = 0xff; + cp += bpp; + } + } + 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; } +VFrame *ResourcePixmap::change_picon_alpha(VFrame *picon_frame, int alpha) +{ + uint8_t **picon_rows = picon_frame->get_rows(); + 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(pw, ph, BC_RGBA8888); + uint8_t **rows = frame->get_rows(); + if( BC_CModels::has_alpha(color_model) && // fast path + BC_CModels::calculate_pixelsize(color_model) == sizeof(unsigned) ) { + unsigned a = alpha << 24; + for( int y=0; y=0; ++bp,++rp ) *rp = (*bp & 0xffffff) | a; + } + } + else { + for( int y=0; y pixmap_w ) w -= w - pixmap_w; VFrame *title_bg = mwindow->theme->get_image("title_bg_data"); int color = mwindow->get_title_color(edit); - VFrame *title_bar = color < 0 ? title_bg : + VFrame *title_bar = !color ? title_bg : change_title_color(title_bg, color); canvas->draw_3segmenth(x, 0, w, total_x, total_w, title_bar, this); if( title_bar != title_bg ) delete title_bar; -// if( total_x > -BC_INFINITY ) { - char title[BCTEXTLEN]; - edit->get_title(title); - canvas->set_color(mwindow->theme->title_color); - canvas->set_font(mwindow->theme->title_font); + char title[BCTEXTLEN]; + edit->get_title(title); + canvas->set_color(mwindow->theme->title_color); + canvas->set_font(mwindow->theme->title_font); // Justify the text on the left boundary of the edit if it is visible. // Otherwise justify it on the left side of the screen. - int text_x = total_x + left_margin; - text_x = MAX(left_margin, text_x); + int text_x = total_x + left_margin; + text_x = MAX(left_margin, text_x); //printf("ResourcePixmap::draw_title 1 %d\n", text_x); - canvas->draw_text(text_x, - canvas->get_text_ascent(mwindow->theme->title_font) + 2, - title, strlen(title), this); -// } + canvas->draw_text(text_x, // 2, + canvas->get_text_ascent(mwindow->theme->title_font) + yS(2), + title, strlen(title), this); } @@ -314,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__, @@ -324,50 +373,57 @@ 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); + } } +int ResourcePixmap::calculate_center_pixel(Track *track) +{ + 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( 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 = mwindow->edl->local_session->zoom_track / 2; - if( edit->track->show_titles() ) - center_pixel += mwindow->theme->get_image("title_bg_data")->get_h(); - int64_t scale_y = mwindow->edl->local_session->zoom_y; + 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; int y_max = center_pixel + scale_y / 2 - 1; double project_zoom = mwindow->edl->local_session->zoom_sample; @@ -448,11 +504,12 @@ void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, i if( !result ) { double *samples = buffer->get_data(); - int y1 = center_pixel - samples[0] * scale_y / 2; + double sample = !rect_audio ? samples[0] : fabs(samples[0]); + int y1 = center_pixel - sample * scale_y / 2; int y2 = CLIP(y1, 0, y_max); - for( int x0=0; x0startsource; speed_position += !speed_autos ? edit_position : @@ -461,10 +518,14 @@ void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, i int j = speed_position * asset_over_session - start_position; CLAMP(j, 0, sample_size); int y0 = y2; - y1 = center_pixel - samples[j] * scale_y / 2; + sample = !rect_audio ? samples[j] : fabs(samples[j]); + y1 = center_pixel - sample * scale_y / 2; y2 = CLIP(y1, 0, y_max); //printf("ResourcePixmap::draw_audio_source %d %d %d\n", __LINE__, y1, y2); - canvas->draw_line(x0, y0, x2, y2, this); + if( !rect_audio ) + canvas->draw_line(x1, y0, x2, y2, this); + else + canvas->draw_line(x2, center_pixel, x2, y2, this); } } @@ -496,10 +557,12 @@ void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, i WaveCacheItem *item = mwindow->wave_cache->get_wave(indexable->id, edit->channel, prev_position, next_position); if( item ) { + double item_low = !rect_audio ? item->low : fabs(item->low); //printf("ResourcePixmap::draw_audio_source %d\n", __LINE__); - int y_lo = (int)(center_pixel - item->low * scale_y / 2); + int y_lo = (int)(center_pixel - item_low * scale_y / 2); int y1 = CLIP(y_lo, 0, y_max); - int y_hi = (int)(center_pixel - item->high * scale_y / 2); + double item_high = !rect_audio ? item->high : fabs(item->high); + int y_hi = (int)(center_pixel - item_high * scale_y / 2); int y2 = CLIP(y_hi, 0, y_max); if( !first_pixel ) { y_lo = MIN(y1,prev_y2); @@ -510,7 +573,7 @@ void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, i y_lo = y1; y_hi = y2; } prev_y1 = y1; prev_y2 = y2; - canvas->draw_line(x, y_lo, x, y_hi, this); + canvas->draw_line(x, !rect_audio ? y_lo : center_pixel, x, y_hi, this); //printf("ResourcePixmap::draw_audio_source %d %d %d %d\n", __LINE__, x, y1, y2); mwindow->wave_cache->unlock(); } @@ -530,19 +593,23 @@ void ResourcePixmap::draw_audio_source(TrackCanvas *canvas, Edit *edit, int x, i void ResourcePixmap::draw_wave(TrackCanvas *canvas, int x, double high, double low) { - int top_pixel = 0; - if( mwindow->edl->session->show_titles ) - top_pixel += mwindow->theme->get_image("title_bg_data")->get_h(); - int center_pixel = mwindow->edl->local_session->zoom_track / 2 + top_pixel; + 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 : + mwindow->theme->get_image("title_bg_data")->get_h(); + int center_pixel = !rect_audio ? + mwindow->edl->local_session->zoom_track / 2 + top_pixel : + mwindow->edl->local_session->zoom_track + top_pixel ; + int scale_y = !rect_audio ? + mwindow->edl->local_session->zoom_y / 2 : + mwindow->edl->local_session->zoom_y ; int bottom_pixel = top_pixel + mwindow->edl->local_session->zoom_track; - int y1 = (int)(center_pixel - - low * mwindow->edl->local_session->zoom_y / 2); - int y2 = (int)(center_pixel - - high * mwindow->edl->local_session->zoom_y / 2); + int y1 = (int)(center_pixel - low * scale_y); + int y2 = (int)(center_pixel - high * scale_y); CLAMP(y1, top_pixel, bottom_pixel); CLAMP(y2, top_pixel, bottom_pixel); canvas->set_color(mwindow->theme->audio_color); - canvas->draw_line(x, y1, x, y2, this); + canvas->draw_line(x, !rect_audio ? y1 : bottom_pixel, x, y2, this); } @@ -592,8 +659,20 @@ void ResourcePixmap::draw_video_resource(TrackCanvas *canvas, mwindow->frame_cache->get_frame_ptr(speed_position, edit->channel, mwindow->edl->session->frame_rate, BC_RGB888, picon_w, picon_h, indexable->id); + int bg_color = gui->get_bg_color(); if( picon_frame ) { - draw_vframe(picon_frame, x, y, picon_w, picon_h, 0, 0); + VFrame *frame = picon_frame; + int color = mwindow->get_title_color(edit); + if( color ) { + int alpha = (~color >> 24) & 0xff; + frame = change_picon_alpha(picon_frame, alpha); + gui->set_bg_color(color & 0xffffff); + } + draw_vframe(frame, x, y, picon_w, picon_h, 0, 0); + if( frame != picon_frame ) { + delete frame; + gui->set_bg_color(bg_color); + } mwindow->frame_cache->unlock(); } else if( mode != IGNORE_THREAD ) { @@ -615,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(); @@ -629,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); }