SkGr.h revision 137a4ca42423bbb6d683067ea544c9a48f18f06c
105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/*
205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Copyright 2010 Google Inc.
305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Licensed under the Apache License, Version 2.0 (the "License");
505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    you may not use this file except in compliance with the License.
605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    You may obtain a copy of the License at
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger         http://www.apache.org/licenses/LICENSE-2.0
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    Unless required by applicable law or agreed to in writing, software
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    distributed under the License is distributed on an "AS IS" BASIS,
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    See the License for the specific language governing permissions and
1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    limitations under the License.
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef SkGr_DEFINED
1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define SkGr_DEFINED
2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include <stddef.h>
2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Gr headers
2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrConfig.h"
2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrContext.h"
2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrFontScaler.h"
2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrPathIter.h"
2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrClipIterator.h"
2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// skia headers
3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkBitmap.h"
3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkPath.h"
3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkPoint.h"
3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkRegion.h"
3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkShader.h"
3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkClipStack.h"
3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if (GR_DEBUG && defined(SK_RELEASE)) || (GR_RELEASE && defined(SK_DEBUG))
3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//    #error "inconsistent GR_DEBUG and SK_DEBUG"
4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if GR_SCALAR_IS_FIXED
4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #ifdef SK_SCALAR_IS_FIXED
4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        #define SK_SCALAR_IS_GR_SCALAR  1
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #else
4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        #define SK_SCALAR_IS_GR_SCALAR  0
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #endif
4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #define SkScalarToGrScalar(x)       SkScalarToFixed(x)
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#elif GR_SCALAR_IS_FLOAT
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #ifdef SK_SCALAR_IS_FLOAT
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        #define SK_SCALAR_IS_GR_SCALAR  1
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #else
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        #define SK_SCALAR_IS_GR_SCALAR  0
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #endif
5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #define SkScalarToGrScalar(x)       SkScalarToFloat(x)
5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#else
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    #error "Ganesh scalar type not defined"
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Sk to Gr Type conversions
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Verify that SkPoint and GrPoint are compatible if using the same scalar type
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if 0/*SK_SCALAR_IS_GR_SCALAR*/
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(sizeof(SkPoint) == sizeof(GrPoint));
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(offsetof(SkPoint,fX) == offsetof(GrPoint,fX)));
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(offsetof(SkPoint,fY) == offsetof(GrPoint,fY)));
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)GrSamplerState::kClamp_WrapMode == (int)SkShader::kClamp_TileMode);
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)GrSamplerState::kRepeat_WrapMode ==(
7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                 int)SkShader::kRepeat_TileMode);
7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)GrSamplerState::kMirror_WrapMode ==
7705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                 (int)SkShader::kMirror_TileMode);
7805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define sk_tile_mode_to_grwrap(X) ((GrSamplerState::WrapMode)(X))
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kZero_BlendCoeff == (int)SkXfermode::kZero_Coeff);
8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kOne_BlendCoeff  == (int)SkXfermode::kOne_Coeff);
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kSC_BlendCoeff   == (int)SkXfermode::kSC_Coeff);
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kISC_BlendCoeff  == (int)SkXfermode::kISC_Coeff);
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kDC_BlendCoeff   == (int)SkXfermode::kDC_Coeff);
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kIDC_BlendCoeff  == (int)SkXfermode::kIDC_Coeff);
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kSA_BlendCoeff   == (int)SkXfermode::kSA_Coeff);
8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kISA_BlendCoeff  == (int)SkXfermode::kISA_Coeff);
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kDA_BlendCoeff   == (int)SkXfermode::kDA_Coeff);
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)kIDA_BlendCoeff  == (int)SkXfermode::kIDA_Coeff);
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define sk_blend_to_grblend(X) ((GrBlendCoeff)(X))
9305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kMove_Verb  == (int)kMove_PathCmd);
9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kLine_Verb  == (int)kLine_PathCmd);
9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kQuad_Verb  == (int)kQuadratic_PathCmd);
9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kCubic_Verb == (int)kCubic_PathCmd);
9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kClose_Verb == (int)kClose_PathCmd);
9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGR_STATIC_ASSERT((int)SkPath::kDone_Verb  == (int)kEnd_PathCmd);
10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define sk_path_verb_to_gr_path_command(X) ((GrPathCmd)(X))
10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkColorPriv.h"
10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline GrRect Sk2Gr(const SkRect& src) {
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return GrRect(SkScalarToGrScalar(src.fLeft),
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(src.fTop),
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(src.fRight),
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(src.fBottom));
11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGr {
11505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
11605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static inline SkIRect& SetIRect(SkIRect* dst, const GrIRect& src) {
11705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        GR_STATIC_ASSERT(sizeof(*dst) == sizeof(src));
11805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        memcpy(dst, &src, sizeof(*dst));
11905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return *dst;
12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
12105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static inline GrIRect& SetIRect(GrIRect* dst, const SkIRect& src) {
12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        GR_STATIC_ASSERT(sizeof(*dst) == sizeof(src));
12405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        memcpy(dst, &src, sizeof(*dst));
12505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return *dst;
12605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
12905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  Convert the SkBitmap::Config to the corresponding PixelConfig, or
13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  kUnknown_PixelConfig if the conversion cannot be done.
13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static GrTexture::PixelConfig BitmapConfig2PixelConfig(SkBitmap::Config,
13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                                        bool isOpaque);
13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static GrTexture::PixelConfig Bitmap2PixelConfig(const SkBitmap& bm) {
13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return BitmapConfig2PixelConfig(bm.config(), bm.isOpaque());
13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static void SkMatrix2GrMatrix(const SkMatrix& m, GrMatrix* g) {
14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        g->setAll(SkScalarToGrScalar(m[0]),
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[1]),
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[2]),
14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[3]),
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[4]),
14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[5]),
14605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[6]),
14705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[7]),
14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                  SkScalarToGrScalar(m[8]));
14905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static GrColor SkColor2GrColor(SkColor c) {
15205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkPMColor pm = SkPreMultiplyColor(c);
15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned r = SkGetPackedR32(pm);
15405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned g = SkGetPackedG32(pm);
15505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned b = SkGetPackedB32(pm);
15605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        unsigned a = SkGetPackedA32(pm);
15705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return GrColorPackRGBA(r, g, b, a);
15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    /**
16105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  This abandons all texture caches (for bitmaps and text) associated with
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  the gpu, and frees any associated skia caches. It differs from
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  deleteAllTextures in that it assumes that the gpu has lots its context,
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     *  and thus the associated HW textures are no longer valid
16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger     */
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static void AbandonAllTextures(GrContext*);
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Classes
17105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGrPathIter : public GrPathIter {
17305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
17405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrPathIter() { fPath = NULL; }
17505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrPathIter(const SkPath& path) { reset(path); }
17605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathCmd next(GrPoint pts[]);
17705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathCmd next();
17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void rewind();
17905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrConvexHint convexHint() const;
18005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void reset(const SkPath& path) {
18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fPath = &path;
18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fIter.setPath(path, false);
18405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
18505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if !SK_SCALAR_IS_GR_SCALAR
18805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkPoint             fPoints[4];
18905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
19005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkPath::Iter        fIter;
19105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkPath*       fPath;
19205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
19305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
19405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGrClipIterator : public GrClipIterator {
19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrClipIterator() { fClipStack = NULL;  fCurr = NULL; }
19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrClipIterator(const SkClipStack& clipStack) { this->reset(clipStack); }
19805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
19905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    void reset(const SkClipStack& clipStack);
20005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // overrides
20205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool isDone() const { return NULL == fCurr; }
20305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void next() { fCurr = fIter.next(); }
20405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void rewind() { this->reset(*fClipStack); }
20505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrClipType getType() const;
20605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrSetOp getOp() const;
20805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void getRect(GrRect* rect) const {
21005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        *rect = Sk2Gr(*fCurr->fRect);
21105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
21205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathIter* getPathIter() {
21405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fPathIter.reset(*fCurr->fPath);
21505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return &fPathIter;
21605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
21705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathFill getPathFill() const;
21905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
22005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
22105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkClipStack*                  fClipStack;
22205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkClipStack::B2FIter                fIter;
22305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrPathIter                        fPathIter;
22405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // SkClipStack's auto advances on each get
22505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // so we store the current pos here.
22605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkClipStack::B2FIter::Clip*   fCurr;
22705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
22805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
22905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGrRegionIterator : public GrClipIterator {
23005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
23105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrRegionIterator() {}
23205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGrRegionIterator(const SkRegion& region) { this->reset(region); }
23305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
234137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    void reset(const SkRegion& region) {
23505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fRegion = &region;
23605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        fIter.reset(region);
23705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
23805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
23905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // overrides
24005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool isDone() const { return fIter.done(); }
24105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void next() { fIter.next(); }
24205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void rewind() { this->reset(*fRegion); }
24305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrClipType getType() const { return kRect_ClipType; }
24405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
24505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrSetOp getOp() const { return kUnion_SetOp; }
24605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
24705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual void getRect(GrRect* rect) const {
24805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        const SkIRect& r = fIter.rect();
24905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fLeft   = GrIntToScalar(r.fLeft);
25005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fTop    = GrIntToScalar(r.fTop);
25105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fRight  = GrIntToScalar(r.fRight);
25205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        rect->fBottom = GrIntToScalar(r.fBottom);
25305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
25405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
25505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathIter* getPathIter() {
25605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkASSERT(0);
25705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return NULL;
25805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
25905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
26005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual GrPathFill getPathFill() const {
26105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        SkASSERT(0);
26205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return kWinding_PathFill;
26305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    }
26405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
26505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    const SkRegion*     fRegion;
26605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkRegion::Iterator  fIter;
26705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
26805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
26905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGlyphCache;
27005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
27105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass SkGrFontScaler : public GrFontScaler {
27205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic:
27305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    explicit SkGrFontScaler(SkGlyphCache* strike);
27405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual ~SkGrFontScaler();
27505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
27605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    // overrides
27705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual const GrKey* getKey();
278137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    virtual GrMaskFormat getMaskFormat();
27905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool getPackedGlyphBounds(GrGlyph::PackedID, GrIRect* bounds);
28005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool getPackedGlyphImage(GrGlyph::PackedID, int width, int height,
28105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                     int rowBytes, void* image);
28205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    virtual bool getGlyphPath(uint16_t glyphID, GrPath*);
28305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
28405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate:
28505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    SkGlyphCache* fStrike;
28605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrKey*  fKey;
28705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//    DECLARE_INSTANCE_COUNTER(SkGrFontScaler);
28805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
28905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
29005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger////////////////////////////////////////////////////////////////////////////////
29105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// Helper functions
29205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
29305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerGrTextureEntry* sk_gr_create_bitmap_texture(GrContext* ctx,
29405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                            GrTextureKey* key,
29505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                            const GrSamplerState& sampler,
29605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                                            const SkBitmap& bitmap);
29705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
29805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
29905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
300