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