SkGPipe.h revision 0b15698a8c76bb8abc1b555c1d91892669b4118f
10b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/*
20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Copyright 2011 Google Inc.
30b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Licensed under the Apache License, Version 2.0 (the "License");
50b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    you may not use this file except in compliance with the License.
60b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    You may obtain a copy of the License at
70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    http://www.apache.org/licenses/LICENSE-2.0
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Unless required by applicable law or agreed to in writing, software
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    distributed under the License is distributed on an "AS IS" BASIS,
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    See the License for the specific language governing permissions and
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    limitations under the License.
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SkGPipe_DEFINED
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SkGPipe_DEFINED
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkWriter32.h"
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkFlattenable.h"
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkCanvas;
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGPipeReader {
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkGPipeReader(SkCanvas* target);
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ~SkGPipeReader();
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    enum Status {
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kDone_Status,   //!< no more data expected from reader
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kEOF_Status,    //!< need more data from reader
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kError_Status   //!< encountered error
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    };
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // data must be 4-byte aligned
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // length must be a multiple of 4
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    Status playback(const void* data, size_t length, size_t* bytesRead = NULL);
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkCanvas*           fCanvas;
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    class SkGPipeState* fState;
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGPipeController {
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /**
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  Called periodically by the writer, to get a working buffer of RAM to
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  write into. The actual size of the block is also returned, and must be
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  actual >= minRequest. If NULL is returned, then actual is ignored and
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  writing will stop.
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  The returned block must be 4-byte aligned, and actual must be a
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  multiple of 4.
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  minRequest will always be a multiple of 4.
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void* requestBlock(size_t minRequest, size_t* actual) = 0;
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    /**
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  This is called each time some atomic portion of the data has been
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  written to the block (most recently returned by requestBlock()).
650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  If bytes == 0, then the writer has finished.
660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     *  bytes will always be a multiple of 4.
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger     */
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void notifyWritten(size_t bytes) = 0;
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SkGPipeWriter {
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkGPipeWriter();
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    ~SkGPipeWriter();
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bool isRecording() const { return NULL != fCanvas; }
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    enum Flags {
800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        kCrossProcess_Flag = 1 << 0,
810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    };
820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkCanvas* startRecording(SkGPipeController*, uint32_t flags = 0);
840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // called in destructor, but can be called sooner once you know there
860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // should be no more drawing calls made into the recording canvas.
870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void endRecording();
880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    class SkGPipeCanvas* fCanvas;
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkGPipeController*   fController;
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkFactorySet         fFactorySet;
930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkWriter32 fWriter;
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
97