// Copyright 2015 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_display_list_raster_source.h" #include <limits> #include "base/synchronization/waitable_event.h" #include "cc/test/fake_display_list_recording_source.h" #include "cc/test/skia_common.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkSurface.h" #include "ui/gfx/geometry/size.h" namespace cc { scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreateInfiniteFilled() { gfx::Size size(std::numeric_limits<int>::max() / 10, std::numeric_limits<int>::max() / 10); return CreateFilled(size); } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreateFilled(const gfx::Size& size) { auto recording_source = FakeDisplayListRecordingSource::CreateFilledRecordingSource(size); SkPaint red_paint; red_paint.setColor(SK_ColorRED); recording_source->add_draw_rect_with_paint(gfx::Rect(size), red_paint); gfx::Size smaller_size(size.width() - 10, size.height() - 10); SkPaint green_paint; green_paint.setColor(SK_ColorGREEN); recording_source->add_draw_rect_with_paint(gfx::Rect(smaller_size), green_paint); recording_source->Rerecord(); return make_scoped_refptr( new FakeDisplayListRasterSource(recording_source.get(), false)); } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreateFilledLCD(const gfx::Size& size) { auto recording_source = FakeDisplayListRecordingSource::CreateFilledRecordingSource(size); SkPaint red_paint; red_paint.setColor(SK_ColorRED); recording_source->add_draw_rect_with_paint(gfx::Rect(size), red_paint); gfx::Size smaller_size(size.width() - 10, size.height() - 10); SkPaint green_paint; green_paint.setColor(SK_ColorGREEN); recording_source->add_draw_rect_with_paint(gfx::Rect(smaller_size), green_paint); recording_source->Rerecord(); return make_scoped_refptr( new FakeDisplayListRasterSource(recording_source.get(), true)); } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreateFilledSolidColor(const gfx::Size& size) { auto recording_source = FakeDisplayListRecordingSource::CreateFilledRecordingSource(size); SkPaint red_paint; red_paint.setColor(SK_ColorRED); recording_source->add_draw_rect_with_paint(gfx::Rect(size), red_paint); recording_source->Rerecord(); auto raster_source = make_scoped_refptr( new FakeDisplayListRasterSource(recording_source.get(), false)); if (!raster_source->IsSolidColor()) ADD_FAILURE() << "Not solid color!"; return raster_source; } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreatePartiallyFilled( const gfx::Size& size, const gfx::Rect& recorded_viewport) { DCHECK(recorded_viewport.IsEmpty() || gfx::Rect(size).Contains(recorded_viewport)); auto recording_source = FakeDisplayListRecordingSource::CreateRecordingSource( recorded_viewport, size); SkPaint red_paint; red_paint.setColor(SK_ColorRED); recording_source->add_draw_rect_with_paint(gfx::Rect(size), red_paint); gfx::Size smaller_size(size.width() - 10, size.height() - 10); SkPaint green_paint; green_paint.setColor(SK_ColorGREEN); recording_source->add_draw_rect_with_paint(gfx::Rect(smaller_size), green_paint); recording_source->Rerecord(); recording_source->SetRecordedViewport(recorded_viewport); return make_scoped_refptr( new FakeDisplayListRasterSource(recording_source.get(), false)); } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreatePartiallyFilledWithImages( const gfx::Size& size, const gfx::Rect& recorded_viewport) { DCHECK(recorded_viewport.IsEmpty() || gfx::Rect(size).Contains(recorded_viewport)); auto recording_source = FakeDisplayListRecordingSource::CreateRecordingSource( recorded_viewport, size); recording_source->SetGenerateDiscardableImagesMetadata(true); SkPaint red_paint; red_paint.setColor(SK_ColorRED); recording_source->add_draw_rect_with_paint(gfx::Rect(size), red_paint); gfx::Size smaller_size(size.width() - 10, size.height() - 10); SkPaint green_paint; green_paint.setColor(SK_ColorGREEN); recording_source->add_draw_rect_with_paint(gfx::Rect(smaller_size), green_paint); skia::RefPtr<SkImage> image = CreateDiscardableImage(smaller_size); recording_source->add_draw_image(image.get(), gfx::Point()); recording_source->Rerecord(); recording_source->SetRecordedViewport(recorded_viewport); return make_scoped_refptr( new FakeDisplayListRasterSource(recording_source.get(), false)); } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreateEmpty(const gfx::Size& size) { auto recording_source = FakeDisplayListRecordingSource::CreateFilledRecordingSource(size); return make_scoped_refptr( new FakeDisplayListRasterSource(recording_source.get(), false)); } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreateFromRecordingSource( const DisplayListRecordingSource* recording_source, bool can_use_lcd) { return make_scoped_refptr( new FakeDisplayListRasterSource(recording_source, can_use_lcd)); } scoped_refptr<FakeDisplayListRasterSource> FakeDisplayListRasterSource::CreateFromRecordingSourceWithWaitable( const DisplayListRecordingSource* recording_source, bool can_use_lcd, base::WaitableEvent* playback_allowed_event) { return make_scoped_refptr(new FakeDisplayListRasterSource( recording_source, can_use_lcd, playback_allowed_event)); } FakeDisplayListRasterSource::FakeDisplayListRasterSource( const DisplayListRecordingSource* recording_source, bool can_use_lcd) : DisplayListRasterSource(recording_source, can_use_lcd), playback_allowed_event_(nullptr) {} FakeDisplayListRasterSource::FakeDisplayListRasterSource( const DisplayListRecordingSource* recording_source, bool can_use_lcd, base::WaitableEvent* playback_allowed_event) : DisplayListRasterSource(recording_source, can_use_lcd), playback_allowed_event_(playback_allowed_event) {} FakeDisplayListRasterSource::~FakeDisplayListRasterSource() {} void FakeDisplayListRasterSource::PlaybackToCanvas( SkCanvas* canvas, const gfx::Rect& canvas_bitmap_rect, const gfx::Rect& canvas_playback_rect, float contents_scale) const { if (playback_allowed_event_) playback_allowed_event_->Wait(); DisplayListRasterSource::PlaybackToCanvas( canvas, canvas_bitmap_rect, canvas_playback_rect, contents_scale); } } // namespace cc