11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
87cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed#include "SkNWayCanvas.h"
97cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
10d9689beb7fce225abbaa78063d46717ec92b19fdDerek SollenbergerSkNWayCanvas::SkNWayCanvas(int width, int height) {
11d9689beb7fce225abbaa78063d46717ec92b19fdDerek Sollenberger    SkBitmap bm;
12d9689beb7fce225abbaa78063d46717ec92b19fdDerek Sollenberger    bm.setConfig(SkBitmap::kNo_Config, width, height);
13d9689beb7fce225abbaa78063d46717ec92b19fdDerek Sollenberger    this->setBitmapDevice(bm);
14d9689beb7fce225abbaa78063d46717ec92b19fdDerek Sollenberger}
157cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
167cc0a6ac7b817b217dd614cba96fc533b32d505dMike ReedSkNWayCanvas::~SkNWayCanvas() {
177cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    this->removeAll();
187cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
197cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
207cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::addCanvas(SkCanvas* canvas) {
217cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    if (canvas) {
227cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        canvas->ref();
237cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        *fList.append() = canvas;
247cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
257cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
267cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
277cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::removeCanvas(SkCanvas* canvas) {
287cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    int index = fList.find(canvas);
297cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    if (index >= 0) {
307cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        canvas->unref();
317cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        fList.removeShuffle(index);
327cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
337cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
347cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
357cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::removeAll() {
367cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    fList.unrefAll();
377cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    fList.reset();
387cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
397cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
407cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed///////////////////////////////////////////////////////////////////////////
417cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed// These are forwarded to the N canvases we're referencing
427cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
437cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedclass SkNWayCanvas::Iter {
447cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedpublic:
457cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter(const SkTDArray<SkCanvas*>& list) : fList(list) {
467cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        fIndex = 0;
477cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
487cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    bool next() {
497cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        if (fIndex < fList.count()) {
507cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed            fCanvas = fList[fIndex++];
517cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed            return true;
527cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        }
537cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        return false;
547cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
557cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    SkCanvas* operator->() { return fCanvas; }
564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
577cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedprivate:
587cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    const SkTDArray<SkCanvas*>& fList;
597cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    int fIndex;
607cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    SkCanvas* fCanvas;
617cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed};
627cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
637cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedint SkNWayCanvas::save(SaveFlags flags) {
647cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
657cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
667cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->save(flags);
677cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
687cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::save(flags);
697cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
707cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
717cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedint SkNWayCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
727cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                                    SaveFlags flags) {
737cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
747cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
757cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->saveLayer(bounds, paint, flags);
767cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
777cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::saveLayer(bounds, paint, flags);
787cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
797cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
807cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::restore() {
817cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
827cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
837cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->restore();
847cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
857cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    this->INHERITED::restore();
867cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
877cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
887cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedbool SkNWayCanvas::translate(SkScalar dx, SkScalar dy) {
897cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
907cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
917cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->translate(dx, dy);
927cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
937cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::translate(dx, dy);
947cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
957cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
967cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedbool SkNWayCanvas::scale(SkScalar sx, SkScalar sy) {
977cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
987cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
997cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->scale(sx, sy);
1007cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1017cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::scale(sx, sy);
1027cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1037cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1047cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedbool SkNWayCanvas::rotate(SkScalar degrees) {
1057cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1067cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1077cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->rotate(degrees);
1087cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1097cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::rotate(degrees);
1107cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1117cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1127cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedbool SkNWayCanvas::skew(SkScalar sx, SkScalar sy) {
1137cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1147cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1157cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->skew(sx, sy);
1167cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1177cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::skew(sx, sy);
1187cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1197cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1207cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedbool SkNWayCanvas::concat(const SkMatrix& matrix) {
1217cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1227cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1237cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->concat(matrix);
1247cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1257cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::concat(matrix);
1267cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1277cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1287cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::setMatrix(const SkMatrix& matrix) {
1297cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1307cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1317cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->setMatrix(matrix);
1327cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1337cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    this->INHERITED::setMatrix(matrix);
1347cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1357cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkNWayCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
1377cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1387cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        iter->clipRect(rect, op, doAA);
1407cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return this->INHERITED::clipRect(rect, op, doAA);
1427cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1437cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerbool SkNWayCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
1457cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1467cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        iter->clipPath(path, op, doAA);
1487cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return this->INHERITED::clipPath(path, op, doAA);
1507cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1517cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1527cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedbool SkNWayCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
1537cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1547cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1557cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->clipRegion(deviceRgn, op);
1567cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1577cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::clipRegion(deviceRgn, op);
1587cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1597cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1607cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawPaint(const SkPaint& paint) {
1617cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1627cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1637cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawPaint(paint);
1647cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1657cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1667cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1677cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[],
1687cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                        const SkPaint& paint) {
1697cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1707cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1717cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawPoints(mode, count, pts, paint);
1727cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1737cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1747cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1757cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
1767cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1777cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1787cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawRect(rect, paint);
1797cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1807cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1817cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1827cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
1837cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1847cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1857cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawPath(path, paint);
1867cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1877cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1887cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1897cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
1907cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                              const SkPaint* paint) {
1917cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
1927cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
1937cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawBitmap(bitmap, x, y, paint);
1947cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
1957cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
1967cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
1977cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
1987cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                                  const SkRect& dst, const SkPaint* paint) {
1997cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2007cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2017cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawBitmapRect(bitmap, src, dst, paint);
2027cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2037cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2047cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2057cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
2067cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                                    const SkPaint* paint) {
2077cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2087cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2097cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawBitmapMatrix(bitmap, m, paint);
2107cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2117cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2127cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2137cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
2147cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                              const SkPaint* paint) {
2157cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2167cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2177cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawSprite(bitmap, x, y, paint);
2187cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2197cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2207cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2217cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
2227cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                            SkScalar y, const SkPaint& paint) {
2237cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2247cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2257cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawText(text, byteLength, x, y, paint);
2267cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2277cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2287cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2297cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawPosText(const void* text, size_t byteLength,
2307cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                               const SkPoint pos[], const SkPaint& paint) {
2317cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2327cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2337cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawPosText(text, byteLength, pos, paint);
2347cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2357cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2367cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2377cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawPosTextH(const void* text, size_t byteLength,
2387cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                                const SkScalar xpos[], SkScalar constY,
2397cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                                const SkPaint& paint) {
2407cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2417cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2427cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawPosTextH(text, byteLength, xpos, constY, paint);
2437cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2447cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2457cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2467cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawTextOnPath(const void* text, size_t byteLength,
2477cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                                  const SkPath& path, const SkMatrix* matrix,
2487cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                                  const SkPaint& paint) {
2497cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2507cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2517cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawTextOnPath(text, byteLength, path, matrix, paint);
2527cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2537cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2547cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2557cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawPicture(SkPicture& picture) {
2567cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2577cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2587cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawPicture(picture);
2597cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2607cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2617cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2627cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reedvoid SkNWayCanvas::drawVertices(VertexMode vmode, int vertexCount,
2637cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                          const SkPoint vertices[], const SkPoint texs[],
2647cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                          const SkColor colors[], SkXfermode* xmode,
2657cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                          const uint16_t indices[], int indexCount,
2667cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                          const SkPaint& paint) {
2677cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2687cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2697cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
2707cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed                           indices, indexCount, paint);
2717cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2727cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2737cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2747cc0a6ac7b817b217dd614cba96fc533b32d505dMike ReedSkBounder* SkNWayCanvas::setBounder(SkBounder* bounder) {
2757cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2767cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2777cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->setBounder(bounder);
2787cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2797cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::setBounder(bounder);
2807cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2817cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2827cc0a6ac7b817b217dd614cba96fc533b32d505dMike ReedSkDrawFilter* SkNWayCanvas::setDrawFilter(SkDrawFilter* filter) {
2837cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    Iter iter(fList);
2847cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    while (iter.next()) {
2857cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed        iter->setDrawFilter(filter);
2867cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    }
2877cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed    return this->INHERITED::setDrawFilter(filter);
2887cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed}
2897cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
2907cc0a6ac7b817b217dd614cba96fc533b32d505dMike Reed
291