michael@0: michael@0: /* michael@0: * Copyright 2011 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: #include "SkNWayCanvas.h" michael@0: michael@0: SkNWayCanvas::SkNWayCanvas(int width, int height) michael@0: : INHERITED(width, height) {} michael@0: michael@0: SkNWayCanvas::~SkNWayCanvas() { michael@0: this->removeAll(); michael@0: } michael@0: michael@0: void SkNWayCanvas::addCanvas(SkCanvas* canvas) { michael@0: if (canvas) { michael@0: canvas->ref(); michael@0: *fList.append() = canvas; michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::removeCanvas(SkCanvas* canvas) { michael@0: int index = fList.find(canvas); michael@0: if (index >= 0) { michael@0: canvas->unref(); michael@0: fList.removeShuffle(index); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::removeAll() { michael@0: fList.unrefAll(); michael@0: fList.reset(); michael@0: } michael@0: michael@0: /////////////////////////////////////////////////////////////////////////// michael@0: // These are forwarded to the N canvases we're referencing michael@0: michael@0: class SkNWayCanvas::Iter { michael@0: public: michael@0: Iter(const SkTDArray& list) : fList(list) { michael@0: fIndex = 0; michael@0: } michael@0: bool next() { michael@0: if (fIndex < fList.count()) { michael@0: fCanvas = fList[fIndex++]; michael@0: return true; michael@0: } michael@0: return false; michael@0: } michael@0: SkCanvas* operator->() { return fCanvas; } michael@0: michael@0: private: michael@0: const SkTDArray& fList; michael@0: int fIndex; michael@0: SkCanvas* fCanvas; michael@0: }; michael@0: michael@0: void SkNWayCanvas::willSave(SaveFlags flags) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->save(flags); michael@0: } michael@0: michael@0: this->INHERITED::willSave(flags); michael@0: } michael@0: michael@0: SkCanvas::SaveLayerStrategy SkNWayCanvas::willSaveLayer(const SkRect* bounds, const SkPaint* paint, michael@0: SaveFlags flags) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->saveLayer(bounds, paint, flags); michael@0: } michael@0: michael@0: this->INHERITED::willSaveLayer(bounds, paint, flags); michael@0: // No need for a layer. michael@0: return kNoLayer_SaveLayerStrategy; michael@0: } michael@0: michael@0: void SkNWayCanvas::willRestore() { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->restore(); michael@0: } michael@0: this->INHERITED::willRestore(); michael@0: } michael@0: michael@0: void SkNWayCanvas::didTranslate(SkScalar dx, SkScalar dy) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->translate(dx, dy); michael@0: } michael@0: this->INHERITED::didTranslate(dx, dy); michael@0: } michael@0: michael@0: void SkNWayCanvas::didScale(SkScalar sx, SkScalar sy) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->scale(sx, sy); michael@0: } michael@0: this->INHERITED::didScale(sx, sy); michael@0: } michael@0: michael@0: void SkNWayCanvas::didRotate(SkScalar degrees) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->rotate(degrees); michael@0: } michael@0: this->INHERITED::didRotate(degrees); michael@0: } michael@0: michael@0: void SkNWayCanvas::didSkew(SkScalar sx, SkScalar sy) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->skew(sx, sy); michael@0: } michael@0: this->INHERITED::didSkew(sx, sy); michael@0: } michael@0: michael@0: void SkNWayCanvas::didConcat(const SkMatrix& matrix) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->concat(matrix); michael@0: } michael@0: this->INHERITED::didConcat(matrix); michael@0: } michael@0: michael@0: void SkNWayCanvas::didSetMatrix(const SkMatrix& matrix) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->setMatrix(matrix); michael@0: } michael@0: this->INHERITED::didSetMatrix(matrix); michael@0: } michael@0: michael@0: void SkNWayCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle); michael@0: } michael@0: this->INHERITED::onClipRect(rect, op, edgeStyle); michael@0: } michael@0: michael@0: void SkNWayCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle); michael@0: } michael@0: this->INHERITED::onClipRRect(rrect, op, edgeStyle); michael@0: } michael@0: michael@0: void SkNWayCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle); michael@0: } michael@0: this->INHERITED::onClipPath(path, op, edgeStyle); michael@0: } michael@0: michael@0: void SkNWayCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->clipRegion(deviceRgn, op); michael@0: } michael@0: this->INHERITED::onClipRegion(deviceRgn, op); michael@0: } michael@0: michael@0: void SkNWayCanvas::clear(SkColor color) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->clear(color); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawPaint(const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawPaint(paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[], michael@0: const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawPoints(mode, count, pts, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawRect(rect, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawOval(rect, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawRRect(rrect, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, michael@0: const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawDRRect(outer, inner, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawPath(path, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, michael@0: const SkPaint* paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawBitmap(bitmap, x, y, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, michael@0: const SkRect& dst, const SkPaint* paint, michael@0: DrawBitmapRectFlags flags) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawBitmapRectToRect(bitmap, src, dst, paint, flags); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, michael@0: const SkPaint* paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawBitmapMatrix(bitmap, m, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center, michael@0: const SkRect& dst, const SkPaint* paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawBitmapNine(bitmap, center, dst, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y, michael@0: const SkPaint* paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawSprite(bitmap, x, y, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x, michael@0: SkScalar y, const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawText(text, byteLength, x, y, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawPosText(const void* text, size_t byteLength, michael@0: const SkPoint pos[], const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawPosText(text, byteLength, pos, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength, michael@0: const SkScalar xpos[], SkScalar constY, michael@0: const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawPosTextH(text, byteLength, xpos, constY, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength, michael@0: const SkPath& path, const SkMatrix* matrix, michael@0: const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawTextOnPath(text, byteLength, path, matrix, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawPicture(SkPicture& picture) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawPicture(picture); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount, michael@0: const SkPoint vertices[], const SkPoint texs[], michael@0: const SkColor colors[], SkXfermode* xmode, michael@0: const uint16_t indices[], int indexCount, michael@0: const SkPaint& paint) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode, michael@0: indices, indexCount, paint); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::drawData(const void* data, size_t length) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->drawData(data, length); michael@0: } michael@0: } michael@0: michael@0: SkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->setBounder(bounder); michael@0: } michael@0: return this->INHERITED::setBounder(bounder); michael@0: } michael@0: michael@0: SkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->setDrawFilter(filter); michael@0: } michael@0: return this->INHERITED::setDrawFilter(filter); michael@0: } michael@0: michael@0: void SkNWayCanvas::beginCommentGroup(const char* description) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->beginCommentGroup(description); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::addComment(const char* kywd, const char* value) { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->addComment(kywd, value); michael@0: } michael@0: } michael@0: michael@0: void SkNWayCanvas::endCommentGroup() { michael@0: Iter iter(fList); michael@0: while (iter.next()) { michael@0: iter->endCommentGroup(); michael@0: } michael@0: }