Added a simple X,Y offset, to speed up basic overlays.

This commit is contained in:
Jonathan Thomas
2012-11-13 22:07:49 -06:00
parent 73be628047
commit d58cfec0ca
2 changed files with 36 additions and 22 deletions

View File

@@ -31,9 +31,9 @@ int main()
Timeline t(640, 360, Framerate(24,1), 44100, 2);
// Add some clips
Clip c1(new FFmpegReader("/home/jonathan/Videos/sintel-1024-stereo.mp4"));
Clip c2(new ImageReader("/home/jonathan/Desktop/logo1.png"));
Clip c3(new ImageReader("/home/jonathan/Desktop/icon.png"));
Clip c1(new FFmpegReader("/home/jonathan/Videos/sintel_trailer-720p.mp4"));
Clip c2(new ImageReader("/home/jonathan/Desktop/logo.png"));
Clip c3(new ImageReader("/home/jonathan/Desktop/big_logo.png"));
//Clip c3(new FFmpegReader("/home/jonathan/Desktop/IncognitoCory_-_April_Song.mp3"));
c1.Position(0.0);
c1.gravity = GRAVITY_CENTER;
@@ -42,19 +42,22 @@ int main()
c2.Position(0.0);
c2.Layer(2);
c2.gravity = GRAVITY_LEFT;
c2.gravity = GRAVITY_BOTTOM_RIGHT;
c2.scale = SCALE_NONE;
c2.alpha.AddPoint(1, 1);
c2.alpha.AddPoint(120, 0);
c2.location_x.AddPoint(1, -0.01);
c2.location_x.AddPoint(300, -1);
c2.location_y.AddPoint(1, -0.02);
c2.End(20);
c3.Layer(1);
c3.Layer(3);
c3.End(20);
c3.location_x.AddPoint(1, 0);
c3.location_x.AddPoint(300, 1.0);
c3.gravity = GRAVITY_LEFT;
c3.scale = SCALE_NONE;
c2.rotation.AddPoint(1, 1);
c2.rotation.AddPoint(300, 360);
c3.gravity = GRAVITY_CENTER;
//c3.scale_x.AddPoint(1, 0.1);
//c3.scale_x.AddPoint(300, 2.0);
//c3.scale_y.AddPoint(1, 0.1);
//c3.scale_y.AddPoint(300, 2.0);
//c2.scale_x.AddPoint(1, 1);
//c2.scale_x.AddPoint(300, 3.5);
@@ -71,13 +74,13 @@ int main()
//c1.alpha.AddPoint(1, 1);
//c1.alpha.AddPoint(30, 0);
c2.alpha.AddPoint(1, 0);
c2.alpha.AddPoint(100, 1);
c2.alpha.AddPoint(200, 0);
c2.alpha.AddPoint(300, 1);
//c2.alpha.AddPoint(1, 0);
//c2.alpha.AddPoint(100, 1);
//c2.alpha.AddPoint(200, 0);
//c2.alpha.AddPoint(300, 1);
c2.location_x.AddPoint(1, 0);
c2.location_x.AddPoint(300, 1.0);
//c2.location_x.AddPoint(1, 0);
//c2.location_x.AddPoint(300, 1.0);
//c2.location_y.AddPoint(1, 0);
//c2.location_y.AddPoint(300, 1);
@@ -153,7 +156,7 @@ int main()
// Output stream info
w.OutputStreamInfo();
for (int frame = 1; frame <= 300; frame++)
for (int frame = 1; frame <= 80; frame++)
{
tr1::shared_ptr<Frame> f = t.GetFrame(frame);
if (f)

View File

@@ -147,17 +147,28 @@ void Timeline::add_layer(tr1::shared_ptr<Frame> new_frame, Clip* source_clip, in
y += height * source_clip->location_y.GetValue(clip_frame_number); // move in percentage of final height
float sx = source_clip->scale_x.GetValue(clip_frame_number); // percentage X scale
float sy = source_clip->scale_y.GetValue(clip_frame_number); // percentage Y scale
bool is_x_animated = source_clip->location_x.Points.size() > 2;
bool is_y_animated = source_clip->location_y.Points.size() > 2;
// origin X,Y Scale Angle NewX,NewY
if (source_width != width || source_height != height || round(r) != 0 || round(x) != 0 || round(y) != 0 || round(sx) != 1 || round(sy) != 1)
int offset_x = 0;
int offset_y = 0;
if ((round(x) != 0 || round(y) != 0) && (round(r) == 0 && round(sx) == 1 && round(sy) == 1 && !is_x_animated && !is_y_animated))
{
// If only X and Y are different, and no animation is being used (just set the offset for speed)
offset_x = round(x);
offset_y = round(y);
} else if (round(r) != 0 || round(x) != 0 || round(y) != 0 || round(sx) != 1 || round(sy) != 1)
{
// Use the distort operator, which is very CPU intensive
// origin X,Y Scale Angle NewX,NewY
double distort_args[7] = {0,0, sx,sy, r, x-1,y-1 };
source_image->distort(Magick::ScaleRotateTranslateDistortion, 7, distort_args, false);
}
/* COMPOSITE SOURCE IMAGE (LAYER) ONTO FINAL IMAGE */
tr1::shared_ptr<Magick::Image> new_image = new_frame->GetImage();
new_image->composite(*source_image.get(), 0, 0, Magick::OverCompositeOp);
new_image->composite(*source_image.get(), offset_x, offset_y, Magick::OverCompositeOp);
}
// Update the list of 'opened' clips