10b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SkGPipe_DEFINED
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SkGPipe_DEFINED
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkWriter32.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkFlattenable.h"
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkCanvas;
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// XLib.h might have defined Status already (ugh)
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef Status
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #undef Status
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGPipeReader {
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkGPipeReader(SkCanvas* target);
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ~SkGPipeReader();
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    enum Status {
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kDone_Status,   //!< no more data expected from reader
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kEOF_Status,    //!< need more data from reader
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kError_Status,  //!< encountered error
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        kReadAtom_Status//!< finished reading an atom
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    };
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // data must be 4-byte aligned
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // length must be a multiple of 4
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    Status playback(const void* data, size_t length, size_t* bytesRead = NULL,
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    bool readAtom = false);
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkCanvas*           fCanvas;
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    class SkGPipeState* fState;
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGPipeController {
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /**
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  Called periodically by the writer, to get a working buffer of RAM to
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  write into. The actual size of the block is also returned, and must be
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  actual >= minRequest. If NULL is returned, then actual is ignored and
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  writing will stop.
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  The returned block must be 4-byte aligned, and actual must be a
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  multiple of 4.
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  minRequest will always be a multiple of 4.
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void* requestBlock(size_t minRequest, size_t* actual) = 0;
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /**
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  This is called each time some atomic portion of the data has been
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  written to the block (most recently returned by requestBlock()).
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  If bytes == 0, then the writer has finished.
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  bytes will always be a multiple of 4.
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void notifyWritten(size_t bytes) = 0;
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGPipeWriter {
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkGPipeWriter();
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ~SkGPipeWriter();
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bool isRecording() const { return NULL != fCanvas; }
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    enum Flags {
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kCrossProcess_Flag = 1 << 0,
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    };
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkCanvas* startRecording(SkGPipeController*, uint32_t flags = 0);
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // called in destructor, but can be called sooner once you know there
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // should be no more drawing calls made into the recording canvas.
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void endRecording();
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    class SkGPipeCanvas* fCanvas;
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkGPipeController*   fController;
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkFactorySet         fFactorySet;
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkWriter32 fWriter;
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
96