105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef SkGr_DEFINED
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define SkGr_DEFINED
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include <stddef.h>
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Gr headers
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrTypes.h"
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrContext.h"
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrFontScaler.h"
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrClipIterator.h"
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "GrPath.h"
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// skia headers
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkBitmap.h"
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkPath.h"
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkPoint.h"
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkRegion.h"
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkShader.h"
2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkClipStack.h"
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if (GR_DEBUG && defined(SK_RELEASE)) || (GR_RELEASE && defined(SK_DEBUG))
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//    #error "inconsistent GR_DEBUG and SK_DEBUG"
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Sk to Gr Type conversions
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)GrSamplerState::kClamp_WrapMode == (int)SkShader::kClamp_TileMode);
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)GrSamplerState::kRepeat_WrapMode ==(
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                 int)SkShader::kRepeat_TileMode);
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)GrSamplerState::kMirror_WrapMode ==
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                 (int)SkShader::kMirror_TileMode);
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define sk_tile_mode_to_grwrap(X) ((GrSamplerState::WrapMode)(X))
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kZero_BlendCoeff == (int)SkXfermode::kZero_Coeff);
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kOne_BlendCoeff  == (int)SkXfermode::kOne_Coeff);
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kSC_BlendCoeff   == (int)SkXfermode::kSC_Coeff);
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kISC_BlendCoeff  == (int)SkXfermode::kISC_Coeff);
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kDC_BlendCoeff   == (int)SkXfermode::kDC_Coeff);
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kIDC_BlendCoeff  == (int)SkXfermode::kIDC_Coeff);
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kSA_BlendCoeff   == (int)SkXfermode::kSA_Coeff);
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kISA_BlendCoeff  == (int)SkXfermode::kISA_Coeff);
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kDA_BlendCoeff   == (int)SkXfermode::kDA_Coeff);
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kIDA_BlendCoeff  == (int)SkXfermode::kIDA_Coeff);
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define sk_blend_to_grblend(X) ((GrBlendCoeff)(X))
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kMove_Verb  == (int)kMove_PathCmd);
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kLine_Verb  == (int)kLine_PathCmd);
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kQuad_Verb  == (int)kQuadratic_PathCmd);
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kCubic_Verb == (int)kCubic_PathCmd);
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kClose_Verb == (int)kClose_PathCmd);
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kDone_Verb  == (int)kEnd_PathCmd);
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define sk_path_verb_to_gr_path_command(X) ((GrPathCmd)(X))
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkColorPriv.h"
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGr {
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Convert the SkBitmap::Config to the corresponding PixelConfig, or
7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  kUnknown_PixelConfig if the conversion cannot be done.
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
7887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    static GrPixelConfig BitmapConfig2PixelConfig(SkBitmap::Config,
7987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger                                                  bool isOpaque);
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    static GrPixelConfig Bitmap2PixelConfig(const SkBitmap& bm) {
8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return BitmapConfig2PixelConfig(bm.config(), bm.isOpaque());
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static GrColor SkColor2GrColor(SkColor c) {
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkPMColor pm = SkPreMultiplyColor(c);
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned r = SkGetPackedR32(pm);
8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned g = SkGetPackedG32(pm);
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned b = SkGetPackedB32(pm);
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned a = SkGetPackedA32(pm);
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return GrColorPackRGBA(r, g, b, a);
9205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
9305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Classes
9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGrClipIterator : public GrClipIterator {
9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrClipIterator() { fClipStack = NULL;  fCurr = NULL; }
10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrClipIterator(const SkClipStack& clipStack) { this->reset(clipStack); }
10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void reset(const SkClipStack& clipStack);
10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // overrides
10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool isDone() const { return NULL == fCurr; }
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void next() { fCurr = fIter.next(); }
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void rewind() { this->reset(*fClipStack); }
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrClipType getType() const;
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrSetOp getOp() const;
11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void getRect(GrRect* rect) const {
11487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        if (!fCurr->fRect) {
11587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            rect->setEmpty();
11687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        } else {
11735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger            *rect = *fCurr->fRect;
11887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        }
11905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual const GrPath* getPath() {
1220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return fCurr->fPath;
12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
12405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathFill getPathFill() const;
12605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
12805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkClipStack*                  fClipStack;
12905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkClipStack::B2FIter                fIter;
13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // SkClipStack's auto advances on each get
13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // so we store the current pos here.
13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkClipStack::B2FIter::Clip*   fCurr;
13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGrRegionIterator : public GrClipIterator {
13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrRegionIterator() {}
13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrRegionIterator(const SkRegion& region) { this->reset(region); }
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
140137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    void reset(const SkRegion& region) {
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fRegion = &region;
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fIter.reset(region);
14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // overrides
14605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool isDone() const { return fIter.done(); }
14705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void next() { fIter.next(); }
14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void rewind() { this->reset(*fRegion); }
14905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrClipType getType() const { return kRect_ClipType; }
15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrSetOp getOp() const { return kUnion_SetOp; }
15205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void getRect(GrRect* rect) const {
15405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        const SkIRect& r = fIter.rect();
15505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fLeft   = GrIntToScalar(r.fLeft);
15605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fTop    = GrIntToScalar(r.fTop);
15705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fRight  = GrIntToScalar(r.fRight);
15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fBottom = GrIntToScalar(r.fBottom);
15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual const GrPath* getPath() {
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkASSERT(0);
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return NULL;
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathFill getPathFill() const {
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkASSERT(0);
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return kWinding_PathFill;
16905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
17105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkRegion*     fRegion;
17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkRegion::Iterator  fIter;
17305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
17405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGlyphCache;
17605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGrFontScaler : public GrFontScaler {
17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
17905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    explicit SkGrFontScaler(SkGlyphCache* strike);
18005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual ~SkGrFontScaler();
18105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // overrides
18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual const GrKey* getKey();
184137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    virtual GrMaskFormat getMaskFormat();
18505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool getPackedGlyphBounds(GrGlyph::PackedID, GrIRect* bounds);
18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool getPackedGlyphImage(GrGlyph::PackedID, int width, int height,
18705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                     int rowBytes, void* image);
18805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool getGlyphPath(uint16_t glyphID, GrPath*);
18905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
19005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
19105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGlyphCache* fStrike;
19205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrKey*  fKey;
19305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//    DECLARE_INSTANCE_COUNTER(SkGrFontScaler);
19405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Helper functions
19805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const GrContext::TextureKey gUNCACHED_KEY = ~0;
2001cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGrContext::TextureCacheEntry sk_gr_create_bitmap_texture(GrContext* ctx,
2011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                GrContext::TextureKey key,
2021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                const GrSamplerState* sampler,
2031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                const SkBitmap& bitmap);
20405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
207