blob: 487a2b8356df86f68eb6efaae00a9f8996b04912 [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"
9#include "SkCanvas.h"
10#include "SkDevice.h"
11#include "SkGPipe.h"
12
13PipeController::PipeController(SkCanvas* target)
14:fReader(target) {
15 fBlock = NULL;
16 fBlockSize = fBytesWritten = 0;
17}
18
19PipeController::~PipeController() {
20 sk_free(fBlock);
21}
22
23void* PipeController::requestBlock(size_t minRequest, size_t *actual) {
24 sk_free(fBlock);
25 fBlockSize = minRequest * 4;
26 fBlock = sk_malloc_throw(fBlockSize);
27 fBytesWritten = 0;
28 *actual = fBlockSize;
29 return fBlock;
30}
31
32void PipeController::notifyWritten(size_t bytes) {
33 fStatus = fReader.playback(this->getData(), bytes);
34 SkASSERT(SkGPipeReader::kError_Status != fStatus);
35 fBytesWritten += bytes;
36}
37
38////////////////////////////////////////////////////////////////////////////////
39
40TiledPipeController::TiledPipeController(const SkBitmap& bitmap)
41: INHERITED(NULL) {
42 int32_t top = 0;
43 int32_t bottom;
44 int32_t height = bitmap.height() / NumberOfTiles;
45 SkIRect rect;
46 for (int i = 0; i < NumberOfTiles; i++) {
47 bottom = i + 1 == NumberOfTiles ? bitmap.height() : top + height;
48 rect.setLTRB(0, top, bitmap.width(), bottom);
49 top = bottom;
50
51 bool extracted = bitmap.extractSubset(&fBitmaps[i], rect);
52 SkASSERT(extracted);
53 SkDevice* device = new SkDevice(fBitmaps[i]);
54 SkCanvas* canvas = new SkCanvas(device);
55 device->unref();
56 canvas->translate(SkIntToScalar(-rect.left()),
57 SkIntToScalar(-rect.top()));
58 if (0 == i) {
59 fReader.setCanvas(canvas);
60 } else {
61 fReaders[i - 1].setCanvas(canvas);
62 }
63 canvas->unref();
64 }
65}
66
67void TiledPipeController::notifyWritten(size_t bytes) {
68 for (int i = 0; i < NumberOfTiles - 1; i++) {
69 fReaders[i].playback(this->getData(), bytes);
70 }
71 this->INHERITED::notifyWritten(bytes);
72}