123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- /*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
- #include "include/core/SkBitmap.h"
- #include "include/core/SkCanvas.h"
- #include "include/core/SkMatrix.h"
- #include "include/core/SkPaint.h"
- #include "include/core/SkRect.h"
- #include "include/core/SkRefCnt.h"
- #include "include/core/SkScalar.h"
- #include "include/effects/SkLayerDrawLooper.h"
- #include "src/core/SkArenaAlloc.h"
- #include "src/core/SkBitmapDevice.h"
- #include "src/core/SkDraw.h"
- #include "tests/Test.h"
- static SkBitmap make_bm(int w, int h) {
- SkBitmap bm;
- bm.allocN32Pixels(w, h);
- return bm;
- }
- // TODO: can this be derived from SkBaseDevice?
- class FakeDevice : public SkBitmapDevice {
- public:
- FakeDevice() : INHERITED(make_bm(100, 100), SkSurfaceProps(0, kUnknown_SkPixelGeometry),
- nullptr, nullptr) {
- }
- void drawRect(const SkRect& r, const SkPaint& paint) override {
- fLastMatrix = this->ctm();
- this->INHERITED::drawRect(r, paint);
- }
- SkMatrix fLastMatrix;
- private:
- typedef SkBitmapDevice INHERITED;
- };
- static void test_frontToBack(skiatest::Reporter* reporter) {
- SkLayerDrawLooper::Builder looperBuilder;
- SkLayerDrawLooper::LayerInfo layerInfo;
- // Add the front layer, with the defaults.
- (void)looperBuilder.addLayer(layerInfo);
- // Add the back layer, with some layer info set.
- layerInfo.fOffset.set(10.0f, 20.0f);
- layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
- SkPaint* layerPaint = looperBuilder.addLayer(layerInfo);
- layerPaint->setBlendMode(SkBlendMode::kSrc);
- FakeDevice device;
- SkCanvas canvas(sk_ref_sp(&device));
- SkPaint paint;
- auto looper(looperBuilder.detach());
- SkArenaAlloc alloc{48};
- SkDrawLooper::Context* context = looper->makeContext(&canvas, &alloc);
- // The back layer should come first.
- REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
- REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrc);
- canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
- REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
- REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
- paint.reset();
- // Then the front layer.
- REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
- REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrcOver);
- canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
- REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
- REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY());
- // Only two layers were added, so that should be the end.
- REPORTER_ASSERT(reporter, !context->next(&canvas, &paint));
- }
- static void test_backToFront(skiatest::Reporter* reporter) {
- SkLayerDrawLooper::Builder looperBuilder;
- SkLayerDrawLooper::LayerInfo layerInfo;
- // Add the back layer, with the defaults.
- (void)looperBuilder.addLayerOnTop(layerInfo);
- // Add the front layer, with some layer info set.
- layerInfo.fOffset.set(10.0f, 20.0f);
- layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
- SkPaint* layerPaint = looperBuilder.addLayerOnTop(layerInfo);
- layerPaint->setBlendMode(SkBlendMode::kSrc);
- FakeDevice device;
- SkCanvas canvas(sk_ref_sp(&device));
- SkPaint paint;
- auto looper(looperBuilder.detach());
- SkArenaAlloc alloc{48};
- SkDrawLooper::Context* context = looper->makeContext(&canvas, &alloc);
- // The back layer should come first.
- REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
- REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrcOver);
- canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
- REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
- REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY());
- paint.reset();
- // Then the front layer.
- REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
- REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrc);
- canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
- REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
- REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
- // Only two layers were added, so that should be the end.
- REPORTER_ASSERT(reporter, !context->next(&canvas, &paint));
- }
- static void test_mixed(skiatest::Reporter* reporter) {
- SkLayerDrawLooper::Builder looperBuilder;
- SkLayerDrawLooper::LayerInfo layerInfo;
- // Add the back layer, with the defaults.
- (void)looperBuilder.addLayer(layerInfo);
- // Add the front layer, with some layer info set.
- layerInfo.fOffset.set(10.0f, 20.0f);
- layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
- SkPaint* layerPaint = looperBuilder.addLayerOnTop(layerInfo);
- layerPaint->setBlendMode(SkBlendMode::kSrc);
- FakeDevice device;
- SkCanvas canvas(sk_ref_sp(&device));
- SkPaint paint;
- sk_sp<SkDrawLooper> looper(looperBuilder.detach());
- SkArenaAlloc alloc{48};
- SkDrawLooper::Context* context = looper->makeContext(&canvas, &alloc);
- // The back layer should come first.
- REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
- REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrcOver);
- canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
- REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
- REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY());
- paint.reset();
- // Then the front layer.
- REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
- REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrc);
- canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
- REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
- REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
- // Only two layers were added, so that should be the end.
- REPORTER_ASSERT(reporter, !context->next(&canvas, &paint));
- }
- DEF_TEST(LayerDrawLooper, reporter) {
- test_frontToBack(reporter);
- test_backToFront(reporter);
- test_mixed(reporter);
- }
|