| /* |
| * Copyright 2020 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| // We want to make sure that if we collapse src-over down to src when blending, that batching still |
| // works correctly with a draw that explicitly requests src. |
| |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkShader.h" |
| #include "include/core/SkSurface.h" |
| #include "include/gpu/GrDirectContext.h" |
| #include "tests/Test.h" |
| #include "tools/gpu/GrContextFactory.h" |
| |
| DEF_GPUTEST_FOR_RENDERING_CONTEXTS(SrcSrcOverBatchTest, reporter, ctxInfo) { |
| auto ctx = ctxInfo.directContext(); |
| |
| static const int kSize = 8; |
| const SkImageInfo ii = SkImageInfo::Make(kSize, kSize, kRGBA_8888_SkColorType, |
| kPremul_SkAlphaType); |
| |
| sk_sp<SkSurface> surface(SkSurface::MakeRenderTarget(ctx, SkBudgeted::kNo, |
| ii, 0, kTopLeft_GrSurfaceOrigin, |
| nullptr)); |
| |
| auto canvas = surface->getCanvas(); |
| |
| SkPaint paint; |
| // Setting a shader so that we actually build a processor set and don't fallback to all |
| // defaults. |
| paint.setShader(SkShaders::Color(SK_ColorRED)); |
| |
| SkIRect rect = SkIRect::MakeWH(2, 2); |
| |
| canvas->drawIRect(rect, paint); |
| |
| // Now draw a rect with src blend mode. If we collapsed the previous draw to src blend mode (a |
| // setting on caps plus not having any coverage), then we expect this second draw to try to |
| // batch with it. This test is a success if we don't hit any asserts, specifically making sure |
| // that both things we decided can be batched together claim to have the same value for |
| // CompatibleWithCoverageAsAlpha. |
| canvas->translate(3, 0); |
| paint.setBlendMode(SkBlendMode::kSrc); |
| canvas->drawIRect(rect, paint); |
| } |