Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(173)

Side by Side Diff: skia/ext/cdl_canvas.h

Issue 2523673004: [NOT FOR COMMIT] Fully replace SkCanvas uses.
Patch Set: Support Android build. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « skia/ext/bitmap_platform_device_skia.cc ('k') | skia/ext/cdl_canvas.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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_
OLDNEW
« no previous file with comments | « skia/ext/bitmap_platform_device_skia.cc ('k') | skia/ext/cdl_canvas.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698