• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 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 SkMiniRecorder_DEFINED
9 #define SkMiniRecorder_DEFINED
10 
11 #include "include/core/SkScalar.h"
12 #include "include/core/SkTypes.h"
13 #include "include/private/SkNoncopyable.h"
14 #include "src/core/SkRecords.h"
15 class SkCanvas;
16 
17 // Records small pictures, but only a limited subset of the canvas API, and may fail.
18 class SkMiniRecorder : SkNoncopyable {
19 public:
20     SkMiniRecorder();
21     ~SkMiniRecorder();
22 
23     // Try to record an op.  Returns false on failure.
24     bool drawPath(const SkPath&, const SkPaint&);
25     bool drawRect(const SkRect&, const SkPaint&);
26     bool drawTextBlob(const SkTextBlob*, SkScalar x, SkScalar y, const SkPaint&);
27 
28     // Detach anything we've recorded as a picture, resetting this SkMiniRecorder.
29     // If cull is nullptr we'll calculate it.
30     sk_sp<SkPicture> detachAsPicture(const SkRect* cull);
31 
32     // Flush anything we've recorded to the canvas, resetting this SkMiniRecorder.
33     // This is logically the same as but rather more efficient than:
34     //    sk_sp<SkPicture> pic(this->detachAsPicture(nullptr));
35     //    pic->playback(canvas);
36     void flushAndReset(SkCanvas*);
37 
38 private:
39     enum class State {
40         kEmpty,
41         kDrawPath,
42         kDrawRect,
43         kDrawTextBlob,
44     };
45 
46     State fState;
47 
48     template <size_t A, size_t B>
49     struct Max { static const size_t val = A > B ? A : B; };
50 
51     static const size_t kInlineStorage =
52         Max<sizeof(SkRecords::DrawPath),
53         Max<sizeof(SkRecords::DrawRect),
54             sizeof(SkRecords::DrawTextBlob)>::val>::val;
55     alignas(void*) alignas(double) char fBuffer[kInlineStorage];
56 };
57 
58 #endif//SkMiniRecorder_DEFINED
59