diff options
author | robertphillips <robertphillips@google.com> | 2014-08-21 13:12:42 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-21 13:12:42 -0700 |
commit | 7eacd77ce63abec6c5a0e7be9bf9f40ea4145d11 (patch) | |
tree | 32b058fe0fa119fb8b99195f900968e5ad7ea348 /src/core/SkMultiPictureDraw.cpp | |
parent | ed20c9b9c9a10b69f316904f66200e90d647fd49 (diff) |
SkMultiPictureDraw API
This CL adds a new API to optimize across multiple SkPicture draw calls.
Note that multiple pictures rendered at once (i.e., picture piles) should be flattened into a single new picture that includes the required clipping on the different layers.
R=bsalomon@google.com, reed@google.com
Author: robertphillips@google.com
Review URL: https://codereview.chromium.org/491313003
Diffstat (limited to 'src/core/SkMultiPictureDraw.cpp')
-rw-r--r-- | src/core/SkMultiPictureDraw.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/core/SkMultiPictureDraw.cpp b/src/core/SkMultiPictureDraw.cpp new file mode 100644 index 0000000000..50af2b717e --- /dev/null +++ b/src/core/SkMultiPictureDraw.cpp @@ -0,0 +1,62 @@ +/* + * 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 reserve) { + if (reserve > 0) { + fDrawData.setReserve(reserve); + } +} + +void SkMultiPictureDraw::reset() { + for (int i = 0; i < fDrawData.count(); ++i) { + fDrawData[i].picture->unref(); + fDrawData[i].canvas->unref(); + SkDELETE(fDrawData[i].paint); + } + + fDrawData.rewind(); +} + +void SkMultiPictureDraw::add(SkCanvas* canvas, + const SkPicture* picture, + const SkMatrix* matrix, + const SkPaint* paint) { + if (NULL == canvas || NULL == picture) { + SkDEBUGFAIL("parameters to SkMultiPictureDraw::add should be non-NULL"); + return; + } + + DrawData* data = fDrawData.append(); + + data->picture = SkRef(picture); + data->canvas = SkRef(canvas); + if (NULL != matrix) { + data->matrix = *matrix; + } else { + data->matrix.setIdentity(); + } + if (NULL != paint) { + data->paint = SkNEW_ARGS(SkPaint, (*paint)); + } else { + data->paint = NULL; + } +} + +void SkMultiPictureDraw::draw() { + for (int i = 0; i < fDrawData.count(); ++i) { + fDrawData[i].canvas->drawPicture(fDrawData[i].picture, + &fDrawData[i].matrix, + fDrawData[i].paint); + } + + this->reset(); +} + |