SkiaCanvasProxy.cpp revision dccca44ffda4836b56a21da95a046c9708ffd49c
11db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger/*
21db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Copyright (C) 2015 The Android Open Source Project
31db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *
41db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License");
51db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * you may not use this file except in compliance with the License.
61db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * You may obtain a copy of the License at
71db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *
81db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *      http://www.apache.org/licenses/LICENSE-2.0
91db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger *
101db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Unless required by applicable law or agreed to in writing, software
111db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS,
121db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * See the License for the specific language governing permissions and
141db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * limitations under the License.
151db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger */
161db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
171db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#include "SkiaCanvasProxy.h"
181db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
191db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#include <cutils/log.h>
201db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger#include <SkPatchUtils.h>
21a11ee3c4131d889d57b7d2cf30faa7c105b23b10Ben Wagner#include <SkPaint.h>
22a11ee3c4131d889d57b7d2cf30faa7c105b23b10Ben Wagner#include <SkPath.h>
2317c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson#include <SkPixelRef.h>
24a11ee3c4131d889d57b7d2cf30faa7c105b23b10Ben Wagner#include <SkRect.h>
25a11ee3c4131d889d57b7d2cf30faa7c105b23b10Ben Wagner#include <SkRRect.h>
261db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
276bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner#include <memory>
286bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner
291db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergernamespace android {
301db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergernamespace uirenderer {
311db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
32b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom HudsonSkiaCanvasProxy::SkiaCanvasProxy(Canvas* canvas, bool filterHwuiCalls)
331db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        : INHERITED(canvas->width(), canvas->height())
34b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson        , mCanvas(canvas)
35b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson        , mFilterHwuiCalls(filterHwuiCalls) {}
361db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
371db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPaint(const SkPaint& paint) {
381db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->drawPaint(paint);
391db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
401db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
411db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPoints(PointMode pointMode, size_t count, const SkPoint pts[],
421db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPaint& paint) {
43b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson    if (!pts || count == 0) {
44b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson        return;
45b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson    }
46b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson
471db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // convert the SkPoints into floats
48e3a40ea488c7cfa396d5901255719a6ddab791d4Ben Wagner    static_assert(sizeof(SkPoint) == sizeof(float)*2, "SkPoint is no longer two floats");
491db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const size_t floatCount = count << 1;
501db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const float* floatArray = &pts[0].fX;
511db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
521db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    switch (pointMode) {
531db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        case kPoints_PointMode: {
541db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            mCanvas->drawPoints(floatArray, floatCount, paint);
551db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            break;
561db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
571db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        case kLines_PointMode: {
581db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            mCanvas->drawLines(floatArray, floatCount, paint);
591db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            break;
601db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
611db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        case kPolygon_PointMode: {
621db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            SkPaint strokedPaint(paint);
631db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            strokedPaint.setStyle(SkPaint::kStroke_Style);
641db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
651db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            SkPath path;
661db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            for (size_t i = 0; i < count - 1; i++) {
671db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                path.moveTo(pts[i]);
681db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                path.lineTo(pts[i+1]);
691db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                this->drawPath(path, strokedPaint);
701db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                path.rewind();
711db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            }
721db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            break;
731db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
741db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        default:
751db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            LOG_ALWAYS_FATAL("Unknown point type");
761db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
771db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
781db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
791db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawOval(const SkRect& rect, const SkPaint& paint) {
801db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->drawOval(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, paint);
811db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
821db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
831db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawRect(const SkRect& rect, const SkPaint& paint) {
841db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->drawRect(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, paint);
851db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
861db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
871db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawRRect(const SkRRect& roundRect, const SkPaint& paint) {
881db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    if (!roundRect.isComplex()) {
891db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkRect& rect = roundRect.rect();
901db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        SkVector radii = roundRect.getSimpleRadii();
911db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        mCanvas->drawRoundRect(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom,
921db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                               radii.fX, radii.fY, paint);
931db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    } else {
941db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        SkPath path;
951db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        path.addRRect(roundRect);
961db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        mCanvas->drawPath(path, paint);
971db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
981db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
991db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1001db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPath(const SkPath& path, const SkPaint& paint) {
1011db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->drawPath(path, paint);
1021db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1031db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1041db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
1051db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPaint* paint) {
10617c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson    SkPixelRef* pxRef = bitmap.pixelRef();
10717c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson
10817c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson    // HWUI doesn't support extractSubset(), so convert any subsetted bitmap into
10917c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson    // a drawBitmapRect(); pass through an un-subsetted bitmap.
11017c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson    if (pxRef && bitmap.dimensions() != pxRef->info().dimensions()) {
11117c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson        SkBitmap fullBitmap;
11217c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson        fullBitmap.setInfo(pxRef->info());
11317c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson        fullBitmap.setPixelRef(pxRef, 0, 0);
11417c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson        SkIPoint origin = bitmap.pixelRefOrigin();
11517c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson        mCanvas->drawBitmap(fullBitmap, origin.fX, origin.fY,
11617c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson                            origin.fX + bitmap.dimensions().width(),
11717c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson                            origin.fY + bitmap.dimensions().height(),
11817c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson                            left, top,
11917c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson                            left + bitmap.dimensions().width(),
12017c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson                            top + bitmap.dimensions().height(),
12117c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson                            paint);
12217c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson    } else {
12317c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson        mCanvas->drawBitmap(bitmap, left, top, paint);
12417c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson    }
1251db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1261db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1271db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawBitmapRect(const SkBitmap& bitmap, const SkRect* srcPtr,
128f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III        const SkRect& dst, const SkPaint* paint, SrcRectConstraint) {
1291db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkRect src = (srcPtr) ? *srcPtr : SkRect::MakeWH(bitmap.width(), bitmap.height());
13017c5adfa63872fbb6a903a5941e3c6455995b92dTom Hudson    // TODO: if bitmap is a subset, do we need to add pixelRefOrigin to src?
1311db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->drawBitmap(bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom,
1321db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                        dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, paint);
1331db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1341db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1351db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
1361db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkRect& dst, const SkPaint*) {
1371db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    //TODO make nine-patch drawing a method on Canvas.h
1381db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkDEBUGFAIL("SkiaCanvasProxy::onDrawBitmapNine is not yet supported");
1391db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1401db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1411db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawVertices(VertexMode mode, int vertexCount, const SkPoint vertices[],
1421db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPoint texs[], const SkColor colors[], SkXfermode*, const uint16_t indices[],
1431db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        int indexCount, const SkPaint& paint) {
144b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson    if (mFilterHwuiCalls) {
145b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson        return;
146b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson    }
1471db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // convert the SkPoints into floats
148e3a40ea488c7cfa396d5901255719a6ddab791d4Ben Wagner    static_assert(sizeof(SkPoint) == sizeof(float)*2, "SkPoint is no longer two floats");
1491db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const int floatCount = vertexCount << 1;
1501db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const float* vArray = &vertices[0].fX;
1511db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const float* tArray = (texs) ? &texs[0].fX : NULL;
1521db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const int* cArray = (colors) ? (int*)colors : NULL;
1531db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->drawVertices(mode, floatCount, vArray, tArray, cArray, indices, indexCount, paint);
1541db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1551db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1561db141f93c4fe79a4669440c3d14f63bc87b2e34Derek SollenbergerSkSurface* SkiaCanvasProxy::onNewSurface(const SkImageInfo&, const SkSurfaceProps&) {
1571db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkDEBUGFAIL("SkiaCanvasProxy::onNewSurface is not supported");
1581db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    return NULL;
1591db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1601db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1611db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::willSave() {
162eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    mCanvas->save(android::SaveFlags::MatrixClip);
163eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita}
164eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita
165eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malitastatic inline SaveFlags::Flags saveFlags(SkCanvas::SaveLayerFlags layerFlags) {
166eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    SaveFlags::Flags saveFlags = 0;
167eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita
168eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    if (!(layerFlags & SkCanvas::kDontClipToLayer_Legacy_SaveLayerFlag)) {
169eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita        saveFlags |= SaveFlags::ClipToLayer;
170eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    }
171eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita
172eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    if (!(layerFlags & SkCanvas::kIsOpaque_SaveLayerFlag)) {
173eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita        saveFlags |= SaveFlags::HasAlphaLayer;
174eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    }
175eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita
176eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita    return saveFlags;
1771db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1781db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1795518e7cbd4e8d7a7cb3d60a4251eccc3b7fb82dbLeon Scroggins IIISkCanvas::SaveLayerStrategy SkiaCanvasProxy::getSaveLayerStrategy(const SaveLayerRec& saveLayerRec) {
1801db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkRect rect;
1815518e7cbd4e8d7a7cb3d60a4251eccc3b7fb82dbLeon Scroggins III    if (saveLayerRec.fBounds) {
1825518e7cbd4e8d7a7cb3d60a4251eccc3b7fb82dbLeon Scroggins III        rect = *saveLayerRec.fBounds;
1835518e7cbd4e8d7a7cb3d60a4251eccc3b7fb82dbLeon Scroggins III    } else if (!mCanvas->getClipBounds(&rect)) {
1841db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        rect = SkRect::MakeEmpty();
1851db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
1865518e7cbd4e8d7a7cb3d60a4251eccc3b7fb82dbLeon Scroggins III    mCanvas->saveLayer(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, saveLayerRec.fPaint,
187eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita                       saveFlags(saveLayerRec.fSaveLayerFlags));
1881db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    return SkCanvas::kNoLayer_SaveLayerStrategy;
1891db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1901db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1911db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::willRestore() {
1921db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->restore();
1931db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1941db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1951db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::didConcat(const SkMatrix& matrix) {
1961db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->concat(matrix);
1971db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
1981db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
1991db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::didSetMatrix(const SkMatrix& matrix) {
2006daa13c5fa7577fa1d8371deca446f6ca911f38fChris Craik    mCanvas->setMatrix(matrix);
2011db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
2021db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2031db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
2041db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPaint& paint) {
2051db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkPath path;
2061db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    path.addRRect(outer);
2071db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    path.addRRect(inner);
2081db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    path.setFillType(SkPath::kEvenOdd_FillType);
2091db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    this->drawPath(path, paint);
2101db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
2111db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2121db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger/**
2131db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * Utility class that converts the incoming text & paint from the given encoding
2141db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger * into glyphIDs.
2151db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger */
2161db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergerclass GlyphIDConverter {
2171db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergerpublic:
2181db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    GlyphIDConverter(const void* text, size_t byteLength, const SkPaint& origPaint) {
2191db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        paint = origPaint;
2201db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        if (paint.getTextEncoding() == SkPaint::kGlyphID_TextEncoding) {
2211db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            glyphIDs = (uint16_t*)text;
2221db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            count = byteLength >> 1;
2231db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        } else {
2246bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner             // ensure space for one glyph per ID given UTF8 encoding.
2256bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner            storage.reset(new uint16_t[byteLength]);
2261db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            glyphIDs = storage.get();
2271db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            count = paint.textToGlyphs(text, byteLength, storage.get());
2281db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
2291db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
2301db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
2311db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2321db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkPaint paint;
2331db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    uint16_t* glyphIDs;
2341db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    int count;
2351db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergerprivate:
2366bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner    std::unique_ptr<uint16_t[]> storage;
2371db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger};
2381db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2391db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
2401db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPaint& origPaint) {
2411db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // convert to glyphIDs if necessary
2421db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    GlyphIDConverter glyphs(text, byteLength, origPaint);
2431db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2441db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // compute the glyph positions
2456bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner    std::unique_ptr<SkPoint[]> pointStorage(new SkPoint[glyphs.count]);
2466bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner    std::unique_ptr<SkScalar[]> glyphWidths(new SkScalar[glyphs.count]);
2471db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    glyphs.paint.getTextWidths(glyphs.glyphIDs, glyphs.count << 1, glyphWidths.get());
2481db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2491db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // compute conservative bounds
2501db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // NOTE: We could call the faster paint.getFontBounds for a less accurate,
2511db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    //       but even more conservative bounds if this  is too slow.
2521db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkRect bounds;
2531db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    glyphs.paint.measureText(glyphs.glyphIDs, glyphs.count << 1, &bounds);
2541db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2551db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // adjust for non-left alignment
2561db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    if (glyphs.paint.getTextAlign() != SkPaint::kLeft_Align) {
2571db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        SkScalar stop = 0;
2581db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        for (int i = 0; i < glyphs.count; i++) {
2591db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            stop += glyphWidths[i];
2601db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
2611db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        if (glyphs.paint.getTextAlign() == SkPaint::kCenter_Align) {
2621db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            stop = SkScalarHalf(stop);
2631db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
2641db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        if (glyphs.paint.isVerticalText()) {
2651db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            y -= stop;
2661db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        } else {
2671db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger            x -= stop;
2681db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
2691db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
2701db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2711db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // setup the first glyph position and adjust bounds if needed
272806a6f07a37c16b37631d8707dd1f2b41276fafcTom Hudson    int xBaseline = 0;
273806a6f07a37c16b37631d8707dd1f2b41276fafcTom Hudson    int yBaseline = 0;
2741db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    if (mCanvas->drawTextAbsolutePos()) {
2751db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        bounds.offset(x,y);
276806a6f07a37c16b37631d8707dd1f2b41276fafcTom Hudson        xBaseline = x;
277806a6f07a37c16b37631d8707dd1f2b41276fafcTom Hudson        yBaseline = y;
2781db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
279806a6f07a37c16b37631d8707dd1f2b41276fafcTom Hudson    pointStorage[0].set(xBaseline, yBaseline);
2801db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2811db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // setup the remaining glyph positions
2821db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    if (glyphs.paint.isVerticalText()) {
2831db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        for (int i = 1; i < glyphs.count; i++) {
284806a6f07a37c16b37631d8707dd1f2b41276fafcTom Hudson            pointStorage[i].set(xBaseline, glyphWidths[i-1] + pointStorage[i-1].fY);
2851db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
2861db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    } else {
2871db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        for (int i = 1; i < glyphs.count; i++) {
288806a6f07a37c16b37631d8707dd1f2b41276fafcTom Hudson            pointStorage[i].set(glyphWidths[i-1] + pointStorage[i-1].fX, yBaseline);
2891db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
2901db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
2911db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
292e3a40ea488c7cfa396d5901255719a6ddab791d4Ben Wagner    static_assert(sizeof(SkPoint) == sizeof(float)*2, "SkPoint is no longer two floats");
293dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    mCanvas->drawGlyphs(glyphs.glyphIDs, &pointStorage[0].fX, glyphs.count, glyphs.paint,
2941db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                      x, y, bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, 0);
2951db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
2961db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
2971db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
2981db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPaint& origPaint) {
2991db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // convert to glyphIDs if necessary
3001db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    GlyphIDConverter glyphs(text, byteLength, origPaint);
3011db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3021db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // convert to relative positions if necessary
3031db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    int x, y;
3041db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const SkPoint* posArray;
3056bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner    std::unique_ptr<SkPoint[]> pointStorage;
3061db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    if (mCanvas->drawTextAbsolutePos()) {
3071db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        x = 0;
3081db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        y = 0;
3091db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        posArray = pos;
3101db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    } else {
3111db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        x = pos[0].fX;
3121db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        y = pos[0].fY;
3136bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner        pointStorage.reset(new SkPoint[glyphs.count]);
3141db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        for (int i = 0; i < glyphs.count; i++) {
3156bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner            pointStorage[i].fX = pos[i].fX - x;
3166bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner            pointStorage[i].fY = pos[i].fY - y;
3171db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        }
3186bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner        posArray = pointStorage.get();
3191db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
3201db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3211db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // compute conservative bounds
3221db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // NOTE: We could call the faster paint.getFontBounds for a less accurate,
3231db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    //       but even more conservative bounds if this  is too slow.
3241db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkRect bounds;
3251db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    glyphs.paint.measureText(glyphs.glyphIDs, glyphs.count << 1, &bounds);
32620c2b3ef74ac96fee5ef1daa7959c434d6caeb97Tom Hudson    bounds.offset(x, y);
3271db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
328e3a40ea488c7cfa396d5901255719a6ddab791d4Ben Wagner    static_assert(sizeof(SkPoint) == sizeof(float)*2, "SkPoint is no longer two floats");
329dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    mCanvas->drawGlyphs(glyphs.glyphIDs, &posArray[0].fX, glyphs.count, glyphs.paint, x, y,
3301db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                      bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, 0);
3311db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3321db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3331db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
3341db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        SkScalar constY, const SkPaint& paint) {
3351db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    const size_t pointCount = byteLength >> 1;
3366bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner    std::unique_ptr<SkPoint[]> pts(new SkPoint[pointCount]);
3371db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    for (size_t i = 0; i < pointCount; i++) {
3381db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        pts[i].set(xpos[i], constY);
3391db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
3406bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner    this->onDrawPosText(text, byteLength, pts.get(), paint);
3411db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3421db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3431db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
3441db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkMatrix* matrix, const SkPaint& origPaint) {
3451db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // convert to glyphIDs if necessary
3461db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    GlyphIDConverter glyphs(text, byteLength, origPaint);
347dccca44ffda4836b56a21da95a046c9708ffd49csergeyv    mCanvas->drawGlyphsOnPath(glyphs.glyphIDs, glyphs.count, path, 0, 0, glyphs.paint);
3481db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3491db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3501db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
3511db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPaint& paint) {
3521db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkDEBUGFAIL("SkiaCanvasProxy::onDrawTextBlob is not supported");
3531db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3541db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3551db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
3561db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
357b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson    if (mFilterHwuiCalls) {
358b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson        return;
359b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson    }
3601db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkPatchUtils::VertexData data;
3611db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3621db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkMatrix matrix;
3631db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->getMatrix(&matrix);
3641db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkISize lod = SkPatchUtils::GetLevelOfDetail(cubics, &matrix);
3651db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3661db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // It automatically adjusts lodX and lodY in case it exceeds the number of indices.
3671db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    // If it fails to generate the vertices, then we do not draw.
3681db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    if (SkPatchUtils::getVertexData(&data, cubics, colors, texCoords, lod.width(), lod.height())) {
3691db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger        this->drawVertices(SkCanvas::kTriangles_VertexMode, data.fVertexCount, data.fPoints,
3701db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                           data.fTexCoords, data.fColors, xmode, data.fIndices, data.fIndexCount,
3711db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger                           paint);
3721db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    }
3731db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3741db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3751db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle) {
3761db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->clipRect(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, op);
3771db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3781db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3791db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipRRect(const SkRRect& roundRect, SkRegion::Op op, ClipEdgeStyle) {
3801db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    SkPath path;
3811db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    path.addRRect(roundRect);
3821db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->clipPath(&path, op);
3831db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3841db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3851db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle) {
3861db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->clipPath(&path, op);
3871db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3881db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3891db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipRegion(const SkRegion& region, SkRegion::Op op) {
3901db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger    mCanvas->clipRegion(&region, op);
3911db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}
3921db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger
3931db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}; // namespace uirenderer
3941db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}; // namespace android
395