1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SurfaceContext_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SurfaceContext_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColorInfo.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpuBuffer.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrImageInfo.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPixmap.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTargetProxy.h" // IWYU pragma: keep 22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTask.h" // IWYU pragma: keep 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxyView.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrTextureProxy.h" // IWYU pragma: keep 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 29*c8dee2aaSAndroid Build Coastguard Worker #include <functional> 30*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 31*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker class GrCaps; 34*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext; 35*c8dee2aaSAndroid Build Coastguard Worker class GrDrawingManager; 36*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext; 37*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContextPriv; 38*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace; 39*c8dee2aaSAndroid Build Coastguard Worker enum GrSurfaceOrigin : int; 40*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int; 41*c8dee2aaSAndroid Build Coastguard Worker enum SkYUVColorSpace : int; 42*c8dee2aaSAndroid Build Coastguard Worker enum class GrColorType; 43*c8dee2aaSAndroid Build Coastguard Worker struct SkIPoint; 44*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 47*c8dee2aaSAndroid Build Coastguard Worker class SingleOwner; 48*c8dee2aaSAndroid Build Coastguard Worker enum class Mipmapped : bool; 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::ganesh { 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker class SurfaceFillContext; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker class SurfaceContext { 56*c8dee2aaSAndroid Build Coastguard Worker public: 57*c8dee2aaSAndroid Build Coastguard Worker // If it is known that the GrSurfaceProxy is not renderable, you can directly call the ctor 58*c8dee2aaSAndroid Build Coastguard Worker // here to make a SurfaceContext on the stack. 59*c8dee2aaSAndroid Build Coastguard Worker SurfaceContext(GrRecordingContext*, GrSurfaceProxyView readView, const GrColorInfo&); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker virtual ~SurfaceContext() = default; 62*c8dee2aaSAndroid Build Coastguard Worker recordingContext()63*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext* recordingContext() const { return fContext; } 64*c8dee2aaSAndroid Build Coastguard Worker colorInfo()65*c8dee2aaSAndroid Build Coastguard Worker const GrColorInfo& colorInfo() const { return fColorInfo; } imageInfo()66*c8dee2aaSAndroid Build Coastguard Worker GrImageInfo imageInfo() const { return {fColorInfo, fReadView.proxy()->dimensions()}; } 67*c8dee2aaSAndroid Build Coastguard Worker origin()68*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin origin() const { return fReadView.origin(); } readSwizzle()69*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle readSwizzle() const { return fReadView.swizzle(); } 70*c8dee2aaSAndroid Build Coastguard Worker // TODO: See if it makes sense for this to return a const& instead and require the callers to 71*c8dee2aaSAndroid Build Coastguard Worker // make a copy (which refs the proxy) if needed. readSurfaceView()72*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView readSurfaceView() { return fReadView; } 73*c8dee2aaSAndroid Build Coastguard Worker dimensions()74*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions() const { return fReadView.dimensions(); } width()75*c8dee2aaSAndroid Build Coastguard Worker int width() const { return fReadView.proxy()->width(); } height()76*c8dee2aaSAndroid Build Coastguard Worker int height() const { return fReadView.proxy()->height(); } 77*c8dee2aaSAndroid Build Coastguard Worker mipmapped()78*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped mipmapped() const { return fReadView.mipmapped(); } 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker const GrCaps* caps() const; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker /** 83*c8dee2aaSAndroid Build Coastguard Worker * Reads a rectangle of pixels from the surface context. 84*c8dee2aaSAndroid Build Coastguard Worker * @param dContext The direct context to use 85*c8dee2aaSAndroid Build Coastguard Worker * @param dst destination pixels for the read 86*c8dee2aaSAndroid Build Coastguard Worker * @param srcPt offset w/in the surface context from which to read 87*c8dee2aaSAndroid Build Coastguard Worker * is a GrDirectContext and fail otherwise. 88*c8dee2aaSAndroid Build Coastguard Worker */ 89*c8dee2aaSAndroid Build Coastguard Worker bool readPixels(GrDirectContext* dContext, GrPixmap dst, SkIPoint srcPt); 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker using ReadPixelsCallback = SkImage::ReadPixelsCallback; 92*c8dee2aaSAndroid Build Coastguard Worker using ReadPixelsContext = SkImage::ReadPixelsContext; 93*c8dee2aaSAndroid Build Coastguard Worker using RescaleGamma = SkImage::RescaleGamma; 94*c8dee2aaSAndroid Build Coastguard Worker using RescaleMode = SkImage::RescaleMode; 95*c8dee2aaSAndroid Build Coastguard Worker 96*c8dee2aaSAndroid Build Coastguard Worker // GPU implementation for SkImage:: and SkSurface::asyncRescaleAndReadPixels. 97*c8dee2aaSAndroid Build Coastguard Worker void asyncRescaleAndReadPixels(GrDirectContext*, 98*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo& info, 99*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& srcRect, 100*c8dee2aaSAndroid Build Coastguard Worker RescaleGamma rescaleGamma, 101*c8dee2aaSAndroid Build Coastguard Worker RescaleMode, 102*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCallback callback, 103*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsContext callbackContext); 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker // GPU implementation for SkImage:: and SkSurface::asyncRescaleAndReadPixelsYUV420. 106*c8dee2aaSAndroid Build Coastguard Worker void asyncRescaleAndReadPixelsYUV420(GrDirectContext*, 107*c8dee2aaSAndroid Build Coastguard Worker SkYUVColorSpace yuvColorSpace, 108*c8dee2aaSAndroid Build Coastguard Worker bool readAlpha, 109*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> dstColorSpace, 110*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& srcRect, 111*c8dee2aaSAndroid Build Coastguard Worker SkISize dstSize, 112*c8dee2aaSAndroid Build Coastguard Worker RescaleGamma rescaleGamma, 113*c8dee2aaSAndroid Build Coastguard Worker RescaleMode, 114*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCallback callback, 115*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsContext context); 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker /** 118*c8dee2aaSAndroid Build Coastguard Worker * Writes a rectangle of pixels from src into the surfaceDrawContext at the specified position. 119*c8dee2aaSAndroid Build Coastguard Worker * @param dContext The direct context to use 120*c8dee2aaSAndroid Build Coastguard Worker * @param src source for the write 121*c8dee2aaSAndroid Build Coastguard Worker * @param dstPt offset w/in the surface context at which to write 122*c8dee2aaSAndroid Build Coastguard Worker */ 123*c8dee2aaSAndroid Build Coastguard Worker bool writePixels(GrDirectContext* dContext, 124*c8dee2aaSAndroid Build Coastguard Worker GrCPixmap src, 125*c8dee2aaSAndroid Build Coastguard Worker SkIPoint dstPt); 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker /** 128*c8dee2aaSAndroid Build Coastguard Worker * Fully populates either the base level or all MIP levels of the GrSurface with pixel data. 129*c8dee2aaSAndroid Build Coastguard Worker * @param dContext The direct context to use 130*c8dee2aaSAndroid Build Coastguard Worker * @param src Array of pixmaps 131*c8dee2aaSAndroid Build Coastguard Worker * @param numLevels Number of pixmaps in src. To succeed this must be 1 or the total 132*c8dee2aaSAndroid Build Coastguard Worker * number of MIP levels. 133*c8dee2aaSAndroid Build Coastguard Worker */ 134*c8dee2aaSAndroid Build Coastguard Worker bool writePixels(GrDirectContext* dContext, 135*c8dee2aaSAndroid Build Coastguard Worker const GrCPixmap src[], 136*c8dee2aaSAndroid Build Coastguard Worker int numLevels); 137*c8dee2aaSAndroid Build Coastguard Worker asSurfaceProxy()138*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxy* asSurfaceProxy() { return fReadView.proxy(); } asSurfaceProxy()139*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* asSurfaceProxy() const { return fReadView.proxy(); } asSurfaceProxyRef()140*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrSurfaceProxy> asSurfaceProxyRef() { return fReadView.refProxy(); } 141*c8dee2aaSAndroid Build Coastguard Worker asTextureProxy()142*c8dee2aaSAndroid Build Coastguard Worker GrTextureProxy* asTextureProxy() { return fReadView.asTextureProxy(); } asTextureProxy()143*c8dee2aaSAndroid Build Coastguard Worker const GrTextureProxy* asTextureProxy() const { return fReadView.asTextureProxy(); } asTextureProxyRef()144*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> asTextureProxyRef() { return fReadView.asTextureProxyRef(); } 145*c8dee2aaSAndroid Build Coastguard Worker asRenderTargetProxy()146*c8dee2aaSAndroid Build Coastguard Worker GrRenderTargetProxy* asRenderTargetProxy() { return fReadView.asRenderTargetProxy(); } asRenderTargetProxy()147*c8dee2aaSAndroid Build Coastguard Worker const GrRenderTargetProxy* asRenderTargetProxy() const { 148*c8dee2aaSAndroid Build Coastguard Worker return fReadView.asRenderTargetProxy(); 149*c8dee2aaSAndroid Build Coastguard Worker } asRenderTargetProxyRef()150*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRenderTargetProxy> asRenderTargetProxyRef() { 151*c8dee2aaSAndroid Build Coastguard Worker return fReadView.asRenderTargetProxyRef(); 152*c8dee2aaSAndroid Build Coastguard Worker } 153*c8dee2aaSAndroid Build Coastguard Worker asFillContext()154*c8dee2aaSAndroid Build Coastguard Worker virtual SurfaceFillContext* asFillContext() { return nullptr; } 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Worker /** 157*c8dee2aaSAndroid Build Coastguard Worker * Rescales the contents of srcRect. The gamma in which the rescaling occurs is controlled by 158*c8dee2aaSAndroid Build Coastguard Worker * RescaleGamma. It is always in the original gamut. The result is converted to the color type 159*c8dee2aaSAndroid Build Coastguard Worker * and color space of info after rescaling. Note: this currently requires that the info have a 160*c8dee2aaSAndroid Build Coastguard Worker * different size than srcRect. Though, it could be relaxed to allow non-scaling color 161*c8dee2aaSAndroid Build Coastguard Worker * conversions. 162*c8dee2aaSAndroid Build Coastguard Worker */ 163*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SurfaceFillContext> rescale(const GrImageInfo& info, 164*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceOrigin, 165*c8dee2aaSAndroid Build Coastguard Worker SkIRect srcRect, 166*c8dee2aaSAndroid Build Coastguard Worker SkImage::RescaleGamma, 167*c8dee2aaSAndroid Build Coastguard Worker SkImage::RescaleMode); 168*c8dee2aaSAndroid Build Coastguard Worker 169*c8dee2aaSAndroid Build Coastguard Worker /** 170*c8dee2aaSAndroid Build Coastguard Worker * Like the above but allows the caller ot specify a destination fill context and 171*c8dee2aaSAndroid Build Coastguard Worker * rect within that context. The dst rect must be contained by the dst or this will fail. 172*c8dee2aaSAndroid Build Coastguard Worker */ 173*c8dee2aaSAndroid Build Coastguard Worker bool rescaleInto(SurfaceFillContext* dst, 174*c8dee2aaSAndroid Build Coastguard Worker SkIRect dstRect, 175*c8dee2aaSAndroid Build Coastguard Worker SkIRect srcRect, 176*c8dee2aaSAndroid Build Coastguard Worker SkImage::RescaleGamma, 177*c8dee2aaSAndroid Build Coastguard Worker SkImage::RescaleMode); 178*c8dee2aaSAndroid Build Coastguard Worker 179*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) testCopy(sk_sp<GrSurfaceProxy> src,const SkIRect & srcRect,const SkIPoint & dstPoint)180*c8dee2aaSAndroid Build Coastguard Worker bool testCopy(sk_sp<GrSurfaceProxy> src, const SkIRect& srcRect, const SkIPoint& dstPoint) { 181*c8dee2aaSAndroid Build Coastguard Worker return this->copy(std::move(src), srcRect, dstPoint) != nullptr; 182*c8dee2aaSAndroid Build Coastguard Worker } 183*c8dee2aaSAndroid Build Coastguard Worker testCopy(sk_sp<GrSurfaceProxy> src)184*c8dee2aaSAndroid Build Coastguard Worker bool testCopy(sk_sp<GrSurfaceProxy> src) { 185*c8dee2aaSAndroid Build Coastguard Worker auto rect = SkIRect::MakeSize(src->dimensions()); 186*c8dee2aaSAndroid Build Coastguard Worker return this->copy(std::move(src), rect, {0, 0}) != nullptr; 187*c8dee2aaSAndroid Build Coastguard Worker } 188*c8dee2aaSAndroid Build Coastguard Worker #endif 189*c8dee2aaSAndroid Build Coastguard Worker 190*c8dee2aaSAndroid Build Coastguard Worker protected: 191*c8dee2aaSAndroid Build Coastguard Worker GrDrawingManager* drawingManager(); 192*c8dee2aaSAndroid Build Coastguard Worker const GrDrawingManager* drawingManager() const; 193*c8dee2aaSAndroid Build Coastguard Worker 194*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(void validate() const;) 195*c8dee2aaSAndroid Build Coastguard Worker 196*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(skgpu::SingleOwner* singleOwner() const;) 197*c8dee2aaSAndroid Build Coastguard Worker 198*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext* fContext; 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker GrSurfaceProxyView fReadView; 201*c8dee2aaSAndroid Build Coastguard Worker 202*c8dee2aaSAndroid Build Coastguard Worker // Inserts a transfer, part of the implementation of asyncReadPixels and 203*c8dee2aaSAndroid Build Coastguard Worker // asyncRescaleAndReadPixelsYUV420(). 204*c8dee2aaSAndroid Build Coastguard Worker struct PixelTransferResult { 205*c8dee2aaSAndroid Build Coastguard Worker using ConversionFn = void(void* dst, const void* mappedBuffer); 206*c8dee2aaSAndroid Build Coastguard Worker // If null then the transfer could not be performed. Otherwise this buffer will contain 207*c8dee2aaSAndroid Build Coastguard Worker // the pixel data when the transfer is complete. 208*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrGpuBuffer> fTransferBuffer; 209*c8dee2aaSAndroid Build Coastguard Worker // RowBytes for transfer buffer data 210*c8dee2aaSAndroid Build Coastguard Worker size_t fRowBytes; 211*c8dee2aaSAndroid Build Coastguard Worker // If this is null then the transfer buffer will contain the data in the requested 212*c8dee2aaSAndroid Build Coastguard Worker // color type. Otherwise, when the transfer is done this must be called to convert 213*c8dee2aaSAndroid Build Coastguard Worker // from the transfer buffer's color type to the requested color type. 214*c8dee2aaSAndroid Build Coastguard Worker std::function<ConversionFn> fPixelConverter; 215*c8dee2aaSAndroid Build Coastguard Worker }; 216*c8dee2aaSAndroid Build Coastguard Worker PixelTransferResult transferPixels(GrColorType colorType, const SkIRect& rect); 217*c8dee2aaSAndroid Build Coastguard Worker 218*c8dee2aaSAndroid Build Coastguard Worker // The async read step of asyncRescaleAndReadPixels() 219*c8dee2aaSAndroid Build Coastguard Worker void asyncReadPixels(GrDirectContext*, 220*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& srcRect, 221*c8dee2aaSAndroid Build Coastguard Worker SkColorType, 222*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCallback, 223*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsContext); 224*c8dee2aaSAndroid Build Coastguard Worker 225*c8dee2aaSAndroid Build Coastguard Worker private: 226*c8dee2aaSAndroid Build Coastguard Worker friend class ::GrRecordingContextPriv; // for validate 227*c8dee2aaSAndroid Build Coastguard Worker friend class ::GrSurfaceProxy; // for copy 228*c8dee2aaSAndroid Build Coastguard Worker 229*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(virtual void onValidate() const {}) 230*c8dee2aaSAndroid Build Coastguard Worker 231*c8dee2aaSAndroid Build Coastguard Worker /** 232*c8dee2aaSAndroid Build Coastguard Worker * Copy 'src' into the proxy backing this context. This call will not do any draw fallback. 233*c8dee2aaSAndroid Build Coastguard Worker * Currently only writePixels and replaceRenderTarget call this directly. All other copies 234*c8dee2aaSAndroid Build Coastguard Worker * should go through GrSurfaceProxy::Copy. 235*c8dee2aaSAndroid Build Coastguard Worker * @param src src of pixels 236*c8dee2aaSAndroid Build Coastguard Worker * @param dstPoint the origin of the 'srcRect' in the destination coordinate space 237*c8dee2aaSAndroid Build Coastguard Worker * @return a task (that may be skippable by calling canSkip) if successful and 238*c8dee2aaSAndroid Build Coastguard Worker * null otherwise. 239*c8dee2aaSAndroid Build Coastguard Worker * 240*c8dee2aaSAndroid Build Coastguard Worker * Note: Notionally, 'srcRect' is clipped to 'src's extent with 'dstPoint' being adjusted. 241*c8dee2aaSAndroid Build Coastguard Worker * Then the 'srcRect' offset by 'dstPoint' is clipped against the dst's extent. 242*c8dee2aaSAndroid Build Coastguard Worker * The end result is only valid src pixels and dst pixels will be touched but the copied 243*c8dee2aaSAndroid Build Coastguard Worker * regions will not be shifted. The 'src' must have the same origin as the backing proxy 244*c8dee2aaSAndroid Build Coastguard Worker * of fSurfaceContext. 245*c8dee2aaSAndroid Build Coastguard Worker */ 246*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRenderTask> copy(sk_sp<GrSurfaceProxy> src, SkIRect srcRect, SkIPoint dstPoint); 247*c8dee2aaSAndroid Build Coastguard Worker 248*c8dee2aaSAndroid Build Coastguard Worker /** 249*c8dee2aaSAndroid Build Coastguard Worker * Copy and scale 'src' into the proxy backing this context. This call will not do any draw 250*c8dee2aaSAndroid Build Coastguard Worker * fallback. Currently only rescaleInto() calls this directly, which handles drawing fallback 251*c8dee2aaSAndroid Build Coastguard Worker * automatically. 252*c8dee2aaSAndroid Build Coastguard Worker * 253*c8dee2aaSAndroid Build Coastguard Worker * @param src src of pixels 254*c8dee2aaSAndroid Build Coastguard Worker * @param srcRect the subset of src that is copied to this proxy 255*c8dee2aaSAndroid Build Coastguard Worker * @param dstRect the subset of dst that receives the copied data, possibly with different 256*c8dee2aaSAndroid Build Coastguard Worker * dimensions than 'srcRect'. 257*c8dee2aaSAndroid Build Coastguard Worker * @param filterMode the filter mode to apply when scaling src 258*c8dee2aaSAndroid Build Coastguard Worker * @return a task (that may be skippable by calling canSkip) if successful and 259*c8dee2aaSAndroid Build Coastguard Worker * null otherwise. 260*c8dee2aaSAndroid Build Coastguard Worker * 261*c8dee2aaSAndroid Build Coastguard Worker * Note: Unlike copy(rect,point), 'srcRect' and 'dstRect' are not adjusted to fit within the 262*c8dee2aaSAndroid Build Coastguard Worker * surfaces. If they are not contained, then nullptr is returned. The 'src' must have the same 263*c8dee2aaSAndroid Build Coastguard Worker * origin as the backing proxy of this context. 264*c8dee2aaSAndroid Build Coastguard Worker */ 265*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrRenderTask> copyScaled(sk_sp<GrSurfaceProxy> src, SkIRect srcRect, SkIRect dstRect, 266*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState::Filter filterMode); 267*c8dee2aaSAndroid Build Coastguard Worker 268*c8dee2aaSAndroid Build Coastguard Worker bool internalWritePixels(GrDirectContext* dContext, 269*c8dee2aaSAndroid Build Coastguard Worker const GrCPixmap src[], 270*c8dee2aaSAndroid Build Coastguard Worker int numLevels, 271*c8dee2aaSAndroid Build Coastguard Worker SkIPoint); 272*c8dee2aaSAndroid Build Coastguard Worker 273*c8dee2aaSAndroid Build Coastguard Worker GrColorInfo fColorInfo; 274*c8dee2aaSAndroid Build Coastguard Worker 275*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkRefCnt; 276*c8dee2aaSAndroid Build Coastguard Worker }; 277*c8dee2aaSAndroid Build Coastguard Worker 278*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::ganesh 279*c8dee2aaSAndroid Build Coastguard Worker 280*c8dee2aaSAndroid Build Coastguard Worker #endif // SurfaceContext_DEFINED 281