11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawSaveLayer.h" 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkAnimateMaker.h" 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h" 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawPaint.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkDrawRectangle.h" 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if SK_USE_CONDENSED_INFO == 0 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectconst SkMemberInfo SkSaveLayer::fInfo[] = { 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_MEMBER(bounds, Rect), 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SK_MEMBER(paint, Paint) 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectDEFINE_GET_MEMBER(SkSaveLayer); 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkSaveLayer::SkSaveLayer() : paint(NULL), bounds(NULL) { 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkSaveLayer::~SkSaveLayer(){ 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectbool SkSaveLayer::draw(SkAnimateMaker& maker) 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!bounds) { 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPaint* save = maker.fPaint; 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //paint is an SkDrawPaint 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint) 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPaint realPaint; 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project paint->setupPaint(&realPaint); 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project maker.fCanvas->saveLayer(&bounds->fRect, &realPaint, SkCanvas::kHasAlphaLayer_SaveFlag); 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project else 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project maker.fCanvas->saveLayer(&bounds->fRect, save, SkCanvas::kHasAlphaLayer_SaveFlag); 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPaint local = SkPaint(*maker.fPaint); 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project maker.fPaint = &local; 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project bool result = INHERITED::draw(maker); 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project maker.fPaint = save; 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project maker.fCanvas->restore(); 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return result; 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DUMP_ENABLED 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkSaveLayer::dump(SkAnimateMaker* maker) 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dumpBase(maker); 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project //would dump enabled be defined but not debug? 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (paint) 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("paint=\"%s\" ", paint->id); 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (bounds) 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugf("bounds=\"%s\" ", bounds->id); 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project dumpDrawables(maker); 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkSaveLayer::onEndElement(SkAnimateMaker& maker) 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!bounds) 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project maker.setErrorCode(SkDisplayXMLParserError::kSaveLayerNeedsBounds); 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project INHERITED::onEndElement(maker); 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 79