Commit 7ceb24d8 authored by jbauman@chromium.org's avatar jbauman@chromium.org

Revert 225751 "BitmapContentLayerUpdater shouldn't reallocate bi..."

> BitmapContentLayerUpdater shouldn't reallocate bitmap smaller.
> 
> BitmapContentLayerUpdater was always allocating a new bitmap if the size of the region to be drawn changed, even if the new region was smaller. These unnecessary reallocations can be very expensive because they require page faults and for the operating system to clear out the memory.
> 
> BUG=296423
> R=ben@chromium.org, enne@chromium.org, vangelis@chromium.org
> 
> Review URL: https://codereview.chromium.org/24486002

BUG=296423,321937
TBR=jbauman@chromium.org

Review URL: https://codereview.chromium.org/100923002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238280 0039d316-1c4b-4281-b951-d872f2087c98
parent 2acf3457
......@@ -61,8 +61,7 @@ void BitmapContentLayerUpdater::PrepareToUpdate(
gfx::Rect* resulting_opaque_rect) {
devtools_instrumentation::ScopedLayerTask paint_layer(
devtools_instrumentation::kPaintLayer, layer_id_);
if (canvas_size_.width() < content_rect.size().width() ||
canvas_size_.height() < content_rect.size().height()) {
if (canvas_size_ != content_rect.size()) {
devtools_instrumentation::ScopedLayerTask paint_setup(
devtools_instrumentation::kPaintSetup, layer_id_);
canvas_size_ = content_rect.size();
......@@ -77,7 +76,7 @@ void BitmapContentLayerUpdater::PrepareToUpdate(
base::TimeTicks start_time =
rendering_stats_instrumentation_->StartRecording();
PaintContents(canvas_.get(),
content_rect,
content_rect.origin(),
contents_width_scale,
contents_height_scale,
resulting_opaque_rect);
......@@ -94,10 +93,12 @@ void BitmapContentLayerUpdater::UpdateTexture(ResourceUpdateQueue* queue,
gfx::Vector2d dest_offset,
bool partial_update) {
CHECK(canvas_);
gfx::Rect canvas_rect = content_rect();
canvas_rect.set_size(canvas_size_);
ResourceUpdate upload = ResourceUpdate::CreateFromCanvas(
texture, canvas_, canvas_rect, source_rect, dest_offset);
ResourceUpdate upload =
ResourceUpdate::CreateFromCanvas(texture,
canvas_,
content_rect(),
source_rect,
dest_offset);
if (partial_update)
queue->AppendPartialUpload(upload);
else
......
......@@ -35,22 +35,20 @@ void ContentLayerUpdater::set_rendering_stats_instrumentation(
}
void ContentLayerUpdater::PaintContents(SkCanvas* canvas,
gfx::Rect content_rect,
gfx::Point origin,
float contents_width_scale,
float contents_height_scale,
gfx::Rect* resulting_opaque_rect) {
TRACE_EVENT2("cc",
"ContentLayerUpdater::PaintContents",
"width",
content_rect.width(),
"height",
content_rect.height());
gfx::Point origin = content_rect.origin();
TRACE_EVENT0("cc", "ContentLayerUpdater::PaintContents");
canvas->save();
canvas->translate(SkFloatToScalar(-origin.x()),
SkFloatToScalar(-origin.y()));
SkBaseDevice* device = canvas->getDevice();
gfx::Rect content_rect(origin, gfx::Size(device->width(), device->height()));
gfx::Rect layer_rect = content_rect;
if (contents_width_scale != 1.f || contents_height_scale != 1.f) {
canvas->scale(SkFloatToScalar(contents_width_scale),
SkFloatToScalar(contents_height_scale));
......
......@@ -31,7 +31,7 @@ class CC_EXPORT ContentLayerUpdater : public LayerUpdater {
virtual ~ContentLayerUpdater();
void PaintContents(SkCanvas* canvas,
gfx::Rect content_rect,
gfx::Point origin,
float contents_width_scale,
float contents_height_scale,
gfx::Rect* resulting_opaque_rect);
......
......@@ -32,7 +32,7 @@ void SkPictureContentLayerUpdater::PrepareToUpdate(
base::TimeTicks start_time =
rendering_stats_instrumentation_->StartRecording();
PaintContents(canvas,
content_rect,
content_rect.origin(),
contents_width_scale,
contents_height_scale,
resulting_opaque_rect);
......
......@@ -180,9 +180,8 @@ class TestLayerDelegate : public LayerDelegate {
// Overridden from LayerDelegate:
virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE {
SkIRect clip_bounds;
canvas->sk_canvas()->getClipDeviceBounds(&clip_bounds);
paint_size_ = gfx::Size(clip_bounds.width(), clip_bounds.height());
gfx::ImageSkiaRep contents = canvas->ExtractImageRep();
paint_size_ = gfx::Size(contents.pixel_width(), contents.pixel_height());
canvas->FillRect(gfx::Rect(paint_size_), colors_[color_index_]);
color_index_ = (color_index_ + 1) % static_cast<int>(colors_.size());
const SkMatrix& matrix = canvas->sk_canvas()->getTotalMatrix();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment