172c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com/* 272c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com * Copyright 2012 Google Inc. 372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com * 472c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com * Use of this source code is governed by a BSD-style license that can be 572c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com * found in the LICENSE file. 672c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com */ 772c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com#include "SkBitmap.h" 958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com#include "SkChunkAlloc.h" 1072c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com#include "SkGPipe.h" 1174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com#include "SkPicture.h" 1258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com#include "SkTDArray.h" 1372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 1472c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comclass SkCanvas; 15b073d920c90bc95f6c216327acd321a4fc809bfascroggo@google.comclass SkMatrix; 1672c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 1772c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comclass PipeController : public SkGPipeController { 1872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.compublic: 1974b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com PipeController(SkCanvas* target, SkPicture::InstallPixelRefProc proc = NULL); 20f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org virtual ~PipeController(); 2172c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com virtual void* requestBlock(size_t minRequest, size_t* actual) SK_OVERRIDE; 2272c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com virtual void notifyWritten(size_t bytes) SK_OVERRIDE; 2372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comprotected: 24f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org const void* getData() { return (const char*) fBlock + fBytesWritten; } 2572c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com SkGPipeReader fReader; 2672c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comprivate: 27f700fb2f139cc38f6ba3571db6cfe0a2e1bbc8c0commit-bot@chromium.org void* fBlock; 2872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com size_t fBlockSize; 2972c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com size_t fBytesWritten; 3072c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com SkGPipeReader::Status fStatus; 3172c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com}; 3272c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 3372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com//////////////////////////////////////////////////////////////////////////////// 3472c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 3572c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comclass TiledPipeController : public PipeController { 3672c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.compublic: 3774b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com TiledPipeController(const SkBitmap&, SkPicture::InstallPixelRefProc proc = NULL, 3874b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com const SkMatrix* initialMatrix = NULL); 3972c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com virtual ~TiledPipeController() {}; 4072c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com virtual void notifyWritten(size_t bytes) SK_OVERRIDE; 41284bf502c086d8fd4285f475a02e69d500c40219scroggo@google.com virtual int numberOfReaders() const SK_OVERRIDE { return NumberOfTiles; } 4272c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.comprivate: 4372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com enum { 4472c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com NumberOfTiles = 10 4572c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com }; 4672c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com SkGPipeReader fReaders[NumberOfTiles - 1]; 4772c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com SkBitmap fBitmaps[NumberOfTiles]; 4872c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com typedef PipeController INHERITED; 4972c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com}; 5058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com 5158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com//////////////////////////////////////////////////////////////////////////////// 5258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com 5358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com/** 5458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com * Borrowed (and modified) from SkDeferredCanvas.cpp::DeferredPipeController. 558e073ba2d63f4d2aab7532f1421df00bb1f88003scroggo@google.com * Allows playing back from multiple threads, but does not do the threading itself. 5658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com */ 578e073ba2d63f4d2aab7532f1421df00bb1f88003scroggo@google.comclass ThreadSafePipeController : public SkGPipeController { 5858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.compublic: 598e073ba2d63f4d2aab7532f1421df00bb1f88003scroggo@google.com ThreadSafePipeController(int numberOfReaders); 6058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com virtual void* requestBlock(size_t minRequest, size_t* actual) SK_OVERRIDE; 6158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com virtual void notifyWritten(size_t bytes) SK_OVERRIDE; 6258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com virtual int numberOfReaders() const SK_OVERRIDE { return fNumberOfReaders; } 6358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com 6458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com /** 6558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com * Play the stored drawing commands to the specified canvas. If SkGPipeWriter::startRecording 6658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com * used the flag SkGPipeWriter::kSimultaneousReaders_Flag, this can be called from different 6758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com * threads simultaneously. 6858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com */ 69bcdf2ec50dfd170959cc2db67c49f6dac084be03scroggo@google.com void draw(SkCanvas*); 7058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.comprivate: 7158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com enum { 7258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com kMinBlockSize = 4096 7358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com }; 7458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com struct PipeBlock { 7558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com PipeBlock(void* block, size_t bytes) { fBlock = block, fBytes = bytes; } 7658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com // Stream of draw commands written by the SkGPipeWriter. Allocated by fAllocator, which will 7758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com // handle freeing it. 7858b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com void* fBlock; 7958b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com // Number of bytes that were written to fBlock. 8058b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com size_t fBytes; 8158b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com }; 8258b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com void* fBlock; 8358b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com size_t fBytesWritten; 8458b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com SkChunkAlloc fAllocator; 8558b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com SkTDArray<PipeBlock> fBlockList; 8658b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com int fNumberOfReaders; 8758b4ead36c62d8c0256ee4da554f3df2744d904cscroggo@google.com}; 88