OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkCanvas_DEFINED | 8 #ifndef SkCanvas_DEFINED |
9 #define SkCanvas_DEFINED | 9 #define SkCanvas_DEFINED |
10 | 10 |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 limit the size of the offscreen, and thus drawing may be | 384 limit the size of the offscreen, and thus drawing may be |
385 clipped to it, though that clipping is not guaranteed to | 385 clipped to it, though that clipping is not guaranteed to |
386 happen. If exact clipping is desired, use clipRect(). | 386 happen. If exact clipping is desired, use clipRect(). |
387 @param alpha This is applied to the offscreen when restore() is called. | 387 @param alpha This is applied to the offscreen when restore() is called. |
388 @param flags LayerFlags | 388 @param flags LayerFlags |
389 @return The value to pass to restoreToCount() to balance this save() | 389 @return The value to pass to restoreToCount() to balance this save() |
390 */ | 390 */ |
391 SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated") | 391 SK_ATTR_EXTERNALLY_DEPRECATED("SaveFlags use is deprecated") |
392 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha, SaveFlags flags); | 392 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha, SaveFlags flags); |
393 | 393 |
| 394 enum { |
| 395 kIsOpaque_SaveLayerFlag = 1 << 0, |
| 396 kPreserveLCDText_SaveLayerFlag = 1 << 1, |
| 397 }; |
| 398 typedef uint32_t SaveLayerFlags; |
| 399 |
| 400 struct SaveLayerRec { |
| 401 SaveLayerRec() : fBounds(nullptr), fPaint(nullptr), fSaveLayerFlags(0) {
} |
| 402 SaveLayerRec(const SkRect* bounds, const SkPaint* paint, SaveLayerFlags
saveLayerFlags = 0) |
| 403 : fBounds(bounds) |
| 404 , fPaint(paint) |
| 405 , fSaveLayerFlags(saveLayerFlags) |
| 406 {} |
| 407 |
| 408 const SkRect* fBounds; // optional |
| 409 const SkPaint* fPaint; // optional |
| 410 SaveLayerFlags fSaveLayerFlags; |
| 411 }; |
| 412 |
| 413 int saveLayer(const SaveLayerRec&); |
| 414 |
394 /** This call balances a previous call to save(), and is used to remove all | 415 /** This call balances a previous call to save(), and is used to remove all |
395 modifications to the matrix/clip/drawFilter state since the last save | 416 modifications to the matrix/clip/drawFilter state since the last save |
396 call. | 417 call. |
397 It is an error to call restore() more times than save() was called. | 418 It is an error to call restore() more times than save() was called. |
398 */ | 419 */ |
399 void restore(); | 420 void restore(); |
400 | 421 |
401 /** Returns the number of matrix/clip states on the SkCanvas' private stack. | 422 /** Returns the number of matrix/clip states on the SkCanvas' private stack. |
402 This will equal # save() calls - # restore() calls + 1. The save count o
n | 423 This will equal # save() calls - # restore() calls + 1. The save count o
n |
403 a new canvas is 1. | 424 a new canvas is 1. |
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 protected: | 1231 protected: |
1211 // default impl defers to getDevice()->newSurface(info) | 1232 // default impl defers to getDevice()->newSurface(info) |
1212 virtual SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&); | 1233 virtual SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&); |
1213 | 1234 |
1214 // default impl defers to its device | 1235 // default impl defers to its device |
1215 virtual bool onPeekPixels(SkPixmap*); | 1236 virtual bool onPeekPixels(SkPixmap*); |
1216 virtual bool onAccessTopLayerPixels(SkPixmap*); | 1237 virtual bool onAccessTopLayerPixels(SkPixmap*); |
1217 | 1238 |
1218 // Subclass save/restore notifiers. | 1239 // Subclass save/restore notifiers. |
1219 // Overriders should call the corresponding INHERITED method up the inherita
nce chain. | 1240 // Overriders should call the corresponding INHERITED method up the inherita
nce chain. |
1220 // willSaveLayer()'s return value may suppress full layer allocation. | 1241 // getSaveLayerStrategy()'s return value may suppress full layer allocation. |
1221 enum SaveLayerStrategy { | 1242 enum SaveLayerStrategy { |
1222 kFullLayer_SaveLayerStrategy, | 1243 kFullLayer_SaveLayerStrategy, |
1223 kNoLayer_SaveLayerStrategy | 1244 kNoLayer_SaveLayerStrategy, |
1224 }; | 1245 }; |
1225 | 1246 |
1226 virtual void willSave() {} | 1247 virtual void willSave() {} |
| 1248 #ifdef SK_SUPPORT_LEGACY_SAVELAYERPARAMS |
1227 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveF
lags) { | 1249 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveF
lags) { |
1228 return kFullLayer_SaveLayerStrategy; | 1250 return kFullLayer_SaveLayerStrategy; |
1229 } | 1251 } |
| 1252 virtual SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&); |
| 1253 #else |
| 1254 // Overriders should call the corresponding INHERITED method up the inherita
nce chain. |
| 1255 virtual SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) { |
| 1256 return kFullLayer_SaveLayerStrategy; |
| 1257 } |
| 1258 #endif |
1230 virtual void willRestore() {} | 1259 virtual void willRestore() {} |
1231 virtual void didRestore() {} | 1260 virtual void didRestore() {} |
1232 virtual void didConcat(const SkMatrix&) {} | 1261 virtual void didConcat(const SkMatrix&) {} |
1233 virtual void didSetMatrix(const SkMatrix&) {} | 1262 virtual void didSetMatrix(const SkMatrix&) {} |
1234 | 1263 |
1235 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&); | 1264 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&); |
1236 | 1265 |
1237 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, | 1266 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, |
1238 SkScalar y, const SkPaint& paint); | 1267 SkScalar y, const SkPaint& paint); |
1239 | 1268 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 // Returns the canvas to be used by DrawIter. Default implementation | 1326 // Returns the canvas to be used by DrawIter. Default implementation |
1298 // returns this. Subclasses that encapsulate an indirect canvas may | 1327 // returns this. Subclasses that encapsulate an indirect canvas may |
1299 // need to overload this method. The impl must keep track of this, as it | 1328 // need to overload this method. The impl must keep track of this, as it |
1300 // is not released or deleted by the caller. | 1329 // is not released or deleted by the caller. |
1301 virtual SkCanvas* canvasForDrawIter(); | 1330 virtual SkCanvas* canvasForDrawIter(); |
1302 | 1331 |
1303 // Clip rectangle bounds. Called internally by saveLayer. | 1332 // Clip rectangle bounds. Called internally by saveLayer. |
1304 // returns false if the entire rectangle is entirely clipped out | 1333 // returns false if the entire rectangle is entirely clipped out |
1305 // If non-NULL, The imageFilter parameter will be used to expand the clip | 1334 // If non-NULL, The imageFilter parameter will be used to expand the clip |
1306 // and offscreen bounds for any margin required by the filter DAG. | 1335 // and offscreen bounds for any margin required by the filter DAG. |
1307 bool clipRectBounds(const SkRect* bounds, SaveFlags flags, | 1336 bool clipRectBounds(const SkRect* bounds, SaveLayerFlags, SkIRect* intersect
ion, |
1308 SkIRect* intersection, | |
1309 const SkImageFilter* imageFilter = NULL); | 1337 const SkImageFilter* imageFilter = NULL); |
1310 | 1338 |
1311 private: | 1339 private: |
1312 enum PrivateSaveFlags { | 1340 enum PrivateSaveLayerFlags { |
1313 // These must not overlap the public flags. | 1341 kDontClipToLayer_PrivateSaveLayerFlag = 1 << 31, |
1314 kPreserveLCDText_PrivateSaveFlag = 1 << 5, | |
1315 }; | 1342 }; |
1316 | 1343 |
| 1344 static bool BoundsAffectsClip(SaveLayerFlags); |
| 1345 static uint32_t SaveFlagsToSaveLayerFlags(SaveFlags); |
| 1346 |
1317 enum ShaderOverrideOpacity { | 1347 enum ShaderOverrideOpacity { |
1318 kNone_ShaderOverrideOpacity, //!< there is no overriding shader (
bitmap or image) | 1348 kNone_ShaderOverrideOpacity, //!< there is no overriding shader (
bitmap or image) |
1319 kOpaque_ShaderOverrideOpacity, //!< the overriding shader is opaque | 1349 kOpaque_ShaderOverrideOpacity, //!< the overriding shader is opaque |
1320 kNotOpaque_ShaderOverrideOpacity, //!< the overriding shader may not b
e opaque | 1350 kNotOpaque_ShaderOverrideOpacity, //!< the overriding shader may not b
e opaque |
1321 }; | 1351 }; |
1322 | 1352 |
1323 // notify our surface (if we have one) that we are about to draw, so it | 1353 // notify our surface (if we have one) that we are about to draw, so it |
1324 // can perform copy-on-write or invalidate any cached images | 1354 // can perform copy-on-write or invalidate any cached images |
1325 void predrawNotify(bool willOverwritesEntireSurface = false); | 1355 void predrawNotify(bool willOverwritesEntireSurface = false); |
1326 void predrawNotify(const SkRect* rect, const SkPaint* paint, ShaderOverrideO
pacity); | 1356 void predrawNotify(const SkRect* rect, const SkPaint* paint, ShaderOverrideO
pacity); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1366 | 1396 |
1367 friend class SkDrawIter; // needs setupDrawForLayerDevice() | 1397 friend class SkDrawIter; // needs setupDrawForLayerDevice() |
1368 friend class AutoDrawLooper; | 1398 friend class AutoDrawLooper; |
1369 friend class SkLua; // needs top layer size and offset | 1399 friend class SkLua; // needs top layer size and offset |
1370 friend class SkDebugCanvas; // needs experimental fAllowSimplifyClip | 1400 friend class SkDebugCanvas; // needs experimental fAllowSimplifyClip |
1371 friend class SkSurface_Raster; // needs getDevice() | 1401 friend class SkSurface_Raster; // needs getDevice() |
1372 friend class SkRecorder; // InitFlags | 1402 friend class SkRecorder; // InitFlags |
1373 friend class SkNoSaveLayerCanvas; // InitFlags | 1403 friend class SkNoSaveLayerCanvas; // InitFlags |
1374 friend class SkPictureImageFilter; // SkCanvas(SkBaseDevice*, SkSurfaceProp
s*, InitFlags) | 1404 friend class SkPictureImageFilter; // SkCanvas(SkBaseDevice*, SkSurfaceProp
s*, InitFlags) |
1375 friend class SkPictureRecord; // predrawNotify (why does it need it? <reed
>) | 1405 friend class SkPictureRecord; // predrawNotify (why does it need it? <reed
>) |
| 1406 friend class SkPicturePlayback; // SaveFlagsToSaveLayerFlags |
1376 | 1407 |
1377 enum InitFlags { | 1408 enum InitFlags { |
1378 kDefault_InitFlags = 0, | 1409 kDefault_InitFlags = 0, |
1379 kConservativeRasterClip_InitFlag = 1 << 0, | 1410 kConservativeRasterClip_InitFlag = 1 << 0, |
1380 }; | 1411 }; |
1381 SkCanvas(const SkIRect& bounds, InitFlags); | 1412 SkCanvas(const SkIRect& bounds, InitFlags); |
1382 SkCanvas(SkBaseDevice* device, InitFlags); | 1413 SkCanvas(SkBaseDevice* device, InitFlags); |
1383 | 1414 |
1384 void resetForNextPicture(const SkIRect& bounds); | 1415 void resetForNextPicture(const SkIRect& bounds); |
1385 | 1416 |
(...skipping 11 matching lines...) Expand all Loading... |
1397 * Gets the size/origin of the top level layer in global canvas coordinates.
We don't want this | 1428 * Gets the size/origin of the top level layer in global canvas coordinates.
We don't want this |
1398 * to be public because it exposes decisions about layer sizes that are inte
rnal to the canvas. | 1429 * to be public because it exposes decisions about layer sizes that are inte
rnal to the canvas. |
1399 */ | 1430 */ |
1400 SkISize getTopLayerSize() const; | 1431 SkISize getTopLayerSize() const; |
1401 SkIPoint getTopLayerOrigin() const; | 1432 SkIPoint getTopLayerOrigin() const; |
1402 | 1433 |
1403 void internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, | 1434 void internalDrawBitmapRect(const SkBitmap& bitmap, const SkRect* src, |
1404 const SkRect& dst, const SkPaint* paint, | 1435 const SkRect& dst, const SkPaint* paint, |
1405 SrcRectConstraint); | 1436 SrcRectConstraint); |
1406 void internalDrawPaint(const SkPaint& paint); | 1437 void internalDrawPaint(const SkPaint& paint); |
1407 void internalSaveLayer(const SkRect* bounds, const SkPaint*, SaveFlags, Save
LayerStrategy); | 1438 void internalSaveLayer(const SaveLayerRec&, SaveLayerStrategy); |
1408 void internalDrawDevice(SkBaseDevice*, int x, int y, const SkPaint*, bool is
BitmapDevice); | 1439 void internalDrawDevice(SkBaseDevice*, int x, int y, const SkPaint*, bool is
BitmapDevice); |
1409 | 1440 |
1410 // shared by save() and saveLayer() | 1441 // shared by save() and saveLayer() |
1411 void internalSave(); | 1442 void internalSave(); |
1412 void internalRestore(); | 1443 void internalRestore(); |
1413 static void DrawRect(const SkDraw& draw, const SkPaint& paint, | 1444 static void DrawRect(const SkDraw& draw, const SkPaint& paint, |
1414 const SkRect& r, SkScalar textSize); | 1445 const SkRect& r, SkScalar textSize); |
1415 static void DrawTextDecorations(const SkDraw& draw, const SkPaint& paint, | 1446 static void DrawTextDecorations(const SkDraw& draw, const SkPaint& paint, |
1416 const char text[], size_t byteLength, | 1447 const char text[], size_t byteLength, |
1417 SkScalar x, SkScalar y); | 1448 SkScalar x, SkScalar y); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1563 | 1594 |
1564 class SkCanvasClipVisitor { | 1595 class SkCanvasClipVisitor { |
1565 public: | 1596 public: |
1566 virtual ~SkCanvasClipVisitor(); | 1597 virtual ~SkCanvasClipVisitor(); |
1567 virtual void clipRect(const SkRect&, SkRegion::Op, bool antialias) = 0; | 1598 virtual void clipRect(const SkRect&, SkRegion::Op, bool antialias) = 0; |
1568 virtual void clipRRect(const SkRRect&, SkRegion::Op, bool antialias) = 0; | 1599 virtual void clipRRect(const SkRRect&, SkRegion::Op, bool antialias) = 0; |
1569 virtual void clipPath(const SkPath&, SkRegion::Op, bool antialias) = 0; | 1600 virtual void clipPath(const SkPath&, SkRegion::Op, bool antialias) = 0; |
1570 }; | 1601 }; |
1571 | 1602 |
1572 #endif | 1603 #endif |
OLD | NEW |