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