18f34372f7e97482e5e61ab298b7edaa008ba2f4creed/*
23b65598bceb65736486db27ed49a56d787032747Brian Osman * Copyright 2017 Google Inc.
38f34372f7e97482e5e61ab298b7edaa008ba2f4creed *
48f34372f7e97482e5e61ab298b7edaa008ba2f4creed * Use of this source code is governed by a BSD-style license that can be
58f34372f7e97482e5e61ab298b7edaa008ba2f4creed * found in the LICENSE file.
68f34372f7e97482e5e61ab298b7edaa008ba2f4creed */
78f34372f7e97482e5e61ab298b7edaa008ba2f4creed
83b65598bceb65736486db27ed49a56d787032747Brian Osman#ifndef SkGr_DEFINED
93b65598bceb65736486db27ed49a56d787032747Brian Osman#define SkGr_DEFINED
108f34372f7e97482e5e61ab298b7edaa008ba2f4creed
11052fd5158f7f85e478a9f87c45fecaacf7d0f5f3Ethan Nicholas#include "GrBlend.h"
123b65598bceb65736486db27ed49a56d787032747Brian Osman#include "GrColor.h"
13e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips#include "GrSamplerParams.h"
14587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon#include "GrTypes.h"
15199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon#include "SkCanvas.h"
163b65598bceb65736486db27ed49a56d787032747Brian Osman#include "SkColor.h"
173b65598bceb65736486db27ed49a56d787032747Brian Osman#include "SkColorPriv.h"
183b65598bceb65736486db27ed49a56d787032747Brian Osman#include "SkFilterQuality.h"
19f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon#include "SkImageInfo.h"
20afa95e270c64c9777647b6c58b796750ced57c39bsalomon#include "SkMatrix.h"
21587e08f361ee3e775a6bbc6dca761dbba82e422cBrian Salomon#include "SkPM4f.h"
22d47067392848ba132d4e86ffbeebe2dcacda9534Mike Reed#include "SkXfermodePriv.h"
238f34372f7e97482e5e61ab298b7edaa008ba2f4creed
248f34372f7e97482e5e61ab298b7edaa008ba2f4creedclass GrCaps;
253b65598bceb65736486db27ed49a56d787032747Brian Osmanclass GrColorSpaceXform;
26f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonclass GrContext;
271105224f9701e57ec5ce0354d6a380b664f5c638Brian Osmanclass GrRenderTargetContext;
28f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonclass GrFragmentProcessor;
29f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonclass GrPaint;
3026c90e04797e15c37ec00e0f836292b8a207d294Robert Phillipsclass GrResourceProvider;
31e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillipsclass GrTextureProxy;
328f34372f7e97482e5e61ab298b7edaa008ba2f4creedclass GrUniqueKey;
336f1d36cc54dc635f5e4d0f925ef79c14914342bbBrian Salomonclass SkBitmap;
34afa95e270c64c9777647b6c58b796750ced57c39bsalomonclass SkData;
35f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonclass SkPaint;
36afa95e270c64c9777647b6c58b796750ced57c39bsalomonclass SkPixelRef;
376f1d36cc54dc635f5e4d0f925ef79c14914342bbBrian Salomonclass SkPixmap;
38f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonstruct SkIRect;
398f34372f7e97482e5e61ab298b7edaa008ba2f4creed
403b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
413b65598bceb65736486db27ed49a56d787032747Brian Osman// Color type conversions
423b65598bceb65736486db27ed49a56d787032747Brian Osman
433b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor SkColorToPremulGrColor(SkColor c) {
443b65598bceb65736486db27ed49a56d787032747Brian Osman    SkPMColor pm = SkPreMultiplyColor(c);
453b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned r = SkGetPackedR32(pm);
463b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned g = SkGetPackedG32(pm);
473b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned b = SkGetPackedB32(pm);
483b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned a = SkGetPackedA32(pm);
493b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColorPackRGBA(r, g, b, a);
503b65598bceb65736486db27ed49a56d787032747Brian Osman}
513b65598bceb65736486db27ed49a56d787032747Brian Osman
523b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor SkColorToUnpremulGrColor(SkColor c) {
533b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned r = SkColorGetR(c);
543b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned g = SkColorGetG(c);
553b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned b = SkColorGetB(c);
563b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned a = SkColorGetA(c);
573b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColorPackRGBA(r, g, b, a);
583b65598bceb65736486db27ed49a56d787032747Brian Osman}
593b65598bceb65736486db27ed49a56d787032747Brian Osman
603b65598bceb65736486db27ed49a56d787032747Brian Osman/** Transform an SkColor (sRGB bytes) to GrColor4f for the specified color space. */
613b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToPremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace);
623b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToUnpremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace);
633b65598bceb65736486db27ed49a56d787032747Brian Osman
648f34372f7e97482e5e61ab298b7edaa008ba2f4creed/**
653b65598bceb65736486db27ed49a56d787032747Brian Osman * As above, but with a caller-supplied color space xform object. Faster for the cases where we
663b65598bceb65736486db27ed49a56d787032747Brian Osman * have that cached.
678f34372f7e97482e5e61ab298b7edaa008ba2f4creed */
683b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToPremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace,
693b65598bceb65736486db27ed49a56d787032747Brian Osman                                   GrColorSpaceXform* gamutXform);
703b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToUnpremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace,
713b65598bceb65736486db27ed49a56d787032747Brian Osman                                     GrColorSpaceXform* gamutXform);
723b65598bceb65736486db27ed49a56d787032747Brian Osman
733b65598bceb65736486db27ed49a56d787032747Brian Osman/** Replicates the SkColor's alpha to all four channels of the GrColor. */
743b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor SkColorAlphaToGrColor(SkColor c) {
753b65598bceb65736486db27ed49a56d787032747Brian Osman    U8CPU a = SkColorGetA(c);
763b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColorPackRGBA(a, a, a, a);
773b65598bceb65736486db27ed49a56d787032747Brian Osman}
78856e9d921462136da8562f8f122d42e114cd4710reed
793b65598bceb65736486db27ed49a56d787032747Brian Osman//////////////////////////////////////////////////////////////////////////////
803b65598bceb65736486db27ed49a56d787032747Brian Osman
813b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline SkPM4f GrColor4fToSkPM4f(const GrColor4f& c) {
823b65598bceb65736486db27ed49a56d787032747Brian Osman    SkPM4f pm4f;
833b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::R] = c.fRGBA[0];
843b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::G] = c.fRGBA[1];
853b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::B] = c.fRGBA[2];
863b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::A] = c.fRGBA[3];
873b65598bceb65736486db27ed49a56d787032747Brian Osman    return pm4f;
883b65598bceb65736486db27ed49a56d787032747Brian Osman}
893b65598bceb65736486db27ed49a56d787032747Brian Osman
903b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor4f SkPM4fToGrColor4f(const SkPM4f& c) {
913b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColor4f{c.r(), c.g(), c.b(), c.a()};
923b65598bceb65736486db27ed49a56d787032747Brian Osman}
933b65598bceb65736486db27ed49a56d787032747Brian Osman
943b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
953b65598bceb65736486db27ed49a56d787032747Brian Osman// Paint conversion
96c55271f2551533b37043aa2e37f754832a43073cbsalomon
97f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon/** Converts an SkPaint to a GrPaint for a given GrContext. The matrix is required in order
98aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    to convert the SkShader (if any) on the SkPaint. The primitive itself has no color. */
99f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaint(GrContext*,
1001105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                      GrRenderTargetContext*,
101f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                      const SkPaint& skPaint,
102f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                      const SkMatrix& viewM,
103f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                      GrPaint* grPaint);
104f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
105aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon/** Same as above but ignores the SkShader (if any) on skPaint. */
106f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaintNoShader(GrContext* context,
1071105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                              GrRenderTargetContext* rtc,
108f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                              const SkPaint& skPaint,
109f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                              GrPaint* grPaint);
110f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
111f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon/** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProcessor. The processor
112aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    should expect an unpremul input color and produce a premultiplied output color. There is
113aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    no primitive color. */
114f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaintReplaceShader(GrContext*,
1151105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                                   GrRenderTargetContext*,
116f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                   const SkPaint& skPaint,
11706ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman                                   sk_sp<GrFragmentProcessor> shaderFP,
118f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                   GrPaint* grPaint);
119f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
120f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon/** Blends the SkPaint's shader (or color if no shader) with the color which specified via a
12125a880960a9a689a745a01071ecba3fe494b5940Brian Salomon    GrOp's GrPrimitiveProcesssor. Currently there is a bool param to indicate whether the
122f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon    primitive color is the dst or src color to the blend in order to work around differences between
123aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    drawVertices and drawAtlas. */
124f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaintWithXfermode(GrContext* context,
1251105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                                  GrRenderTargetContext* rtc,
126f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  const SkPaint& skPaint,
127f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  const SkMatrix& viewM,
1287d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed                                  SkBlendMode primColorMode,
129f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  bool primitiveIsSrc,
130f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  GrPaint* grPaint);
131f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
132aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon/** This is used when there is a primitive color, but the shader should be ignored. Currently,
133aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    the expectation is that the primitive color will be premultiplied, though it really should be
134aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    unpremultiplied so that interpolation is done in unpremul space. The paint's alpha will be
135aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    applied to the primitive color after interpolation. */
1361105224f9701e57ec5ce0354d6a380b664f5c638Brian Osmaninline bool SkPaintToGrPaintWithPrimitiveColor(GrContext* context, GrRenderTargetContext* rtc,
1378fe485b793f6b3c286700988138e1395b0d33487brianosman                                               const SkPaint& skPaint, GrPaint* grPaint) {
1387d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    return SkPaintToGrPaintWithXfermode(context, rtc, skPaint, SkMatrix::I(), SkBlendMode::kDst,
1398fe485b793f6b3c286700988138e1395b0d33487brianosman                                        false, grPaint);
140aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon}
141aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon
14233a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt/** This is used when there may or may not be a shader, and the caller wants to plugin a texture
14333a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt    lookup.  If there is a shader, then its output will only be used if the texture is alpha8. */
14433a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualittbool SkPaintToGrPaintWithTexture(GrContext* context,
1451105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                                 GrRenderTargetContext* rtc,
14633a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 const SkPaint& paint,
14733a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 const SkMatrix& viewM,
14806ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman                                 sk_sp<GrFragmentProcessor> fp,
14933a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 bool textureIsAlphaOnly,
15033a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 GrPaint* grPaint);
15133a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt
1523b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
1533b65598bceb65736486db27ed49a56d787032747Brian Osman// Misc Sk to Gr type conversions
1543b65598bceb65736486db27ed49a56d787032747Brian Osman
1553b65598bceb65736486db27ed49a56d787032747Brian OsmanGrSurfaceDesc GrImageInfoToSurfaceDesc(const SkImageInfo&, const GrCaps&);
1563b65598bceb65736486db27ed49a56d787032747Brian OsmanGrPixelConfig SkImageInfo2GrPixelConfig(const SkImageInfo& info, const GrCaps& caps);
1573b65598bceb65736486db27ed49a56d787032747Brian Osman
1583b65598bceb65736486db27ed49a56d787032747Brian Osmanbool GrPixelConfigToColorType(GrPixelConfig, SkColorType*);
1593b65598bceb65736486db27ed49a56d787032747Brian Osman
1603b65598bceb65736486db27ed49a56d787032747Brian OsmanGrSamplerParams::FilterMode GrSkFilterQualityToGrFilterMode(SkFilterQuality paintFilterQuality,
1613b65598bceb65736486db27ed49a56d787032747Brian Osman                                                            const SkMatrix& viewM,
1623b65598bceb65736486db27ed49a56d787032747Brian Osman                                                            const SkMatrix& localM,
1633b65598bceb65736486db27ed49a56d787032747Brian Osman                                                            bool* doBicubic);
1643b65598bceb65736486db27ed49a56d787032747Brian Osman
165f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon//////////////////////////////////////////////////////////////////////////////
166f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
167199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomonstatic inline GrPrimitiveType SkVertexModeToGrPrimitiveType(const SkCanvas::VertexMode mode) {
168199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    switch (mode) {
169199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon        case SkCanvas::kTriangles_VertexMode:
170199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon            return kTriangles_GrPrimitiveType;
171199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon        case SkCanvas::kTriangleStrip_VertexMode:
172199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon            return kTriangleStrip_GrPrimitiveType;
173199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon        case SkCanvas::kTriangleFan_VertexMode:
174199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon            return kTriangleFan_GrPrimitiveType;
175199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    }
176199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    SkFAIL("Invalid mode");
177199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    return kPoints_GrPrimitiveType;
178199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon}
179199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon
180199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon//////////////////////////////////////////////////////////////////////////////
181199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon
1823b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kZero_GrBlendCoeff == (int)SkXfermode::kZero_Coeff);
1833b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kOne_GrBlendCoeff == (int)SkXfermode::kOne_Coeff);
1843b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kSC_GrBlendCoeff == (int)SkXfermode::kSC_Coeff);
1853b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kISC_GrBlendCoeff == (int)SkXfermode::kISC_Coeff);
1863b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kDC_GrBlendCoeff == (int)SkXfermode::kDC_Coeff);
1873b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kIDC_GrBlendCoeff == (int)SkXfermode::kIDC_Coeff);
1883b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kSA_GrBlendCoeff == (int)SkXfermode::kSA_Coeff);
1893b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kISA_GrBlendCoeff == (int)SkXfermode::kISA_Coeff);
1903b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kDA_GrBlendCoeff == (int)SkXfermode::kDA_Coeff);
1913b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kIDA_GrBlendCoeff == (int)SkXfermode::kIDA_Coeff);
1923b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT(SkXfermode::kCoeffCount == 10);
193f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
1943b65598bceb65736486db27ed49a56d787032747Brian Osman#define SkXfermodeCoeffToGrBlendCoeff(X) ((GrBlendCoeff)(X))
195f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
1963b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
1973b65598bceb65736486db27ed49a56d787032747Brian Osman// Texture management
1982695eaa41fbd208dcee9e134e180c6609856f0acbrianosman
1993b65598bceb65736486db27ed49a56d787032747Brian Osman/** Returns a texture representing the bitmap that is compatible with the GrSamplerParams. The
2003b65598bceb65736486db27ed49a56d787032747Brian Osman *  texture is inserted into the cache (unless the bitmap is marked volatile) and can be
2013b65598bceb65736486db27ed49a56d787032747Brian Osman *  retrieved again via this function.
2023b65598bceb65736486db27ed49a56d787032747Brian Osman *  The 'scaleAdjust' in/out parameter will be updated to hold any rescaling that needs to be
2033b65598bceb65736486db27ed49a56d787032747Brian Osman *  performed on the absolute texture coordinates (e.g., if the texture is resized out to
2043b65598bceb65736486db27ed49a56d787032747Brian Osman *  the next power of two). It can be null if the caller is sure the bitmap won't be resized.
205045802dbb7202b52f5fd2758d725f39c156a6165bsalomon */
206bbd7a3be407ce94fcc4f8b1eb475de8b6f49026eRobert Phillipssk_sp<GrTextureProxy> GrRefCachedBitmapTextureProxy(GrContext*,
207bbd7a3be407ce94fcc4f8b1eb475de8b6f49026eRobert Phillips                                                    const SkBitmap&,
208bbd7a3be407ce94fcc4f8b1eb475de8b6f49026eRobert Phillips                                                    const GrSamplerParams&,
209bbd7a3be407ce94fcc4f8b1eb475de8b6f49026eRobert Phillips                                                    SkScalar scaleAdjust[2]);
210bbd7a3be407ce94fcc4f8b1eb475de8b6f49026eRobert Phillips
211045802dbb7202b52f5fd2758d725f39c156a6165bsalomon/**
212045802dbb7202b52f5fd2758d725f39c156a6165bsalomon * Creates a new texture for the bitmap. Does not concern itself with cache keys or texture params.
213045802dbb7202b52f5fd2758d725f39c156a6165bsalomon * The bitmap must have CPU-accessible pixels. Attempts to take advantage of faster paths for
214045802dbb7202b52f5fd2758d725f39c156a6165bsalomon * compressed textures and yuv planes.
215045802dbb7202b52f5fd2758d725f39c156a6165bsalomon */
21626c90e04797e15c37ec00e0f836292b8a207d294Robert Phillipssk_sp<GrTextureProxy> GrUploadBitmapToTextureProxy(GrResourceProvider*, const SkBitmap&);
217d3749485db2de966a80e39669a49192fc7c0bd9dRobert Phillips
2180c984a0af30989fe20b1f8af18867983a88c48b6Robert Phillipssk_sp<GrTextureProxy> GrGenerateMipMapsAndUploadToTextureProxy(GrContext*, const SkBitmap&,
2190c984a0af30989fe20b1f8af18867983a88c48b6Robert Phillips                                                               SkColorSpace* dstColorSpace);
22055f2d2d57f4dd4109aa0c9dab6023373e3b928eccblume
2210d996868c3dd5af2ccb6fced488edb335185c107bsalomon/**
2220d996868c3dd5af2ccb6fced488edb335185c107bsalomon * Creates a new texture for the pixmap.
2230d996868c3dd5af2ccb6fced488edb335185c107bsalomon */
22426c90e04797e15c37ec00e0f836292b8a207d294Robert Phillipssk_sp<GrTextureProxy> GrUploadPixmapToTextureProxy(GrResourceProvider*,
22526c90e04797e15c37ec00e0f836292b8a207d294Robert Phillips                                                   const SkPixmap&, SkBudgeted);
2260d996868c3dd5af2ccb6fced488edb335185c107bsalomon
227186d2d430ba248fea1e00669154b95252ac9a486cblume/**
228186d2d430ba248fea1e00669154b95252ac9a486cblume * Creates a new texture populated with the mipmap levels.
229186d2d430ba248fea1e00669154b95252ac9a486cblume */
2300ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillipssk_sp<GrTextureProxy> GrUploadMipMapToTextureProxy(GrContext*, const SkImageInfo&,
2310ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips                                                   const GrMipLevel* texels,
2320ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips                                                   int mipLevelCount,
2330ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips                                                   SkDestinationSurfaceColorMode colorMode);
2340ae6faa34d73ffc7ebec3d13f0473703bade821bRobert Phillips
235e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips// This is intended to replace:
236e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    SkAutoLockPixels alp(bitmap, true);
237e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    if (!bitmap.readyToDraw()) {
238e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//        return nullptr;
239e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    }
240e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    sk_sp<GrTexture> texture = GrMakeCachedBitmapTexture(fContext.get(), bitmap,
241e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//                                                         GrSamplerParams::ClampNoFilter(),
242e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//                                                         nullptr);
243e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    if (!texture) {
244e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//        return nullptr;
245e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    }
24626c90e04797e15c37ec00e0f836292b8a207d294Robert Phillipssk_sp<GrTextureProxy> GrMakeCachedBitmapProxy(GrResourceProvider*, const SkBitmap& bitmap);
247e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips
2483b65598bceb65736486db27ed49a56d787032747Brian Osman
2493b65598bceb65736486db27ed49a56d787032747Brian Osman/**
2503b65598bceb65736486db27ed49a56d787032747Brian Osman *  Our key includes the offset, width, and height so that bitmaps created by extractSubset()
2513b65598bceb65736486db27ed49a56d787032747Brian Osman *  are unique.
2523b65598bceb65736486db27ed49a56d787032747Brian Osman *
2533b65598bceb65736486db27ed49a56d787032747Brian Osman *  The imageID is in the shared namespace (see SkNextID::ImageID())
2543b65598bceb65736486db27ed49a56d787032747Brian Osman *      - SkBitmap/SkPixelRef
2553b65598bceb65736486db27ed49a56d787032747Brian Osman *      - SkImage
2563b65598bceb65736486db27ed49a56d787032747Brian Osman *      - SkImageGenerator
2573b65598bceb65736486db27ed49a56d787032747Brian Osman *
2583b65598bceb65736486db27ed49a56d787032747Brian Osman *  Note: width/height must fit in 16bits for this impl.
2593b65598bceb65736486db27ed49a56d787032747Brian Osman */
2603b65598bceb65736486db27ed49a56d787032747Brian Osmanvoid GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID, const SkIRect& imageBounds);
2613b65598bceb65736486db27ed49a56d787032747Brian Osman
2623b65598bceb65736486db27ed49a56d787032747Brian Osman/** Call this after installing a GrUniqueKey on texture. It will cause the texture's key to be
2633b65598bceb65736486db27ed49a56d787032747Brian Osman    removed should the bitmap's contents change or be destroyed. */
2643b65598bceb65736486db27ed49a56d787032747Brian Osmanvoid GrInstallBitmapUniqueKeyInvalidator(const GrUniqueKey& key, SkPixelRef* pixelRef);
2653b65598bceb65736486db27ed49a56d787032747Brian Osman
266f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon//////////////////////////////////////////////////////////////////////////////
267f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
2683b65598bceb65736486db27ed49a56d787032747Brian Osman/** When image filter code needs to construct a render target context to do intermediate rendering,
2693b65598bceb65736486db27ed49a56d787032747Brian Osman    we need a renderable pixel config. The source (SkSpecialImage) may not be in a renderable
2703b65598bceb65736486db27ed49a56d787032747Brian Osman    format, but we want to preserve the color space of that source. This picks an appropriate format
2713b65598bceb65736486db27ed49a56d787032747Brian Osman    to use. */
2723b65598bceb65736486db27ed49a56d787032747Brian OsmanGrPixelConfig GrRenderableConfigForColorSpace(const SkColorSpace*);
2733b65598bceb65736486db27ed49a56d787032747Brian Osman
2743b65598bceb65736486db27ed49a56d787032747Brian Osman/**
2753b65598bceb65736486db27ed49a56d787032747Brian Osman *  If the compressed data in the SkData is supported (as a texture format, this returns
2763b65598bceb65736486db27ed49a56d787032747Brian Osman *  the pixel-config that should be used, and sets outStartOfDataToUpload to the ptr into
2773b65598bceb65736486db27ed49a56d787032747Brian Osman *  the data where the actual raw data starts (skipping any header bytes).
2783b65598bceb65736486db27ed49a56d787032747Brian Osman *
2793b65598bceb65736486db27ed49a56d787032747Brian Osman *  If the compressed data is not supported, this returns kUnknown_GrPixelConfig, and
2803b65598bceb65736486db27ed49a56d787032747Brian Osman *  ignores outStartOfDataToUpload.
2813b65598bceb65736486db27ed49a56d787032747Brian Osman */
2823b65598bceb65736486db27ed49a56d787032747Brian OsmanGrPixelConfig GrIsCompressedTextureDataSupported(GrContext* ctx, SkData* data,
2833b65598bceb65736486db27ed49a56d787032747Brian Osman                                                 int expectedW, int expectedH,
2843b65598bceb65736486db27ed49a56d787032747Brian Osman                                                 const void** outStartOfDataToUpload);
2853b65598bceb65736486db27ed49a56d787032747Brian Osman
286f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
287f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
2888f34372f7e97482e5e61ab298b7edaa008ba2f4creed#endif
289