Chromium Code Reviews| Index: webkit/glue/webmediaplayer_impl.cc |
| diff --git a/webkit/glue/webmediaplayer_impl.cc b/webkit/glue/webmediaplayer_impl.cc |
| index 4a64b0f71b693404e74fc461ca840a4725767f47..ff0160f8cb326b94ef439cb6e562e99bc9eae69b 100644 |
| --- a/webkit/glue/webmediaplayer_impl.cc |
| +++ b/webkit/glue/webmediaplayer_impl.cc |
| @@ -563,55 +563,80 @@ void WebMediaPlayerImpl::paint(WebCanvas* canvas, |
| #if WEBKIT_USING_SKIA |
| proxy_->Paint(canvas, rect); |
| #elif WEBKIT_USING_CG |
| - // Get the current scaling in X and Y. |
| - CGAffineTransform mat = CGContextGetCTM(canvas); |
| - float scale_x = sqrt(mat.a * mat.a + mat.b * mat.b); |
| - float scale_y = sqrt(mat.c * mat.c + mat.d * mat.d); |
| - float inverse_scale_x = SkScalarNearlyZero(scale_x) ? 0.0f : 1.0f / scale_x; |
| - float inverse_scale_y = SkScalarNearlyZero(scale_y) ? 0.0f : 1.0f / scale_y; |
| - int scaled_width = static_cast<int>(rect.width * fabs(scale_x)); |
| - int scaled_height = static_cast<int>(rect.height * fabs(scale_y)); |
| - |
| - // Make sure we don't create a huge canvas. |
| - // TODO(hclam): Respect the aspect ratio. |
| - if (scaled_width > static_cast<int>(media::Limits::kMaxCanvas)) |
| - scaled_width = media::Limits::kMaxCanvas; |
| - if (scaled_height > static_cast<int>(media::Limits::kMaxCanvas)) |
| - scaled_height = media::Limits::kMaxCanvas; |
| - |
| - // If there is no preexisting platform canvas, or if the size has |
| - // changed, recreate the canvas. This is to avoid recreating the bitmap |
| - // buffer over and over for each frame of video. |
| - if (!skia_canvas_.get() || |
| - skia_canvas_->getDevice()->width() != scaled_width || |
| - skia_canvas_->getDevice()->height() != scaled_height) { |
| - skia_canvas_.reset( |
| - new skia::PlatformCanvas(scaled_width, scaled_height, true)); |
| - } |
| + if (CGBitmapContextGetData(canvas)) { |
| + int width = CGBitmapContextGetWidth(canvas); |
| + int height = CGBitmapContextGetHeight(canvas); |
| + DCHECK(width != 0 && height != 0); |
| + skia::PlatformCanvas skia_canvas(width, height, true, canvas); |
| + |
| + // Copy the transformation matrix from the context. |
| + CGAffineTransform cgMat = CGContextGetCTM(canvas); |
| + SkMatrix skMat; |
| + skMat.reset(); |
| + skMat[SkMatrix::kMScaleX] = cgMat.a; |
| + skMat[SkMatrix::kMScaleY] = -cgMat.d; |
| + skMat[SkMatrix::kMSkewX] = cgMat.b; |
| + skMat[SkMatrix::kMSkewY] = -cgMat.c; |
| + skMat[SkMatrix::kMTransX] = cgMat.tx; |
| + skMat[SkMatrix::kMTransY] = height - cgMat.ty; |
| + skia_canvas.setMatrix(skMat); |
| + |
| + proxy_->Paint(&skia_canvas, rect); |
| + } else { |
| + // No bitmap context available, so we need to proxy via a bitmap. |
| + // TODO(sjl): Can this ever happen? |
|
brettw
2010/12/29 21:03:52
I was wondering the same thing as this todo says.
sjl
2010/12/31 05:55:49
That's my understanding too.
|
| + |
| + // Get the current scaling in X and Y. |
| + CGAffineTransform mat = CGContextGetCTM(canvas); |
| + float scale_x = sqrt(mat.a * mat.a + mat.b * mat.b); |
| + float scale_y = sqrt(mat.c * mat.c + mat.d * mat.d); |
| + float inverse_scale_x = SkScalarNearlyZero(scale_x) ? 0.0f : 1.0f / scale_x; |
| + float inverse_scale_y = SkScalarNearlyZero(scale_y) ? 0.0f : 1.0f / scale_y; |
| + int scaled_width = static_cast<int>(rect.width * fabs(scale_x)); |
| + int scaled_height = static_cast<int>(rect.height * fabs(scale_y)); |
| + |
| + // Make sure we don't create a huge canvas. |
| + // TODO(hclam): Respect the aspect ratio. |
| + if (scaled_width > static_cast<int>(media::Limits::kMaxCanvas)) |
| + scaled_width = media::Limits::kMaxCanvas; |
| + if (scaled_height > static_cast<int>(media::Limits::kMaxCanvas)) |
| + scaled_height = media::Limits::kMaxCanvas; |
| + |
| + // If there is no preexisting platform canvas, or if the size has |
| + // changed, recreate the canvas. This is to avoid recreating the bitmap |
| + // buffer over and over for each frame of video. |
| + if (!skia_canvas_.get() || |
| + skia_canvas_->getDevice()->width() != scaled_width || |
| + skia_canvas_->getDevice()->height() != scaled_height) { |
| + skia_canvas_.reset( |
| + new skia::PlatformCanvas(scaled_width, scaled_height, true)); |
| + } |
| + |
| + // Draw to our temporary skia canvas. |
| + gfx::Rect normalized_rect(scaled_width, scaled_height); |
| + proxy_->Paint(skia_canvas_.get(), normalized_rect); |
| + |
| + // The mac coordinate system is flipped vertical from the normal skia |
| + // coordinates. During painting of the frame, flip the coordinates |
| + // system and, for simplicity, also translate the clip rectangle to |
| + // start at 0,0. |
| + CGContextSaveGState(canvas); |
| + CGContextTranslateCTM(canvas, rect.x, rect.height + rect.y); |
| + CGContextScaleCTM(canvas, inverse_scale_x, -inverse_scale_y); |
| - // Draw to our temporary skia canvas. |
| - gfx::Rect normalized_rect(scaled_width, scaled_height); |
| - proxy_->Paint(skia_canvas_.get(), normalized_rect); |
| - |
| - // The mac coordinate system is flipped vertical from the normal skia |
| - // coordinates. During painting of the frame, flip the coordinates |
| - // system and, for simplicity, also translate the clip rectangle to |
| - // start at 0,0. |
| - CGContextSaveGState(canvas); |
| - CGContextTranslateCTM(canvas, rect.x, rect.height + rect.y); |
| - CGContextScaleCTM(canvas, inverse_scale_x, -inverse_scale_y); |
| - |
| - // We need a local variable CGRect version for DrawToContext. |
| - CGRect normalized_cgrect = |
| - CGRectMake(normalized_rect.x(), normalized_rect.y(), |
| - normalized_rect.width(), normalized_rect.height()); |
| - |
| - // Copy the frame rendered to our temporary skia canvas onto the passed in |
| - // canvas. |
| - skia_canvas_->getTopPlatformDevice().DrawToContext(canvas, 0, 0, |
| - &normalized_cgrect); |
| - |
| - CGContextRestoreGState(canvas); |
| + // We need a local variable CGRect version for DrawToContext. |
| + CGRect normalized_cgrect = |
| + CGRectMake(normalized_rect.x(), normalized_rect.y(), |
| + normalized_rect.width(), normalized_rect.height()); |
| + |
| + // Copy the frame rendered to our temporary skia canvas onto the passed in |
| + // canvas. |
| + |
| + skia_canvas_->getTopPlatformDevice().DrawToContext(canvas, 0, 0, |
| + &normalized_cgrect); |
| + |
| + CGContextRestoreGState(canvas); |
| + } |
| #else |
| NOTIMPLEMENTED() << "We only support rendering to skia or CG"; |
| #endif |