Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Side by Side Diff: chrome/renderer/webplugin_delegate_proxy.cc

Issue 5040: Fix painting problem with transparent plugins because plugins were ignoring t... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/renderer/webplugin_delegate_proxy.h ('k') | webkit/glue/plugins/plugin_host.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "chrome/renderer/webplugin_delegate_proxy.h" 5 #include "chrome/renderer/webplugin_delegate_proxy.h"
6 6
7 #include <atlbase.h> 7 #include <atlbase.h>
8 8
9 #include "generated_resources.h" 9 #include "generated_resources.h"
10 10
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 : render_view_(render_view), 136 : render_view_(render_view),
137 mime_type_(mime_type), 137 mime_type_(mime_type),
138 clsid_(clsid), 138 clsid_(clsid),
139 plugin_(NULL), 139 plugin_(NULL),
140 windowless_(false), 140 windowless_(false),
141 first_paint_(true), 141 first_paint_(true),
142 npobject_(NULL), 142 npobject_(NULL),
143 send_deferred_update_geometry_(false), 143 send_deferred_update_geometry_(false),
144 visible_(false), 144 visible_(false),
145 sad_plugin_(NULL), 145 sad_plugin_(NULL),
146 window_script_object_(NULL) { 146 window_script_object_(NULL),
147 transparent_(false),
148 invalidate_pending_(false) {
147 } 149 }
148 150
149 WebPluginDelegateProxy::~WebPluginDelegateProxy() { 151 WebPluginDelegateProxy::~WebPluginDelegateProxy() {
150 if (npobject_) 152 if (npobject_)
151 NPN_ReleaseObject(npobject_); 153 NPN_ReleaseObject(npobject_);
152 154
153 if (window_script_object_) { 155 if (window_script_object_) {
154 window_script_object_->set_proxy(NULL); 156 window_script_object_->set_proxy(NULL);
155 window_script_object_->set_invalid(); 157 window_script_object_->set_invalid();
156 } 158 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 217
216 channel_host_->AddRoute(instance_id_, this, false); 218 channel_host_->AddRoute(instance_id_, this, false);
217 219
218 // Now tell the PluginInstance in the plugin process to initialize. 220 // Now tell the PluginInstance in the plugin process to initialize.
219 PluginMsg_Init_Params params; 221 PluginMsg_Init_Params params;
220 params.containing_window = render_view_->host_window(); 222 params.containing_window = render_view_->host_window();
221 params.url = url; 223 params.url = url;
222 for (int i = 0; i < argc; ++i) { 224 for (int i = 0; i < argc; ++i) {
223 params.arg_names.push_back(argn[i]); 225 params.arg_names.push_back(argn[i]);
224 params.arg_values.push_back(argv[i]); 226 params.arg_values.push_back(argv[i]);
227
228 if (LowerCaseEqualsASCII(params.arg_names.back(), "wmode") &&
229 LowerCaseEqualsASCII(params.arg_values.back(), "transparent")) {
230 transparent_ = true;
231 }
225 } 232 }
226 params.load_manually = load_manually; 233 params.load_manually = load_manually;
227 params.modal_dialog_event = render_view_->modal_dialog_event(); 234 params.modal_dialog_event = render_view_->modal_dialog_event();
228 235
229 plugin_ = plugin; 236 plugin_ = plugin;
230 237
231 result = false; 238 result = false;
232 IPC::Message* msg = new PluginMsg_Init(instance_id_, params, &result); 239 IPC::Message* msg = new PluginMsg_Init(instance_id_, params, &result);
233 Send(msg); 240 Send(msg);
234 241
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 } 299 }
293 300
294 void WebPluginDelegateProxy::InstallMissingPlugin() { 301 void WebPluginDelegateProxy::InstallMissingPlugin() {
295 Send(new PluginMsg_InstallMissingPlugin(instance_id_)); 302 Send(new PluginMsg_InstallMissingPlugin(instance_id_));
296 } 303 }
297 304
298 void WebPluginDelegateProxy::OnMessageReceived(const IPC::Message& msg) { 305 void WebPluginDelegateProxy::OnMessageReceived(const IPC::Message& msg) {
299 IPC_BEGIN_MESSAGE_MAP(WebPluginDelegateProxy, msg) 306 IPC_BEGIN_MESSAGE_MAP(WebPluginDelegateProxy, msg)
300 IPC_MESSAGE_HANDLER(PluginHostMsg_SetWindow, OnSetWindow) 307 IPC_MESSAGE_HANDLER(PluginHostMsg_SetWindow, OnSetWindow)
301 IPC_MESSAGE_HANDLER(PluginHostMsg_CancelResource, OnCancelResource) 308 IPC_MESSAGE_HANDLER(PluginHostMsg_CancelResource, OnCancelResource)
302 IPC_MESSAGE_HANDLER(PluginHostMsg_Invalidate, OnInvalidate)
303 IPC_MESSAGE_HANDLER(PluginHostMsg_InvalidateRect, OnInvalidateRect) 309 IPC_MESSAGE_HANDLER(PluginHostMsg_InvalidateRect, OnInvalidateRect)
304 IPC_MESSAGE_HANDLER(PluginHostMsg_GetWindowScriptNPObject, 310 IPC_MESSAGE_HANDLER(PluginHostMsg_GetWindowScriptNPObject,
305 OnGetWindowScriptNPObject) 311 OnGetWindowScriptNPObject)
306 IPC_MESSAGE_HANDLER(PluginHostMsg_GetPluginElement, 312 IPC_MESSAGE_HANDLER(PluginHostMsg_GetPluginElement,
307 OnGetPluginElement) 313 OnGetPluginElement)
308 IPC_MESSAGE_HANDLER(PluginHostMsg_SetCookie, OnSetCookie) 314 IPC_MESSAGE_HANDLER(PluginHostMsg_SetCookie, OnSetCookie)
309 IPC_MESSAGE_HANDLER(PluginHostMsg_GetCookies, OnGetCookies) 315 IPC_MESSAGE_HANDLER(PluginHostMsg_GetCookies, OnGetCookies)
310 IPC_MESSAGE_HANDLER(PluginHostMsg_ShowModalHTMLDialog, 316 IPC_MESSAGE_HANDLER(PluginHostMsg_ShowModalHTMLDialog,
311 OnShowModalHTMLDialog) 317 OnShowModalHTMLDialog)
312 IPC_MESSAGE_HANDLER(PluginHostMsg_MissingPluginStatus, 318 IPC_MESSAGE_HANDLER(PluginHostMsg_MissingPluginStatus,
313 OnMissingPluginStatus) 319 OnMissingPluginStatus)
314 IPC_MESSAGE_HANDLER(PluginHostMsg_URLRequest, OnHandleURLRequest) 320 IPC_MESSAGE_HANDLER(PluginHostMsg_URLRequest, OnHandleURLRequest)
315 IPC_MESSAGE_HANDLER(PluginHostMsg_GetCPBrowsingContext, 321 IPC_MESSAGE_HANDLER(PluginHostMsg_GetCPBrowsingContext,
316 OnGetCPBrowsingContext) 322 OnGetCPBrowsingContext)
317 IPC_MESSAGE_HANDLER(PluginHostMsg_CancelDocumentLoad, OnCancelDocumentLoad) 323 IPC_MESSAGE_HANDLER(PluginHostMsg_CancelDocumentLoad, OnCancelDocumentLoad)
318 IPC_MESSAGE_HANDLER(PluginHostMsg_InitiateHTTPRangeRequest, 324 IPC_MESSAGE_HANDLER(PluginHostMsg_InitiateHTTPRangeRequest,
319 OnInitiateHTTPRangeRequest) 325 OnInitiateHTTPRangeRequest)
320 IPC_MESSAGE_UNHANDLED_ERROR() 326 IPC_MESSAGE_UNHANDLED_ERROR()
321 IPC_END_MESSAGE_MAP() 327 IPC_END_MESSAGE_MAP()
322 } 328 }
323 329
324 void WebPluginDelegateProxy::OnChannelError() { 330 void WebPluginDelegateProxy::OnChannelError() {
325 OnInvalidate(); 331 if (plugin_)
332 plugin_->Invalidate();
326 render_view_->PluginCrashed(plugin_path_); 333 render_view_->PluginCrashed(plugin_path_);
327 } 334 }
328 335
329 // Copied from render_widget.cc
330 static size_t GetPaintBufSize(const gfx::Rect& rect) {
331 // TODO(darin): protect against overflow
332 return 4 * rect.width() * rect.height();
333 }
334
335 void WebPluginDelegateProxy::UpdateGeometry(const gfx::Rect& window_rect, 336 void WebPluginDelegateProxy::UpdateGeometry(const gfx::Rect& window_rect,
336 const gfx::Rect& clip_rect, 337 const gfx::Rect& clip_rect,
337 bool visible) { 338 bool visible) {
338 bool moved = plugin_rect_.x() != window_rect.x() ||
339 plugin_rect_.y() != window_rect.y();
340 plugin_rect_ = window_rect; 339 plugin_rect_ = window_rect;
341 if (!windowless_) { 340 if (!windowless_) {
342 deferred_clip_rect_ = clip_rect; 341 deferred_clip_rect_ = clip_rect;
343 visible_ = visible; 342 visible_ = visible;
344 send_deferred_update_geometry_ = true; 343 send_deferred_update_geometry_ = true;
345 return; 344 return;
346 } 345 }
347 346
348 HANDLE windowless_buffer_handle = NULL; 347 HANDLE transport_store_handle = NULL;
349 if (!windowless_canvas_.get() || 348 HANDLE background_store_handle = NULL;
350 (window_rect.width() != windowless_canvas_->getDevice()->width() || 349 if (!backing_store_canvas_.get() ||
351 window_rect.height() != windowless_canvas_->getDevice()->height())) { 350 (window_rect.width() != backing_store_canvas_->getDevice()->width() ||
352 // Create a shared memory section that the plugin paints asynchronously. 351 window_rect.height() != backing_store_canvas_->getDevice()->height())) {
353 windowless_canvas_.reset(); 352 // Create a shared memory section that the plugin paints into
354 if (!windowless_buffer_lock_) 353 // asynchronously.
355 windowless_buffer_lock_.Set(CreateMutex(NULL, FALSE, NULL)); 354 ResetWindowlessBitmaps();
356 windowless_buffer_.reset(new SharedMemory()); 355 if (!window_rect.IsEmpty()) {
357 size_t size = GetPaintBufSize(plugin_rect_); 356 if (!CreateBitmap(&backing_store_, &backing_store_canvas_) ||
358 if (!windowless_buffer_->Create(L"", false, true, size)) { 357 !CreateBitmap(&transport_store_, &transport_store_canvas_) ||
359 DCHECK(false); 358 (transparent_ &&
360 windowless_buffer_.reset(); 359 !CreateBitmap(&background_store_, &background_store_canvas_))) {
361 return; 360 DCHECK(false);
361 ResetWindowlessBitmaps();
362 return;
363 }
364
365 transport_store_handle = transport_store_->handle();
366 if (background_store_.get())
367 background_store_handle = background_store_->handle();
362 } 368 }
363
364 windowless_canvas_.reset(new gfx::PlatformCanvasWin(
365 plugin_rect_.width(), plugin_rect_.height(), false,
366 windowless_buffer_->handle()));
367 windowless_canvas_->translate(static_cast<SkScalar>(-plugin_rect_.x()),
368 static_cast<SkScalar>(-plugin_rect_.y()));
369 windowless_canvas_->getTopPlatformDevice().accessBitmap(true).
370 eraseARGB(0, 0, 0, 0);
371 windowless_buffer_handle = windowless_buffer_->handle();
372 } else if (moved) {
373 windowless_canvas_->resetMatrix();
374 windowless_canvas_->translate(static_cast<SkScalar>(-plugin_rect_.x()),
375 static_cast<SkScalar>(-plugin_rect_.y()));
376 } 369 }
377 370
378 IPC::Message* msg = new PluginMsg_UpdateGeometry( 371 IPC::Message* msg = new PluginMsg_UpdateGeometry(
379 instance_id_, window_rect, clip_rect, visible, windowless_buffer_handle, 372 instance_id_, window_rect, clip_rect, visible, transport_store_handle,
380 windowless_buffer_lock_); 373 background_store_handle);
381 msg->set_unblock(true); 374 msg->set_unblock(true);
382 Send(msg); 375 Send(msg);
383 } 376 }
384 377
378 // Copied from render_widget.cc
379 static size_t GetPaintBufSize(const gfx::Rect& rect) {
380 // TODO(darin): protect against overflow
381 return 4 * rect.width() * rect.height();
382 }
383
384 void WebPluginDelegateProxy::ResetWindowlessBitmaps() {
385 backing_store_.reset();
386 transport_store_.reset();
387 backing_store_canvas_.reset();
388 transport_store_canvas_.reset();
389 background_store_.reset();
390 background_store_canvas_.release();
391 }
392
393 bool WebPluginDelegateProxy::CreateBitmap(
394 scoped_ptr<SharedMemory>* memory,
395 scoped_ptr<gfx::PlatformCanvasWin>* canvas) {
396 size_t size = GetPaintBufSize(plugin_rect_);
397 memory->reset(new SharedMemory());
398 if (!(*memory)->Create(L"", false, true, size))
399 return false;
400
401 canvas->reset(new gfx::PlatformCanvasWin(
402 plugin_rect_.width(), plugin_rect_.height(), true, (*memory)->handle()));
403 return true;
404 }
405
385 void WebPluginDelegateProxy::Paint(HDC hdc, const gfx::Rect& damaged_rect) { 406 void WebPluginDelegateProxy::Paint(HDC hdc, const gfx::Rect& damaged_rect) {
386 // If the plugin is no longer connected (channel crashed) draw a crashed 407 // If the plugin is no longer connected (channel crashed) draw a crashed
387 // plugin bitmap 408 // plugin bitmap
388 if (!channel_host_->channel_valid()) { 409 if (!channel_host_->channel_valid()) {
389 PaintSadPlugin(hdc, damaged_rect); 410 PaintSadPlugin(hdc, damaged_rect);
390 return; 411 return;
391 } 412 }
392 413
393 // No paint events for windowed plugins. However, if it is the first paint 414 // No paint events for windowed plugins. However, if it is the first paint
394 // we don't know yet whether the plugin is windowless or not, so we have to 415 // we don't know yet whether the plugin is windowless or not, so we have to
395 // send the event. 416 // send the event.
396 if (!windowless_ && !first_paint_) { 417 if (!windowless_ && !first_paint_) {
397 // TODO(maruel): That's not true for printing and thumbnail capture. 418 // TODO(maruel): That's not true for printing and thumbnail capture.
398 // We shall use PrintWindow() to draw the window. 419 // We shall use PrintWindow() to draw the window.
399 return; 420 return;
400 } 421 }
401 first_paint_ = false;
402 422
403 // We got a paint before the plugin's coordinates, so there's no buffer to 423 // We got a paint before the plugin's coordinates, so there's no buffer to
404 // copy from. 424 // copy from.
405 if (!windowless_buffer_.get()) 425 if (!backing_store_canvas_.get())
406 return; 426 return;
407 427
408 // Limit the damaged rectangle to whatever is contained inside the plugin 428 // Limit the damaged rectangle to whatever is contained inside the plugin
409 // rectangle, as that's the rectangle that we'll bitblt to the hdc. 429 // rectangle, as that's the rectangle that we'll bitblt to the hdc.
410 gfx::Rect rect = damaged_rect.Intersect(plugin_rect_); 430 gfx::Rect rect = damaged_rect.Intersect(plugin_rect_);
411 431
412 DWORD wait_result = WaitForSingleObject(windowless_buffer_lock_, INFINITE); 432 bool background_changed = false;
413 DCHECK(wait_result == WAIT_OBJECT_0); 433 if (background_store_canvas_.get() && BackgroundChanged(hdc, rect)) {
434 background_changed = true;
435 HDC background_hdc =
436 background_store_canvas_->getTopPlatformDevice().getBitmapDC();
437 BitBlt(background_hdc, rect.x()-plugin_rect_.x(), rect.y()-plugin_rect_.y(),
438 rect.width(), rect.height(), hdc, rect.x(), rect.y(), SRCCOPY);
439 }
414 440
415 BLENDFUNCTION m_bf; 441 if (first_paint_ || background_changed) {
416 m_bf.BlendOp = AC_SRC_OVER; 442 gfx::Rect offset_rect = rect;
417 m_bf.BlendFlags = 0; 443 offset_rect.Offset(-plugin_rect_.x(), -plugin_rect_.y());
418 m_bf.SourceConstantAlpha = 255; 444 Send(new PluginMsg_Paint(instance_id_, offset_rect));
419 m_bf.AlphaFormat = AC_SRC_ALPHA; 445 CopyFromTransportToBacking(offset_rect);
446 }
420 447
421 HDC new_hdc = windowless_canvas_->getTopPlatformDevice().getBitmapDC(); 448 first_paint_ = false;
422 AlphaBlend(hdc, rect.x(), rect.y(), rect.width(), rect.height(), 449 HDC backing_hdc = backing_store_canvas_->getTopPlatformDevice().getBitmapDC();
423 new_hdc, rect.x(), rect.y(), rect.width(), rect.height(), m_bf); 450 BitBlt(hdc, rect.x(), rect.y(), rect.width(), rect.height(), backing_hdc,
451 rect.x()-plugin_rect_.x(), rect.y()-plugin_rect_.y(), SRCCOPY);
424 452
425 BOOL result = ReleaseMutex(windowless_buffer_lock_); 453 if (invalidate_pending_) {
426 DCHECK(result); 454 // Only send the PaintAck message if this paint is in response to an
455 // invalidate from the plugin, since this message acts as an access token
456 // to ensure only one process is using the transport dib at a time.
457 invalidate_pending_ = false;
458 Send(new PluginMsg_DidPaint(instance_id_));
459 }
460 }
461
462 bool WebPluginDelegateProxy::BackgroundChanged(
463 HDC hdc,
464 const gfx::Rect& rect) {
465 HBITMAP hbitmap = static_cast<HBITMAP>(GetCurrentObject(hdc, OBJ_BITMAP));
466 if (hbitmap == NULL) {
467 NOTREACHED();
468 return true;
469 }
470
471 BITMAP bitmap = { 0 };
472 int result = GetObject(hbitmap, sizeof(bitmap), &bitmap);
473 if (!result) {
474 NOTREACHED();
475 return true;
476 }
477
478 XFORM xf;
479 if (!GetWorldTransform(hdc, &xf)) {
480 NOTREACHED();
481 return true;
482 }
483
484 int row_byte_size = rect.width() * (bitmap.bmBitsPixel / 8);
485 for (int y = rect.y(); y < rect.bottom(); y++) {
486 char* hdc_row_start = static_cast<char*>(bitmap.bmBits) +
487 (y + static_cast<int>(xf.eDy)) * bitmap.bmWidthBytes +
488 (rect.x() + static_cast<int>(xf.eDx)) * (bitmap.bmBitsPixel / 8);
489
490 // getAddr32 doesn't use the translation units, so we have to subtract
491 // the plugin origin from the coordinates.
492 uint32_t* canvas_row_start =
493 background_store_canvas_->getDevice()->accessBitmap(true).getAddr32(
494 rect.x() - plugin_rect_.x(), y - plugin_rect_.y());
495 if (memcmp(hdc_row_start, canvas_row_start, row_byte_size) != 0)
496 return true;
497 }
498
499 return false;
427 } 500 }
428 501
429 void WebPluginDelegateProxy::Print(HDC hdc) { 502 void WebPluginDelegateProxy::Print(HDC hdc) {
430 PluginMsg_PrintResponse_Params params = { 0 }; 503 PluginMsg_PrintResponse_Params params = { 0 };
431 Send(new PluginMsg_Print(instance_id_, &params)); 504 Send(new PluginMsg_Print(instance_id_, &params));
432 505
433 SharedMemory memory(params.shared_memory, true); 506 SharedMemory memory(params.shared_memory, true);
434 if (!memory.Map(params.size)) { 507 if (!memory.Map(params.size)) {
435 NOTREACHED(); 508 NOTREACHED();
436 return; 509 return;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 cursor); 554 cursor);
482 message->set_pump_messages_event(modal_loop_pump_messages_event_); 555 message->set_pump_messages_event(modal_loop_pump_messages_event_);
483 Send(message); 556 Send(message);
484 return handled; 557 return handled;
485 } 558 }
486 559
487 int WebPluginDelegateProxy::GetProcessId() { 560 int WebPluginDelegateProxy::GetProcessId() {
488 return channel_host_->peer_pid(); 561 return channel_host_->peer_pid();
489 } 562 }
490 563
491 HWND WebPluginDelegateProxy::GetWindowHandle() {
492 NOTREACHED() << "GetWindowHandle can't be called on the proxy.";
493 return NULL;
494 }
495
496 void WebPluginDelegateProxy::OnSetWindow( 564 void WebPluginDelegateProxy::OnSetWindow(
497 HWND window, HANDLE modal_loop_pump_messages_event) { 565 HWND window, HANDLE modal_loop_pump_messages_event) {
498 windowless_ = window == NULL; 566 windowless_ = window == NULL;
499 if (plugin_) 567 if (plugin_)
500 plugin_->SetWindow(window, modal_loop_pump_messages_event); 568 plugin_->SetWindow(window, modal_loop_pump_messages_event);
501 569
502 DCHECK(modal_loop_pump_messages_event_ == NULL); 570 DCHECK(modal_loop_pump_messages_event_ == NULL);
503 modal_loop_pump_messages_event_.Set(modal_loop_pump_messages_event); 571 modal_loop_pump_messages_event_.Set(modal_loop_pump_messages_event);
504 } 572 }
505 573
506 void WebPluginDelegateProxy::OnCancelResource(int id) { 574 void WebPluginDelegateProxy::OnCancelResource(int id) {
507 if (plugin_) 575 if (plugin_)
508 plugin_->CancelResource(id); 576 plugin_->CancelResource(id);
509 } 577 }
510 578
511 void WebPluginDelegateProxy::OnInvalidate() { 579 void WebPluginDelegateProxy::OnInvalidateRect(const gfx::Rect& rect) {
512 if (plugin_) 580 if (!plugin_)
513 plugin_->Invalidate(); 581 return;
514 }
515 582
516 void WebPluginDelegateProxy::OnInvalidateRect(const gfx::Rect& rect) { 583 invalidate_pending_ = true;
517 if (plugin_) 584 CopyFromTransportToBacking(rect);
518 plugin_->InvalidateRect(rect); 585 plugin_->InvalidateRect(rect);
519 } 586 }
520 587
521 void WebPluginDelegateProxy::OnGetWindowScriptNPObject( 588 void WebPluginDelegateProxy::OnGetWindowScriptNPObject(
522 int route_id, bool* success, void** npobject_ptr) { 589 int route_id, bool* success, void** npobject_ptr) {
523 *success = false; 590 *success = false;
524 NPObject* npobject = NULL; 591 NPObject* npobject = NULL;
525 if (plugin_) 592 if (plugin_)
526 npobject = plugin_->GetWindowScriptNPObject(); 593 npobject = plugin_->GetWindowScriptNPObject();
527 594
528 if (!npobject) 595 if (!npobject)
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 canvas.DrawBitmapInt(*sad_plugin_, 676 canvas.DrawBitmapInt(*sad_plugin_,
610 std::max(0, (width - sad_plugin_->width())/2), 677 std::max(0, (width - sad_plugin_->width())/2),
611 std::max(0, (height - sad_plugin_->height())/2)); 678 std::max(0, (height - sad_plugin_->height())/2));
612 } 679 }
613 680
614 canvas.getTopPlatformDevice().drawToHDC( 681 canvas.getTopPlatformDevice().drawToHDC(
615 hdc, plugin_rect_.x(), plugin_rect_.y(), NULL); 682 hdc, plugin_rect_.x(), plugin_rect_.y(), NULL);
616 return; 683 return;
617 } 684 }
618 685
686 void WebPluginDelegateProxy::CopyFromTransportToBacking(const gfx::Rect& rect) {
687 if (!backing_store_canvas_.get())
688 return;
689
690 // Copy the damaged rect from the transport bitmap to the backing store.
691 HDC backing = backing_store_canvas_->getTopPlatformDevice().getBitmapDC();
692 HDC transport = transport_store_canvas_->getTopPlatformDevice().getBitmapDC();
693
694 BitBlt(backing, rect.x(), rect.y(), rect.width(), rect.height(),
695 transport, rect.x(), rect.y(), SRCCOPY);
696 }
697
619 void WebPluginDelegateProxy::OnHandleURLRequest( 698 void WebPluginDelegateProxy::OnHandleURLRequest(
620 const PluginHostMsg_URLRequest_Params& params) { 699 const PluginHostMsg_URLRequest_Params& params) {
621 const char* data = NULL; 700 const char* data = NULL;
622 if (params.buffer.size()) 701 if (params.buffer.size())
623 data = &params.buffer[0]; 702 data = &params.buffer[0];
624 703
625 const char* target = NULL; 704 const char* target = NULL;
626 if (params.target.length()) 705 if (params.target.length())
627 target = params.target.c_str(); 706 target = params.target.c_str();
628 707
(...skipping 25 matching lines...) Expand all
654 plugin_->CancelDocumentLoad(); 733 plugin_->CancelDocumentLoad();
655 } 734 }
656 735
657 void WebPluginDelegateProxy::OnInitiateHTTPRangeRequest( 736 void WebPluginDelegateProxy::OnInitiateHTTPRangeRequest(
658 const std::string& url, const std::string& range_info, 737 const std::string& url, const std::string& range_info,
659 HANDLE existing_stream, bool notify_needed, HANDLE notify_data) { 738 HANDLE existing_stream, bool notify_needed, HANDLE notify_data) {
660 plugin_->InitiateHTTPRangeRequest(url.c_str(), range_info.c_str(), 739 plugin_->InitiateHTTPRangeRequest(url.c_str(), range_info.c_str(),
661 existing_stream, notify_needed, 740 existing_stream, notify_needed,
662 notify_data); 741 notify_data);
663 } 742 }
OLDNEW
« no previous file with comments | « chrome/renderer/webplugin_delegate_proxy.h ('k') | webkit/glue/plugins/plugin_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698