blob: a7c0c1d880fad72f7be8dd86cac5f155b2fcf237 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
2 Copyright 2010 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17
18#ifndef SkGr_DEFINED
19#define SkGr_DEFINED
20
21#include <stddef.h>
22
bsalomon@google.comd302f142011-03-03 13:54:13 +000023// Gr headers
reed@google.comac10a2d2010-12-22 21:39:39 +000024#include "GrConfig.h"
25#include "GrContext.h"
26#include "GrFontScaler.h"
27#include "GrPathIter.h"
28#include "GrClipIterator.h"
29
30// skia headers
31#include "SkBitmap.h"
32#include "SkPath.h"
33#include "SkPoint.h"
34#include "SkRegion.h"
35#include "SkShader.h"
bsalomon@google.comd302f142011-03-03 13:54:13 +000036#include "SkClipStack.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000037
38#if (GR_DEBUG && defined(SK_RELEASE)) || (GR_RELEASE && defined(SK_DEBUG))
39// #error "inconsistent GR_DEBUG and SK_DEBUG"
40#endif
41
42#if GR_SCALAR_IS_FIXED
43 #ifdef SK_SCALAR_IS_FIXED
44 #define SK_SCALAR_IS_GR_SCALAR 1
45 #else
46 #define SK_SCALAR_IS_GR_SCALAR 0
47 #endif
48 #define SkScalarToGrScalar(x) SkScalarToFixed(x)
49
50#elif GR_SCALAR_IS_FLOAT
51
52 #ifdef SK_SCALAR_IS_FLOAT
53 #define SK_SCALAR_IS_GR_SCALAR 1
54 #else
55 #define SK_SCALAR_IS_GR_SCALAR 0
56 #endif
57 #define SkScalarToGrScalar(x) SkScalarToFloat(x)
58
bsalomon@google.com5782d712011-01-21 21:03:59 +000059#else
reed@google.comac10a2d2010-12-22 21:39:39 +000060 #error "Ganesh scalar type not defined"
61#endif
62
63////////////////////////////////////////////////////////////////////////////////
64// Sk to Gr Type conversions
65
66// Verify that SkPoint and GrPoint are compatible if using the same scalar type
67#if 0/*SK_SCALAR_IS_GR_SCALAR*/
68 GR_STATIC_ASSERT(sizeof(SkPoint) == sizeof(GrPoint));
69 GR_STATIC_ASSERT(offsetof(SkPoint,fX) == offsetof(GrPoint,fX)));
70 GR_STATIC_ASSERT(offsetof(SkPoint,fY) == offsetof(GrPoint,fY)));
71#endif
72
73GR_STATIC_ASSERT((int)GrSamplerState::kClamp_WrapMode == (int)SkShader::kClamp_TileMode);
74GR_STATIC_ASSERT((int)GrSamplerState::kRepeat_WrapMode ==(
75 int)SkShader::kRepeat_TileMode);
bsalomon@google.com5782d712011-01-21 21:03:59 +000076GR_STATIC_ASSERT((int)GrSamplerState::kMirror_WrapMode ==
reed@google.comac10a2d2010-12-22 21:39:39 +000077 (int)SkShader::kMirror_TileMode);
78
79#define sk_tile_mode_to_grwrap(X) ((GrSamplerState::WrapMode)(X))
80
bsalomon@google.comffca4002011-02-22 20:34:01 +000081GR_STATIC_ASSERT((int)kZero_BlendCoeff == (int)SkXfermode::kZero_Coeff);
82GR_STATIC_ASSERT((int)kOne_BlendCoeff == (int)SkXfermode::kOne_Coeff);
83GR_STATIC_ASSERT((int)kSC_BlendCoeff == (int)SkXfermode::kSC_Coeff);
84GR_STATIC_ASSERT((int)kISC_BlendCoeff == (int)SkXfermode::kISC_Coeff);
85GR_STATIC_ASSERT((int)kDC_BlendCoeff == (int)SkXfermode::kDC_Coeff);
86GR_STATIC_ASSERT((int)kIDC_BlendCoeff == (int)SkXfermode::kIDC_Coeff);
87GR_STATIC_ASSERT((int)kSA_BlendCoeff == (int)SkXfermode::kSA_Coeff);
88GR_STATIC_ASSERT((int)kISA_BlendCoeff == (int)SkXfermode::kISA_Coeff);
89GR_STATIC_ASSERT((int)kDA_BlendCoeff == (int)SkXfermode::kDA_Coeff);
90GR_STATIC_ASSERT((int)kIDA_BlendCoeff == (int)SkXfermode::kIDA_Coeff);
reed@google.comac10a2d2010-12-22 21:39:39 +000091
bsalomon@google.comffca4002011-02-22 20:34:01 +000092#define sk_blend_to_grblend(X) ((GrBlendCoeff)(X))
reed@google.comac10a2d2010-12-22 21:39:39 +000093
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000094GR_STATIC_ASSERT((int)SkPath::kMove_Verb == (int)kMove_PathCmd);
95GR_STATIC_ASSERT((int)SkPath::kLine_Verb == (int)kLine_PathCmd);
96GR_STATIC_ASSERT((int)SkPath::kQuad_Verb == (int)kQuadratic_PathCmd);
97GR_STATIC_ASSERT((int)SkPath::kCubic_Verb == (int)kCubic_PathCmd);
98GR_STATIC_ASSERT((int)SkPath::kClose_Verb == (int)kClose_PathCmd);
99GR_STATIC_ASSERT((int)SkPath::kDone_Verb == (int)kEnd_PathCmd);
reed@google.comac10a2d2010-12-22 21:39:39 +0000100
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +0000101#define sk_path_verb_to_gr_path_command(X) ((GrPathCmd)(X))
reed@google.comac10a2d2010-12-22 21:39:39 +0000102
103///////////////////////////////////////////////////////////////////////////////
104
105#include "SkColorPriv.h"
106
107static inline GrRect Sk2Gr(const SkRect& src) {
108 return GrRect(SkScalarToGrScalar(src.fLeft),
109 SkScalarToGrScalar(src.fTop),
110 SkScalarToGrScalar(src.fRight),
111 SkScalarToGrScalar(src.fBottom));
112}
113
114class SkGr {
115public:
116 static inline SkIRect& SetIRect(SkIRect* dst, const GrIRect& src) {
117 GR_STATIC_ASSERT(sizeof(*dst) == sizeof(src));
118 memcpy(dst, &src, sizeof(*dst));
119 return *dst;
120 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000121
reed@google.comac10a2d2010-12-22 21:39:39 +0000122 static inline GrIRect& SetIRect(GrIRect* dst, const SkIRect& src) {
123 GR_STATIC_ASSERT(sizeof(*dst) == sizeof(src));
124 memcpy(dst, &src, sizeof(*dst));
125 return *dst;
126 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000127
reed@google.comac10a2d2010-12-22 21:39:39 +0000128 /**
129 * Convert the SkBitmap::Config to the corresponding PixelConfig, or
130 * kUnknown_PixelConfig if the conversion cannot be done.
131 */
132 static GrTexture::PixelConfig BitmapConfig2PixelConfig(SkBitmap::Config,
133 bool isOpaque);
134
135 static GrTexture::PixelConfig Bitmap2PixelConfig(const SkBitmap& bm) {
136 return BitmapConfig2PixelConfig(bm.config(), bm.isOpaque());
137 }
138
139 static void SkMatrix2GrMatrix(const SkMatrix& m, GrMatrix* g) {
140 g->setAll(SkScalarToGrScalar(m[0]),
141 SkScalarToGrScalar(m[1]),
142 SkScalarToGrScalar(m[2]),
143 SkScalarToGrScalar(m[3]),
144 SkScalarToGrScalar(m[4]),
145 SkScalarToGrScalar(m[5]),
146 SkScalarToGrScalar(m[6]),
147 SkScalarToGrScalar(m[7]),
148 SkScalarToGrScalar(m[8]));
149 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000150
reed@google.comac10a2d2010-12-22 21:39:39 +0000151 static GrColor SkColor2GrColor(SkColor c) {
152 SkPMColor pm = SkPreMultiplyColor(c);
153 unsigned r = SkGetPackedR32(pm);
154 unsigned g = SkGetPackedG32(pm);
155 unsigned b = SkGetPackedB32(pm);
156 unsigned a = SkGetPackedA32(pm);
157 return GrColorPackRGBA(r, g, b, a);
158 }
159
160 /**
161 * This abandons all texture caches (for bitmaps and text) associated with
162 * the gpu, and frees any associated skia caches. It differs from
163 * deleteAllTextures in that it assumes that the gpu has lots its context,
164 * and thus the associated HW textures are no longer valid
165 */
166 static void AbandonAllTextures(GrContext*);
167};
168
169////////////////////////////////////////////////////////////////////////////////
170// Classes
171
172class SkGrPathIter : public GrPathIter {
173public:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000174 SkGrPathIter() { fPath = NULL; }
175 SkGrPathIter(const SkPath& path) { reset(path); }
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +0000176 virtual GrPathCmd next(GrPoint pts[]);
177 virtual GrPathCmd next();
reed@google.comac10a2d2010-12-22 21:39:39 +0000178 virtual void rewind();
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +0000179 virtual GrConvexHint hint() const;
bsalomon@google.comd302f142011-03-03 13:54:13 +0000180
181 void reset(const SkPath& path) {
182 fPath = &path;
183 fIter.setPath(path, false);
184 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000185private:
bsalomon@google.com5782d712011-01-21 21:03:59 +0000186
reed@google.comac10a2d2010-12-22 21:39:39 +0000187#if !SK_SCALAR_IS_GR_SCALAR
188 SkPoint fPoints[4];
189#endif
190 SkPath::Iter fIter;
bsalomon@google.comd302f142011-03-03 13:54:13 +0000191 const SkPath* fPath;
reed@google.comac10a2d2010-12-22 21:39:39 +0000192};
193
194class SkGrClipIterator : public GrClipIterator {
195public:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000196 SkGrClipIterator() { fClipStack = NULL; fCurr = NULL; }
197 SkGrClipIterator(const SkClipStack& clipStack) { this->reset(clipStack); }
198
199 void reset(const SkClipStack& clipStack);
200
201 // overrides
202 virtual bool isDone() const { return NULL == fCurr; }
203 virtual void next() { fCurr = fIter.next(); }
204 virtual void rewind() { this->reset(*fClipStack); }
205 virtual GrClipType getType() const;
206
207 virtual GrSetOp getOp() const;
208
209 virtual void getRect(GrRect* rect) const {
210 *rect = Sk2Gr(*fCurr->fRect);
211 }
212
213 virtual GrPathIter* getPathIter() {
214 fPathIter.reset(*fCurr->fPath);
215 return &fPathIter;
216 }
217
218 virtual GrPathFill getPathFill() const;
219
220private:
221 const SkClipStack* fClipStack;
222 SkClipStack::B2FIter fIter;
223 SkGrPathIter fPathIter;
224 // SkClipStack's auto advances on each get
225 // so we store the current pos here.
226 const SkClipStack::B2FIter::Clip* fCurr;
227};
228
229class SkGrRegionIterator : public GrClipIterator {
230public:
231 SkGrRegionIterator() {}
232 SkGrRegionIterator(const SkRegion& region) { this->reset(region); }
233
234 void reset(const SkRegion& region) {
235 fRegion = &region;
236 fIter.reset(region);
reed@google.comac10a2d2010-12-22 21:39:39 +0000237 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000238
reed@google.comac10a2d2010-12-22 21:39:39 +0000239 // overrides
bsalomon@google.comd302f142011-03-03 13:54:13 +0000240 virtual bool isDone() const { return fIter.done(); }
reed@google.comac10a2d2010-12-22 21:39:39 +0000241 virtual void next() { fIter.next(); }
bsalomon@google.comd302f142011-03-03 13:54:13 +0000242 virtual void rewind() { this->reset(*fRegion); }
243 virtual GrClipType getType() const { return kRect_ClipType; }
reed@google.comac10a2d2010-12-22 21:39:39 +0000244
bsalomon@google.comd302f142011-03-03 13:54:13 +0000245 virtual GrSetOp getOp() const { return kUnion_SetOp; }
246
247 virtual void getRect(GrRect* rect) const {
248 const SkIRect& r = fIter.rect();
249 rect->fLeft = GrIntToScalar(r.fLeft);
250 rect->fTop = GrIntToScalar(r.fTop);
251 rect->fRight = GrIntToScalar(r.fRight);
252 rect->fBottom = GrIntToScalar(r.fBottom);
253 }
254
255 virtual GrPathIter* getPathIter() {
256 SkASSERT(0);
257 return NULL;
258 }
259
260 virtual GrPathFill getPathFill() const {
261 SkASSERT(0);
262 return kWinding_PathFill;
263 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000264private:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000265 const SkRegion* fRegion;
266 SkRegion::Iterator fIter;
reed@google.comac10a2d2010-12-22 21:39:39 +0000267};
268
269class SkGlyphCache;
270
271class SkGrFontScaler : public GrFontScaler {
272public:
273 explicit SkGrFontScaler(SkGlyphCache* strike);
274 virtual ~SkGrFontScaler();
275
276 // overrides
277 virtual const GrKey* getKey();
278 virtual bool getPackedGlyphBounds(GrGlyph::PackedID, GrIRect* bounds);
279 virtual bool getPackedGlyphImage(GrGlyph::PackedID, int width, int height,
280 int rowBytes, void* image);
281 virtual bool getGlyphPath(uint16_t glyphID, GrPath*);
282
283private:
284 SkGlyphCache* fStrike;
285 GrKey* fKey;
286// DECLARE_INSTANCE_COUNTER(SkGrFontScaler);
287};
288
289////////////////////////////////////////////////////////////////////////////////
290// Helper functions
291
bsalomon@google.com5782d712011-01-21 21:03:59 +0000292GrTextureEntry* sk_gr_create_bitmap_texture(GrContext* ctx,
reed@google.comac10a2d2010-12-22 21:39:39 +0000293 GrTextureKey* key,
294 const GrSamplerState& sampler,
295 const SkBitmap& bitmap);
296
reed@google.comac10a2d2010-12-22 21:39:39 +0000297
298#endif