| Index: media/filters/skcanvas_video_renderer.cc
|
| diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc
|
| index 9bdd393e56c31c368b926de08be9e4e42a993382..7cb6c5eb873499e092f92995004741b4b93434b8 100644
|
| --- a/media/filters/skcanvas_video_renderer.cc
|
| +++ b/media/filters/skcanvas_video_renderer.cc
|
| @@ -327,42 +327,57 @@ void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame,
|
| if (!SkInstallDiscardablePixelRef(generator_, &last_frame_)) {
|
| NOTREACHED();
|
| }
|
| + DCHECK(video_frame->visible_rect().width() == last_frame_.width() &&
|
| + video_frame->visible_rect().height() == last_frame_.height());
|
|
|
| - // TODO(rileya): Perform this rotation on the canvas, rather than allocating
|
| - // a new bitmap and copying.
|
| + last_frame_timestamp_ = video_frame->timestamp();
|
| + } else if (generator_) {
|
| + generator_->set_frame(video_frame);
|
| + }
|
| +
|
| + paint.setXfermodeMode(mode);
|
| + paint.setFilterLevel(SkPaint::kLow_FilterLevel);
|
| +
|
| + bool need_transform =
|
| + video_rotation != VIDEO_ROTATION_0 ||
|
| + dest_rect.size() != video_frame->visible_rect().size() ||
|
| + !dest_rect.origin().IsOrigin();
|
| + if (need_transform) {
|
| + canvas->save();
|
| + canvas->translate(
|
| + SkFloatToScalar(dest_rect.x() + (dest_rect.width() * 0.5f)),
|
| + SkFloatToScalar(dest_rect.y() + (dest_rect.height() * 0.5f)));
|
| + SkScalar angle = SkFloatToScalar(0.0f);
|
| switch (video_rotation) {
|
| case VIDEO_ROTATION_0:
|
| break;
|
| case VIDEO_ROTATION_90:
|
| - last_frame_ = SkBitmapOperations::Rotate(
|
| - last_frame_, SkBitmapOperations::ROTATION_90_CW);
|
| + angle = SkFloatToScalar(90.0f);
|
| break;
|
| case VIDEO_ROTATION_180:
|
| - last_frame_ = SkBitmapOperations::Rotate(
|
| - last_frame_, SkBitmapOperations::ROTATION_180_CW);
|
| + angle = SkFloatToScalar(180.0f);
|
| break;
|
| case VIDEO_ROTATION_270:
|
| - last_frame_ = SkBitmapOperations::Rotate(
|
| - last_frame_, SkBitmapOperations::ROTATION_270_CW);
|
| + angle = SkFloatToScalar(270.0f);
|
| break;
|
| }
|
| + canvas->rotate(angle);
|
|
|
| - // We copied the frame into a new bitmap and threw out the old one, so we
|
| - // no longer have a |generator_| around. This should be removed when the
|
| - // above TODO is addressed.
|
| - if (video_rotation != VIDEO_ROTATION_0)
|
| - generator_ = NULL;
|
| -
|
| - last_frame_timestamp_ = video_frame->timestamp();
|
| - } else if (generator_) {
|
| - generator_->set_frame(video_frame);
|
| + gfx::SizeF rotated_dest_size = dest_rect.size();
|
| + if (video_rotation == VIDEO_ROTATION_90 ||
|
| + video_rotation == VIDEO_ROTATION_270) {
|
| + rotated_dest_size =
|
| + gfx::SizeF(rotated_dest_size.height(), rotated_dest_size.width());
|
| + }
|
| + canvas->scale(
|
| + SkFloatToScalar(rotated_dest_size.width() / last_frame_.width()),
|
| + SkFloatToScalar(rotated_dest_size.height() / last_frame_.height()));
|
| + canvas->translate(-SkFloatToScalar(last_frame_.width() * 0.5f),
|
| + -SkFloatToScalar(last_frame_.height() * 0.5f));
|
| }
|
| -
|
| - paint.setXfermodeMode(mode);
|
| -
|
| - // Paint using |last_frame_|.
|
| - paint.setFilterLevel(SkPaint::kLow_FilterLevel);
|
| - canvas->drawBitmapRect(last_frame_, NULL, dest, &paint);
|
| + canvas->drawBitmap(last_frame_, 0, 0, &paint);
|
| + if (need_transform)
|
| + canvas->restore();
|
| canvas->flush();
|
| }
|
|
|
|
|