| Index: src/core/SkMultiPictureDraw.cpp
|
| diff --git a/src/core/SkMultiPictureDraw.cpp b/src/core/SkMultiPictureDraw.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..17993c0d5556947540155751c544eebbede1390d
|
| --- /dev/null
|
| +++ b/src/core/SkMultiPictureDraw.cpp
|
| @@ -0,0 +1,106 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkCanvas.h"
|
| +#include "SkMultiPictureDraw.h"
|
| +#include "SkPicture.h"
|
| +
|
| +SkMultiPictureDraw::SkMultiPictureDraw(int sizeHint) {
|
| + if (sizeHint > 0) {
|
| + fDrawData.setReserve(sizeHint);
|
| + }
|
| +}
|
| +
|
| +void SkMultiPictureDraw::unrefAll() {
|
| + for (int i = 0; i < fDrawData.count(); ++i) {
|
| + fDrawData[i].pic->unref();
|
| + fDrawData[i].canvas->unref();
|
| + }
|
| +
|
| + fDrawData.rewind();
|
| +}
|
| +
|
| +void SkMultiPictureDraw::add(const SkPicture* picture, SkCanvas* canvas, const SkMatrix* matrix) {
|
| + if (NULL == picture || NULL == canvas) {
|
| + SkDEBUGFAIL("parameters to SkMultiPictureDraw::add should be non-NULL");
|
| + return;
|
| + }
|
| +
|
| + DrawData* data = fDrawData.append();
|
| +
|
| + data->pic = SkRef(picture);
|
| + data->canvas = SkRef(canvas);
|
| + if (NULL != matrix) {
|
| + data->matrix = *matrix;
|
| + } else {
|
| + data->matrix.setIdentity();
|
| + }
|
| + data->clipType = DrawData::kNone_ClipType;
|
| +}
|
| +
|
| +void SkMultiPictureDraw::add(const SkPicture* picture, SkCanvas* canvas, const SkRect& clipRect, const SkMatrix* matrix) {
|
| + if (NULL == picture || NULL == canvas) {
|
| + SkDEBUGFAIL("parameters to SkMultiPictureDraw::add should be non-NULL");
|
| + return;
|
| + }
|
| +
|
| + DrawData* data = fDrawData.append();
|
| +
|
| + data->pic = SkRef(picture);
|
| + data->canvas = SkRef(canvas);
|
| + if (NULL != matrix) {
|
| + data->matrix = *matrix;
|
| + } else {
|
| + data->matrix.setIdentity();
|
| + }
|
| + data->clipType = DrawData::kRect_ClipType;
|
| + data->clipRRect.setRect(clipRect);
|
| +}
|
| +
|
| +void SkMultiPictureDraw::add(const SkPicture* picture, SkCanvas* canvas, const SkRRect& clipRRect, const SkMatrix* matrix) {
|
| + if (NULL == picture || NULL == canvas) {
|
| + SkDEBUGFAIL("parameters to SkMultiPictureDraw::add should be non-NULL");
|
| + return;
|
| + }
|
| +
|
| + DrawData* data = fDrawData.append();
|
| +
|
| + data->pic = SkRef(picture);
|
| + data->canvas = SkRef(canvas);
|
| + if (NULL != matrix) {
|
| + data->matrix = *matrix;
|
| + } else {
|
| + data->matrix.setIdentity();
|
| + }
|
| + data->clipType = DrawData::kRRect_ClipType;
|
| + data->clipRRect = clipRRect;
|
| +}
|
| +
|
| +void SkMultiPictureDraw::draw() {
|
| + for (int i = 0; i < fDrawData.count(); ++i) {
|
| + fDrawData[i].canvas->save();
|
| +
|
| + switch (fDrawData[i].clipType) {
|
| + case DrawData::kRect_ClipType:
|
| + fDrawData[i].canvas->clipRect(fDrawData[i].clipRRect.rect());
|
| + break;
|
| + case DrawData::kRRect_ClipType:
|
| + fDrawData[i].canvas->clipRRect(fDrawData[i].clipRRect);
|
| + break;
|
| + case DrawData::kNone_ClipType: // fall through
|
| + default:
|
| + break;
|
| + };
|
| +
|
| + fDrawData[i].canvas->drawPicture(fDrawData[i].pic, &fDrawData[i].matrix, NULL);
|
| +
|
| + fDrawData[i].canvas->restore();
|
| + }
|
| +
|
| + this->unrefAll();
|
| +}
|
| +
|
|
|