blob: 7876d2961126d055d1d05f4f1b8c87fdb688eb86 [file] [log] [blame]
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cc/test/fake_content_layer_client.h"
#include <stddef.h>
#include "cc/playback/clip_display_item.h"
#include "cc/playback/display_item_list_settings.h"
#include "cc/playback/drawing_display_item.h"
#include "cc/playback/transform_display_item.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkPictureRecorder.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/skia_util.h"
namespace cc {
FakeContentLayerClient::ImageData::ImageData(const SkImage* img,
const gfx::Point& point,
const SkPaint& paint)
: image(skia::SharePtr(img)), point(point), paint(paint) {}
FakeContentLayerClient::ImageData::ImageData(const SkImage* img,
const gfx::Transform& transform,
const SkPaint& paint)
: image(skia::SharePtr(img)), transform(transform), paint(paint) {}
FakeContentLayerClient::ImageData::~ImageData() {}
FakeContentLayerClient::FakeContentLayerClient()
: display_list_use_cached_picture_(true),
fill_with_nonsolid_color_(false),
last_canvas_(nullptr),
last_painting_control_(PAINTING_BEHAVIOR_NORMAL),
reported_memory_usage_(0),
bounds_set_(false) {}
FakeContentLayerClient::~FakeContentLayerClient() {
}
gfx::Rect FakeContentLayerClient::PaintableRegion() {
CHECK(bounds_set_);
return gfx::Rect(bounds_);
}
scoped_refptr<DisplayItemList>
FakeContentLayerClient::PaintContentsToDisplayList(
PaintingControlSetting painting_control) {
// Cached picture is used because unit tests expect to be able to
// use GatherPixelRefs.
DisplayItemListSettings settings;
settings.use_cached_picture = display_list_use_cached_picture_;
scoped_refptr<DisplayItemList> display_list =
DisplayItemList::Create(PaintableRegion(), settings);
SkPictureRecorder recorder;
skia::RefPtr<SkCanvas> canvas;
for (RectPaintVector::const_iterator it = draw_rects_.begin();
it != draw_rects_.end(); ++it) {
const gfx::RectF& draw_rect = it->first;
const SkPaint& paint = it->second;
canvas =
skia::SharePtr(recorder.beginRecording(gfx::RectFToSkRect(draw_rect)));
canvas->drawRect(gfx::RectFToSkRect(draw_rect), paint);
display_list->CreateAndAppendItem<DrawingDisplayItem>(
ToEnclosingRect(draw_rect),
skia::AdoptRef(recorder.endRecordingAsPicture()));
}
for (ImageVector::const_iterator it = draw_images_.begin();
it != draw_images_.end(); ++it) {
if (!it->transform.IsIdentity()) {
display_list->CreateAndAppendItem<TransformDisplayItem>(PaintableRegion(),
it->transform);
}
canvas = skia::SharePtr(
recorder.beginRecording(it->image->width(), it->image->height()));
canvas->drawImage(it->image.get(), it->point.x(), it->point.y(),
&it->paint);
display_list->CreateAndAppendItem<DrawingDisplayItem>(
PaintableRegion(), skia::AdoptRef(recorder.endRecordingAsPicture()));
if (!it->transform.IsIdentity()) {
display_list->CreateAndAppendItem<EndTransformDisplayItem>(
PaintableRegion());
}
}
if (fill_with_nonsolid_color_) {
gfx::Rect draw_rect = PaintableRegion();
bool red = true;
while (!draw_rect.IsEmpty()) {
SkPaint paint;
paint.setColor(red ? SK_ColorRED : SK_ColorBLUE);
canvas =
skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(draw_rect)));
canvas->drawIRect(gfx::RectToSkIRect(draw_rect), paint);
display_list->CreateAndAppendItem<DrawingDisplayItem>(
draw_rect, skia::AdoptRef(recorder.endRecordingAsPicture()));
draw_rect.Inset(1, 1);
}
}
display_list->Finalize();
return display_list;
}
bool FakeContentLayerClient::FillsBoundsCompletely() const { return false; }
size_t FakeContentLayerClient::GetApproximateUnsharedMemoryUsage() const {
return reported_memory_usage_;
}
} // namespace cc