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 = ®ion; 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