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<tw; ++x ) {
- cp[0] = cp[1] = cp[2] = gap_grey;
- if( bpp > 3 ) cp[3] = 0xff;
- cp += bpp;
+ 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<th; ++y ) {
- uint8_t *cp = bar_rows[y];
- if( tw > 0 ) {
- cp[0] = cp[1] = cp[2] = gap_grey;
- if( bpp > 3 ) cp[3] = 0xff;
- cp += bpp;
+ unsigned rgba = (0xff<<24) | (color & 0xffffff);
+ for( int y=1; y<th; ++y ) {
+ unsigned *bp = (unsigned *)bar_rows[y];
+ if( tw > 0 ) *bp++ = gap_rgba;
+ for( int i=tw1; --i>0; ++bp ) *bp = rgba;
+ if( tw > 1 ) *bp = gap_rgba;
}
- for( int x=1; x<tw1; ++x ) {
- cp[0] = cr; cp[1] = cg; cp[2] = cb;
- if( bpp > 3 ) cp[3] = 0xff;
- cp += bpp;
+ }
+ else {
+ uint8_t cr = (color>>16), cg = (color>>8), cb = (color>>0);
+ if( th > 0 ) {
+ uint8_t *cp = bar_rows[0];
+ for( int x=0; x<tw; ++x ) {
+ cp[0] = cp[1] = cp[2] = gap_grey;
+ if( bpp > 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<th; ++y ) {
+ uint8_t *cp = bar_rows[y];
+ if( tw > 0 ) {
+ cp[0] = cp[1] = cp[2] = gap_grey;
+ if( bpp > 3 ) cp[3] = 0xff;
+ cp += bpp;
+ }
+ for( int x=1; x<tw1; ++x ) {
+ cp[0] = cr; cp[1] = cg; cp[2] = cb;
+ if( bpp > 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 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<h; ++y ) {
- uint8_t *bp = picon_rows[y], *rp = rows[y];
- for( int x=0; x<w; ++x ) {
- rp[0] = bp[0]; rp[1] = bp[1];
- rp[2] = bp[2]; bp += bpp;
- rp[3] = alpha; rp += 4;
+ 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<ph; ++y ) {
+ unsigned *bp = (unsigned *)picon_rows[y];
+ unsigned *rp = (unsigned *)rows[y];
+ for( int i=pw; --i>=0; ++bp,++rp ) *rp = (*bp & 0xffffff) | a;
+ }
+ }
+ else {
+ for( int y=0; y<ph; ++y ) {
+ uint8_t *bp = picon_rows[y], *rp = rows[y];
+ for( int x=0; x<pw; ++x ) {
+ rp[0] = bp[0]; rp[1] = bp[1];
+ rp[2] = bp[2]; bp += bpp;
+ rp[3] = alpha; rp += 4;
+ }
}
}
return frame;
// coords relative to pixmap
int64_t total_x = edit_x - pixmap_x, total_w = edit_w;
int64_t x = total_x, w = total_w;
- int left_margin = 10;
+ int left_margin = xS(10);
if( x < 0 ) { w -= -x; x = 0; }
if( w > pixmap_w ) w -= w - pixmap_w;
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);
}
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__,
{
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;
{
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();
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);
}