OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/media/webmediaplayer_impl.h" | 5 #include "webkit/media/webmediaplayer_impl.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
500 const WebKit::WebRect& rect) { | 500 const WebKit::WebRect& rect) { |
501 paint(canvas, rect, 0xFF); | 501 paint(canvas, rect, 0xFF); |
502 } | 502 } |
503 | 503 |
504 void WebMediaPlayerImpl::paint(WebCanvas* canvas, | 504 void WebMediaPlayerImpl::paint(WebCanvas* canvas, |
505 const WebRect& rect, | 505 const WebRect& rect, |
506 uint8_t alpha) { | 506 uint8_t alpha) { |
507 DCHECK_EQ(main_loop_, MessageLoop::current()); | 507 DCHECK_EQ(main_loop_, MessageLoop::current()); |
508 DCHECK(proxy_); | 508 DCHECK(proxy_); |
509 | 509 |
510 #if WEBKIT_USING_SKIA | |
511 proxy_->Paint(canvas, rect, alpha); | 510 proxy_->Paint(canvas, rect, alpha); |
512 #elif WEBKIT_USING_CG | |
513 // Get the current scaling in X and Y. | |
514 CGAffineTransform mat = CGContextGetCTM(canvas); | |
515 float scale_x = sqrt(mat.a * mat.a + mat.b * mat.b); | |
516 float scale_y = sqrt(mat.c * mat.c + mat.d * mat.d); | |
517 float inverse_scale_x = SkScalarNearlyZero(scale_x) ? 0.0f : 1.0f / scale_x; | |
518 float inverse_scale_y = SkScalarNearlyZero(scale_y) ? 0.0f : 1.0f / scale_y; | |
519 int scaled_width = static_cast<int>(rect.width * fabs(scale_x)); | |
520 int scaled_height = static_cast<int>(rect.height * fabs(scale_y)); | |
521 | |
522 // Make sure we don't create a huge canvas. | |
523 // TODO(hclam): Respect the aspect ratio. | |
524 if (scaled_width > static_cast<int>(media::limits::kMaxCanvas)) | |
525 scaled_width = media::limits::kMaxCanvas; | |
526 if (scaled_height > static_cast<int>(media::limits::kMaxCanvas)) | |
527 scaled_height = media::limits::kMaxCanvas; | |
528 | |
529 // If there is no preexisting platform canvas, or if the size has | |
530 // changed, recreate the canvas. This is to avoid recreating the bitmap | |
531 // buffer over and over for each frame of video. | |
532 if (!skia_canvas_.get() || | |
533 skia_canvas_->getDevice()->width() != scaled_width || | |
534 skia_canvas_->getDevice()->height() != scaled_height) { | |
535 skia_canvas_.reset( | |
536 new skia::PlatformCanvas(scaled_width, scaled_height, true)); | |
537 } | |
538 | |
539 // Draw to our temporary skia canvas. | |
540 gfx::Rect normalized_rect(scaled_width, scaled_height); | |
541 proxy_->Paint(skia_canvas_.get(), normalized_rect); | |
542 | |
543 // The mac coordinate system is flipped vertical from the normal skia | |
544 // coordinates. During painting of the frame, flip the coordinates | |
545 // system and, for simplicity, also translate the clip rectangle to | |
546 // start at 0,0. | |
547 CGContextSaveGState(canvas); | |
548 CGContextTranslateCTM(canvas, rect.x, rect.height + rect.y); | |
549 CGContextScaleCTM(canvas, inverse_scale_x, -inverse_scale_y); | |
550 | |
551 // We need a local variable CGRect version for DrawToContext. | |
552 CGRect normalized_cgrect = | |
553 CGRectMake(normalized_rect.x(), normalized_rect.y(), | |
554 normalized_rect.width(), normalized_rect.height()); | |
555 | |
556 // Copy the frame rendered to our temporary skia canvas onto the passed in | |
557 // canvas. | |
558 skia::DrawToNativeContext(skia_canvas_.get(), canvas, 0, 0, | |
559 &normalized_cgrect); | |
560 | |
561 CGContextRestoreGState(canvas); | |
562 #else | |
563 NOTIMPLEMENTED() << "We only support rendering to skia or CG"; | |
564 #endif | |
565 } | 511 } |
566 | 512 |
567 bool WebMediaPlayerImpl::hasSingleSecurityOrigin() const { | 513 bool WebMediaPlayerImpl::hasSingleSecurityOrigin() const { |
568 if (proxy_) | 514 if (proxy_) |
569 return proxy_->HasSingleOrigin(); | 515 return proxy_->HasSingleOrigin(); |
570 return true; | 516 return true; |
571 } | 517 } |
572 | 518 |
573 WebMediaPlayer::MovieLoadType WebMediaPlayerImpl::movieLoadType() const { | 519 WebMediaPlayer::MovieLoadType WebMediaPlayerImpl::movieLoadType() const { |
574 DCHECK_EQ(main_loop_, MessageLoop::current()); | 520 DCHECK_EQ(main_loop_, MessageLoop::current()); |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 return audio_source_provider_; | 1008 return audio_source_provider_; |
1063 } | 1009 } |
1064 | 1010 |
1065 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { | 1011 void WebMediaPlayerImpl::IncrementExternallyAllocatedMemory() { |
1066 DCHECK_EQ(main_loop_, MessageLoop::current()); | 1012 DCHECK_EQ(main_loop_, MessageLoop::current()); |
1067 incremented_externally_allocated_memory_ = true; | 1013 incremented_externally_allocated_memory_ = true; |
1068 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); | 1014 v8::V8::AdjustAmountOfExternalAllocatedMemory(kPlayerExtraMemory); |
1069 } | 1015 } |
1070 | 1016 |
1071 } // namespace webkit_media | 1017 } // namespace webkit_media |
OLD | NEW |