1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawSaveLayer.h" 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkAnimateMaker.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawPaint.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawRectangle.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#if SK_USE_CONDENSED_INFO == 0 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkMemberInfo SkSaveLayer::fInfo[] = { 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(bounds, Rect), 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SK_MEMBER(paint, Paint) 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comDEFINE_GET_MEMBER(SkSaveLayer); 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkSaveLayer::SkSaveLayer() : paint(NULL), bounds(NULL) { 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkSaveLayer::~SkSaveLayer(){ 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkSaveLayer::draw(SkAnimateMaker& maker) 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!bounds) { 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return false; 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 38d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkPaint* save = maker.fPaint; 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com //paint is an SkDrawPaint 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (paint) 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com { 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint realPaint; 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint->setupPaint(&realPaint); 44091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org maker.fCanvas->saveLayer(&bounds->fRect, &realPaint); 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com else 47091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org maker.fCanvas->saveLayer(&bounds->fRect, save); 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint local = SkPaint(*maker.fPaint); 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.fPaint = &local; 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool result = INHERITED::draw(maker); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.fPaint = save; 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.fCanvas->restore(); 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return result; 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DUMP_ENABLED 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkSaveLayer::dump(SkAnimateMaker* maker) 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dumpBase(maker); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com //would dump enabled be defined but not debug? 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (paint) 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("paint=\"%s\" ", paint->id); 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (bounds) 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("bounds=\"%s\" ", bounds->id); 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dumpDrawables(maker); 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkSaveLayer::onEndElement(SkAnimateMaker& maker) 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!bounds) 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com maker.setErrorCode(SkDisplayXMLParserError::kSaveLayerNeedsBounds); 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com INHERITED::onEndElement(maker); 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 77