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

Side by Side Diff: chrome/plugin/webplugin_proxy.cc

Issue 343040: Fix transparent windowless plugin background painting. This would manifest... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month 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/browser/browser.cc ('k') | no next file » | 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) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/plugin/webplugin_proxy.h" 5 #include "chrome/plugin/webplugin_proxy.h"
6 6
7 #include "build/build_config.h" 7 #include "build/build_config.h"
8 8
9 #include "app/gfx/canvas.h" 9 #include "app/gfx/canvas.h"
10 #if defined(OS_WIN) 10 #if defined(OS_WIN)
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 return; 369 return;
370 #endif 370 #endif
371 371
372 // Clear the damaged area so that if the plugin doesn't paint there we won't 372 // Clear the damaged area so that if the plugin doesn't paint there we won't
373 // end up with the old values. 373 // end up with the old values.
374 gfx::Rect offset_rect = rect; 374 gfx::Rect offset_rect = rect;
375 offset_rect.Offset(delegate_->GetRect().origin()); 375 offset_rect.Offset(delegate_->GetRect().origin());
376 #if defined(OS_WIN) || defined(OS_LINUX) 376 #if defined(OS_WIN) || defined(OS_LINUX)
377 windowless_canvas_->save(); 377 windowless_canvas_->save();
378 378
379 // The given clip rect is in global coordinates, so install it before the 379 // The given clip rect is relative to the plugin coordinate system.
380 // transformation is done for the coordinate system.
381 SkRect sk_rect = { SkIntToScalar(rect.x()), 380 SkRect sk_rect = { SkIntToScalar(rect.x()),
382 SkIntToScalar(rect.y()), 381 SkIntToScalar(rect.y()),
383 SkIntToScalar(rect.right()), 382 SkIntToScalar(rect.right()),
384 SkIntToScalar(rect.bottom()) }; 383 SkIntToScalar(rect.bottom()) };
385 windowless_canvas_->clipRect(sk_rect); 384 windowless_canvas_->clipRect(sk_rect);
386 windowless_canvas_->translate(SkIntToScalar(-delegate_->GetRect().x()),
387 SkIntToScalar(-delegate_->GetRect().y()));
388 385
389 // Setup the background. 386 // Setup the background.
390 if (!background_canvas_.get()) { 387 if (background_canvas_.get()) {
388 // When a background canvas is given, we're in transparent mode. This means
389 // the plugin wants to have the image of the page in the canvas it's drawing
390 // into (which is windowless_canvas_) so it can do blending. So we copy the
391 // background bitmap into the windowless_canvas_.
392 const SkBitmap& background_bitmap =
393 background_canvas_->getTopPlatformDevice().accessBitmap(false);
394 windowless_canvas_->drawBitmap(background_bitmap, 0, 0);
395 } else {
396 // In non-transparent mode, the plugin doesn't care what's underneath, so we
397 // can just give it black.
391 SkPaint black_fill_paint; 398 SkPaint black_fill_paint;
392 black_fill_paint.setARGB(0xFF, 0x00, 0x00, 0x00); 399 black_fill_paint.setARGB(0xFF, 0x00, 0x00, 0x00);
393 windowless_canvas_->drawPaint(black_fill_paint); 400 windowless_canvas_->drawPaint(black_fill_paint);
394 } else { 401 }
395 SkIRect src_rect = { rect.x(), rect.y(),
396 rect.x() + offset_rect.width(),
397 rect.y() + offset_rect.height() };
398 402
399 SkRect dest_rect = { SkIntToScalar(offset_rect.x()), 403 // Bring the windowless_canvas_ into the window coordinate system, which is
400 SkIntToScalar(offset_rect.y()), 404 // how the plugin expects to draw (since the windowless API was originally
401 SkIntToScalar(offset_rect.right()), 405 // designed just for scribbling over the web page).
402 SkIntToScalar(offset_rect.bottom()) }; 406 windowless_canvas_->translate(SkIntToScalar(-delegate_->GetRect().x()),
403 const SkBitmap& background_bitmap = 407 SkIntToScalar(-delegate_->GetRect().y()));
404 background_canvas_->getTopPlatformDevice().accessBitmap(false);
405 windowless_canvas_->drawBitmapRect(background_bitmap, &src_rect, dest_rect);
406 }
407 408
408 // Before we send the invalidate, paint so that renderer uses the updated 409 // Before we send the invalidate, paint so that renderer uses the updated
409 // bitmap. 410 // bitmap.
410 delegate_->Paint(windowless_canvas_.get(), offset_rect); 411 delegate_->Paint(windowless_canvas_.get(), offset_rect);
411 412
412 windowless_canvas_->restore(); 413 windowless_canvas_->restore();
413 #elif defined(OS_MACOSX) 414 #elif defined(OS_MACOSX)
414 CGContextSaveGState(windowless_context_); 415 CGContextSaveGState(windowless_context_);
415 if (!background_context_.get()) { 416 if (!background_context_.get()) {
416 CGContextSetFillColorWithColor(windowless_context_, 417 CGContextSetFillColorWithColor(windowless_context_,
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 while (index != resource_clients_.end()) { 584 while (index != resource_clients_.end()) {
584 WebPluginResourceClient* client = (*index).second; 585 WebPluginResourceClient* client = (*index).second;
585 586
586 if (client == resource_client) { 587 if (client == resource_client) {
587 resource_clients_.erase(index++); 588 resource_clients_.erase(index++);
588 } else { 589 } else {
589 index++; 590 index++;
590 } 591 }
591 } 592 }
592 } 593 }
OLDNEW
« no previous file with comments | « chrome/browser/browser.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698