DisplayListCanvas.cpp revision 64e445bf74bee2098781d608cedfd723d8cc88d3
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/* 24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project 34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License. 64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at 74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software 114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and 144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License. 154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 17db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik#include "DisplayListCanvas.h" 186554943a1dd6854c0f4976900956e556767b49e1Romain Guy 19a35778c799e8073a42b9e22191bde9d838327ab7John Reck#include "ResourceCache.h" 20c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "DeferredDisplayList.h" 2112f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck#include "DeferredLayerUpdater.h" 222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#include "DisplayListOp.h" 23113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "RenderNode.h" 248dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson#include "utils/PaintUtils.h" 2513631f3da855f200a151e7837ed9f6b079622b58Romain Guy 26db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik#include <SkCamera.h> 27db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik#include <SkCanvas.h> 28db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik 29db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik#include <private/hwui/DrawGlInfo.h> 30db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik 314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 34cc882b6518129a11fa007f8c9343e972f03607b4Derek SollenbergerDisplayListCanvas::DisplayListCanvas(int width, int height) 35984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson : mState(*this) 36088c514cb13f3b8f8683588c2f398f18df1547c9John Reck , mResourceCache(ResourceCache::getInstance()) 37d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik , mDisplayListData(nullptr) 38cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mTranslateX(0.0f) 39cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mTranslateY(0.0f) 40a5f2e070741182ad9a6ebd489f844f444879c697Rob Tsuk , mHasDeferredTranslate(false) 418afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik , mDeferredBarrierType(kBarrier_None) 42cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mHighContrastText(false) 43cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mRestoreSaveCount(-1) { 44cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger reset(width, height); 454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 47db663fe83f976107fd8fd9307d871b37d9e47370Chris CraikDisplayListCanvas::~DisplayListCanvas() { 4844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck LOG_ALWAYS_FATAL_IF(mDisplayListData, 49db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik "Destroyed a DisplayListCanvas during a record!"); 504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 52cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenbergervoid DisplayListCanvas::reset(int width, int height) { 5344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck LOG_ALWAYS_FATAL_IF(mDisplayListData, 5444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck "prepareDirty called a second time during a recording!"); 5544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData = new DisplayListData(); 5644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck 5764e445bf74bee2098781d608cedfd723d8cc88d3Chris Craik mState.initializeSaveStack(width, height, 5864e445bf74bee2098781d608cedfd723d8cc88d3Chris Craik 0, 0, width, height, Vector3()); 5945e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 608afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = kBarrier_InOrder; 618dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson mState.setDirtyClip(false); 6227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 6327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy} 6427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 65cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger 66cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 67cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger// Operations 68cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 69cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger 70cc882b6518129a11fa007f8c9343e972f03607b4Derek SollenbergerDisplayListData* DisplayListCanvas::finishRecording() { 718afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 728afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 73daf98e941e140e8739458126640183b9f296a2abChet Haase 74cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mPaintMap.clear(); 75cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mRegionMap.clear(); 76cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mPathMap.clear(); 77cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger DisplayListData* data = mDisplayListData; 78cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mDisplayListData = nullptr; 79cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mSkiaCanvasProxy.reset(nullptr); 80cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger return data; 814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 83956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craikvoid DisplayListCanvas::callDrawGLFunction(Functor *functor) { 842af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawFunctorOp(functor)); 8509d5cddf67b676018700bcc10a72242641cd7eecJohn Reck mDisplayListData->functors.add(functor); 86daf98e941e140e8739458126640183b9f296a2abChet Haase} 87daf98e941e140e8739458126640183b9f296a2abChet Haase 88db663fe83f976107fd8fd9307d871b37d9e47370Chris CraikSkCanvas* DisplayListCanvas::asSkCanvas() { 891db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger LOG_ALWAYS_FATAL_IF(!mDisplayListData, 901db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger "attempting to get an SkCanvas when we are not recording!"); 911db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger if (!mSkiaCanvasProxy) { 921db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger mSkiaCanvasProxy.reset(new SkiaCanvasProxy(this)); 931db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger } 9490fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson 9590fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson // SkCanvas instances default to identity transform, but should inherit 9690fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson // the state of this Canvas; if this code was in the SkiaCanvasProxy 9790fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson // constructor, we couldn't cache mSkiaCanvasProxy. 9890fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson SkMatrix parentTransform; 9990fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson getMatrix(&parentTransform); 10090fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson mSkiaCanvasProxy.get()->setMatrix(parentTransform); 10190fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson 1021db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger return mSkiaCanvasProxy.get(); 1031db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 1041db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 105db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikint DisplayListCanvas::save(SkCanvas::SaveFlags flags) { 1068dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addStateOp(new (alloc()) SaveOp((int) flags)); 1078dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.save((int) flags); 1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 110db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::restore() { 11104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy if (mRestoreSaveCount < 0) { 11233f6beb10f98e8ba96250e284876d607055d278dRomain Guy restoreToCount(getSaveCount() - 1); 11333f6beb10f98e8ba96250e284876d607055d278dRomain Guy return; 11404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 11533f6beb10f98e8ba96250e284876d607055d278dRomain Guy 11633f6beb10f98e8ba96250e284876d607055d278dRomain Guy mRestoreSaveCount--; 1178afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 118984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.restore(); 1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 121db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::restoreToCount(int saveCount) { 12227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = saveCount; 1238afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 124984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.restoreToCount(saveCount); 1254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 127db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikint DisplayListCanvas::saveLayer(float left, float top, float right, float bottom, 1288dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint* paint, SkCanvas::SaveFlags flags) { 1294ace7305608442ab35ea9aa65a4220df152c187fChris Craik // force matrix/clip isolation for layer 1304ace7305608442ab35ea9aa65a4220df152c187fChris Craik flags |= SkCanvas::kClip_SaveFlag | SkCanvas::kMatrix_SaveFlag; 1314ace7305608442ab35ea9aa65a4220df152c187fChris Craik 132d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger paint = refPaint(paint); 1338dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addStateOp(new (alloc()) SaveLayerOp(left, top, right, bottom, paint, (int) flags)); 1348dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.save((int) flags); 1355b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 1365b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 137db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::translate(float dx, float dy) { 138772687d24206e2fa2deebf0980a932573a624b17Chris Craik if (dx == 0.0f && dy == 0.0f) return; 139772687d24206e2fa2deebf0980a932573a624b17Chris Craik 1408afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mHasDeferredTranslate = true; 14133f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX += dx; 14233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateY += dy; 1438afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 1448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson mState.translate(dx, dy, 0.0f); 1454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 147db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::rotate(float degrees) { 148772687d24206e2fa2deebf0980a932573a624b17Chris Craik if (degrees == 0.0f) return; 149772687d24206e2fa2deebf0980a932573a624b17Chris Craik 1502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) RotateOp(degrees)); 151984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.rotate(degrees); 1524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 154db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::scale(float sx, float sy) { 155772687d24206e2fa2deebf0980a932573a624b17Chris Craik if (sx == 1.0f && sy == 1.0f) return; 156772687d24206e2fa2deebf0980a932573a624b17Chris Craik 1572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ScaleOp(sx, sy)); 158984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.scale(sx, sy); 1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 161db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::skew(float sx, float sy) { 1622af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SkewOp(sx, sy)); 163984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.skew(sx, sy); 164807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 165807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 166db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::setMatrix(const SkMatrix& matrix) { 1672af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SetMatrixOp(matrix)); 168984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.setMatrix(matrix); 1694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 171db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::concat(const SkMatrix& matrix) { 1722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ConcatMatrixOp(matrix)); 173984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.concatMatrix(matrix); 1744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 176db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::getClipBounds(SkRect* outRect) const { 1778dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson Rect bounds = mState.getLocalClipBounds(); 1788dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson *outRect = SkRect::MakeLTRB(bounds.left, bounds.top, bounds.right, bounds.bottom); 1798dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return !(outRect->isEmpty()); 1808dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1818dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 182db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::quickRejectRect(float left, float top, float right, float bottom) const { 1838dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.quickRejectConservative(left, top, right, bottom); 1848dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1858dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 186db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::quickRejectPath(const SkPath& path) const { 1878dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect bounds = path.getBounds(); 1888dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.quickRejectConservative(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom); 1898dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1908dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1918dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 192db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipRect(float left, float top, float right, float bottom, 1934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 1942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRectOp(left, top, right, bottom, op)); 195984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipRect(left, top, right, bottom, op); 1964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 198db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipPath(const SkPath* path, SkRegion::Op op) { 1992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik path = refPath(path); 2002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipPathOp(path, op)); 201984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipPath(path, op); 202735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 203735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 204db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipRegion(const SkRegion* region, SkRegion::Op op) { 2052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik region = refRegion(region); 2062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRegionOp(region, op)); 207984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipRegion(region, op); 208735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 209735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 210956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craikvoid DisplayListCanvas::drawRenderNode(RenderNode* renderNode) { 2118afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik LOG_ALWAYS_FATAL_IF(!renderNode, "missing rendernode"); 212a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik DrawRenderNodeOp* op = new (alloc()) DrawRenderNodeOp( 213a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik renderNode, 214a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik *mState.currentTransform(), 215a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik mState.clipIsSimple()); 2168afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addRenderNodeOp(op); 2170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 2180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 2193aadd60521960be063ee06208562ccb63dc414e3Chris Craikvoid DisplayListCanvas::drawLayer(DeferredLayerUpdater* layerHandle) { 22012f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck // We ref the DeferredLayerUpdater due to its thread-safe ref-counting 22112f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck // semantics. 22212f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck mDisplayListData->ref(layerHandle); 2233aadd60521960be063ee06208562ccb63dc414e3Chris Craik addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer())); 2246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 2256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 226db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) { 2277c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck bitmap = refBitmap(*bitmap); 2282af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2292af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 230796475006f5d670e8383a2050f11719522437a43Chris Craik addDrawOp(new (alloc()) DrawBitmapOp(bitmap, paint)); 2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 233db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float left, float top, 2348dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint* paint) { 2358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson save(SkCanvas::kMatrix_SaveFlag); 2368dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson translate(left, top); 2378dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 2388dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson restore(); 2398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 2408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 241db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, 2428dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint* paint) { 2438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (matrix.isIdentity()) { 2448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 245e688bf720334f58e0003b4c75b53cc7618adf43fChris Craik } else if (!(matrix.getType() & ~(SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask)) 246e688bf720334f58e0003b4c75b53cc7618adf43fChris Craik && MathUtils::isPositive(matrix.getScaleX()) 247e688bf720334f58e0003b4c75b53cc7618adf43fChris Craik && MathUtils::isPositive(matrix.getScaleY())) { 2488dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // SkMatrix::isScaleTranslate() not available in L 2498dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect src; 2508dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect dst; 2518dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bitmap.getBounds(&src); 2528dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson matrix.mapRect(&dst, src); 2538dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom, 2548dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, paint); 2558dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } else { 2568dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson save(SkCanvas::kMatrix_SaveFlag); 2578dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson concat(matrix); 2588dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 2598dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson restore(); 2608dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 2618dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 2628dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 263db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, 2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 265d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float dstRight, float dstBottom, const SkPaint* paint) { 266796475006f5d670e8383a2050f11719522437a43Chris Craik if (srcLeft == 0 && srcTop == 0 26714100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik && srcRight == bitmap.width() 26814100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik && srcBottom == bitmap.height() 269796475006f5d670e8383a2050f11719522437a43Chris Craik && (srcBottom - srcTop == dstBottom - dstTop) 270796475006f5d670e8383a2050f11719522437a43Chris Craik && (srcRight - srcLeft == dstRight - dstLeft)) { 271527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik // transform simple rect to rect drawing case into position bitmap ops, since they merge 272796475006f5d670e8383a2050f11719522437a43Chris Craik save(SkCanvas::kMatrix_SaveFlag); 273796475006f5d670e8383a2050f11719522437a43Chris Craik translate(dstLeft, dstTop); 2748dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 275796475006f5d670e8383a2050f11719522437a43Chris Craik restore(); 276796475006f5d670e8383a2050f11719522437a43Chris Craik } else { 277796475006f5d670e8383a2050f11719522437a43Chris Craik paint = refPaint(paint); 278796475006f5d670e8383a2050f11719522437a43Chris Craik 27914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik if (paint && paint->getShader()) { 28014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik float scaleX = (dstRight - dstLeft) / (srcRight - srcLeft); 28114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik float scaleY = (dstBottom - dstTop) / (srcBottom - srcTop); 28214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik if (!MathUtils::areEqual(scaleX, 1.0f) || !MathUtils::areEqual(scaleY, 1.0f)) { 28314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik // Apply the scale transform on the canvas, so that the shader 28414100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik // effectively calculates positions relative to src rect space 28514100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 28614100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik save(SkCanvas::kMatrix_SaveFlag); 28714100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik translate(dstLeft, dstTop); 28814100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik scale(scaleX, scaleY); 28914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 29014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstLeft = 0.0f; 29114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstTop = 0.0f; 29214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstRight = srcRight - srcLeft; 29314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstBottom = srcBottom - srcTop; 29414100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 2957c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapRectOp(refBitmap(bitmap), 29614100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik srcLeft, srcTop, srcRight, srcBottom, 29714100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstLeft, dstTop, dstRight, dstBottom, paint)); 29814100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik restore(); 29914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik return; 30014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik } 30114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik } 30214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 3037c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapRectOp(refBitmap(bitmap), 304796475006f5d670e8383a2050f11719522437a43Chris Craik srcLeft, srcTop, srcRight, srcBottom, 305796475006f5d670e8383a2050f11719522437a43Chris Craik dstLeft, dstTop, dstRight, dstBottom, paint)); 306527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 3074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 309db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, 310d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* vertices, const int* colors, const SkPaint* paint) { 3110664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik int vertexCount = (meshWidth + 1) * (meshHeight + 1); 3120664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik vertices = refBuffer<float>(vertices, vertexCount * 2); // 2 floats per vertex 3132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3140664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik colors = refBuffer<int>(colors, vertexCount); // 1 color per vertex 3152af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3167c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapMeshOp(refBitmap(bitmap), meshWidth, meshHeight, 3178dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson vertices, colors, paint)); 3185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 3195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 3204c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenbergervoid DisplayListCanvas::drawNinePatch(const SkBitmap& bitmap, const Res_png_9patch& patch, 3214c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) { 3227c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck const SkBitmap* bitmapPtr = refBitmap(bitmap); 3234c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger const Res_png_9patch* patchPtr = refPatch(&patch); 32416ea8d373b03b1e115dd505af70dbee4e3a3a182Romain Guy paint = refPaint(paint); 3252af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3264c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger addDrawOp(new (alloc()) DrawPatchOp(bitmapPtr, patchPtr, 3274c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger dstLeft, dstTop, dstRight, dstBottom, paint)); 3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 330db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawColor(int color, SkXfermode::Mode mode) { 3312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawColorOp(color, mode)); 3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 334db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPaint(const SkPaint& paint) { 3358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect bounds; 3368dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (getClipBounds(&bounds)) { 3378dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawRect(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, paint); 3388dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 3398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 3408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 3418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 342db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRect(float left, float top, float right, float bottom, 3438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint& paint) { 3448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawRectOp(left, top, right, bottom, refPaint(&paint))); 3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 347db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRoundRect(float left, float top, float right, float bottom, 3488dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float rx, float ry, const SkPaint& paint) { 3498dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawRoundRectOp(left, top, right, bottom, rx, ry, refPaint(&paint))); 35001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 35101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 352db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRoundRect( 353072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top, 354072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom, 355072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry, 356072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPaint* paint) { 3570e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(left); 3580e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(top); 3590e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(right); 3600e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(bottom); 3610e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(rx); 3620e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(ry); 3630e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(paint); 36437b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(paint->value.getShader()); 365072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi addDrawOp(new (alloc()) DrawRoundRectPropsOp(&left->value, &top->value, 366072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi &right->value, &bottom->value, &rx->value, &ry->value, &paint->value)); 367072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi} 368072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi 369db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawCircle(float x, float y, float radius, const SkPaint& paint) { 3708dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawCircleOp(x, y, radius, refPaint(&paint))); 37101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 37201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 373db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y, 37452244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint) { 3750e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(x); 3760e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(y); 3770e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(radius); 3780e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(paint); 37937b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(paint->value.getShader()); 38052244fff29042926e21fa897ef5ab11148e35299John Reck addDrawOp(new (alloc()) DrawCirclePropsOp(&x->value, &y->value, 38152244fff29042926e21fa897ef5ab11148e35299John Reck &radius->value, &paint->value)); 38252244fff29042926e21fa897ef5ab11148e35299John Reck} 38352244fff29042926e21fa897ef5ab11148e35299John Reck 384db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawOval(float left, float top, float right, float bottom, 3858dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint& paint) { 3868dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawOvalOp(left, top, right, bottom, refPaint(&paint))); 387c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 388c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 389db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawArc(float left, float top, float right, float bottom, 3908dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) { 391544e524db6e4da526af1c897fe5314036ede5012Chris Craik if (fabs(sweepAngle) >= 360.0f) { 392107843de4507b3511006cb9c77b8d0364374385aTom Hudson drawOval(left, top, right, bottom, paint); 393107843de4507b3511006cb9c77b8d0364374385aTom Hudson } else { 394107843de4507b3511006cb9c77b8d0364374385aTom Hudson addDrawOp(new (alloc()) DrawArcOp(left, top, right, bottom, 3958dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson startAngle, sweepAngle, useCenter, refPaint(&paint))); 3966ac174b97246ed40fe780b29561603b61770fa17Chris Craik } 3978b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 3988b2f5267f16c295f12faab810527cd6311997e34Romain Guy 399db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 4008dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawPathOp(refPath(&path), refPaint(&paint))); 4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 403db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawLines(const float* points, int count, const SkPaint& paint) { 4042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 4052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4068dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawLinesOp(points, count, refPaint(&paint))); 407ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 408ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 409db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPoints(const float* points, int count, const SkPaint& paint) { 4102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 4112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4128dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawPointsOp(points, count, refPaint(&paint))); 4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 415db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawTextOnPath(const uint16_t* glyphs, int count, 4168dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPath& path, float hOffset, float vOffset, const SkPaint& paint) { 4178dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (!glyphs || count <= 0) return; 4182af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4198dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = 2 * count; 4208dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson DrawOp* op = new (alloc()) DrawTextOnPathOp(refText((const char*) glyphs, bytesCount), 4218dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bytesCount, count, refPath(&path), 4228dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson hOffset, vOffset, refPaint(&paint)); 4230f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 424996e57c84368058be793897ebc355b917a59abc2Raph Levien} 425996e57c84368058be793897ebc355b917a59abc2Raph Levien 426db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPosText(const uint16_t* text, const float* positions, 4278dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int count, int posCount, const SkPaint& paint) { 428107843de4507b3511006cb9c77b8d0364374385aTom Hudson if (!text || count <= 0) return; 4292af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4308dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = 2 * count; 4312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik positions = refBuffer<float>(positions, count * 2); 4322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4338dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson DrawOp* op = new (alloc()) DrawPosTextOp(refText((const char*) text, bytesCount), 4348dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bytesCount, count, positions, refPaint(&paint)); 4350f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 436996e57c84368058be793897ebc355b917a59abc2Raph Levien} 437996e57c84368058be793897ebc355b917a59abc2Raph Levien 438db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions, 4398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int count, const SkPaint& paint, float x, float y, 4408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float boundsLeft, float boundsTop, float boundsRight, float boundsBottom, 4418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float totalAdvance) { 442527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 4438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (!glyphs || count <= 0 || PaintUtils::paintWillNotDrawText(paint)) return; 44433f6beb10f98e8ba96250e284876d607055d278dRomain Guy 4458dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = count * 2; 4468dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const char* text = refText((const char*) glyphs, bytesCount); 4472af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik positions = refBuffer<float>(positions, count * 2); 4488dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom); 44933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 4506578a989566e585eee053095dc80e2552e125db2Derek Sollenberger DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, 4516578a989566e585eee053095dc80e2552e125db2Derek Sollenberger x, y, positions, refPaint(&paint), totalAdvance, bounds); 4526578a989566e585eee053095dc80e2552e125db2Derek Sollenberger addDrawOp(op); 453672433d90fab7383cd28beac9d4485b566a90940Romain Guy} 454672433d90fab7383cd28beac9d4485b566a90940Romain Guy 45594394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenbergervoid DisplayListCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) { 45694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger if (paint.getStyle() != SkPaint::kFill_Style || 45794394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger (paint.isAntiAlias() && !mState.currentTransform()->isSimple())) { 45894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger SkRegion::Iterator it(region); 45994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger while (!it.done()) { 46094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger const SkIRect& r = it.rect(); 46194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); 46294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger it.next(); 46394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 46494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } else { 46594394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger int count = 0; 46694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger Vector<float> rects; 46794394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger SkRegion::Iterator it(region); 46894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger while (!it.done()) { 46994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger const SkIRect& r = it.rect(); 47094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fLeft); 47194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fTop); 47294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fRight); 47394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fBottom); 47494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger count += 4; 47594394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger it.next(); 47694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 47794394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger drawRects(rects.array(), count, &paint); 47894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 47994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger} 48094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger 481db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRects(const float* rects, int count, const SkPaint* paint) { 482107843de4507b3511006cb9c77b8d0364374385aTom Hudson if (count <= 0) return; 483672433d90fab7383cd28beac9d4485b566a90940Romain Guy 4842af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik rects = refBuffer<float>(rects, count); 4852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 4862af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawRectsOp(rects, count, paint)); 487eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 488eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 489db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::setDrawFilter(SkDrawFilter* filter) { 4900b8606266c1afc69cbeb73acda67c85d87943318Derek Sollenberger mDrawFilter.reset(SkSafeRef(filter)); 4912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 4922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 493db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::insertReorderBarrier(bool enableReorder) { 4948afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 4958afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 4968afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = enableReorder ? kBarrier_OutOfOrder : kBarrier_InOrder; 4978afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 4988afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 499db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::flushRestoreToCount() { 5002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mRestoreSaveCount >= 0) { 5018afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addOpAndUpdateChunk(new (alloc()) RestoreToCountOp(mRestoreSaveCount)); 5022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mRestoreSaveCount = -1; 5032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 506db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::flushTranslate() { 5078afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (mHasDeferredTranslate) { 5082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mTranslateX != 0.0f || mTranslateY != 0.0f) { 5098afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addOpAndUpdateChunk(new (alloc()) TranslateOp(mTranslateX, mTranslateY)); 5102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mTranslateX = mTranslateY = 0.0f; 5112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5128afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mHasDeferredTranslate = false; 5132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5152af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 516db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addOpAndUpdateChunk(DisplayListOp* op) { 517272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck int insertIndex = mDisplayListData->displayListOps.size(); 518272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck mDisplayListData->displayListOps.push_back(op); 5198afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (mDeferredBarrierType != kBarrier_None) { 5208afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // op is first in new chunk 521272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck mDisplayListData->chunks.emplace_back(); 522272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck DisplayListData::Chunk& newChunk = mDisplayListData->chunks.back(); 5238afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.beginOpIndex = insertIndex; 5248afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.endOpIndex = insertIndex + 1; 5258afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.reorderChildren = (mDeferredBarrierType == kBarrier_OutOfOrder); 5268afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 5278afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik int nextChildIndex = mDisplayListData->children().size(); 5288afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.beginChildIndex = newChunk.endChildIndex = nextChildIndex; 5298afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = kBarrier_None; 5308afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } else { 5318afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // standard case - append to existing chunk 532272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck mDisplayListData->chunks.back().endOpIndex = insertIndex + 1; 5338afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } 5348afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return insertIndex; 5352af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5362af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 537db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::flushAndAddOp(DisplayListOp* op) { 5388afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 5398afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 5408afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return addOpAndUpdateChunk(op); 5418afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5428afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 543db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addStateOp(StateOp* op) { 5448afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return flushAndAddOp(op); 5458afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5468afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 547db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addDrawOp(DrawOp* op) { 5482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik Rect localBounds; 5493b20251a355c88193c439f928a84ae69483fb488John Reck if (op->getLocalBounds(localBounds)) { 5508dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bool rejected = quickRejectRect(localBounds.left, localBounds.top, 5512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik localBounds.right, localBounds.bottom); 5522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik op->setQuickRejected(rejected); 5532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 554c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik 55544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->hasDrawOps = true; 5568afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return flushAndAddOp(op); 5578afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5588afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 559db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addRenderNodeOp(DrawRenderNodeOp* op) { 5608afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik int opIndex = addDrawOp(op); 5618afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik int childIndex = mDisplayListData->addChild(op); 5628afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 5638afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // update the chunk's child indices 564272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck DisplayListData::Chunk& chunk = mDisplayListData->chunks.back(); 5658afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik chunk.endChildIndex = childIndex + 1; 5668afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 5678afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (op->renderNode()->stagingProperties().isProjectionReceiver()) { 5688afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // use staging property, since recording on UI thread 5698afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDisplayListData->projectionReceiveIndex = opIndex; 5708afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } 5718afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return opIndex; 5725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 5735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 57437b0824a46157b7e169ad7ec33a46e89c851884cJohn Reckvoid DisplayListCanvas::refBitmapsInShader(const SkShader* shader) { 57537b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck if (!shader) return; 57637b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck 57737b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck // If this paint has an SkShader that has an SkBitmap add 57837b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck // it to the bitmap pile 57937b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck SkBitmap bitmap; 58037b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck SkShader::TileMode xy[2]; 58137b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck if (shader->asABitmap(&bitmap, nullptr, xy) == SkShader::kDefault_BitmapType) { 58237b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmap(bitmap); 58337b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck return; 58437b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck } 58537b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck SkShader::ComposeRec rec; 58637b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck if (shader->asACompose(&rec)) { 58737b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(rec.fShaderA); 58837b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(rec.fShaderB); 58937b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck return; 59037b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck } 59137b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck} 59237b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck 5934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 5944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 595