SkGr.h revision 0c984a0af30989fe20b1f8af18867983a88c48b6
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;
31f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomonclass GrTexture;
32e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillipsclass GrTextureProxy;
338f34372f7e97482e5e61ab298b7edaa008ba2f4creedclass GrUniqueKey;
346f1d36cc54dc635f5e4d0f925ef79c14914342bbBrian Salomonclass SkBitmap;
35afa95e270c64c9777647b6c58b796750ced57c39bsalomonclass SkData;
36f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonclass SkPaint;
37afa95e270c64c9777647b6c58b796750ced57c39bsalomonclass SkPixelRef;
386f1d36cc54dc635f5e4d0f925ef79c14914342bbBrian Salomonclass SkPixmap;
39f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonstruct SkIRect;
408f34372f7e97482e5e61ab298b7edaa008ba2f4creed
413b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
423b65598bceb65736486db27ed49a56d787032747Brian Osman// Color type conversions
433b65598bceb65736486db27ed49a56d787032747Brian Osman
443b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor SkColorToPremulGrColor(SkColor c) {
453b65598bceb65736486db27ed49a56d787032747Brian Osman    SkPMColor pm = SkPreMultiplyColor(c);
463b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned r = SkGetPackedR32(pm);
473b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned g = SkGetPackedG32(pm);
483b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned b = SkGetPackedB32(pm);
493b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned a = SkGetPackedA32(pm);
503b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColorPackRGBA(r, g, b, a);
513b65598bceb65736486db27ed49a56d787032747Brian Osman}
523b65598bceb65736486db27ed49a56d787032747Brian Osman
533b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor SkColorToUnpremulGrColor(SkColor c) {
543b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned r = SkColorGetR(c);
553b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned g = SkColorGetG(c);
563b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned b = SkColorGetB(c);
573b65598bceb65736486db27ed49a56d787032747Brian Osman    unsigned a = SkColorGetA(c);
583b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColorPackRGBA(r, g, b, a);
593b65598bceb65736486db27ed49a56d787032747Brian Osman}
603b65598bceb65736486db27ed49a56d787032747Brian Osman
613b65598bceb65736486db27ed49a56d787032747Brian Osman/** Transform an SkColor (sRGB bytes) to GrColor4f for the specified color space. */
623b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToPremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace);
633b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToUnpremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace);
643b65598bceb65736486db27ed49a56d787032747Brian Osman
658f34372f7e97482e5e61ab298b7edaa008ba2f4creed/**
663b65598bceb65736486db27ed49a56d787032747Brian Osman * As above, but with a caller-supplied color space xform object. Faster for the cases where we
673b65598bceb65736486db27ed49a56d787032747Brian Osman * have that cached.
688f34372f7e97482e5e61ab298b7edaa008ba2f4creed */
693b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToPremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace,
703b65598bceb65736486db27ed49a56d787032747Brian Osman                                   GrColorSpaceXform* gamutXform);
713b65598bceb65736486db27ed49a56d787032747Brian OsmanGrColor4f SkColorToUnpremulGrColor4f(SkColor c, SkColorSpace* dstColorSpace,
723b65598bceb65736486db27ed49a56d787032747Brian Osman                                     GrColorSpaceXform* gamutXform);
733b65598bceb65736486db27ed49a56d787032747Brian Osman
743b65598bceb65736486db27ed49a56d787032747Brian Osman/** Replicates the SkColor's alpha to all four channels of the GrColor. */
753b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor SkColorAlphaToGrColor(SkColor c) {
763b65598bceb65736486db27ed49a56d787032747Brian Osman    U8CPU a = SkColorGetA(c);
773b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColorPackRGBA(a, a, a, a);
783b65598bceb65736486db27ed49a56d787032747Brian Osman}
79856e9d921462136da8562f8f122d42e114cd4710reed
803b65598bceb65736486db27ed49a56d787032747Brian Osman//////////////////////////////////////////////////////////////////////////////
813b65598bceb65736486db27ed49a56d787032747Brian Osman
823b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline SkPM4f GrColor4fToSkPM4f(const GrColor4f& c) {
833b65598bceb65736486db27ed49a56d787032747Brian Osman    SkPM4f pm4f;
843b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::R] = c.fRGBA[0];
853b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::G] = c.fRGBA[1];
863b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::B] = c.fRGBA[2];
873b65598bceb65736486db27ed49a56d787032747Brian Osman    pm4f.fVec[SkPM4f::A] = c.fRGBA[3];
883b65598bceb65736486db27ed49a56d787032747Brian Osman    return pm4f;
893b65598bceb65736486db27ed49a56d787032747Brian Osman}
903b65598bceb65736486db27ed49a56d787032747Brian Osman
913b65598bceb65736486db27ed49a56d787032747Brian Osmanstatic inline GrColor4f SkPM4fToGrColor4f(const SkPM4f& c) {
923b65598bceb65736486db27ed49a56d787032747Brian Osman    return GrColor4f{c.r(), c.g(), c.b(), c.a()};
933b65598bceb65736486db27ed49a56d787032747Brian Osman}
943b65598bceb65736486db27ed49a56d787032747Brian Osman
953b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
963b65598bceb65736486db27ed49a56d787032747Brian Osman// Paint conversion
97c55271f2551533b37043aa2e37f754832a43073cbsalomon
98f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon/** Converts an SkPaint to a GrPaint for a given GrContext. The matrix is required in order
99aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    to convert the SkShader (if any) on the SkPaint. The primitive itself has no color. */
100f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaint(GrContext*,
1011105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                      GrRenderTargetContext*,
102f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                      const SkPaint& skPaint,
103f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                      const SkMatrix& viewM,
104f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                      GrPaint* grPaint);
105f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
106aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon/** Same as above but ignores the SkShader (if any) on skPaint. */
107f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaintNoShader(GrContext* context,
1081105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                              GrRenderTargetContext* rtc,
109f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                              const SkPaint& skPaint,
110f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                              GrPaint* grPaint);
111f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
112f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon/** Replaces the SkShader (if any) on skPaint with the passed in GrFragmentProcessor. The processor
113aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    should expect an unpremul input color and produce a premultiplied output color. There is
114aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    no primitive color. */
115f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaintReplaceShader(GrContext*,
1161105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                                   GrRenderTargetContext*,
117f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                   const SkPaint& skPaint,
11806ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman                                   sk_sp<GrFragmentProcessor> shaderFP,
119f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                   GrPaint* grPaint);
120f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
121f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon/** Blends the SkPaint's shader (or color if no shader) with the color which specified via a
12225a880960a9a689a745a01071ecba3fe494b5940Brian Salomon    GrOp's GrPrimitiveProcesssor. Currently there is a bool param to indicate whether the
123f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon    primitive color is the dst or src color to the blend in order to work around differences between
124aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    drawVertices and drawAtlas. */
125f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomonbool SkPaintToGrPaintWithXfermode(GrContext* context,
1261105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                                  GrRenderTargetContext* rtc,
127f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  const SkPaint& skPaint,
128f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  const SkMatrix& viewM,
1297d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed                                  SkBlendMode primColorMode,
130f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  bool primitiveIsSrc,
131f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon                                  GrPaint* grPaint);
132f1b7a1d82860e106ed7d3e0e876419e65783fb84bsalomon
133aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon/** This is used when there is a primitive color, but the shader should be ignored. Currently,
134aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    the expectation is that the primitive color will be premultiplied, though it really should be
135aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    unpremultiplied so that interpolation is done in unpremul space. The paint's alpha will be
136aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon    applied to the primitive color after interpolation. */
1371105224f9701e57ec5ce0354d6a380b664f5c638Brian Osmaninline bool SkPaintToGrPaintWithPrimitiveColor(GrContext* context, GrRenderTargetContext* rtc,
1388fe485b793f6b3c286700988138e1395b0d33487brianosman                                               const SkPaint& skPaint, GrPaint* grPaint) {
1397d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    return SkPaintToGrPaintWithXfermode(context, rtc, skPaint, SkMatrix::I(), SkBlendMode::kDst,
1408fe485b793f6b3c286700988138e1395b0d33487brianosman                                        false, grPaint);
141aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon}
142aa48d36397f8464dafd38c3f42fbdfb1419e8778bsalomon
14333a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt/** This is used when there may or may not be a shader, and the caller wants to plugin a texture
14433a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt    lookup.  If there is a shader, then its output will only be used if the texture is alpha8. */
14533a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualittbool SkPaintToGrPaintWithTexture(GrContext* context,
1461105224f9701e57ec5ce0354d6a380b664f5c638Brian Osman                                 GrRenderTargetContext* rtc,
14733a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 const SkPaint& paint,
14833a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 const SkMatrix& viewM,
14906ca8ec87cf6fab57cadd043a5ac18c4154a4129bungeman                                 sk_sp<GrFragmentProcessor> fp,
15033a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 bool textureIsAlphaOnly,
15133a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt                                 GrPaint* grPaint);
15233a5fce6126dc5d3927a71fdc6c35af6f5893fd5joshualitt
1533b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
1543b65598bceb65736486db27ed49a56d787032747Brian Osman// Misc Sk to Gr type conversions
1553b65598bceb65736486db27ed49a56d787032747Brian Osman
1563b65598bceb65736486db27ed49a56d787032747Brian OsmanGrSurfaceDesc GrImageInfoToSurfaceDesc(const SkImageInfo&, const GrCaps&);
1573b65598bceb65736486db27ed49a56d787032747Brian OsmanGrPixelConfig SkImageInfo2GrPixelConfig(const SkImageInfo& info, const GrCaps& caps);
1583b65598bceb65736486db27ed49a56d787032747Brian Osman
1593b65598bceb65736486db27ed49a56d787032747Brian Osmanbool GrPixelConfigToColorType(GrPixelConfig, SkColorType*);
1603b65598bceb65736486db27ed49a56d787032747Brian Osman
1613b65598bceb65736486db27ed49a56d787032747Brian OsmanGrSamplerParams::FilterMode GrSkFilterQualityToGrFilterMode(SkFilterQuality paintFilterQuality,
1623b65598bceb65736486db27ed49a56d787032747Brian Osman                                                            const SkMatrix& viewM,
1633b65598bceb65736486db27ed49a56d787032747Brian Osman                                                            const SkMatrix& localM,
1643b65598bceb65736486db27ed49a56d787032747Brian Osman                                                            bool* doBicubic);
1653b65598bceb65736486db27ed49a56d787032747Brian Osman
166f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon//////////////////////////////////////////////////////////////////////////////
167f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
168199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomonstatic inline GrPrimitiveType SkVertexModeToGrPrimitiveType(const SkCanvas::VertexMode mode) {
169199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    switch (mode) {
170199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon        case SkCanvas::kTriangles_VertexMode:
171199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon            return kTriangles_GrPrimitiveType;
172199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon        case SkCanvas::kTriangleStrip_VertexMode:
173199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon            return kTriangleStrip_GrPrimitiveType;
174199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon        case SkCanvas::kTriangleFan_VertexMode:
175199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon            return kTriangleFan_GrPrimitiveType;
176199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    }
177199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    SkFAIL("Invalid mode");
178199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon    return kPoints_GrPrimitiveType;
179199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon}
180199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon
181199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon//////////////////////////////////////////////////////////////////////////////
182199fb875c5e63c13233209e89b943c7ac7ab6665Brian Salomon
1833b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kZero_GrBlendCoeff == (int)SkXfermode::kZero_Coeff);
1843b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kOne_GrBlendCoeff == (int)SkXfermode::kOne_Coeff);
1853b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kSC_GrBlendCoeff == (int)SkXfermode::kSC_Coeff);
1863b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kISC_GrBlendCoeff == (int)SkXfermode::kISC_Coeff);
1873b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kDC_GrBlendCoeff == (int)SkXfermode::kDC_Coeff);
1883b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kIDC_GrBlendCoeff == (int)SkXfermode::kIDC_Coeff);
1893b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kSA_GrBlendCoeff == (int)SkXfermode::kSA_Coeff);
1903b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kISA_GrBlendCoeff == (int)SkXfermode::kISA_Coeff);
1913b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kDA_GrBlendCoeff == (int)SkXfermode::kDA_Coeff);
1923b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT((int)kIDA_GrBlendCoeff == (int)SkXfermode::kIDA_Coeff);
1933b65598bceb65736486db27ed49a56d787032747Brian OsmanGR_STATIC_ASSERT(SkXfermode::kCoeffCount == 10);
194f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
1953b65598bceb65736486db27ed49a56d787032747Brian Osman#define SkXfermodeCoeffToGrBlendCoeff(X) ((GrBlendCoeff)(X))
196f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
1973b65598bceb65736486db27ed49a56d787032747Brian Osman////////////////////////////////////////////////////////////////////////////////
1983b65598bceb65736486db27ed49a56d787032747Brian Osman// Texture management
1992695eaa41fbd208dcee9e134e180c6609856f0acbrianosman
2003b65598bceb65736486db27ed49a56d787032747Brian Osman/** Returns a texture representing the bitmap that is compatible with the GrSamplerParams. The
2013b65598bceb65736486db27ed49a56d787032747Brian Osman *  texture is inserted into the cache (unless the bitmap is marked volatile) and can be
2023b65598bceb65736486db27ed49a56d787032747Brian Osman *  retrieved again via this function.
2033b65598bceb65736486db27ed49a56d787032747Brian Osman *  The 'scaleAdjust' in/out parameter will be updated to hold any rescaling that needs to be
2043b65598bceb65736486db27ed49a56d787032747Brian Osman *  performed on the absolute texture coordinates (e.g., if the texture is resized out to
2053b65598bceb65736486db27ed49a56d787032747Brian Osman *  the next power of two). It can be null if the caller is sure the bitmap won't be resized.
206045802dbb7202b52f5fd2758d725f39c156a6165bsalomon */
2073b65598bceb65736486db27ed49a56d787032747Brian OsmanGrTexture* GrRefCachedBitmapTexture(GrContext*, const SkBitmap&,
2083b65598bceb65736486db27ed49a56d787032747Brian Osman                                    const GrSamplerParams&, SkScalar scaleAdjust[2]);
209f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
210045802dbb7202b52f5fd2758d725f39c156a6165bsalomon/**
211045802dbb7202b52f5fd2758d725f39c156a6165bsalomon * Creates a new texture for the bitmap. Does not concern itself with cache keys or texture params.
212045802dbb7202b52f5fd2758d725f39c156a6165bsalomon * The bitmap must have CPU-accessible pixels. Attempts to take advantage of faster paths for
213045802dbb7202b52f5fd2758d725f39c156a6165bsalomon * compressed textures and yuv planes.
214045802dbb7202b52f5fd2758d725f39c156a6165bsalomon */
215045802dbb7202b52f5fd2758d725f39c156a6165bsalomonGrTexture* GrUploadBitmapToTexture(GrContext*, const SkBitmap&);
216f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
21726c90e04797e15c37ec00e0f836292b8a207d294Robert Phillipssk_sp<GrTextureProxy> GrUploadBitmapToTextureProxy(GrResourceProvider*, const SkBitmap&);
218d3749485db2de966a80e39669a49192fc7c0bd9dRobert Phillips
2197b8400dad2f82dcc6ed3c7cc1707ebaf85f04840Brian OsmanGrTexture* GrGenerateMipMapsAndUploadToTexture(GrContext*, const SkBitmap&,
22061624f0c716b576706659750d87b6956f4c15722Brian Osman                                               SkColorSpace* dstColorSpace);
2210c984a0af30989fe20b1f8af18867983a88c48b6Robert Phillips
2220c984a0af30989fe20b1f8af18867983a88c48b6Robert Phillipssk_sp<GrTextureProxy> GrGenerateMipMapsAndUploadToTextureProxy(GrContext*, const SkBitmap&,
2230c984a0af30989fe20b1f8af18867983a88c48b6Robert Phillips                                                               SkColorSpace* dstColorSpace);
22455f2d2d57f4dd4109aa0c9dab6023373e3b928eccblume
2250d996868c3dd5af2ccb6fced488edb335185c107bsalomon/**
2260d996868c3dd5af2ccb6fced488edb335185c107bsalomon * Creates a new texture for the pixmap.
2270d996868c3dd5af2ccb6fced488edb335185c107bsalomon */
228d3749485db2de966a80e39669a49192fc7c0bd9dRobert PhillipsGrTexture* GrUploadPixmapToTexture(GrContext*, const SkPixmap&, SkBudgeted);
229d3749485db2de966a80e39669a49192fc7c0bd9dRobert Phillips
23026c90e04797e15c37ec00e0f836292b8a207d294Robert Phillipssk_sp<GrTextureProxy> GrUploadPixmapToTextureProxy(GrResourceProvider*,
23126c90e04797e15c37ec00e0f836292b8a207d294Robert Phillips                                                   const SkPixmap&, SkBudgeted);
2320d996868c3dd5af2ccb6fced488edb335185c107bsalomon
233186d2d430ba248fea1e00669154b95252ac9a486cblume/**
234186d2d430ba248fea1e00669154b95252ac9a486cblume * Creates a new texture populated with the mipmap levels.
235186d2d430ba248fea1e00669154b95252ac9a486cblume */
236186d2d430ba248fea1e00669154b95252ac9a486cblumeGrTexture* GrUploadMipMapToTexture(GrContext*, const SkImageInfo&, const GrMipLevel* texels,
237a4c41b3e83bc684b3535d36590519d6fb676742dRobert Phillips                                   int mipLevelCount, SkDestinationSurfaceColorMode colorMode);
238186d2d430ba248fea1e00669154b95252ac9a486cblume
239e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillipssk_sp<GrTexture> GrMakeCachedBitmapTexture(GrContext*, const SkBitmap&,
240e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips                                           const GrSamplerParams&, SkScalar scaleAdjust[2]);
241e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips
242e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips// This is intended to replace:
243e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    SkAutoLockPixels alp(bitmap, true);
244e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    if (!bitmap.readyToDraw()) {
245e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//        return nullptr;
246e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    }
247e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    sk_sp<GrTexture> texture = GrMakeCachedBitmapTexture(fContext.get(), bitmap,
248e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//                                                         GrSamplerParams::ClampNoFilter(),
249e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//                                                         nullptr);
250e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    if (!texture) {
251e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//        return nullptr;
252e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips//    }
25326c90e04797e15c37ec00e0f836292b8a207d294Robert Phillipssk_sp<GrTextureProxy> GrMakeCachedBitmapProxy(GrResourceProvider*, const SkBitmap& bitmap);
254e14d3053f329c97e1bd0519e9b358a887988dcb8Robert Phillips
2553b65598bceb65736486db27ed49a56d787032747Brian Osman
2563b65598bceb65736486db27ed49a56d787032747Brian Osman/**
2573b65598bceb65736486db27ed49a56d787032747Brian Osman *  Our key includes the offset, width, and height so that bitmaps created by extractSubset()
2583b65598bceb65736486db27ed49a56d787032747Brian Osman *  are unique.
2593b65598bceb65736486db27ed49a56d787032747Brian Osman *
2603b65598bceb65736486db27ed49a56d787032747Brian Osman *  The imageID is in the shared namespace (see SkNextID::ImageID())
2613b65598bceb65736486db27ed49a56d787032747Brian Osman *      - SkBitmap/SkPixelRef
2623b65598bceb65736486db27ed49a56d787032747Brian Osman *      - SkImage
2633b65598bceb65736486db27ed49a56d787032747Brian Osman *      - SkImageGenerator
2643b65598bceb65736486db27ed49a56d787032747Brian Osman *
2653b65598bceb65736486db27ed49a56d787032747Brian Osman *  Note: width/height must fit in 16bits for this impl.
2663b65598bceb65736486db27ed49a56d787032747Brian Osman */
2673b65598bceb65736486db27ed49a56d787032747Brian Osmanvoid GrMakeKeyFromImageID(GrUniqueKey* key, uint32_t imageID, const SkIRect& imageBounds);
2683b65598bceb65736486db27ed49a56d787032747Brian Osman
2693b65598bceb65736486db27ed49a56d787032747Brian Osman/** Call this after installing a GrUniqueKey on texture. It will cause the texture's key to be
2703b65598bceb65736486db27ed49a56d787032747Brian Osman    removed should the bitmap's contents change or be destroyed. */
2713b65598bceb65736486db27ed49a56d787032747Brian Osmanvoid GrInstallBitmapUniqueKeyInvalidator(const GrUniqueKey& key, SkPixelRef* pixelRef);
2723b65598bceb65736486db27ed49a56d787032747Brian Osman
273f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon//////////////////////////////////////////////////////////////////////////////
274f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
2753b65598bceb65736486db27ed49a56d787032747Brian Osman/** When image filter code needs to construct a render target context to do intermediate rendering,
2763b65598bceb65736486db27ed49a56d787032747Brian Osman    we need a renderable pixel config. The source (SkSpecialImage) may not be in a renderable
2773b65598bceb65736486db27ed49a56d787032747Brian Osman    format, but we want to preserve the color space of that source. This picks an appropriate format
2783b65598bceb65736486db27ed49a56d787032747Brian Osman    to use. */
2793b65598bceb65736486db27ed49a56d787032747Brian OsmanGrPixelConfig GrRenderableConfigForColorSpace(const SkColorSpace*);
2803b65598bceb65736486db27ed49a56d787032747Brian Osman
2813b65598bceb65736486db27ed49a56d787032747Brian Osman/**
2823b65598bceb65736486db27ed49a56d787032747Brian Osman *  If the compressed data in the SkData is supported (as a texture format, this returns
2833b65598bceb65736486db27ed49a56d787032747Brian Osman *  the pixel-config that should be used, and sets outStartOfDataToUpload to the ptr into
2843b65598bceb65736486db27ed49a56d787032747Brian Osman *  the data where the actual raw data starts (skipping any header bytes).
2853b65598bceb65736486db27ed49a56d787032747Brian Osman *
2863b65598bceb65736486db27ed49a56d787032747Brian Osman *  If the compressed data is not supported, this returns kUnknown_GrPixelConfig, and
2873b65598bceb65736486db27ed49a56d787032747Brian Osman *  ignores outStartOfDataToUpload.
2883b65598bceb65736486db27ed49a56d787032747Brian Osman */
2893b65598bceb65736486db27ed49a56d787032747Brian OsmanGrPixelConfig GrIsCompressedTextureDataSupported(GrContext* ctx, SkData* data,
2903b65598bceb65736486db27ed49a56d787032747Brian Osman                                                 int expectedW, int expectedH,
2913b65598bceb65736486db27ed49a56d787032747Brian Osman                                                 const void** outStartOfDataToUpload);
2923b65598bceb65736486db27ed49a56d787032747Brian Osman
293f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
294f276ac5c16d39a2b877300d760041f0291bb5ec9bsalomon
2958f34372f7e97482e5e61ab298b7edaa008ba2f4creed#endif
296