| 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 "content/plugin/webplugin_proxy.h" | 5 #include "content/plugin/webplugin_proxy.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 CGContextClearRect(windowless_context(), rect.ToCGRect()); | 376 CGContextClearRect(windowless_context(), rect.ToCGRect()); |
| 377 } | 377 } |
| 378 CGContextClipToRect(windowless_context(), rect.ToCGRect()); | 378 CGContextClipToRect(windowless_context(), rect.ToCGRect()); |
| 379 // TODO(caryclark): This is a temporary workaround to allow the Darwin / Skia | 379 // TODO(caryclark): This is a temporary workaround to allow the Darwin / Skia |
| 380 // port to share code with the Darwin / CG port. All ports will eventually use | 380 // port to share code with the Darwin / CG port. All ports will eventually use |
| 381 // the common code below. | 381 // the common code below. |
| 382 delegate_->CGPaint(windowless_context(), rect); | 382 delegate_->CGPaint(windowless_context(), rect); |
| 383 if (windowless_contexts_[saved_index].get() == saved_context_weak) | 383 if (windowless_contexts_[saved_index].get() == saved_context_weak) |
| 384 CGContextRestoreGState(windowless_contexts_[saved_index]); | 384 CGContextRestoreGState(windowless_contexts_[saved_index]); |
| 385 #else | 385 #else |
| 386 windowless_canvas()->save(); | 386 // See above comment about windowless_context_ changing. |
| 387 // http::/crbug.com/139462 |
| 388 skia::PlatformCanvas* saved_canvas = windowless_canvas(); |
| 389 SkAutoRef local_ref(saved_canvas); |
| 390 |
| 391 saved_canvas->save(); |
| 387 | 392 |
| 388 // The given clip rect is relative to the plugin coordinate system. | 393 // The given clip rect is relative to the plugin coordinate system. |
| 389 SkRect sk_rect = { SkIntToScalar(rect.x()), | 394 SkRect sk_rect = { SkIntToScalar(rect.x()), |
| 390 SkIntToScalar(rect.y()), | 395 SkIntToScalar(rect.y()), |
| 391 SkIntToScalar(rect.right()), | 396 SkIntToScalar(rect.right()), |
| 392 SkIntToScalar(rect.bottom()) }; | 397 SkIntToScalar(rect.bottom()) }; |
| 393 windowless_canvas()->clipRect(sk_rect); | 398 saved_canvas->clipRect(sk_rect); |
| 394 | 399 |
| 395 // Setup the background. | 400 // Setup the background. |
| 396 if (background_canvas_.get() && background_canvas_.get()->getDevice()) { | 401 if (background_canvas_.get() && background_canvas_.get()->getDevice()) { |
| 397 // When a background canvas is given, we're in transparent mode. This means | 402 // When a background canvas is given, we're in transparent mode. This means |
| 398 // the plugin wants to have the image of the page in the canvas it's drawing | 403 // the plugin wants to have the image of the page in the canvas it's drawing |
| 399 // into (which is windowless_canvases_) so it can do blending. So we copy | 404 // into (which is windowless_canvases_) so it can do blending. So we copy |
| 400 // the background bitmap into the windowless canvas. | 405 // the background bitmap into the windowless canvas. |
| 401 const SkBitmap& background_bitmap = | 406 const SkBitmap& background_bitmap = |
| 402 skia::GetTopDevice(*background_canvas_)->accessBitmap(false); | 407 skia::GetTopDevice(*background_canvas_)->accessBitmap(false); |
| 403 windowless_canvas()->drawBitmap(background_bitmap, 0, 0); | 408 saved_canvas->drawBitmap(background_bitmap, 0, 0); |
| 404 } else { | 409 } else { |
| 405 // In non-transparent mode, the plugin doesn't care what's underneath, so we | 410 // In non-transparent mode, the plugin doesn't care what's underneath, so we |
| 406 // can just give it black. | 411 // can just give it black. |
| 407 SkPaint black_fill_paint; | 412 SkPaint black_fill_paint; |
| 408 black_fill_paint.setARGB(0xFF, 0x00, 0x00, 0x00); | 413 black_fill_paint.setARGB(0xFF, 0x00, 0x00, 0x00); |
| 409 windowless_canvas()->drawPaint(black_fill_paint); | 414 saved_canvas->drawPaint(black_fill_paint); |
| 410 } | 415 } |
| 411 | 416 |
| 412 // Bring the windowless canvas into the window coordinate system, which is | 417 // Bring the windowless canvas into the window coordinate system, which is |
| 413 // how the plugin expects to draw (since the windowless API was originally | 418 // how the plugin expects to draw (since the windowless API was originally |
| 414 // designed just for scribbling over the web page). | 419 // designed just for scribbling over the web page). |
| 415 windowless_canvas()->translate(SkIntToScalar(-delegate_->GetRect().x()), | 420 saved_canvas->translate(SkIntToScalar(-delegate_->GetRect().x()), |
| 416 SkIntToScalar(-delegate_->GetRect().y())); | 421 SkIntToScalar(-delegate_->GetRect().y())); |
| 417 | 422 |
| 418 // Before we send the invalidate, paint so that renderer uses the updated | 423 // Before we send the invalidate, paint so that renderer uses the updated |
| 419 // bitmap. | 424 // bitmap. |
| 420 delegate_->Paint(windowless_canvas(), offset_rect); | 425 delegate_->Paint(saved_canvas, offset_rect); |
| 421 | 426 |
| 422 windowless_canvas()->restore(); | 427 saved_canvas->restore(); |
| 423 #endif | 428 #endif |
| 424 } | 429 } |
| 425 | 430 |
| 426 void WebPluginProxy::UpdateGeometry( | 431 void WebPluginProxy::UpdateGeometry( |
| 427 const gfx::Rect& window_rect, | 432 const gfx::Rect& window_rect, |
| 428 const gfx::Rect& clip_rect, | 433 const gfx::Rect& clip_rect, |
| 429 const TransportDIB::Handle& windowless_buffer0, | 434 const TransportDIB::Handle& windowless_buffer0, |
| 430 const TransportDIB::Handle& windowless_buffer1, | 435 const TransportDIB::Handle& windowless_buffer1, |
| 431 int windowless_buffer_index, | 436 int windowless_buffer_index, |
| 432 const TransportDIB::Handle& background_buffer, | 437 const TransportDIB::Handle& background_buffer, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 !damaged_rect_.IsEmpty()) { | 470 !damaged_rect_.IsEmpty()) { |
| 466 InvalidateRect(damaged_rect_); | 471 InvalidateRect(damaged_rect_); |
| 467 } | 472 } |
| 468 } | 473 } |
| 469 | 474 |
| 470 #if defined(OS_WIN) | 475 #if defined(OS_WIN) |
| 471 | 476 |
| 472 void WebPluginProxy::CreateCanvasFromHandle( | 477 void WebPluginProxy::CreateCanvasFromHandle( |
| 473 const TransportDIB::Handle& dib_handle, | 478 const TransportDIB::Handle& dib_handle, |
| 474 const gfx::Rect& window_rect, | 479 const gfx::Rect& window_rect, |
| 475 scoped_ptr<skia::PlatformCanvas>* canvas_out) { | 480 SkAutoTUnref<skia::PlatformCanvas>* canvas) { |
| 476 scoped_ptr<skia::PlatformCanvas> canvas(new skia::PlatformCanvas); | 481 canvas->reset(new skia::PlatformCanvas); |
| 477 if (!canvas->initialize( | 482 if (!canvas->get()->initialize( |
| 478 window_rect.width(), | 483 window_rect.width(), |
| 479 window_rect.height(), | 484 window_rect.height(), |
| 480 true, | 485 true, |
| 481 dib_handle)) { | 486 dib_handle)) { |
| 482 canvas_out->reset(); | 487 canvas->reset(NULL); |
| 483 } | 488 } |
| 484 canvas_out->reset(canvas.release()); | |
| 485 // The canvas does not own the section so we need to close it now. | 489 // The canvas does not own the section so we need to close it now. |
| 486 CloseHandle(dib_handle); | 490 CloseHandle(dib_handle); |
| 487 } | 491 } |
| 488 | 492 |
| 489 void WebPluginProxy::SetWindowlessBuffers( | 493 void WebPluginProxy::SetWindowlessBuffers( |
| 490 const TransportDIB::Handle& windowless_buffer0, | 494 const TransportDIB::Handle& windowless_buffer0, |
| 491 const TransportDIB::Handle& windowless_buffer1, | 495 const TransportDIB::Handle& windowless_buffer1, |
| 492 const TransportDIB::Handle& background_buffer, | 496 const TransportDIB::Handle& background_buffer, |
| 493 const gfx::Rect& window_rect) { | 497 const gfx::Rect& window_rect) { |
| 494 CreateCanvasFromHandle(windowless_buffer0, | 498 CreateCanvasFromHandle(windowless_buffer0, |
| 495 window_rect, | 499 window_rect, |
| 496 &windowless_canvases_[0]); | 500 &windowless_canvases_[0]); |
| 497 if (!windowless_canvases_[0].get()) { | 501 if (!windowless_canvases_[0].get()) { |
| 498 windowless_canvases_[1].reset(); | 502 windowless_canvases_[1].reset(NULL); |
| 499 background_canvas_.reset(); | 503 background_canvas_.reset(NULL); |
| 500 return; | 504 return; |
| 501 } | 505 } |
| 502 CreateCanvasFromHandle(windowless_buffer1, | 506 CreateCanvasFromHandle(windowless_buffer1, |
| 503 window_rect, | 507 window_rect, |
| 504 &windowless_canvases_[1]); | 508 &windowless_canvases_[1]); |
| 505 if (!windowless_canvases_[1].get()) { | 509 if (!windowless_canvases_[1].get()) { |
| 506 windowless_canvases_[0].reset(); | 510 windowless_canvases_[0].reset(NULL); |
| 507 background_canvas_.reset(); | 511 background_canvas_.reset(NULL); |
| 508 return; | 512 return; |
| 509 } | 513 } |
| 510 | 514 |
| 511 if (background_buffer) { | 515 if (background_buffer) { |
| 512 CreateCanvasFromHandle(background_buffer, | 516 CreateCanvasFromHandle(background_buffer, |
| 513 window_rect, | 517 window_rect, |
| 514 &background_canvas_); | 518 &background_canvas_); |
| 515 if (!background_canvas_.get()) { | 519 if (!background_canvas_.get()) { |
| 516 windowless_canvases_[0].reset(); | 520 windowless_canvases_[0].reset(NULL); |
| 517 windowless_canvases_[1].reset(); | 521 windowless_canvases_[1].reset(NULL); |
| 518 return; | 522 return; |
| 519 } | 523 } |
| 520 } | 524 } |
| 521 } | 525 } |
| 522 | 526 |
| 523 #elif defined(OS_MACOSX) | 527 #elif defined(OS_MACOSX) |
| 524 | 528 |
| 525 void WebPluginProxy::CreateDIBAndCGContextFromHandle( | 529 void WebPluginProxy::CreateDIBAndCGContextFromHandle( |
| 526 const TransportDIB::Handle& dib_handle, | 530 const TransportDIB::Handle& dib_handle, |
| 527 const gfx::Rect& window_rect, | 531 const gfx::Rect& window_rect, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 &background_dib_, | 569 &background_dib_, |
| 566 &background_context_); | 570 &background_context_); |
| 567 } | 571 } |
| 568 | 572 |
| 569 #elif defined(USE_X11) | 573 #elif defined(USE_X11) |
| 570 | 574 |
| 571 void WebPluginProxy::CreateDIBAndCanvasFromHandle( | 575 void WebPluginProxy::CreateDIBAndCanvasFromHandle( |
| 572 const TransportDIB::Handle& dib_handle, | 576 const TransportDIB::Handle& dib_handle, |
| 573 const gfx::Rect& window_rect, | 577 const gfx::Rect& window_rect, |
| 574 scoped_ptr<TransportDIB>* dib_out, | 578 scoped_ptr<TransportDIB>* dib_out, |
| 575 scoped_ptr<skia::PlatformCanvas>* canvas_out) { | 579 SkAutoTUnref<skia::PlatformCanvas>* canvas) { |
| 576 TransportDIB* dib = TransportDIB::Map(dib_handle); | 580 TransportDIB* dib = TransportDIB::Map(dib_handle); |
| 577 skia::PlatformCanvas* canvas = NULL; | |
| 578 // dib may be NULL if the renderer has already destroyed the TransportDIB by | 581 // dib may be NULL if the renderer has already destroyed the TransportDIB by |
| 579 // the time we receive the handle, e.g. in case of multiple resizes. | 582 // the time we receive the handle, e.g. in case of multiple resizes. |
| 580 if (dib) { | 583 if (dib) { |
| 581 canvas = dib->GetPlatformCanvas(window_rect.width(), window_rect.height()); | 584 canvas->reset( |
| 585 dib->GetPlatformCanvas(window_rect.width(), window_rect.height())); |
| 586 } else { |
| 587 canvas->reset(NULL); |
| 582 } | 588 } |
| 583 dib_out->reset(dib); | 589 dib_out->reset(dib); |
| 584 canvas_out->reset(canvas); | |
| 585 } | 590 } |
| 586 | 591 |
| 587 void WebPluginProxy::CreateShmPixmapFromDIB( | 592 void WebPluginProxy::CreateShmPixmapFromDIB( |
| 588 TransportDIB* dib, | 593 TransportDIB* dib, |
| 589 const gfx::Rect& window_rect, | 594 const gfx::Rect& window_rect, |
| 590 XID* pixmap_out) { | 595 XID* pixmap_out) { |
| 591 if (dib) { | 596 if (dib) { |
| 592 Display* display = ui::GetXDisplay(); | 597 Display* display = ui::GetXDisplay(); |
| 593 XID root_window = ui::GetX11RootWindow(); | 598 XID root_window = ui::GetX11RootWindow(); |
| 594 XShmSegmentInfo shminfo = {0}; | 599 XShmSegmentInfo shminfo = {0}; |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 // Retrieve the IME status from a plug-in and send it to a renderer process | 785 // Retrieve the IME status from a plug-in and send it to a renderer process |
| 781 // when the plug-in has updated it. | 786 // when the plug-in has updated it. |
| 782 int input_type; | 787 int input_type; |
| 783 gfx::Rect caret_rect; | 788 gfx::Rect caret_rect; |
| 784 if (!delegate_->GetIMEStatus(&input_type, &caret_rect)) | 789 if (!delegate_->GetIMEStatus(&input_type, &caret_rect)) |
| 785 return; | 790 return; |
| 786 | 791 |
| 787 Send(new PluginHostMsg_NotifyIMEStatus(route_id_, input_type, caret_rect)); | 792 Send(new PluginHostMsg_NotifyIMEStatus(route_id_, input_type, caret_rect)); |
| 788 } | 793 } |
| 789 #endif | 794 #endif |
| OLD | NEW |