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