diff options
Diffstat (limited to 'chrome/renderer/render_widget.cc')
-rw-r--r-- | chrome/renderer/render_widget.cc | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/chrome/renderer/render_widget.cc b/chrome/renderer/render_widget.cc index 4cd54c1..23f27da 100644 --- a/chrome/renderer/render_widget.cc +++ b/chrome/renderer/render_widget.cc @@ -14,6 +14,7 @@ #include "chrome/common/transport_dib.h" #include "chrome/renderer/render_process.h" #include "skia/ext/platform_canvas.h" +#include "skia/include/SkShader.h" #include "third_party/WebKit/WebKit/chromium/public/WebRect.h" #include "third_party/WebKit/WebKit/chromium/public/WebScreenInfo.h" #include "third_party/WebKit/WebKit/chromium/public/WebSize.h" @@ -308,6 +309,25 @@ void RenderWidget::ClearFocus() { void RenderWidget::PaintRect(const gfx::Rect& rect, skia::PlatformCanvas* canvas) { + + // If there is a custom background, tile it. + if (!background_.empty()) { + canvas->save(); + + SkIRect clipRect = { rect.x(), rect.y(), rect.right(), rect.bottom() }; + canvas->setClipRegion(SkRegion(clipRect)); + + SkPaint paint; + SkShader* shader = SkShader::CreateBitmapShader(background_, + SkShader::kRepeat_TileMode, + SkShader::kRepeat_TileMode); + paint.setShader(shader)->unref(); + paint.setPorterDuffXfermode(SkPorterDuff::kSrcOver_Mode); + canvas->drawPaint(paint); + + canvas->restore(); + } + // Bring the canvas into the coordinate system of the paint rect canvas->translate(static_cast<SkScalar>(-rect.x()), static_cast<SkScalar>(-rect.y())); @@ -675,6 +695,12 @@ void RenderWidget::OnSetTextDirection(int direction) { } } +void RenderWidget::SetBackground(const SkBitmap& background) { + background_ = background; + // Generate a full repaint. + DidInvalidateRect(webwidget_, gfx::Rect(size_.width(), size_.height())); +} + bool RenderWidget::next_paint_is_resize_ack() const { return ViewHostMsg_PaintRect_Flags::is_resize_ack(next_paint_flags_); } |