blob: bcb6766022195c00a2746cb8158ffc63d8d5d041 [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 */
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000132 static GrPixelConfig BitmapConfig2PixelConfig(SkBitmap::Config,
133 bool isOpaque);
reed@google.comac10a2d2010-12-22 21:39:39 +0000134
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000135 static GrPixelConfig Bitmap2PixelConfig(const SkBitmap& bm) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000136 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 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000159};
160
161////////////////////////////////////////////////////////////////////////////////
162// Classes
163
164class SkGrPathIter : public GrPathIter {
165public:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000166 SkGrPathIter() { fPath = NULL; }
167 SkGrPathIter(const SkPath& path) { reset(path); }
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +0000168 virtual GrPathCmd next(GrPoint pts[]);
169 virtual GrPathCmd next();
reed@google.comac10a2d2010-12-22 21:39:39 +0000170 virtual void rewind();
bsalomon@google.combf4338c2011-03-04 22:48:25 +0000171 virtual GrConvexHint convexHint() const;
bsalomon@google.com06e17952011-04-27 21:13:04 +0000172 virtual bool getConservativeBounds(GrRect* rect) const;
bsalomon@google.comd302f142011-03-03 13:54:13 +0000173
174 void reset(const SkPath& path) {
175 fPath = &path;
176 fIter.setPath(path, false);
177 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000178private:
bsalomon@google.com5782d712011-01-21 21:03:59 +0000179
reed@google.comac10a2d2010-12-22 21:39:39 +0000180#if !SK_SCALAR_IS_GR_SCALAR
181 SkPoint fPoints[4];
182#endif
183 SkPath::Iter fIter;
bsalomon@google.comd302f142011-03-03 13:54:13 +0000184 const SkPath* fPath;
reed@google.comac10a2d2010-12-22 21:39:39 +0000185};
186
187class SkGrClipIterator : public GrClipIterator {
188public:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000189 SkGrClipIterator() { fClipStack = NULL; fCurr = NULL; }
190 SkGrClipIterator(const SkClipStack& clipStack) { this->reset(clipStack); }
191
192 void reset(const SkClipStack& clipStack);
193
194 // overrides
195 virtual bool isDone() const { return NULL == fCurr; }
196 virtual void next() { fCurr = fIter.next(); }
197 virtual void rewind() { this->reset(*fClipStack); }
198 virtual GrClipType getType() const;
199
200 virtual GrSetOp getOp() const;
201
202 virtual void getRect(GrRect* rect) const {
scroggo7b118072011-03-23 15:04:26 +0000203 if (!fCurr->fRect) {
204 rect->setEmpty();
205 } else {
206 *rect = Sk2Gr(*fCurr->fRect);
207 }
bsalomon@google.comd302f142011-03-03 13:54:13 +0000208 }
209
210 virtual GrPathIter* getPathIter() {
211 fPathIter.reset(*fCurr->fPath);
212 return &fPathIter;
213 }
214
215 virtual GrPathFill getPathFill() const;
216
217private:
218 const SkClipStack* fClipStack;
219 SkClipStack::B2FIter fIter;
220 SkGrPathIter fPathIter;
221 // SkClipStack's auto advances on each get
222 // so we store the current pos here.
223 const SkClipStack::B2FIter::Clip* fCurr;
224};
225
226class SkGrRegionIterator : public GrClipIterator {
227public:
228 SkGrRegionIterator() {}
229 SkGrRegionIterator(const SkRegion& region) { this->reset(region); }
230
reed@google.com98539c62011-03-15 15:40:16 +0000231 void reset(const SkRegion& region) {
bsalomon@google.comd302f142011-03-03 13:54:13 +0000232 fRegion = &region;
233 fIter.reset(region);
reed@google.comac10a2d2010-12-22 21:39:39 +0000234 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000235
reed@google.comac10a2d2010-12-22 21:39:39 +0000236 // overrides
bsalomon@google.comd302f142011-03-03 13:54:13 +0000237 virtual bool isDone() const { return fIter.done(); }
reed@google.comac10a2d2010-12-22 21:39:39 +0000238 virtual void next() { fIter.next(); }
bsalomon@google.comd302f142011-03-03 13:54:13 +0000239 virtual void rewind() { this->reset(*fRegion); }
240 virtual GrClipType getType() const { return kRect_ClipType; }
reed@google.comac10a2d2010-12-22 21:39:39 +0000241
bsalomon@google.comd302f142011-03-03 13:54:13 +0000242 virtual GrSetOp getOp() const { return kUnion_SetOp; }
243
244 virtual void getRect(GrRect* rect) const {
245 const SkIRect& r = fIter.rect();
246 rect->fLeft = GrIntToScalar(r.fLeft);
247 rect->fTop = GrIntToScalar(r.fTop);
248 rect->fRight = GrIntToScalar(r.fRight);
249 rect->fBottom = GrIntToScalar(r.fBottom);
250 }
251
252 virtual GrPathIter* getPathIter() {
253 SkASSERT(0);
254 return NULL;
255 }
256
257 virtual GrPathFill getPathFill() const {
258 SkASSERT(0);
259 return kWinding_PathFill;
260 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000261private:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000262 const SkRegion* fRegion;
263 SkRegion::Iterator fIter;
reed@google.comac10a2d2010-12-22 21:39:39 +0000264};
265
266class SkGlyphCache;
267
268class SkGrFontScaler : public GrFontScaler {
269public:
270 explicit SkGrFontScaler(SkGlyphCache* strike);
271 virtual ~SkGrFontScaler();
272
273 // overrides
274 virtual const GrKey* getKey();
reed@google.com98539c62011-03-15 15:40:16 +0000275 virtual GrMaskFormat getMaskFormat();
reed@google.comac10a2d2010-12-22 21:39:39 +0000276 virtual bool getPackedGlyphBounds(GrGlyph::PackedID, GrIRect* bounds);
277 virtual bool getPackedGlyphImage(GrGlyph::PackedID, int width, int height,
278 int rowBytes, void* image);
279 virtual bool getGlyphPath(uint16_t glyphID, GrPath*);
280
281private:
282 SkGlyphCache* fStrike;
283 GrKey* fKey;
284// DECLARE_INSTANCE_COUNTER(SkGrFontScaler);
285};
286
287////////////////////////////////////////////////////////////////////////////////
288// Helper functions
289
bsalomon@google.com5782d712011-01-21 21:03:59 +0000290GrTextureEntry* sk_gr_create_bitmap_texture(GrContext* ctx,
reed@google.comac10a2d2010-12-22 21:39:39 +0000291 GrTextureKey* key,
292 const GrSamplerState& sampler,
293 const SkBitmap& bitmap);
294
reed@google.comac10a2d2010-12-22 21:39:39 +0000295
296#endif