| /* |
| * 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 "src/gpu/ccpr/GrCCClipPath.h" |
| |
| #include "src/gpu/GrOnFlushResourceProvider.h" |
| #include "src/gpu/GrProxyProvider.h" |
| #include "src/gpu/GrRenderTarget.h" |
| #include "src/gpu/GrTexture.h" |
| #include "src/gpu/ccpr/GrCCPerFlushResources.h" |
| |
| GrCCClipPath::GrCCClipPath(const SkPath& deviceSpacePath, const SkIRect& accessRect, |
| const GrCaps& caps) |
| : fDeviceSpacePath(deviceSpacePath) |
| , fPathDevIBounds(fDeviceSpacePath.getBounds().roundOut()) |
| , fAccessRect(accessRect) |
| , fAtlasLazyProxy(GrCCAtlas::MakeLazyAtlasProxy( |
| [](GrResourceProvider*, const GrCCAtlas::LazyAtlasDesc&) { |
| // GrCCClipPaths get instantiated explicitly after the atlas is laid out. If |
| // this callback gets invoked, it means atlas proxy itself failed to |
| // instantiate. |
| return GrSurfaceProxy::LazyCallbackResult(); |
| }, caps, GrSurfaceProxy::UseAllocator::kYes)) { |
| SkASSERT(!deviceSpacePath.isEmpty()); |
| SkASSERT(SkIRect::Intersects(fAccessRect, fPathDevIBounds)); |
| |
| } |
| |
| void GrCCClipPath::accountForOwnPath(GrCCAtlas::Specs* specs) const { |
| SkIRect ibounds; |
| if (ibounds.intersect(fAccessRect, fPathDevIBounds)) { |
| specs->accountForSpace(ibounds.width(), ibounds.height()); |
| } |
| } |
| |
| std::unique_ptr<GrCCAtlas> GrCCClipPath::renderPathInAtlas(GrCCPerFlushResources* resources, |
| GrOnFlushResourceProvider* onFlushRP) { |
| SkASSERT(!fHasAtlas); |
| auto retiredAtlas = resources->renderDeviceSpacePathInAtlas( |
| onFlushRP, fAccessRect, fDeviceSpacePath, fPathDevIBounds, |
| GrFillRuleForSkPath(fDeviceSpacePath), &fDevToAtlasOffset); |
| SkDEBUGCODE(fHasAtlas = true); |
| return retiredAtlas; |
| } |