Home | History | Annotate | Download | only in utils
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkBitmap.h"
      9 #include "SkChunkAlloc.h"
     10 #include "SkGPipe.h"
     11 #include "SkPicture.h"
     12 #include "SkTDArray.h"
     13 
     14 class SkCanvas;
     15 class SkMatrix;
     16 
     17 class PipeController : public SkGPipeController {
     18 public:
     19     PipeController(SkCanvas* target, SkPicture::InstallPixelRefProc proc = NULL);
     20     virtual ~PipeController();
     21     virtual void* requestBlock(size_t minRequest, size_t* actual) SK_OVERRIDE;
     22     virtual void notifyWritten(size_t bytes) SK_OVERRIDE;
     23 protected:
     24     const void* getData() { return (const char*) fBlock + fBytesWritten; }
     25     SkGPipeReader fReader;
     26 private:
     27     void* fBlock;
     28     size_t fBlockSize;
     29     size_t fBytesWritten;
     30     SkGPipeReader::Status fStatus;
     31 };
     32 
     33 ////////////////////////////////////////////////////////////////////////////////
     34 
     35 class TiledPipeController : public PipeController {
     36 public:
     37     TiledPipeController(const SkBitmap&, SkPicture::InstallPixelRefProc proc = NULL,
     38                         const SkMatrix* initialMatrix = NULL);
     39     virtual ~TiledPipeController() {};
     40     virtual void notifyWritten(size_t bytes) SK_OVERRIDE;
     41     virtual int numberOfReaders() const SK_OVERRIDE { return NumberOfTiles; }
     42 private:
     43     enum {
     44         NumberOfTiles = 10
     45     };
     46     SkGPipeReader fReaders[NumberOfTiles - 1];
     47     SkBitmap fBitmaps[NumberOfTiles];
     48     typedef PipeController INHERITED;
     49 };
     50 
     51 ////////////////////////////////////////////////////////////////////////////////
     52 
     53 /**
     54  * Borrowed (and modified) from SkDeferredCanvas.cpp::DeferredPipeController.
     55  * Allows playing back from multiple threads, but does not do the threading itself.
     56  */
     57 class ThreadSafePipeController : public SkGPipeController {
     58 public:
     59     ThreadSafePipeController(int numberOfReaders);
     60     virtual void* requestBlock(size_t minRequest, size_t* actual) SK_OVERRIDE;
     61     virtual void notifyWritten(size_t bytes) SK_OVERRIDE;
     62     virtual int numberOfReaders() const SK_OVERRIDE { return fNumberOfReaders; }
     63 
     64     /**
     65      * Play the stored drawing commands to the specified canvas. If SkGPipeWriter::startRecording
     66      * used the flag SkGPipeWriter::kSimultaneousReaders_Flag, this can be called from different
     67      * threads simultaneously.
     68      */
     69     void draw(SkCanvas*);
     70 private:
     71     enum {
     72         kMinBlockSize = 4096
     73     };
     74     struct PipeBlock {
     75         PipeBlock(void* block, size_t bytes) { fBlock = block, fBytes = bytes; }
     76         // Stream of draw commands written by the SkGPipeWriter. Allocated by fAllocator, which will
     77         // handle freeing it.
     78         void* fBlock;
     79         // Number of bytes that were written to fBlock.
     80         size_t fBytes;
     81     };
     82     void* fBlock;
     83     size_t fBytesWritten;
     84     SkChunkAlloc fAllocator;
     85     SkTDArray<PipeBlock> fBlockList;
     86     int fNumberOfReaders;
     87 };
     88