/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrCCClipPath.h" #include "GrOnFlushResourceProvider.h" #include "GrProxyProvider.h" #include "GrTexture.h" #include "ccpr/GrCCPerFlushResources.h" void GrCCClipPath::init(const SkPath& deviceSpacePath, const SkIRect& accessRect, int rtWidth, int rtHeight, const GrCaps& caps) { SkASSERT(!this->isInitialized()); fAtlasLazyProxy = GrProxyProvider::MakeFullyLazyProxy( [this](GrResourceProvider* resourceProvider) { if (!resourceProvider) { return sk_sp(); } SkASSERT(fHasAtlas); SkASSERT(!fHasAtlasTransform); GrTextureProxy* textureProxy = fAtlas ? fAtlas->textureProxy() : nullptr; if (!textureProxy || !textureProxy->instantiate(resourceProvider)) { fAtlasScale = fAtlasTranslate = {0, 0}; SkDEBUGCODE(fHasAtlasTransform = true); return sk_sp(); } SkASSERT(kTopLeft_GrSurfaceOrigin == textureProxy->origin()); fAtlasScale = {1.f / textureProxy->width(), 1.f / textureProxy->height()}; fAtlasTranslate.set(fDevToAtlasOffset.fX * fAtlasScale.x(), fDevToAtlasOffset.fY * fAtlasScale.y()); SkDEBUGCODE(fHasAtlasTransform = true); return sk_ref_sp(textureProxy->priv().peekTexture()); }, GrProxyProvider::Renderable::kYes, kTopLeft_GrSurfaceOrigin, kAlpha_half_GrPixelConfig, caps); fDeviceSpacePath = deviceSpacePath; fDeviceSpacePath.getBounds().roundOut(&fPathDevIBounds); fAccessRect = accessRect; } void GrCCClipPath::accountForOwnPath(GrCCPerFlushResourceSpecs* specs) const { SkASSERT(this->isInitialized()); ++specs->fNumClipPaths; specs->fRenderedPathStats.statPath(fDeviceSpacePath); SkIRect ibounds; if (ibounds.intersect(fAccessRect, fPathDevIBounds)) { specs->fRenderedAtlasSpecs.accountForSpace(ibounds.width(), ibounds.height()); } } void GrCCClipPath::renderPathInAtlas(GrCCPerFlushResources* resources, GrOnFlushResourceProvider* onFlushRP) { SkASSERT(this->isInitialized()); SkASSERT(!fHasAtlas); fAtlas = resources->renderDeviceSpacePathInAtlas(fAccessRect, fDeviceSpacePath, fPathDevIBounds, &fDevToAtlasOffset); SkDEBUGCODE(fHasAtlas = true); }