| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "remoting/client/plugin/pepper_view.h" | 5 #include "remoting/client/plugin/pepper_view.h" |
| 6 | 6 |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/string_util.h" |
| 8 #include "ppapi/cpp/graphics_2d.h" | 9 #include "ppapi/cpp/graphics_2d.h" |
| 9 #include "ppapi/cpp/image_data.h" | 10 #include "ppapi/cpp/image_data.h" |
| 10 #include "ppapi/cpp/point.h" | 11 #include "ppapi/cpp/point.h" |
| 11 #include "ppapi/cpp/rect.h" | 12 #include "ppapi/cpp/rect.h" |
| 12 #include "ppapi/cpp/size.h" | 13 #include "ppapi/cpp/size.h" |
| 13 #include "remoting/base/tracer.h" | 14 #include "remoting/base/tracer.h" |
| 14 #include "remoting/base/util.h" | 15 #include "remoting/base/util.h" |
| 15 #include "remoting/client/chromoting_stats.h" | 16 #include "remoting/client/chromoting_stats.h" |
| 16 #include "remoting/client/client_context.h" | 17 #include "remoting/client/client_context.h" |
| 17 #include "remoting/client/plugin/chromoting_instance.h" | 18 #include "remoting/client/plugin/chromoting_instance.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 46 task_factory_.RevokeAll(); | 47 task_factory_.RevokeAll(); |
| 47 } | 48 } |
| 48 | 49 |
| 49 void PepperView::Paint() { | 50 void PepperView::Paint() { |
| 50 DCHECK(CurrentlyOnPluginThread()); | 51 DCHECK(CurrentlyOnPluginThread()); |
| 51 | 52 |
| 52 TraceContext::tracer()->PrintString("Start Paint."); | 53 TraceContext::tracer()->PrintString("Start Paint."); |
| 53 // TODO(ajwong): We're assuming the native format is BGRA_PREMUL below. This | 54 // TODO(ajwong): We're assuming the native format is BGRA_PREMUL below. This |
| 54 // is wrong. | 55 // is wrong. |
| 55 if (is_static_fill_) { | 56 if (is_static_fill_) { |
| 56 LOG(ERROR) << "Static filling " << static_fill_color_; | 57 instance_->Log(logging::LOG_INFO, |
| 58 "Static filling %08x", static_fill_color_); |
| 57 pp::ImageData image(instance_, pp::ImageData::GetNativeImageDataFormat(), | 59 pp::ImageData image(instance_, pp::ImageData::GetNativeImageDataFormat(), |
| 58 pp::Size(host_width_, host_height_), | 60 pp::Size(host_width_, host_height_), |
| 59 false); | 61 false); |
| 60 if (image.is_null()) { | 62 if (image.is_null()) { |
| 61 LOG(ERROR) << "Unable to allocate image of size: " | 63 instance_->Log(logging::LOG_ERROR, |
| 62 << host_width_ << "x" << host_height_; | 64 "Unable to allocate image of size: %dx%d", |
| 65 host_width_, host_height_); |
| 63 return; | 66 return; |
| 64 } | 67 } |
| 65 | 68 |
| 66 for (int y = 0; y < image.size().height(); y++) { | 69 for (int y = 0; y < image.size().height(); y++) { |
| 67 for (int x = 0; x < image.size().width(); x++) { | 70 for (int x = 0; x < image.size().width(); x++) { |
| 68 *image.GetAddr32(pp::Point(x, y)) = static_fill_color_; | 71 *image.GetAddr32(pp::Point(x, y)) = static_fill_color_; |
| 69 } | 72 } |
| 70 } | 73 } |
| 71 | 74 |
| 72 // For ReplaceContents, make sure the image size matches the device context | 75 // For ReplaceContents, make sure the image size matches the device context |
| (...skipping 15 matching lines...) Expand all Loading... |
| 88 | 91 |
| 89 TraceContext::tracer()->PrintString("Start Paint Frame."); | 92 TraceContext::tracer()->PrintString("Start Paint Frame."); |
| 90 | 93 |
| 91 SetViewport(0, 0, frame->width(), frame->height()); | 94 SetViewport(0, 0, frame->width(), frame->height()); |
| 92 | 95 |
| 93 uint8* frame_data = frame->data(media::VideoFrame::kRGBPlane); | 96 uint8* frame_data = frame->data(media::VideoFrame::kRGBPlane); |
| 94 const int kFrameStride = frame->stride(media::VideoFrame::kRGBPlane); | 97 const int kFrameStride = frame->stride(media::VideoFrame::kRGBPlane); |
| 95 const int kBytesPerPixel = GetBytesPerPixel(media::VideoFrame::RGB32); | 98 const int kBytesPerPixel = GetBytesPerPixel(media::VideoFrame::RGB32); |
| 96 | 99 |
| 97 if (!backing_store_.get() || backing_store_->is_null()) { | 100 if (!backing_store_.get() || backing_store_->is_null()) { |
| 98 LOG(ERROR) << "Backing store is not available."; | 101 instance_->Log(logging::LOG_ERROR, "Backing store is not available."); |
| 99 return; | 102 return; |
| 100 } | 103 } |
| 101 if (DoScaling()) { | 104 if (DoScaling()) { |
| 102 if (!scaled_backing_store_.get() || scaled_backing_store_->is_null()) { | 105 if (!scaled_backing_store_.get() || scaled_backing_store_->is_null()) { |
| 103 LOG(ERROR) << "Scaled backing store is not available."; | 106 instance_->Log(logging::LOG_ERROR, |
| 107 "Scaled backing store is not available."); |
| 104 } | 108 } |
| 105 } | 109 } |
| 106 | 110 |
| 107 // Copy updated regions to the backing store and then paint the regions. | 111 // Copy updated regions to the backing store and then paint the regions. |
| 108 for (size_t i = 0; i < rects->size(); ++i) { | 112 for (size_t i = 0; i < rects->size(); ++i) { |
| 109 // TODO(ajwong): We're assuming the native format is BGRA_PREMUL below. This | 113 // TODO(ajwong): We're assuming the native format is BGRA_PREMUL below. This |
| 110 // is wrong. | 114 // is wrong. |
| 111 const gfx::Rect& r = (*rects)[i]; | 115 const gfx::Rect& r = (*rects)[i]; |
| 112 | 116 |
| 113 // TODO(hclam): Make sure rectangles are valid. | 117 // TODO(hclam): Make sure rectangles are valid. |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 graphics2d_.Flush(TaskToCompletionCallback( | 338 graphics2d_.Flush(TaskToCompletionCallback( |
| 335 task_factory_.NewRunnableMethod(&PepperView::OnRefreshPaintDone))); | 339 task_factory_.NewRunnableMethod(&PepperView::OnRefreshPaintDone))); |
| 336 } | 340 } |
| 337 } | 341 } |
| 338 | 342 |
| 339 void PepperView::ResizeInternals() { | 343 void PepperView::ResizeInternals() { |
| 340 graphics2d_ = pp::Graphics2D(instance_, | 344 graphics2d_ = pp::Graphics2D(instance_, |
| 341 pp::Size(host_width_, host_height_), | 345 pp::Size(host_width_, host_height_), |
| 342 false); | 346 false); |
| 343 if (!instance_->BindGraphics(graphics2d_)) { | 347 if (!instance_->BindGraphics(graphics2d_)) { |
| 344 LOG(ERROR) << "Couldn't bind the device context."; | 348 instance_->Log(logging::LOG_ERROR, "Couldn't bind the device context."); |
| 345 return; | 349 return; |
| 346 } | 350 } |
| 347 | 351 |
| 348 if (host_width_ == 0 && host_height_ == 0) | 352 if (host_width_ == 0 && host_height_ == 0) |
| 349 return; | 353 return; |
| 350 | 354 |
| 351 // Allocate the backing store to save the desktop image. | 355 // Allocate the backing store to save the desktop image. |
| 352 pp::Size host_size(host_width_, host_height_); | 356 pp::Size host_size(host_width_, host_height_); |
| 353 if ((backing_store_.get() == NULL) || (backing_store_->size() != host_size)) { | 357 if ((backing_store_.get() == NULL) || (backing_store_->size() != host_size)) { |
| 354 backing_store_.reset( | 358 backing_store_.reset( |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 (*frame_out)->AddRef(); | 438 (*frame_out)->AddRef(); |
| 435 } | 439 } |
| 436 done->Run(); | 440 done->Run(); |
| 437 delete done; | 441 delete done; |
| 438 } | 442 } |
| 439 | 443 |
| 440 void PepperView::ReleaseFrame(media::VideoFrame* frame) { | 444 void PepperView::ReleaseFrame(media::VideoFrame* frame) { |
| 441 DCHECK(CurrentlyOnPluginThread()); | 445 DCHECK(CurrentlyOnPluginThread()); |
| 442 | 446 |
| 443 if (frame) { | 447 if (frame) { |
| 444 LOG(WARNING) << "Frame released."; | 448 instance_->Log(logging::LOG_WARNING, "Frame released."); |
| 445 frame->Release(); | 449 frame->Release(); |
| 446 } | 450 } |
| 447 } | 451 } |
| 448 | 452 |
| 449 void PepperView::OnPartialFrameOutput(media::VideoFrame* frame, | 453 void PepperView::OnPartialFrameOutput(media::VideoFrame* frame, |
| 450 UpdatedRects* rects, | 454 UpdatedRects* rects, |
| 451 Task* done) { | 455 Task* done) { |
| 452 DCHECK(CurrentlyOnPluginThread()); | 456 DCHECK(CurrentlyOnPluginThread()); |
| 453 | 457 |
| 454 TraceContext::tracer()->PrintString("Calling PaintFrame"); | 458 TraceContext::tracer()->PrintString("Calling PaintFrame"); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 465 instance_->GetStats()->video_paint_ms()->Record( | 469 instance_->GetStats()->video_paint_ms()->Record( |
| 466 (base::Time::Now() - paint_start).InMilliseconds()); | 470 (base::Time::Now() - paint_start).InMilliseconds()); |
| 467 return; | 471 return; |
| 468 } | 472 } |
| 469 | 473 |
| 470 void PepperView::OnRefreshPaintDone() { | 474 void PepperView::OnRefreshPaintDone() { |
| 471 DCHECK(CurrentlyOnPluginThread()); | 475 DCHECK(CurrentlyOnPluginThread()); |
| 472 } | 476 } |
| 473 | 477 |
| 474 } // namespace remoting | 478 } // namespace remoting |
| OLD | NEW |