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