blob: 10f1bd09d533b1516c3f96752dc466a1044e2687 [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.comd302f142011-03-03 13:54:13 +0000172
173 void reset(const SkPath& path) {
174 fPath = &path;
175 fIter.setPath(path, false);
176 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000177private:
bsalomon@google.com5782d712011-01-21 21:03:59 +0000178
reed@google.comac10a2d2010-12-22 21:39:39 +0000179#if !SK_SCALAR_IS_GR_SCALAR
180 SkPoint fPoints[4];
181#endif
182 SkPath::Iter fIter;
bsalomon@google.comd302f142011-03-03 13:54:13 +0000183 const SkPath* fPath;
reed@google.comac10a2d2010-12-22 21:39:39 +0000184};
185
186class SkGrClipIterator : public GrClipIterator {
187public:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000188 SkGrClipIterator() { fClipStack = NULL; fCurr = NULL; }
189 SkGrClipIterator(const SkClipStack& clipStack) { this->reset(clipStack); }
190
191 void reset(const SkClipStack& clipStack);
192
193 // overrides
194 virtual bool isDone() const { return NULL == fCurr; }
195 virtual void next() { fCurr = fIter.next(); }
196 virtual void rewind() { this->reset(*fClipStack); }
197 virtual GrClipType getType() const;
198
199 virtual GrSetOp getOp() const;
200
201 virtual void getRect(GrRect* rect) const {
scroggo7b118072011-03-23 15:04:26 +0000202 if (!fCurr->fRect) {
203 rect->setEmpty();
204 } else {
205 *rect = Sk2Gr(*fCurr->fRect);
206 }
bsalomon@google.comd302f142011-03-03 13:54:13 +0000207 }
208
209 virtual GrPathIter* getPathIter() {
210 fPathIter.reset(*fCurr->fPath);
211 return &fPathIter;
212 }
213
214 virtual GrPathFill getPathFill() const;
215
216private:
217 const SkClipStack* fClipStack;
218 SkClipStack::B2FIter fIter;
219 SkGrPathIter fPathIter;
220 // SkClipStack's auto advances on each get
221 // so we store the current pos here.
222 const SkClipStack::B2FIter::Clip* fCurr;
223};
224
225class SkGrRegionIterator : public GrClipIterator {
226public:
227 SkGrRegionIterator() {}
228 SkGrRegionIterator(const SkRegion& region) { this->reset(region); }
229
reed@google.com98539c62011-03-15 15:40:16 +0000230 void reset(const SkRegion& region) {
bsalomon@google.comd302f142011-03-03 13:54:13 +0000231 fRegion = &region;
232 fIter.reset(region);
reed@google.comac10a2d2010-12-22 21:39:39 +0000233 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000234
reed@google.comac10a2d2010-12-22 21:39:39 +0000235 // overrides
bsalomon@google.comd302f142011-03-03 13:54:13 +0000236 virtual bool isDone() const { return fIter.done(); }
reed@google.comac10a2d2010-12-22 21:39:39 +0000237 virtual void next() { fIter.next(); }
bsalomon@google.comd302f142011-03-03 13:54:13 +0000238 virtual void rewind() { this->reset(*fRegion); }
239 virtual GrClipType getType() const { return kRect_ClipType; }
reed@google.comac10a2d2010-12-22 21:39:39 +0000240
bsalomon@google.comd302f142011-03-03 13:54:13 +0000241 virtual GrSetOp getOp() const { return kUnion_SetOp; }
242
243 virtual void getRect(GrRect* rect) const {
244 const SkIRect& r = fIter.rect();
245 rect->fLeft = GrIntToScalar(r.fLeft);
246 rect->fTop = GrIntToScalar(r.fTop);
247 rect->fRight = GrIntToScalar(r.fRight);
248 rect->fBottom = GrIntToScalar(r.fBottom);
249 }
250
251 virtual GrPathIter* getPathIter() {
252 SkASSERT(0);
253 return NULL;
254 }
255
256 virtual GrPathFill getPathFill() const {
257 SkASSERT(0);
258 return kWinding_PathFill;
259 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000260private:
bsalomon@google.comd302f142011-03-03 13:54:13 +0000261 const SkRegion* fRegion;
262 SkRegion::Iterator fIter;
reed@google.comac10a2d2010-12-22 21:39:39 +0000263};
264
265class SkGlyphCache;
266
267class SkGrFontScaler : public GrFontScaler {
268public:
269 explicit SkGrFontScaler(SkGlyphCache* strike);
270 virtual ~SkGrFontScaler();
271
272 // overrides
273 virtual const GrKey* getKey();
reed@google.com98539c62011-03-15 15:40:16 +0000274 virtual GrMaskFormat getMaskFormat();
reed@google.comac10a2d2010-12-22 21:39:39 +0000275 virtual bool getPackedGlyphBounds(GrGlyph::PackedID, GrIRect* bounds);
276 virtual bool getPackedGlyphImage(GrGlyph::PackedID, int width, int height,
277 int rowBytes, void* image);
278 virtual bool getGlyphPath(uint16_t glyphID, GrPath*);
279
280private:
281 SkGlyphCache* fStrike;
282 GrKey* fKey;
283// DECLARE_INSTANCE_COUNTER(SkGrFontScaler);
284};
285
286////////////////////////////////////////////////////////////////////////////////
287// Helper functions
288
bsalomon@google.com5782d712011-01-21 21:03:59 +0000289GrTextureEntry* sk_gr_create_bitmap_texture(GrContext* ctx,
reed@google.comac10a2d2010-12-22 21:39:39 +0000290 GrTextureKey* key,
291 const GrSamplerState& sampler,
292 const SkBitmap& bitmap);
293
reed@google.comac10a2d2010-12-22 21:39:39 +0000294
295#endif