blob: de26346a15ab0fb8aea789e356af629d279601b2 [file] [log] [blame]
scroggo@google.com72c96722012-06-06 21:07:10 +00001/*
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 "SamplePipeControllers.h"
scroggo@google.comb073d922012-06-08 15:35:03 +00009
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000010#include "SkBitmapDevice.h"
scroggo@google.com72c96722012-06-06 21:07:10 +000011#include "SkCanvas.h"
scroggo@google.com72c96722012-06-06 21:07:10 +000012#include "SkGPipe.h"
scroggo@google.comb073d922012-06-08 15:35:03 +000013#include "SkMatrix.h"
scroggo@google.com72c96722012-06-06 21:07:10 +000014
scroggo@google.com74b7ffd2013-04-30 02:32:41 +000015PipeController::PipeController(SkCanvas* target, SkPicture::InstallPixelRefProc proc)
commit-bot@chromium.org2d91eff2014-05-07 15:27:10 +000016 : fReader(target), fBlockSize(0), fBytesWritten(0) {
scroggo@google.com74b7ffd2013-04-30 02:32:41 +000017 fReader.setBitmapDecoder(proc);
scroggo@google.com72c96722012-06-06 21:07:10 +000018}
19
commit-bot@chromium.org2d91eff2014-05-07 15:27:10 +000020void* PipeController::requestBlock(size_t minRequest, size_t* actual) {
21 fBlockSize = minRequest;
22 fBlock.reset(fBlockSize);
scroggo@google.com72c96722012-06-06 21:07:10 +000023 fBytesWritten = 0;
24 *actual = fBlockSize;
commit-bot@chromium.org2d91eff2014-05-07 15:27:10 +000025 return fBlock.get();
scroggo@google.com72c96722012-06-06 21:07:10 +000026}
27
28void PipeController::notifyWritten(size_t bytes) {
29 fStatus = fReader.playback(this->getData(), bytes);
30 SkASSERT(SkGPipeReader::kError_Status != fStatus);
31 fBytesWritten += bytes;
32}
33
34////////////////////////////////////////////////////////////////////////////////
35
scroggo@google.comb073d922012-06-08 15:35:03 +000036TiledPipeController::TiledPipeController(const SkBitmap& bitmap,
scroggo@google.com74b7ffd2013-04-30 02:32:41 +000037 SkPicture::InstallPixelRefProc proc,
scroggo@google.comb073d922012-06-08 15:35:03 +000038 const SkMatrix* initial)
scroggo@google.com74b7ffd2013-04-30 02:32:41 +000039: INHERITED(NULL, proc) {
scroggo@google.com72c96722012-06-06 21:07:10 +000040 int32_t top = 0;
41 int32_t bottom;
42 int32_t height = bitmap.height() / NumberOfTiles;
43 SkIRect rect;
44 for (int i = 0; i < NumberOfTiles; i++) {
45 bottom = i + 1 == NumberOfTiles ? bitmap.height() : top + height;
46 rect.setLTRB(0, top, bitmap.width(), bottom);
47 top = bottom;
48
humper@google.com0e515772013-01-07 19:54:40 +000049 SkDEBUGCODE(bool extracted = )bitmap.extractSubset(&fBitmaps[i], rect);
scroggo@google.com72c96722012-06-06 21:07:10 +000050 SkASSERT(extracted);
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000051 SkBaseDevice* device = new SkBitmapDevice(fBitmaps[i]);
scroggo@google.com72c96722012-06-06 21:07:10 +000052 SkCanvas* canvas = new SkCanvas(device);
53 device->unref();
scroggo@google.comb073d922012-06-08 15:35:03 +000054 if (initial != NULL) {
55 canvas->setMatrix(*initial);
56 }
scroggo@google.com72c96722012-06-06 21:07:10 +000057 canvas->translate(SkIntToScalar(-rect.left()),
58 SkIntToScalar(-rect.top()));
59 if (0 == i) {
60 fReader.setCanvas(canvas);
61 } else {
62 fReaders[i - 1].setCanvas(canvas);
scroggo@google.com74b7ffd2013-04-30 02:32:41 +000063 fReaders[i - 1].setBitmapDecoder(proc);
scroggo@google.com72c96722012-06-06 21:07:10 +000064 }
65 canvas->unref();
66 }
67}
68
69void TiledPipeController::notifyWritten(size_t bytes) {
70 for (int i = 0; i < NumberOfTiles - 1; i++) {
71 fReaders[i].playback(this->getData(), bytes);
72 }
73 this->INHERITED::notifyWritten(bytes);
74}
scroggo@google.com58b4ead2012-08-31 16:15:22 +000075
76////////////////////////////////////////////////////////////////////////////////
77
scroggo@google.com8e073ba2012-08-31 16:25:46 +000078ThreadSafePipeController::ThreadSafePipeController(int numberOfReaders)
scroggo@google.com58b4ead2012-08-31 16:15:22 +000079: fAllocator(kMinBlockSize)
80, fNumberOfReaders(numberOfReaders) {
81 fBlock = NULL;
82 fBytesWritten = 0;
83}
84
scroggo@google.com8e073ba2012-08-31 16:25:46 +000085void* ThreadSafePipeController::requestBlock(size_t minRequest, size_t *actual) {
scroggo@google.com58b4ead2012-08-31 16:15:22 +000086 if (fBlock) {
87 // Save the previous block for later
88 PipeBlock previousBloc(fBlock, fBytesWritten);
89 fBlockList.push(previousBloc);
90 }
scroggo@google.come5f48242013-02-25 21:47:41 +000091 int32_t blockSize = SkMax32(SkToS32(minRequest), kMinBlockSize);
scroggo@google.com58b4ead2012-08-31 16:15:22 +000092 fBlock = fAllocator.allocThrow(blockSize);
93 fBytesWritten = 0;
94 *actual = blockSize;
95 return fBlock;
96}
97
scroggo@google.com8e073ba2012-08-31 16:25:46 +000098void ThreadSafePipeController::notifyWritten(size_t bytes) {
scroggo@google.com58b4ead2012-08-31 16:15:22 +000099 fBytesWritten += bytes;
100}
101
scroggo@google.combcdf2ec2012-09-20 14:42:33 +0000102void ThreadSafePipeController::draw(SkCanvas* target) {
scroggo@google.com58b4ead2012-08-31 16:15:22 +0000103 SkGPipeReader reader(target);
104 for (int currentBlock = 0; currentBlock < fBlockList.count(); currentBlock++ ) {
105 reader.playback(fBlockList[currentBlock].fBlock, fBlockList[currentBlock].fBytes);
106 }
107
108 if (fBlock) {
109 reader.playback(fBlock, fBytesWritten);
110 }
111}