| OLD | NEW |
| (Empty) | |
| 1 /* |
| 2 * Copyright 2016 Google Inc. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. |
| 6 */ |
| 7 |
| 8 #ifndef SKIA_EXT_CDL_CANVAS_H_ |
| 9 #define SKIA_EXT_CDL_CANVAS_H_ |
| 10 |
| 11 #include "cdl_common.h" |
| 12 |
| 13 #if CDL_ENABLED |
| 14 |
| 15 #include "third_party/skia/include/core/SkBitmap.h" |
| 16 #include "third_party/skia/include/core/SkCanvas.h" |
| 17 #include "third_party/skia/include/core/SkColorFilter.h" |
| 18 #include "third_party/skia/include/core/SkDrawLooper.h" |
| 19 #include "third_party/skia/include/core/SkImageFilter.h" |
| 20 #include "third_party/skia/include/core/SkPaint.h" |
| 21 #include "third_party/skia/include/core/SkPathEffect.h" |
| 22 #include "third_party/skia/include/utils/SkNWayCanvas.h" |
| 23 |
| 24 class CdlPaint; |
| 25 class CdlPicture; |
| 26 |
| 27 class SK_API CdlCanvas : public SkRefCnt { |
| 28 public: |
| 29 static sk_sp<CdlCanvas> Make(SkCanvas* canvas); |
| 30 |
| 31 CdlCanvas(); |
| 32 explicit CdlCanvas(SkCanvas* canvas); |
| 33 explicit CdlCanvas(const SkBitmap& bitmap); |
| 34 explicit CdlCanvas(SkBaseDevice* device); |
| 35 CdlCanvas(int width, int height); |
| 36 CdlCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props); |
| 37 ~CdlCanvas() override; |
| 38 |
| 39 SkCanvas* skCanvas() { return canvas_; } |
| 40 const SkCanvas* skCanvas() const { return canvas_; } |
| 41 |
| 42 // Save / Restore |
| 43 int save(); |
| 44 void restore(); |
| 45 |
| 46 typedef uint32_t SaveLayerFlags; |
| 47 |
| 48 struct SaveLayerRec { |
| 49 SaveLayerRec() |
| 50 : fBounds(nullptr), |
| 51 fPaint(nullptr), |
| 52 fBackdrop(nullptr), |
| 53 fSaveLayerFlags(0) {} |
| 54 SaveLayerRec(const SkRect* bounds, |
| 55 const CdlPaint* paint, |
| 56 SaveLayerFlags saveLayerFlags = 0) |
| 57 : fBounds(bounds), |
| 58 fPaint(paint), |
| 59 fBackdrop(nullptr), |
| 60 fSaveLayerFlags(saveLayerFlags) {} |
| 61 SaveLayerRec(const SkRect* bounds, |
| 62 const CdlPaint* paint, |
| 63 const SkImageFilter* backdrop, |
| 64 SaveLayerFlags saveLayerFlags) |
| 65 : fBounds(bounds), |
| 66 fPaint(paint), |
| 67 fBackdrop(backdrop), |
| 68 fSaveLayerFlags(saveLayerFlags) {} |
| 69 |
| 70 const SkRect* fBounds; // optional |
| 71 const CdlPaint* fPaint; // optional |
| 72 const SkImageFilter* fBackdrop; // optional |
| 73 SaveLayerFlags fSaveLayerFlags; |
| 74 }; |
| 75 |
| 76 int saveLayer(const SkRect* bounds, const CdlPaint* paint); |
| 77 int saveLayer(const SkRect& bounds, const CdlPaint* paint) { |
| 78 return this->saveLayer(&bounds, paint); |
| 79 } |
| 80 int saveLayer(const SaveLayerRec& origRec); |
| 81 int saveLayerAlpha(const SkRect* bounds, U8CPU alpha); |
| 82 int saveLayerPreserveLCDTextRequests(const SkRect* bounds, |
| 83 const CdlPaint* paint); |
| 84 |
| 85 int getSaveCount() const; |
| 86 void restoreToCount(int saveCount); |
| 87 |
| 88 // Transform |
| 89 void concat(const SkMatrix& matrix); |
| 90 void rotate(SkScalar degrees); |
| 91 void rotate(SkScalar degrees, SkScalar px, SkScalar py); |
| 92 void scale(SkScalar sx, SkScalar sy); |
| 93 void translate(SkScalar dx, SkScalar dy); |
| 94 |
| 95 void resetMatrix(); |
| 96 void setMatrix(const SkMatrix& matrix); |
| 97 const SkMatrix& getTotalMatrix() const; |
| 98 |
| 99 // Clip |
| 100 SkISize getBaseLayerSize() const; |
| 101 bool getClipBounds(SkRect* bounds) const; |
| 102 bool getClipDeviceBounds(SkIRect* bounds) const; |
| 103 const SkClipStack* getClipStack() const; |
| 104 bool isClipEmpty() const; |
| 105 bool isClipRect() const; |
| 106 bool quickReject(const SkRect& rect) const; |
| 107 |
| 108 void clipRect(const SkRect& rect, SkCanvas::ClipOp, bool doAntiAlias); |
| 109 void clipRect(const SkRect& rect, SkCanvas::ClipOp op) { |
| 110 this->clipRect(rect, op, false); |
| 111 } |
| 112 void clipRect(const SkRect& rect, bool doAntiAlias = false) { |
| 113 this->clipRect(rect, SkCanvas::kIntersect_Op, doAntiAlias); |
| 114 } |
| 115 |
| 116 void clipRRect(const SkRRect& rrect, SkCanvas::ClipOp op, bool doAntiAlias); |
| 117 void clipRRect(const SkRRect& rrect, SkCanvas::ClipOp op) { |
| 118 this->clipRRect(rrect, op, false); |
| 119 } |
| 120 void clipRRect(const SkRRect& rrect, bool doAntiAlias = false) { |
| 121 this->clipRRect(rrect, SkCanvas::kIntersect_Op, doAntiAlias); |
| 122 } |
| 123 |
| 124 void clipPath(const SkPath& path, SkCanvas::ClipOp op, bool doAntiAlias); |
| 125 void clipPath(const SkPath& path, SkCanvas::ClipOp op) { |
| 126 this->clipPath(path, op, false); |
| 127 } |
| 128 void clipPath(const SkPath& path, bool doAntiAlias = false) { |
| 129 this->clipPath(path, SkCanvas::kIntersect_Op, doAntiAlias); |
| 130 } |
| 131 |
| 132 void clipRegion(const SkRegion& deviceRgn, |
| 133 SkCanvas::ClipOp op = SkCanvas::kIntersect_Op); |
| 134 |
| 135 // Draw |
| 136 void drawColor(SkColor color, SkBlendMode mode = SkBlendMode::kSrcOver); |
| 137 void drawPaint(const CdlPaint& paint); |
| 138 void drawPoint(SkScalar x, SkScalar y, const CdlPaint& paint); |
| 139 void drawPoint(SkScalar x, SkScalar y, SkColor color); |
| 140 void drawPoints(SkCanvas::PointMode mode, |
| 141 size_t count, |
| 142 const SkPoint pts[], |
| 143 const CdlPaint& paint); |
| 144 |
| 145 void drawLine(SkScalar x0, |
| 146 SkScalar y0, |
| 147 SkScalar x1, |
| 148 SkScalar y1, |
| 149 const CdlPaint& paint); |
| 150 |
| 151 void drawCircle(SkScalar cx, |
| 152 SkScalar cy, |
| 153 SkScalar radius, |
| 154 const CdlPaint& paint); |
| 155 void drawOval(const SkRect& oval, const CdlPaint&); |
| 156 |
| 157 void drawRect(const SkRect&, const CdlPaint&); |
| 158 void drawRoundRect(const SkRect& rect, |
| 159 SkScalar rx, |
| 160 SkScalar ry, |
| 161 const CdlPaint& paint); |
| 162 void drawRectCoords(SkScalar left, |
| 163 SkScalar top, |
| 164 SkScalar right, |
| 165 SkScalar bottom, |
| 166 const CdlPaint& paint); |
| 167 void drawRRect(const SkRRect& rrect, const CdlPaint& paint); |
| 168 void drawDRRect(const SkRRect& outer, const SkRRect& inner, const CdlPaint&); |
| 169 void drawIRect(const SkIRect& rect, const CdlPaint& paint) { |
| 170 SkRect r; |
| 171 r.set(rect); // promotes the ints to scalars |
| 172 this->drawRect(r, paint); |
| 173 } |
| 174 |
| 175 void drawPath(const SkPath& path, const CdlPaint& paint); |
| 176 |
| 177 void drawBitmap(const SkBitmap& bitmap, |
| 178 SkScalar left, |
| 179 SkScalar top, |
| 180 const CdlPaint* paint = NULL); |
| 181 |
| 182 void drawImage(const SkImage* image, |
| 183 SkScalar left, |
| 184 SkScalar top, |
| 185 const CdlPaint* paint = NULL); |
| 186 void drawImage(const sk_sp<SkImage>& image, |
| 187 SkScalar left, |
| 188 SkScalar top, |
| 189 const CdlPaint* paint = NULL) { |
| 190 this->drawImage(image.get(), left, top, paint); |
| 191 } |
| 192 |
| 193 void drawImageRect(const SkImage* image, |
| 194 const SkRect& src, |
| 195 const SkRect& dst, |
| 196 const CdlPaint* paint, |
| 197 SkCanvas::SrcRectConstraint constraint = |
| 198 SkCanvas::kStrict_SrcRectConstraint); |
| 199 // variant that takes src SkIRect |
| 200 void drawImageRect( |
| 201 const SkImage* image, |
| 202 const SkIRect& isrc, |
| 203 const SkRect& dst, |
| 204 const CdlPaint* paint, |
| 205 SkCanvas::SrcRectConstraint = SkCanvas::kStrict_SrcRectConstraint); |
| 206 // variant that assumes src == image-bounds |
| 207 void drawImageRect( |
| 208 const SkImage* image, |
| 209 const SkRect& dst, |
| 210 const CdlPaint* paint, |
| 211 SkCanvas::SrcRectConstraint = SkCanvas::kStrict_SrcRectConstraint); |
| 212 |
| 213 void drawImageRect(const sk_sp<SkImage>& image, |
| 214 const SkRect& src, |
| 215 const SkRect& dst, |
| 216 const CdlPaint* paint, |
| 217 SkCanvas::SrcRectConstraint constraint = |
| 218 SkCanvas::kStrict_SrcRectConstraint) { |
| 219 this->drawImageRect(image.get(), src, dst, paint, constraint); |
| 220 } |
| 221 void drawImageRect( |
| 222 const sk_sp<SkImage>& image, |
| 223 const SkIRect& isrc, |
| 224 const SkRect& dst, |
| 225 const CdlPaint* paint, |
| 226 SkCanvas::SrcRectConstraint cons = SkCanvas::kStrict_SrcRectConstraint) { |
| 227 this->drawImageRect(image.get(), isrc, dst, paint, cons); |
| 228 } |
| 229 void drawImageRect( |
| 230 const sk_sp<SkImage>& image, |
| 231 const SkRect& dst, |
| 232 const CdlPaint* paint, |
| 233 SkCanvas::SrcRectConstraint cons = SkCanvas::kStrict_SrcRectConstraint) { |
| 234 this->drawImageRect(image.get(), dst, paint, cons); |
| 235 } |
| 236 |
| 237 void drawText(const void* text, |
| 238 size_t byteLength, |
| 239 SkScalar x, |
| 240 SkScalar y, |
| 241 const CdlPaint& paint); |
| 242 void drawPosText(const void* text, |
| 243 size_t byteLength, |
| 244 const SkPoint pos[], |
| 245 const CdlPaint& paint); |
| 246 void drawTextBlob(const SkTextBlob* blob, |
| 247 SkScalar x, |
| 248 SkScalar y, |
| 249 const CdlPaint& paint); |
| 250 void drawTextBlob(const sk_sp<SkTextBlob>& blob, |
| 251 SkScalar x, |
| 252 SkScalar y, |
| 253 const CdlPaint& paint) { |
| 254 this->drawTextBlob(blob.get(), x, y, paint); |
| 255 } |
| 256 |
| 257 void drawPicture(const CdlPicture* picture) { |
| 258 this->drawPicture(picture, NULL, NULL); |
| 259 } |
| 260 void drawPicture(const sk_sp<CdlPicture>& picture) { |
| 261 this->drawPicture(picture.get()); |
| 262 } |
| 263 void drawPicture(const CdlPicture*, |
| 264 const SkMatrix* matrix, |
| 265 const CdlPaint* paint); |
| 266 void drawPicture(const sk_sp<CdlPicture>& picture, |
| 267 const SkMatrix* matrix, |
| 268 const CdlPaint* paint) { |
| 269 this->drawPicture(picture.get(), matrix, paint); |
| 270 } |
| 271 |
| 272 // Misc |
| 273 void flush(); |
| 274 void discard() { this->onDiscard(); } |
| 275 void clear(SkColor color) { this->drawColor(color, SkBlendMode::kSrc); } |
| 276 bool readPixels(SkBitmap* bitmap, int srcX, int srcY); |
| 277 bool writePixels(const SkImageInfo&, |
| 278 const void* pixels, |
| 279 size_t rowBytes, |
| 280 int x, |
| 281 int y); |
| 282 bool writePixels(const SkBitmap& bitmap, int x, int y); |
| 283 |
| 284 protected: |
| 285 enum SaveLayerStrategy { |
| 286 kFullLayer_SaveLayerStrategy, |
| 287 kNoLayer_SaveLayerStrategy, |
| 288 }; |
| 289 |
| 290 virtual int onSave(); |
| 291 virtual int onSaveLayer(const SaveLayerRec&); |
| 292 virtual void onRestore(); |
| 293 |
| 294 virtual void onConcat(const SkMatrix&); |
| 295 virtual void onSetMatrix(const SkMatrix&); |
| 296 virtual void onTranslate(SkScalar, SkScalar); |
| 297 |
| 298 enum ClipEdgeStyle { kHard_ClipEdgeStyle, kSoft_ClipEdgeStyle }; |
| 299 |
| 300 virtual void onClipRect(const SkRect&, SkCanvas::ClipOp, ClipEdgeStyle); |
| 301 virtual void onClipRRect(const SkRRect&, SkCanvas::ClipOp, ClipEdgeStyle); |
| 302 virtual void onClipPath(const SkPath&, SkCanvas::ClipOp, ClipEdgeStyle); |
| 303 virtual void onClipRegion(const SkRegion&, SkCanvas::ClipOp); |
| 304 |
| 305 virtual void onDiscard(); |
| 306 |
| 307 virtual void onDrawPaint(const CdlPaint&); |
| 308 virtual void onDrawPath(const SkPath&, const CdlPaint&); |
| 309 virtual void onDrawRect(const SkRect&, const CdlPaint&); |
| 310 virtual void onDrawOval(const SkRect&, const CdlPaint&); |
| 311 virtual void onDrawRRect(const SkRRect&, const CdlPaint&); |
| 312 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const CdlPaint&); |
| 313 |
| 314 virtual void onDrawPicture(const CdlPicture* picture, |
| 315 const SkMatrix* matrix, |
| 316 const CdlPaint* paint); |
| 317 virtual void onDrawAnnotation(const SkRect&, const char[], SkData*); |
| 318 |
| 319 virtual void onDrawText(const void*, |
| 320 size_t, |
| 321 SkScalar x, |
| 322 SkScalar y, |
| 323 const CdlPaint&); |
| 324 virtual void onDrawPosText(const void*, |
| 325 size_t, |
| 326 const SkPoint[], |
| 327 const CdlPaint&); |
| 328 virtual void onDrawTextBlob(const SkTextBlob*, |
| 329 SkScalar, |
| 330 SkScalar, |
| 331 const CdlPaint&); |
| 332 |
| 333 virtual void onDrawImage(const SkImage*, SkScalar, SkScalar, const CdlPaint*); |
| 334 |
| 335 virtual void onDrawImageRect(const SkImage*, |
| 336 const SkRect*, |
| 337 const SkRect&, |
| 338 const CdlPaint*, |
| 339 SkCanvas::SrcRectConstraint); |
| 340 |
| 341 virtual void onDrawPoints(SkCanvas::PointMode, |
| 342 size_t count, |
| 343 const SkPoint pts[], |
| 344 const CdlPaint&); |
| 345 |
| 346 std::unique_ptr<SkCanvas> owned_canvas_; |
| 347 SkCanvas* canvas_; |
| 348 }; |
| 349 |
| 350 class CdlAutoCanvasRestore : SkNoncopyable { |
| 351 public: |
| 352 CdlAutoCanvasRestore(CdlCanvas* canvas, bool doSave) |
| 353 : fCanvas(canvas), fSaveCount(0) { |
| 354 if (fCanvas) { |
| 355 fSaveCount = canvas->getSaveCount(); |
| 356 if (doSave) { |
| 357 canvas->save(); |
| 358 } |
| 359 } |
| 360 } |
| 361 ~CdlAutoCanvasRestore() { |
| 362 if (fCanvas) { |
| 363 fCanvas->restoreToCount(fSaveCount); |
| 364 } |
| 365 } |
| 366 |
| 367 /** |
| 368 * Perform the restore now, instead of waiting for the destructor. Will |
| 369 * only do this once. |
| 370 */ |
| 371 void restore() { |
| 372 if (fCanvas) { |
| 373 fCanvas->restoreToCount(fSaveCount); |
| 374 fCanvas = NULL; |
| 375 } |
| 376 } |
| 377 |
| 378 private: |
| 379 CdlCanvas* fCanvas; |
| 380 int fSaveCount; |
| 381 }; |
| 382 |
| 383 class SK_API CdlPassThroughCanvas : public CdlCanvas { |
| 384 public: |
| 385 CdlPassThroughCanvas(SkCanvas* canvas); |
| 386 ~CdlPassThroughCanvas() override; |
| 387 }; |
| 388 |
| 389 inline SK_API const SkCanvas* GetSkCanvas(const CdlCanvas* canvas) { |
| 390 return canvas->skCanvas(); |
| 391 } |
| 392 inline SK_API SkCanvas* GetSkCanvas(CdlCanvas* canvas) { |
| 393 return canvas->skCanvas(); |
| 394 } |
| 395 |
| 396 //#define CDL_WRAP_SKCANVAS(x) (CdlCanvas::Make(x).get()) |
| 397 |
| 398 #else |
| 399 |
| 400 #include "third_party/skia/include/core/SkCanvas.h" |
| 401 #include "third_party/skia/include/utils/SkNWayCanvas.h" |
| 402 |
| 403 class SK_API CdlPassThroughCanvas : public SkNWayCanvas { |
| 404 public: |
| 405 CdlPassThroughCanvas(SkCanvas* canvas); |
| 406 ~CdlPassThroughCanvas() override; |
| 407 }; |
| 408 |
| 409 inline const SK_API SkCanvas* GetSkCanvas(const CdlCanvas* canvas) { |
| 410 return canvas; |
| 411 } |
| 412 inline SK_API SkCanvas* GetSkCanvas(CdlCanvas* canvas) { |
| 413 return canvas; |
| 414 } |
| 415 |
| 416 //#define CDL_WRAP_SKCANVAS(x) (x) |
| 417 |
| 418 #endif // CDL_ENABLED |
| 419 |
| 420 #endif // SKIA_EXT_CDL_CANVAS_H_ |
| OLD | NEW |