void onDraw(int loops, SkCanvas* canvas) override { if (!fSurface) { GrContext* context = canvas->getGrContext(); if (nullptr == context) { return; } SkImageInfo info = SkImageInfo::Make(fW, fH, kN32_SkColorType, kPremul_SkAlphaType, kSRGB_SkColorProfileType); fSurface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info); } // Clear surface once: fSurface->getCanvas()->clear(SK_ColorBLACK); SkPaint paint; paint.setFilterQuality(kMedium_SkFilterQuality); for (int i = 0; i < loops; i++) { // Touch surface so mips are dirtied fSurface->getCanvas()->drawPoint(0, 0, SK_ColorWHITE); // Draw reduced version of surface to original canvas, to trigger mip generation canvas->save(); canvas->scale(0.1f, 0.1f); canvas->drawImage(fSurface->makeImageSnapshot(SkBudgeted::kNo), 0, 0, &paint); canvas->restore(); } }
// Exercise the public API of SkSpecialSurface (e.g., getCanvas, newImageSnapshot) static void test_surface(const sk_sp<SkSpecialSurface>& surf, skiatest::Reporter* reporter, int offset) { const SkIRect surfSubset = TestingSpecialSurfaceAccess::Subset(surf.get()); REPORTER_ASSERT(reporter, offset == surfSubset.fLeft); REPORTER_ASSERT(reporter, offset == surfSubset.fTop); REPORTER_ASSERT(reporter, kSmallerSize == surfSubset.width()); REPORTER_ASSERT(reporter, kSmallerSize == surfSubset.height()); SkCanvas* canvas = surf->getCanvas(); SkASSERT_RELEASE(canvas); canvas->clear(SK_ColorRED); sk_sp<SkSpecialImage> img(surf->makeImageSnapshot()); REPORTER_ASSERT(reporter, img); const SkIRect imgSubset = img->subset(); REPORTER_ASSERT(reporter, surfSubset == imgSubset); // the canvas was invalidated by the newImageSnapshot call REPORTER_ASSERT(reporter, !surf->getCanvas()); }
static void check_isopaque(skiatest::Reporter* reporter, const sk_sp<SkSurface>& surface, bool expectedOpaque) { sk_sp<SkImage> image(surface->makeImageSnapshot()); REPORTER_ASSERT(reporter, image->isOpaque() == expectedOpaque); }
sk_sp<SkImage> image() override { return surface->makeImageSnapshot(); }