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 32135934cccabf72879603ef37222da2195445f027eDerek Sollenberger // Compute conservative bounds. If the content has already been processed 32235934cccabf72879603ef37222da2195445f027eDerek Sollenberger // by Minikin then it had already computed these bounds. Unfortunately, 32335934cccabf72879603ef37222da2195445f027eDerek Sollenberger // there is no way to capture those bounds as part of the Skia drawPosText 32435934cccabf72879603ef37222da2195445f027eDerek Sollenberger // API so we need to do that computation again here. 3251db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger SkRect bounds; 32635934cccabf72879603ef37222da2195445f027eDerek Sollenberger for (int i = 0; i < glyphs.count; i++) { 32735934cccabf72879603ef37222da2195445f027eDerek Sollenberger SkRect glyphBounds; 32835934cccabf72879603ef37222da2195445f027eDerek Sollenberger glyphs.paint.measureText(&glyphs.glyphIDs[i], sizeof(uint16_t), &glyphBounds); 32935934cccabf72879603ef37222da2195445f027eDerek Sollenberger glyphBounds.offset(pos[i].fX, pos[i].fY); 33035934cccabf72879603ef37222da2195445f027eDerek Sollenberger bounds.join(glyphBounds); 33135934cccabf72879603ef37222da2195445f027eDerek Sollenberger } 3321db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 333e3a40ea488c7cfa396d5901255719a6ddab791d4Ben Wagner static_assert(sizeof(SkPoint) == sizeof(float)*2, "SkPoint is no longer two floats"); 334dccca44ffda4836b56a21da95a046c9708ffd49csergeyv mCanvas->drawGlyphs(glyphs.glyphIDs, &posArray[0].fX, glyphs.count, glyphs.paint, x, y, 3351db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, 0); 3361db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3371db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3381db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 3391db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger SkScalar constY, const SkPaint& paint) { 3401db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger const size_t pointCount = byteLength >> 1; 3416bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner std::unique_ptr<SkPoint[]> pts(new SkPoint[pointCount]); 3421db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger for (size_t i = 0; i < pointCount; i++) { 3431db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger pts[i].set(xpos[i], constY); 3441db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger } 3456bbf68d05a9deb335fc693b4a64651aea1b4e9e0Ben Wagner this->onDrawPosText(text, byteLength, pts.get(), paint); 3461db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3471db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3481db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 3491db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger const SkMatrix* matrix, const SkPaint& origPaint) { 3501db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger // convert to glyphIDs if necessary 3511db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger GlyphIDConverter glyphs(text, byteLength, origPaint); 352dccca44ffda4836b56a21da95a046c9708ffd49csergeyv mCanvas->drawGlyphsOnPath(glyphs.glyphIDs, glyphs.count, path, 0, 0, glyphs.paint); 3531db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3541db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3551db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, 3561db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger const SkPaint& paint) { 3571db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger SkDEBUGFAIL("SkiaCanvasProxy::onDrawTextBlob is not supported"); 3581db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3591db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3601db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 3611db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) { 362b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson if (mFilterHwuiCalls) { 363b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson return; 364b1476ae7d515d6c406b4367cfb4ada8ce2d116e1Tom Hudson } 3651db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger SkPatchUtils::VertexData data; 3661db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3671db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger SkMatrix matrix; 3681db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger mCanvas->getMatrix(&matrix); 3691db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger SkISize lod = SkPatchUtils::GetLevelOfDetail(cubics, &matrix); 3701db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3711db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger // It automatically adjusts lodX and lodY in case it exceeds the number of indices. 3721db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger // If it fails to generate the vertices, then we do not draw. 3731db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger if (SkPatchUtils::getVertexData(&data, cubics, colors, texCoords, lod.width(), lod.height())) { 3741db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger this->drawVertices(SkCanvas::kTriangles_VertexMode, data.fVertexCount, data.fPoints, 3751db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger data.fTexCoords, data.fColors, xmode, data.fIndices, data.fIndexCount, 3761db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger paint); 3771db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger } 3781db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3791db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3801db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle) { 3811db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger mCanvas->clipRect(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, op); 3821db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3831db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3841db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipRRect(const SkRRect& roundRect, SkRegion::Op op, ClipEdgeStyle) { 3851db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger SkPath path; 3861db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger path.addRRect(roundRect); 3871db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger mCanvas->clipPath(&path, op); 3881db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3891db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3901db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle) { 3911db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger mCanvas->clipPath(&path, op); 3921db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3931db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3941db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenbergervoid SkiaCanvasProxy::onClipRegion(const SkRegion& region, SkRegion::Op op) { 3951db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger mCanvas->clipRegion(®ion, op); 3961db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 3971db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 3981db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}; // namespace uirenderer 3991db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger}; // namespace android 400