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