DisplayListCanvas.cpp revision 4c5efe9290543b723b76a8bd48518da1ae1dcb26
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 57cc882b6518129a11fa007f8c9343e972f03607b4Derek Sollenberger mState.setViewport(width, height); 58984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.initializeSaveStack(0, 0, mState.getWidth(), mState.getHeight(), 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 171ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudsonvoid DisplayListCanvas::setLocalMatrix(const SkMatrix& matrix) { 172ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson addStateOp(new (alloc()) SetLocalMatrixOp(matrix)); 173ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson mState.setMatrix(matrix); 174ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson} 175ac7b6d33d23cb0baaf61c723346198d41f012035Tom Hudson 176db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::concat(const SkMatrix& matrix) { 1772af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ConcatMatrixOp(matrix)); 178984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson mState.concatMatrix(matrix); 1794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 1804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 181db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::getClipBounds(SkRect* outRect) const { 1828dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson Rect bounds = mState.getLocalClipBounds(); 1838dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson *outRect = SkRect::MakeLTRB(bounds.left, bounds.top, bounds.right, bounds.bottom); 1848dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return !(outRect->isEmpty()); 1858dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1868dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 187db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::quickRejectRect(float left, float top, float right, float bottom) const { 1888dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.quickRejectConservative(left, top, right, bottom); 1898dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1908dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 191db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::quickRejectPath(const SkPath& path) const { 1928dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect bounds = path.getBounds(); 1938dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson return mState.quickRejectConservative(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom); 1948dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 1958dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 1968dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 197db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipRect(float left, float top, float right, float bottom, 1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 1992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRectOp(left, top, right, bottom, op)); 200984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipRect(left, top, right, bottom, op); 2014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 203db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipPath(const SkPath* path, SkRegion::Op op) { 2042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik path = refPath(path); 2052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipPathOp(path, op)); 206984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipPath(path, op); 207735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 208735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 209db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikbool DisplayListCanvas::clipRegion(const SkRegion* region, SkRegion::Op op) { 2102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik region = refRegion(region); 2112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addStateOp(new (alloc()) ClipRegionOp(region, op)); 212984162fb7e4010b6e2908352dbff17ed47eecf06Tom Hudson return mState.clipRegion(region, op); 213735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy} 214735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 215956f340aacc7d8fc2d10f776551f13fde2d8d3abChris Craikvoid DisplayListCanvas::drawRenderNode(RenderNode* renderNode) { 2168afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik LOG_ALWAYS_FATAL_IF(!renderNode, "missing rendernode"); 217a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik DrawRenderNodeOp* op = new (alloc()) DrawRenderNodeOp( 218a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik renderNode, 219a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik *mState.currentTransform(), 220a766cb2bce5db9108c0266fbebea6aa18d5713ffChris Craik mState.clipIsSimple()); 2218afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addRenderNodeOp(op); 2220fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 2230fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 224db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawLayer(DeferredLayerUpdater* layerHandle, float x, float y) { 22512f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck // We ref the DeferredLayerUpdater due to its thread-safe ref-counting 22612f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck // semantics. 22712f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck mDisplayListData->ref(layerHandle); 22812f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer(), x, y)); 2296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 2306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 231db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap* bitmap, const SkPaint* paint) { 2327c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck bitmap = refBitmap(*bitmap); 2332af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 2342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 235796475006f5d670e8383a2050f11719522437a43Chris Craik addDrawOp(new (alloc()) DrawBitmapOp(bitmap, paint)); 2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 238db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float left, float top, 2398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint* paint) { 2408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson save(SkCanvas::kMatrix_SaveFlag); 2418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson translate(left, top); 2428dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 2438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson restore(); 2448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 2458dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 246db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, const SkMatrix& matrix, 2478dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint* paint) { 2488dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (matrix.isIdentity()) { 2498dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 2508dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } else if (!(matrix.getType() & ~(SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask))) { 2518dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson // SkMatrix::isScaleTranslate() not available in L 2528dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect src; 2538dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect dst; 2548dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bitmap.getBounds(&src); 2558dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson matrix.mapRect(&dst, src); 2568dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(bitmap, src.fLeft, src.fTop, src.fRight, src.fBottom, 2578dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, paint); 2588dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } else { 2598dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson save(SkCanvas::kMatrix_SaveFlag); 2608dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson concat(matrix); 2618dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 2628dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson restore(); 2638dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 2648dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 2658dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 266db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmap(const SkBitmap& bitmap, float srcLeft, float srcTop, 2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 268d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik float dstRight, float dstBottom, const SkPaint* paint) { 269796475006f5d670e8383a2050f11719522437a43Chris Craik if (srcLeft == 0 && srcTop == 0 27014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik && srcRight == bitmap.width() 27114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik && srcBottom == bitmap.height() 272796475006f5d670e8383a2050f11719522437a43Chris Craik && (srcBottom - srcTop == dstBottom - dstTop) 273796475006f5d670e8383a2050f11719522437a43Chris Craik && (srcRight - srcLeft == dstRight - dstLeft)) { 274527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik // transform simple rect to rect drawing case into position bitmap ops, since they merge 275796475006f5d670e8383a2050f11719522437a43Chris Craik save(SkCanvas::kMatrix_SaveFlag); 276796475006f5d670e8383a2050f11719522437a43Chris Craik translate(dstLeft, dstTop); 2778dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawBitmap(&bitmap, paint); 278796475006f5d670e8383a2050f11719522437a43Chris Craik restore(); 279796475006f5d670e8383a2050f11719522437a43Chris Craik } else { 280796475006f5d670e8383a2050f11719522437a43Chris Craik paint = refPaint(paint); 281796475006f5d670e8383a2050f11719522437a43Chris Craik 28214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik if (paint && paint->getShader()) { 28314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik float scaleX = (dstRight - dstLeft) / (srcRight - srcLeft); 28414100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik float scaleY = (dstBottom - dstTop) / (srcBottom - srcTop); 28514100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik if (!MathUtils::areEqual(scaleX, 1.0f) || !MathUtils::areEqual(scaleY, 1.0f)) { 28614100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik // Apply the scale transform on the canvas, so that the shader 28714100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik // effectively calculates positions relative to src rect space 28814100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 28914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik save(SkCanvas::kMatrix_SaveFlag); 29014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik translate(dstLeft, dstTop); 29114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik scale(scaleX, scaleY); 29214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 29314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstLeft = 0.0f; 29414100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstTop = 0.0f; 29514100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstRight = srcRight - srcLeft; 29614100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstBottom = srcBottom - srcTop; 29714100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 2987c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapRectOp(refBitmap(bitmap), 29914100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik srcLeft, srcTop, srcRight, srcBottom, 30014100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik dstLeft, dstTop, dstRight, dstBottom, paint)); 30114100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik restore(); 30214100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik return; 30314100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik } 30414100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik } 30514100ac9f8efc1a2407e3f5a5c8b2532a49585dbChris Craik 3067c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapRectOp(refBitmap(bitmap), 307796475006f5d670e8383a2050f11719522437a43Chris Craik srcLeft, srcTop, srcRight, srcBottom, 308796475006f5d670e8383a2050f11719522437a43Chris Craik dstLeft, dstTop, dstRight, dstBottom, paint)); 309527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik } 3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 312db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawBitmapMesh(const SkBitmap& bitmap, int meshWidth, int meshHeight, 313d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik const float* vertices, const int* colors, const SkPaint* paint) { 3140664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik int vertexCount = (meshWidth + 1) * (meshHeight + 1); 3150664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik vertices = refBuffer<float>(vertices, vertexCount * 2); // 2 floats per vertex 3162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 3170664fef9e2a36025b3fad85b57b4d10617b4d66eChris Craik colors = refBuffer<int>(colors, vertexCount); // 1 color per vertex 3182af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3197c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck addDrawOp(new (alloc()) DrawBitmapMeshOp(refBitmap(bitmap), meshWidth, meshHeight, 3208dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson vertices, colors, paint)); 3215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 3225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 3234c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenbergervoid DisplayListCanvas::drawNinePatch(const SkBitmap& bitmap, const Res_png_9patch& patch, 3244c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger float dstLeft, float dstTop, float dstRight, float dstBottom, const SkPaint* paint) { 3257c103a36f60b690e3fe83c40210e1cb0c76bba43John Reck const SkBitmap* bitmapPtr = refBitmap(bitmap); 3264c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger const Res_png_9patch* patchPtr = refPatch(&patch); 32716ea8d373b03b1e115dd505af70dbee4e3a3a182Romain Guy paint = refPaint(paint); 3282af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 3294c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger addDrawOp(new (alloc()) DrawPatchOp(bitmapPtr, patchPtr, 3304c5efe9290543b723b76a8bd48518da1ae1dcb26Derek Sollenberger dstLeft, dstTop, dstRight, dstBottom, paint)); 3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 333db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawColor(int color, SkXfermode::Mode mode) { 3342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawColorOp(color, mode)); 3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 337db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPaint(const SkPaint& paint) { 3388dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson SkRect bounds; 3398dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (getClipBounds(&bounds)) { 3408dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson drawRect(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, paint); 3418dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson } 3428dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson} 3438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 3448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson 345db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRect(float left, float top, float right, float bottom, 3468dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint& paint) { 3478dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawRectOp(left, top, right, bottom, refPaint(&paint))); 3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 350db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRoundRect(float left, float top, float right, float bottom, 3518dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float rx, float ry, const SkPaint& paint) { 3528dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawRoundRectOp(left, top, right, bottom, rx, ry, refPaint(&paint))); 35301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 35401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 355db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRoundRect( 356072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top, 357072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom, 358072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry, 359072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi CanvasPropertyPaint* paint) { 3600e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(left); 3610e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(top); 3620e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(right); 3630e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(bottom); 3640e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(rx); 3650e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(ry); 3660e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(paint); 36737b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(paint->value.getShader()); 368072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi addDrawOp(new (alloc()) DrawRoundRectPropsOp(&left->value, &top->value, 369072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi &right->value, &bottom->value, &rx->value, &ry->value, &paint->value)); 370072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi} 371072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi 372db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawCircle(float x, float y, float radius, const SkPaint& paint) { 3738dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawCircleOp(x, y, radius, refPaint(&paint))); 37401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 37501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 376db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y, 37752244fff29042926e21fa897ef5ab11148e35299John Reck CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint) { 3780e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(x); 3790e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(y); 3800e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(radius); 3810e89e2b7bcb2c035e8cee77f93120e7c5617f8d2John Reck mDisplayListData->ref(paint); 38237b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(paint->value.getShader()); 38352244fff29042926e21fa897ef5ab11148e35299John Reck addDrawOp(new (alloc()) DrawCirclePropsOp(&x->value, &y->value, 38452244fff29042926e21fa897ef5ab11148e35299John Reck &radius->value, &paint->value)); 38552244fff29042926e21fa897ef5ab11148e35299John Reck} 38652244fff29042926e21fa897ef5ab11148e35299John Reck 387db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawOval(float left, float top, float right, float bottom, 3888dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPaint& paint) { 3898dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawOvalOp(left, top, right, bottom, refPaint(&paint))); 390c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 391c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 392db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawArc(float left, float top, float right, float bottom, 3938dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float startAngle, float sweepAngle, bool useCenter, const SkPaint& paint) { 394544e524db6e4da526af1c897fe5314036ede5012Chris Craik if (fabs(sweepAngle) >= 360.0f) { 395107843de4507b3511006cb9c77b8d0364374385aTom Hudson drawOval(left, top, right, bottom, paint); 396107843de4507b3511006cb9c77b8d0364374385aTom Hudson } else { 397107843de4507b3511006cb9c77b8d0364374385aTom Hudson addDrawOp(new (alloc()) DrawArcOp(left, top, right, bottom, 3988dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson startAngle, sweepAngle, useCenter, refPaint(&paint))); 3996ac174b97246ed40fe780b29561603b61770fa17Chris Craik } 4008b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 4018b2f5267f16c295f12faab810527cd6311997e34Romain Guy 402db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 4038dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawPathOp(refPath(&path), refPaint(&paint))); 4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 406db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawLines(const float* points, int count, const SkPaint& paint) { 4072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 4082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4098dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawLinesOp(points, count, refPaint(&paint))); 410ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 411ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 412db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPoints(const float* points, int count, const SkPaint& paint) { 4132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik points = refBuffer<float>(points, count); 4142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4158dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson addDrawOp(new (alloc()) DrawPointsOp(points, count, refPaint(&paint))); 4164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 418db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawTextOnPath(const uint16_t* glyphs, int count, 4198dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const SkPath& path, float hOffset, float vOffset, const SkPaint& paint) { 4208dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (!glyphs || count <= 0) return; 4212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4228dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = 2 * count; 4238dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson DrawOp* op = new (alloc()) DrawTextOnPathOp(refText((const char*) glyphs, bytesCount), 4248dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bytesCount, count, refPath(&path), 4258dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson hOffset, vOffset, refPaint(&paint)); 4260f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 427996e57c84368058be793897ebc355b917a59abc2Raph Levien} 428996e57c84368058be793897ebc355b917a59abc2Raph Levien 429db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawPosText(const uint16_t* text, const float* positions, 4308dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int count, int posCount, const SkPaint& paint) { 431107843de4507b3511006cb9c77b8d0364374385aTom Hudson if (!text || count <= 0) return; 4322af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4338dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = 2 * count; 4342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik positions = refBuffer<float>(positions, count * 2); 4352af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 4368dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson DrawOp* op = new (alloc()) DrawPosTextOp(refText((const char*) text, bytesCount), 4378dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bytesCount, count, positions, refPaint(&paint)); 4380f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy addDrawOp(op); 439996e57c84368058be793897ebc355b917a59abc2Raph Levien} 440996e57c84368058be793897ebc355b917a59abc2Raph Levien 441db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawText(const uint16_t* glyphs, const float* positions, 4428dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int count, const SkPaint& paint, float x, float y, 4438dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float boundsLeft, float boundsTop, float boundsRight, float boundsBottom, 4448dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson float totalAdvance) { 445527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 4468dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson if (!glyphs || count <= 0 || PaintUtils::paintWillNotDrawText(paint)) return; 44733f6beb10f98e8ba96250e284876d607055d278dRomain Guy 4488dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson int bytesCount = count * 2; 4498dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson const char* text = refText((const char*) glyphs, bytesCount); 4502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik positions = refBuffer<float>(positions, count * 2); 4518dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson Rect bounds(boundsLeft, boundsTop, boundsRight, boundsBottom); 45233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 4536578a989566e585eee053095dc80e2552e125db2Derek Sollenberger DrawOp* op = new (alloc()) DrawTextOp(text, bytesCount, count, 4546578a989566e585eee053095dc80e2552e125db2Derek Sollenberger x, y, positions, refPaint(&paint), totalAdvance, bounds); 4556578a989566e585eee053095dc80e2552e125db2Derek Sollenberger addDrawOp(op); 456672433d90fab7383cd28beac9d4485b566a90940Romain Guy} 457672433d90fab7383cd28beac9d4485b566a90940Romain Guy 45894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenbergervoid DisplayListCanvas::drawRegion(const SkRegion& region, const SkPaint& paint) { 45994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger if (paint.getStyle() != SkPaint::kFill_Style || 46094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger (paint.isAntiAlias() && !mState.currentTransform()->isSimple())) { 46194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger SkRegion::Iterator it(region); 46294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger while (!it.done()) { 46394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger const SkIRect& r = it.rect(); 46494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger drawRect(r.fLeft, r.fTop, r.fRight, r.fBottom, paint); 46594394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger it.next(); 46694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 46794394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } else { 46894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger int count = 0; 46994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger Vector<float> rects; 47094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger SkRegion::Iterator it(region); 47194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger while (!it.done()) { 47294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger const SkIRect& r = it.rect(); 47394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fLeft); 47494394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fTop); 47594394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fRight); 47694394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger rects.push(r.fBottom); 47794394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger count += 4; 47894394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger it.next(); 47994394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 48094394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger drawRects(rects.array(), count, &paint); 48194394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger } 48294394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger} 48394394b3fb048d5349a77b57950ab7f6b6e92ce34Derek Sollenberger 484db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::drawRects(const float* rects, int count, const SkPaint* paint) { 485107843de4507b3511006cb9c77b8d0364374385aTom Hudson if (count <= 0) return; 486672433d90fab7383cd28beac9d4485b566a90940Romain Guy 4872af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik rects = refBuffer<float>(rects, count); 4882af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik paint = refPaint(paint); 4892af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik addDrawOp(new (alloc()) DrawRectsOp(rects, count, paint)); 490eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 491eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 492db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::setDrawFilter(SkDrawFilter* filter) { 4930b8606266c1afc69cbeb73acda67c85d87943318Derek Sollenberger mDrawFilter.reset(SkSafeRef(filter)); 4942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 4952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 496db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::insertReorderBarrier(bool enableReorder) { 4978afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 4988afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 4998afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = enableReorder ? kBarrier_OutOfOrder : kBarrier_InOrder; 5008afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5018afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 502db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::flushRestoreToCount() { 5032af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mRestoreSaveCount >= 0) { 5048afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addOpAndUpdateChunk(new (alloc()) RestoreToCountOp(mRestoreSaveCount)); 5052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mRestoreSaveCount = -1; 5062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 509db663fe83f976107fd8fd9307d871b37d9e47370Chris Craikvoid DisplayListCanvas::flushTranslate() { 5108afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (mHasDeferredTranslate) { 5112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (mTranslateX != 0.0f || mTranslateY != 0.0f) { 5128afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik addOpAndUpdateChunk(new (alloc()) TranslateOp(mTranslateX, mTranslateY)); 5132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mTranslateX = mTranslateY = 0.0f; 5142af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5158afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mHasDeferredTranslate = false; 5162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 5172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5182af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 519db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addOpAndUpdateChunk(DisplayListOp* op) { 520272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck int insertIndex = mDisplayListData->displayListOps.size(); 521272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck mDisplayListData->displayListOps.push_back(op); 5228afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (mDeferredBarrierType != kBarrier_None) { 5238afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // op is first in new chunk 524272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck mDisplayListData->chunks.emplace_back(); 525272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck DisplayListData::Chunk& newChunk = mDisplayListData->chunks.back(); 5268afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.beginOpIndex = insertIndex; 5278afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.endOpIndex = insertIndex + 1; 5288afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.reorderChildren = (mDeferredBarrierType == kBarrier_OutOfOrder); 5298afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 5308afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik int nextChildIndex = mDisplayListData->children().size(); 5318afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik newChunk.beginChildIndex = newChunk.endChildIndex = nextChildIndex; 5328afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDeferredBarrierType = kBarrier_None; 5338afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } else { 5348afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // standard case - append to existing chunk 535272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck mDisplayListData->chunks.back().endOpIndex = insertIndex + 1; 5368afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } 5378afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return insertIndex; 5382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik} 5392af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 540db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::flushAndAddOp(DisplayListOp* op) { 5418afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushRestoreToCount(); 5428afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik flushTranslate(); 5438afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return addOpAndUpdateChunk(op); 5448afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5458afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 546db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addStateOp(StateOp* op) { 5478afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return flushAndAddOp(op); 5488afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5498afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 550db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addDrawOp(DrawOp* op) { 5512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik Rect localBounds; 5523b20251a355c88193c439f928a84ae69483fb488John Reck if (op->getLocalBounds(localBounds)) { 5538dfaa4904205772cdceee63ef3989bcdedf1a914Tom Hudson bool rejected = quickRejectRect(localBounds.left, localBounds.top, 5542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik localBounds.right, localBounds.bottom); 5552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik op->setQuickRejected(rejected); 5562af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik } 557c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik 55844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck mDisplayListData->hasDrawOps = true; 5598afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return flushAndAddOp(op); 5608afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik} 5618afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 562db663fe83f976107fd8fd9307d871b37d9e47370Chris Craiksize_t DisplayListCanvas::addRenderNodeOp(DrawRenderNodeOp* op) { 5638afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik int opIndex = addDrawOp(op); 5648afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik int childIndex = mDisplayListData->addChild(op); 5658afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 5668afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // update the chunk's child indices 567272a685f17cc4828257e521a6f62b7b17870f75eJohn Reck DisplayListData::Chunk& chunk = mDisplayListData->chunks.back(); 5688afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik chunk.endChildIndex = childIndex + 1; 5698afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik 5708afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik if (op->renderNode()->stagingProperties().isProjectionReceiver()) { 5718afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik // use staging property, since recording on UI thread 5728afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik mDisplayListData->projectionReceiveIndex = opIndex; 5738afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik } 5748afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik return opIndex; 5755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 5765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 57737b0824a46157b7e169ad7ec33a46e89c851884cJohn Reckvoid DisplayListCanvas::refBitmapsInShader(const SkShader* shader) { 57837b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck if (!shader) return; 57937b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck 58037b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck // If this paint has an SkShader that has an SkBitmap add 58137b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck // it to the bitmap pile 58237b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck SkBitmap bitmap; 58337b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck SkShader::TileMode xy[2]; 58437b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck if (shader->asABitmap(&bitmap, nullptr, xy) == SkShader::kDefault_BitmapType) { 58537b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmap(bitmap); 58637b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck return; 58737b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck } 58837b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck SkShader::ComposeRec rec; 58937b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck if (shader->asACompose(&rec)) { 59037b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(rec.fShaderA); 59137b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck refBitmapsInShader(rec.fShaderB); 59237b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck return; 59337b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck } 59437b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck} 59537b0824a46157b7e169ad7ec33a46e89c851884cJohn Reck 5964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 5974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 598