DisplayListCanvas.cpp revision dccca44ffda4836b56a21da95a046c9708ffd49c
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 19c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik#include "DeferredDisplayList.h" 2012f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck#include "DeferredLayerUpdater.h" 212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik#include "DisplayListOp.h" 22766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "ResourceCache.h" 23113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "RenderNode.h" 24766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "VectorDrawable.h" 258dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson#include "utils/PaintUtils.h" 2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 27db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik#include <SkCamera.h> 28db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik#include <SkCanvas.h> 29db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik 30db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik#include <private/hwui/DrawGlInfo.h> 31db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik 324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 35cc882b6518129a11fa007f8c9343e972f03607b4Derek SollenbergerDisplayListCanvas::DisplayListCanvas(int width, int height) 36984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson : mState(*this) 37088c514cb13f3b8f8683588c2f398f18df1547c9John Reck , mResourceCache(ResourceCache::getInstance()) 38003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik , mDisplayList(nullptr) 39cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mTranslateX(0.0f) 40cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mTranslateY(0.0f) 41a5f2e070741182ad9a6ebd489f844f444879c697Rob Tsuk , mHasDeferredTranslate(false) 428afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik , mDeferredBarrierType(kBarrier_None) 43cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mHighContrastText(false) 44cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik , mRestoreSaveCount(-1) { 456f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenberger resetRecording(width, height); 464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 48db663fe83f976107fd8fd9307d871b37d9e47370Chris CraikDisplayListCanvas::~DisplayListCanvas() { 49003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik LOG_ALWAYS_FATAL_IF(mDisplayList, 50db663fe83f976107fd8fd9307d871b37d9e47370Chris Craik "Destroyed a DisplayListCanvas during a record!"); 514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 536f485569fa3d6047dcffd068aebf361e3598783cDerek Sollenbergervoid DisplayListCanvas::resetRecording(int width, int height) { 54003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik LOG_ALWAYS_FATAL_IF(mDisplayList, 5544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck "prepareDirty called a second time during a recording!"); 56003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList = new DisplayList(); 5744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck 5864e445bf74bee2098781d608cedfd723d8cc88d3Chris Craik mState.initializeSaveStack(width, height, 5964e445bf74bee2098781d608cedfd723d8cc88d3Chris Craik 0, 0, width, height, Vector3()); 6045e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 618afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = kBarrier_InOrder; 628dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson mState.setDirtyClip(false); 6327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 6427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy} 6527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 66cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger 67cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 68cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger// Operations 69cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 70cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger 71003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris CraikDisplayList* DisplayListCanvas::finishRecording() { 728afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 738afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 74daf98e941e140e8739458126640183b9f296a2abChet Haase 75cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mPaintMap.clear(); 76cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mRegionMap.clear(); 77cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mPathMap.clear(); 78003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik DisplayList* displayList = mDisplayList; 79003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList = nullptr; 80cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mSkiaCanvasProxy.reset(nullptr); 81003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik return displayList; 824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 84956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craikvoid DisplayListCanvas::callDrawGLFunction(Functor *functor) { 852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawFunctorOp(functor)); 86b36af87f8275f4b982906f88193ec27600f2746aChris Craik mDisplayList->functors.push_back(functor); 87daf98e941e140e8739458126640183b9f296a2abChet Haase} 88daf98e941e140e8739458126640183b9f296a2abChet Haase 89db663fe83f976107fd8fd9307d871b37d9e47370Chris CraikSkCanvas* DisplayListCanvas::asSkCanvas() { 90003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik LOG_ALWAYS_FATAL_IF(!mDisplayList, 911db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger "attempting to get an SkCanvas when we are not recording!"); 921db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger if (!mSkiaCanvasProxy) { 931db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger mSkiaCanvasProxy.reset(new SkiaCanvasProxy(this)); 941db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger } 9590fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson 9690fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson // SkCanvas instances default to identity transform, but should inherit 9790fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson // the state of this Canvas; if this code was in the SkiaCanvasProxy 9890fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson // constructor, we couldn't cache mSkiaCanvasProxy. 9990fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson SkMatrix parentTransform; 10090fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson getMatrix(&parentTransform); 10190fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson mSkiaCanvasProxy.get()->setMatrix(parentTransform); 10290fb1f6732a610ad5ff6acdb3bd9ae392c8eac82Tom Hudson 1031db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger return mSkiaCanvasProxy.get(); 1041db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger} 1051db141f93c4fe79a4669440c3d14f63bc87b2e34Derek Sollenberger 106eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malitaint DisplayListCanvas::save(SaveFlags::Flags flags) { 1078dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addStateOp(new (alloc()) SaveOp((int) flags)); 1088dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.save((int) flags); 1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 111db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::restore() { 11204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy if (mRestoreSaveCount < 0) { 11333f6beb10f98e8ba96250e284876d607055d278dRomain Guy restoreToCount(getSaveCount() - 1); 11433f6beb10f98e8ba96250e284876d607055d278dRomain Guy return; 11504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 11633f6beb10f98e8ba96250e284876d607055d278dRomain Guy 11733f6beb10f98e8ba96250e284876d607055d278dRomain Guy mRestoreSaveCount--; 1188afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 119984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.restore(); 1204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 122db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::restoreToCount(int saveCount) { 12327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = saveCount; 1248afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 125984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.restoreToCount(saveCount); 1264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 128db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikint DisplayListCanvas::saveLayer(float left, float top, float right, float bottom, 129eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita const SkPaint* paint, SaveFlags::Flags flags) { 1304ace7305608442ab35ea9aa65a4220df152c187fChris Craik // force matrix/clip isolation for layer 131eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita flags |= SaveFlags::MatrixClip; 1324ace7305608442ab35ea9aa65a4220df152c187fChris Craik 133d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger paint = refPaint(paint); 1348dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addStateOp(new (alloc()) SaveLayerOp(left, top, right, bottom, paint, (int) flags)); 1358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.save((int) flags); 1365b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 1375b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 138db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::translate(float dx, float dy) { 139772687d24206e2fa2deebf0980a932573a624b17Chris Craik if (dx == 0.0f && dy == 0.0f) return; 140772687d24206e2fa2deebf0980a932573a624b17Chris Craik 1418afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mHasDeferredTranslate = true; 14233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX += dx; 14333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateY += dy; 1448afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 1458dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson mState.translate(dx, dy, 0.0f); 1464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 148db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::rotate(float degrees) { 149772687d24206e2fa2deebf0980a932573a624b17Chris Craik if (degrees == 0.0f) return; 150772687d24206e2fa2deebf0980a932573a624b17Chris Craik 1512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) RotateOp(degrees)); 152984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.rotate(degrees); 1534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 155db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::scale(float sx, float sy) { 156772687d24206e2fa2deebf0980a932573a624b17Chris Craik if (sx == 1.0f && sy == 1.0f) return; 157772687d24206e2fa2deebf0980a932573a624b17Chris Craik 1582af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ScaleOp(sx, sy)); 159984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.scale(sx, sy); 1604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 162db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::skew(float sx, float sy) { 1632af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SkewOp(sx, sy)); 164984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.skew(sx, sy); 165807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 166807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 167db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::setMatrix(const SkMatrix& matrix) { 1682af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) SetMatrixOp(matrix)); 169984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.setMatrix(matrix); 1704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 172db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::concat(const SkMatrix& matrix) { 1732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ConcatMatrixOp(matrix)); 174984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.concatMatrix(matrix); 1754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 177db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::getClipBounds(SkRect* outRect) const { 1788dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson Rect bounds = mState.getLocalClipBounds(); 1798dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson *outRect = SkRect::MakeLTRB(bounds.left, bounds.top, bounds.right, bounds.bottom); 1808dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return !(outRect->isEmpty()); 1818dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1828dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 183db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::quickRejectRect(float left, float top, float right, float bottom) const { 1848dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.quickRejectConservative(left, top, right, bottom); 1858dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1868dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 187db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::quickRejectPath(const SkPath& path) const { 1888dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect bounds = path.getBounds(); 1898dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.quickRejectConservative(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom); 1908dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1918dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1928dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 193db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipRect(float left, float top, float right, float bottom, 1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 1952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRectOp(left, top, right, bottom, op)); 196984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipRect(left, top, right, bottom, op); 1974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 199db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipPath(const SkPath* path, SkRegion::Op op) { 2002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik path = refPath(path); 2012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipPathOp(path, op)); 202984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipPath(path, op); 203735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 204735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 205db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipRegion(const SkRegion* region, SkRegion::Op op) { 2062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik region = refRegion(region); 2072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRegionOp(region, op)); 208984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipRegion(region, op); 209735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 210735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 211956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craikvoid DisplayListCanvas::drawRenderNode(RenderNode* renderNode) { 2128afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik LOG_ALWAYS_FATAL_IF(!renderNode, "missing rendernode"); 213a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik DrawRenderNodeOp* op = new (alloc()) DrawRenderNodeOp( 214a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik renderNode, 215a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik *mState.currentTransform(), 216a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik mState.clipIsSimple()); 2178afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addRenderNodeOp(op); 2180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 2190fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 2203aadd60521960be063ee06208562ccb63dc414e3Chris Craikvoid DisplayListCanvas::drawLayer(DeferredLayerUpdater* layerHandle) { 22112f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck // We ref the DeferredLayerUpdater due to its thread-safe ref-counting 22212f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck // semantics. 223003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(layerHandle); 2243aadd60521960be063ee06208562ccb63dc414e3Chris Craik addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer())); 2256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 2266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 227db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) { 2287c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck bitmap = refBitmap(*bitmap); 2292af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2302af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 231796475006f5d670e8383a2050f11719522437a43Chris Craik addDrawOp(new (alloc()) DrawBitmapOp(bitmap, paint)); 2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 234db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float left, float top, 2358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint* paint) { 236eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita save(SaveFlags::Matrix); 2378dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson translate(left, top); 2388dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 2398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson restore(); 2408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 2418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 242db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, 2438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint* paint) { 2448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (matrix.isIdentity()) { 2458dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 246e688bf720334f58e0003b4c75b53cc7618adf43fChris Craik } else if (!(matrix.getType() & ~(SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask)) 247e688bf720334f58e0003b4c75b53cc7618adf43fChris Craik && MathUtils::isPositive(matrix.getScaleX()) 248e688bf720334f58e0003b4c75b53cc7618adf43fChris Craik && MathUtils::isPositive(matrix.getScaleY())) { 2498dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // SkMatrix::isScaleTranslate() not available in L 2508dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect src; 2518dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect dst; 2528dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bitmap.getBounds(&src); 2538dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson matrix.mapRect(&dst, src); 2548dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom, 2558dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, paint); 2568dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } else { 257eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita save(SaveFlags::Matrix); 2588dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson concat(matrix); 2598dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 2608dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson restore(); 2618dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 2628dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 2638dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 264db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, 2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 266d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float dstRight, float dstBottom, const SkPaint* paint) { 267796475006f5d670e8383a2050f11719522437a43Chris Craik if (srcLeft == 0 && srcTop == 0 26814100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik && srcRight == bitmap.width() 26914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik && srcBottom == bitmap.height() 270796475006f5d670e8383a2050f11719522437a43Chris Craik && (srcBottom - srcTop == dstBottom - dstTop) 271796475006f5d670e8383a2050f11719522437a43Chris Craik && (srcRight - srcLeft == dstRight - dstLeft)) { 272527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik // transform simple rect to rect drawing case into position bitmap ops, since they merge 273eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita save(SaveFlags::Matrix); 274796475006f5d670e8383a2050f11719522437a43Chris Craik translate(dstLeft, dstTop); 2758dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 276796475006f5d670e8383a2050f11719522437a43Chris Craik restore(); 277796475006f5d670e8383a2050f11719522437a43Chris Craik } else { 278796475006f5d670e8383a2050f11719522437a43Chris Craik paint = refPaint(paint); 279796475006f5d670e8383a2050f11719522437a43Chris Craik 28014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik if (paint && paint->getShader()) { 28114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik float scaleX = (dstRight - dstLeft) / (srcRight - srcLeft); 28214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik float scaleY = (dstBottom - dstTop) / (srcBottom - srcTop); 28314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik if (!MathUtils::areEqual(scaleX, 1.0f) || !MathUtils::areEqual(scaleY, 1.0f)) { 28414100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik // Apply the scale transform on the canvas, so that the shader 28514100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik // effectively calculates positions relative to src rect space 28614100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 287eecff56fed5dd5206acfbc5007b4912081b36d3bFlorin Malita save(SaveFlags::Matrix); 28814100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik translate(dstLeft, dstTop); 28914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik scale(scaleX, scaleY); 29014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 29114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstLeft = 0.0f; 29214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstTop = 0.0f; 29314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstRight = srcRight - srcLeft; 29414100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstBottom = srcBottom - srcTop; 29514100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 2967c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapRectOp(refBitmap(bitmap), 29714100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik srcLeft, srcTop, srcRight, srcBottom, 29814100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstLeft, dstTop, dstRight, dstBottom, paint)); 29914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik restore(); 30014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik return; 30114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik } 30214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik } 30314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 3047c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapRectOp(refBitmap(bitmap), 305796475006f5d670e8383a2050f11719522437a43Chris Craik srcLeft, srcTop, srcRight, srcBottom, 306796475006f5d670e8383a2050f11719522437a43Chris Craik dstLeft, dstTop, dstRight, dstBottom, paint)); 307527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 310db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, 311d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* vertices, const int* colors, const SkPaint* paint) { 3120664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik int vertexCount = (meshWidth + 1) * (meshHeight + 1); 3130664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik vertices = refBuffer<float>(vertices, vertexCount * 2); // 2 floats per vertex 3142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3150664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik colors = refBuffer<int>(colors, vertexCount); // 1 color per vertex 3162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3177c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapMeshOp(refBitmap(bitmap), meshWidth, meshHeight, 3188dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson vertices, colors, paint)); 3195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 3205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 3214c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenbergervoid DisplayListCanvas::drawNinePatch(const SkBitmap& bitmap, const Res_png_9patch& patch, 3224c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) { 3237c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck const SkBitmap* bitmapPtr = refBitmap(bitmap); 3244c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger const Res_png_9patch* patchPtr = refPatch(&patch); 32516ea8d373b03b1e115dd505af70dbee4e3a3a182Romain Guy paint = refPaint(paint); 3262af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3274c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger addDrawOp(new (alloc()) DrawPatchOp(bitmapPtr, patchPtr, 3284c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger dstLeft, dstTop, dstRight, dstBottom, paint)); 3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 331db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawColor(int color, SkXfermode::Mode mode) { 3322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawColorOp(color, mode)); 3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 335db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPaint(const SkPaint& paint) { 3368dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect bounds; 3378dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (getClipBounds(&bounds)) { 3388dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawRect(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, paint); 3398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 3408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 3418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 3428dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 343db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRect(float left, float top, float right, float bottom, 3448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint& paint) { 3458dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawRectOp(left, top, right, bottom, refPaint(&paint))); 3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 348db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRoundRect(float left, float top, float right, float bottom, 3498dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float rx, float ry, const SkPaint& paint) { 3508dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawRoundRectOp(left, top, right, bottom, rx, ry, refPaint(&paint))); 35101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 35201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 353db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRoundRect( 354072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top, 355072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom, 356072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry, 357072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPaint* paint) { 358003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(left); 359003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(top); 360003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(right); 361003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(bottom); 362003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(rx); 363003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(ry); 364003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(paint); 36537b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(paint->value.getShader()); 366072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi addDrawOp(new (alloc()) DrawRoundRectPropsOp(&left->value, &top->value, 367072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi &right->value, &bottom->value, &rx->value, &ry->value, &paint->value)); 368072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi} 369072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi 370db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawCircle(float x, float y, float radius, const SkPaint& paint) { 3718dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawCircleOp(x, y, radius, refPaint(&paint))); 37201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 37301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 374db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y, 37552244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint) { 376003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(x); 377003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(y); 378003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(radius); 379003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ref(paint); 38037b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(paint->value.getShader()); 38152244fff29042926e21fa897ef5ab11148e35299John Reck addDrawOp(new (alloc()) DrawCirclePropsOp(&x->value, &y->value, 38252244fff29042926e21fa897ef5ab11148e35299John Reck &radius->value, &paint->value)); 38352244fff29042926e21fa897ef5ab11148e35299John Reck} 38452244fff29042926e21fa897ef5ab11148e35299John Reck 385db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawOval(float left, float top, float right, float bottom, 3868dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint& paint) { 3878dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawOvalOp(left, top, right, bottom, refPaint(&paint))); 388c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 389c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 390db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawArc(float left, float top, float right, float bottom, 3918dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) { 392544e524db6e4da526af1c897fe5314036ede5012Chris Craik if (fabs(sweepAngle) >= 360.0f) { 393107843de4507b3511006cb9c77b8d0364374385aTom Hudson drawOval(left, top, right, bottom, paint); 394107843de4507b3511006cb9c77b8d0364374385aTom Hudson } else { 395107843de4507b3511006cb9c77b8d0364374385aTom Hudson addDrawOp(new (alloc()) DrawArcOp(left, top, right, bottom, 3968dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson startAngle, sweepAngle, useCenter, refPaint(&paint))); 3976ac174b97246ed40fe780b29561603b61770fa17Chris Craik } 3988b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 3998b2f5267f16c295f12faab810527cd6311997e34Romain Guy 400db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 4018dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawPathOp(refPath(&path), refPaint(&paint))); 4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 404db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawLines(const float* points, int count, const SkPaint& paint) { 4052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 4062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4078dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawLinesOp(points, count, refPaint(&paint))); 408ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 409ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 410db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPoints(const float* points, int count, const SkPaint& paint) { 4112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 4122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4138dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawPointsOp(points, count, refPaint(&paint))); 4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 416766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuvoid DisplayListCanvas::drawVectorDrawable(VectorDrawableRoot* tree) { 417766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu mDisplayList->ref(tree); 41814b56a514c9f49b3f9496e247c6cbb31db3e0db8Doris Liu addDrawOp(new (alloc()) DrawVectorDrawableOp(tree)); 419766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 420766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 421dccca44ffda4836b56a21da95a046c9708ffd49csergeyvvoid DisplayListCanvas::drawGlyphsOnPath(const uint16_t* glyphs, int count, 4228dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPath& path, float hOffset, float vOffset, const SkPaint& paint) { 4238dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (!glyphs || count <= 0) return; 4242af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4258dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = 2 * count; 426e8c3c813b0e3ac98304b17a751ce6e436e252bd9Chris Craik DrawOp* op = new (alloc()) DrawTextOnPathOp(refBuffer<glyph_t>(glyphs, count), 4278dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bytesCount, count, refPath(&path), 4288dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson hOffset, vOffset, refPaint(&paint)); 4290f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 430996e57c84368058be793897ebc355b917a59abc2Raph Levien} 431996e57c84368058be793897ebc355b917a59abc2Raph Levien 432dccca44ffda4836b56a21da95a046c9708ffd49csergeyvvoid DisplayListCanvas::drawGlyphs(const uint16_t* glyphs, const float* positions, 4338dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int count, const SkPaint& paint, float x, float y, 4348dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float boundsLeft, float boundsTop, float boundsRight, float boundsBottom, 4358dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float totalAdvance) { 436527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 4378dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (!glyphs || count <= 0 || PaintUtils::paintWillNotDrawText(paint)) return; 43833f6beb10f98e8ba96250e284876d607055d278dRomain Guy 4398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = count * 2; 4402af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik positions = refBuffer<float>(positions, count * 2); 4418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom); 44233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 443e8c3c813b0e3ac98304b17a751ce6e436e252bd9Chris Craik DrawOp* op = new (alloc()) DrawTextOp(refBuffer<glyph_t>(glyphs, count), bytesCount, count, 4446578a989566e585eee053095dc80e2552e125db2Derek Sollenberger x, y, positions, refPaint(&paint), totalAdvance, bounds); 4456578a989566e585eee053095dc80e2552e125db2Derek Sollenberger addDrawOp(op); 446a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik drawTextDecorations(x, y, totalAdvance, paint); 447672433d90fab7383cd28beac9d4485b566a90940Romain Guy} 448672433d90fab7383cd28beac9d4485b566a90940Romain Guy 44994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenbergervoid DisplayListCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) { 45094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger if (paint.getStyle() != SkPaint::kFill_Style || 45194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger (paint.isAntiAlias() && !mState.currentTransform()->isSimple())) { 45294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger SkRegion::Iterator it(region); 45394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger while (!it.done()) { 45494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger const SkIRect& r = it.rect(); 45594394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); 45694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger it.next(); 45794394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 45894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } else { 45994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger int count = 0; 46094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger Vector<float> rects; 46194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger SkRegion::Iterator it(region); 46294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger while (!it.done()) { 46394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger const SkIRect& r = it.rect(); 46494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fLeft); 46594394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fTop); 46694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fRight); 46794394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fBottom); 46894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger count += 4; 46994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger it.next(); 47094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 47194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger drawRects(rects.array(), count, &paint); 47294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 47394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger} 47494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger 475db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRects(const float* rects, int count, const SkPaint* paint) { 476107843de4507b3511006cb9c77b8d0364374385aTom Hudson if (count <= 0) return; 477672433d90fab7383cd28beac9d4485b566a90940Romain Guy 4782af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik rects = refBuffer<float>(rects, count); 4792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 4802af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawRectsOp(rects, count, paint)); 481eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 482eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 483db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::setDrawFilter(SkDrawFilter* filter) { 4840b8606266c1afc69cbeb73acda67c85d87943318Derek Sollenberger mDrawFilter.reset(SkSafeRef(filter)); 4852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 4862af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 487db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::insertReorderBarrier(bool enableReorder) { 4888afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 4898afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 4908afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = enableReorder ? kBarrier_OutOfOrder : kBarrier_InOrder; 4918afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 4928afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 493db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::flushRestoreToCount() { 4942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mRestoreSaveCount >= 0) { 4958afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addOpAndUpdateChunk(new (alloc()) RestoreToCountOp(mRestoreSaveCount)); 4962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mRestoreSaveCount = -1; 4972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 4982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 4992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 500db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::flushTranslate() { 5018afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (mHasDeferredTranslate) { 5022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mTranslateX != 0.0f || mTranslateY != 0.0f) { 5038afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addOpAndUpdateChunk(new (alloc()) TranslateOp(mTranslateX, mTranslateY)); 5042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mTranslateX = mTranslateY = 0.0f; 5052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5068afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mHasDeferredTranslate = false; 5072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 510db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addOpAndUpdateChunk(DisplayListOp* op) { 511003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik int insertIndex = mDisplayList->ops.size(); 51210ed692118552a01ff97b095295852b631e51beeChris Craik#if HWUI_NEW_OPS 51310ed692118552a01ff97b095295852b631e51beeChris Craik LOG_ALWAYS_FATAL("unsupported"); 51410ed692118552a01ff97b095295852b631e51beeChris Craik#else 515003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->ops.push_back(op); 51610ed692118552a01ff97b095295852b631e51beeChris Craik#endif 5178afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (mDeferredBarrierType != kBarrier_None) { 5188afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // op is first in new chunk 519003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->chunks.emplace_back(); 520003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik DisplayList::Chunk& newChunk = mDisplayList->chunks.back(); 5218afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.beginOpIndex = insertIndex; 5228afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.endOpIndex = insertIndex + 1; 5238afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.reorderChildren = (mDeferredBarrierType == kBarrier_OutOfOrder); 5248afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 525b36af87f8275f4b982906f88193ec27600f2746aChris Craik int nextChildIndex = mDisplayList->children.size(); 5268afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.beginChildIndex = newChunk.endChildIndex = nextChildIndex; 5278afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = kBarrier_None; 5288afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } else { 5298afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // standard case - append to existing chunk 530003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->chunks.back().endOpIndex = insertIndex + 1; 5318afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } 5328afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return insertIndex; 5332af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 535db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::flushAndAddOp(DisplayListOp* op) { 5368afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 5378afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 5388afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return addOpAndUpdateChunk(op); 5398afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5408afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 541db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addStateOp(StateOp* op) { 5428afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return flushAndAddOp(op); 5438afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5448afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 545db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addDrawOp(DrawOp* op) { 5462af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik Rect localBounds; 5473b20251a355c88193c439f928a84ae69483fb488John Reck if (op->getLocalBounds(localBounds)) { 5488dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bool rejected = quickRejectRect(localBounds.left, localBounds.top, 5492af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik localBounds.right, localBounds.bottom); 5502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik op->setQuickRejected(rejected); 5512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 552c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik 553003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->hasDrawOps = true; 5548afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return flushAndAddOp(op); 5558afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5568afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 557db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addRenderNodeOp(DrawRenderNodeOp* op) { 5588afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik int opIndex = addDrawOp(op); 559b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#if !HWUI_NEW_OPS 560003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik int childIndex = mDisplayList->addChild(op); 5618afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 5628afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // update the chunk's child indices 563003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik DisplayList::Chunk& chunk = mDisplayList->chunks.back(); 5648afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik chunk.endChildIndex = childIndex + 1; 5658afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 566b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik if (op->renderNode->stagingProperties().isProjectionReceiver()) { 5678afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // use staging property, since recording on UI thread 568003cc3dec8e2a92e51086fbcd5ee1bb236efa701Chris Craik mDisplayList->projectionReceiveIndex = opIndex; 5698afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } 570b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif 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]; 581f35b989d26bb98900f6c5fa2e586326b30b6e161Leon Scroggins III if (shader->isABitmap(&bitmap, nullptr, xy)) { 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