• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 
11 #ifndef SkGPipe_DEFINED
12 #define SkGPipe_DEFINED
13 
14 #include "SkWriter32.h"
15 #include "SkFlattenable.h"
16 
17 class SkCanvas;
18 
19 // XLib.h might have defined Status already (ugh)
20 #ifdef Status
21     #undef Status
22 #endif
23 
24 class SkGPipeReader {
25 public:
26     SkGPipeReader(SkCanvas* target);
27     ~SkGPipeReader();
28 
29     enum Status {
30         kDone_Status,   //!< no more data expected from reader
31         kEOF_Status,    //!< need more data from reader
32         kError_Status,  //!< encountered error
33         kReadAtom_Status//!< finished reading an atom
34     };
35 
36     // data must be 4-byte aligned
37     // length must be a multiple of 4
38     Status playback(const void* data, size_t length, size_t* bytesRead = NULL,
39                     bool readAtom = false);
40 private:
41     SkCanvas*           fCanvas;
42     class SkGPipeState* fState;
43 };
44 
45 ///////////////////////////////////////////////////////////////////////////////
46 
47 class SkGPipeController {
48 public:
49     /**
50      *  Called periodically by the writer, to get a working buffer of RAM to
51      *  write into. The actual size of the block is also returned, and must be
52      *  actual >= minRequest. If NULL is returned, then actual is ignored and
53      *  writing will stop.
54      *
55      *  The returned block must be 4-byte aligned, and actual must be a
56      *  multiple of 4.
57      *  minRequest will always be a multiple of 4.
58      */
59     virtual void* requestBlock(size_t minRequest, size_t* actual) = 0;
60 
61     /**
62      *  This is called each time some atomic portion of the data has been
63      *  written to the block (most recently returned by requestBlock()).
64      *  If bytes == 0, then the writer has finished.
65      *
66      *  bytes will always be a multiple of 4.
67      */
68     virtual void notifyWritten(size_t bytes) = 0;
69 };
70 
71 class SkGPipeWriter {
72 public:
73     SkGPipeWriter();
74     ~SkGPipeWriter();
75 
isRecording()76     bool isRecording() const { return NULL != fCanvas; }
77 
78     enum Flags {
79         kCrossProcess_Flag = 1 << 0,
80     };
81 
82     SkCanvas* startRecording(SkGPipeController*, uint32_t flags = 0);
83 
84     // called in destructor, but can be called sooner once you know there
85     // should be no more drawing calls made into the recording canvas.
86     void endRecording();
87 
88 private:
89     class SkGPipeCanvas* fCanvas;
90     SkGPipeController*   fController;
91     SkFactorySet         fFactorySet;
92     SkWriter32 fWriter;
93 };
94 
95 #endif
96