1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2006 The Android Open Source Project 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkDrawSaveLayer.h" 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkAnimateMaker.h" 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkCanvas.h" 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkDrawPaint.h" 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkDrawRectangle.h" 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#if SK_USE_CONDENSED_INFO == 0 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerconst SkMemberInfo SkSaveLayer::fInfo[] = { 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SK_MEMBER(bounds, Rect), 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SK_MEMBER(paint, Paint) 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerDEFINE_GET_MEMBER(SkSaveLayer); 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkSaveLayer::SkSaveLayer() : paint(NULL), bounds(NULL) { 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek SollenbergerSkSaveLayer::~SkSaveLayer(){ 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerbool SkSaveLayer::draw(SkAnimateMaker& maker) 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (!bounds) { 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return false; 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPaint* save = maker.fPaint; 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger //paint is an SkDrawPaint 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (paint) 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger { 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPaint realPaint; 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger paint->setupPaint(&realPaint); 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger maker.fCanvas->saveLayer(&bounds->fRect, &realPaint, SkCanvas::kHasAlphaLayer_SaveFlag); 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger else 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger maker.fCanvas->saveLayer(&bounds->fRect, save, SkCanvas::kHasAlphaLayer_SaveFlag); 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkPaint local = SkPaint(*maker.fPaint); 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger maker.fPaint = &local; 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool result = INHERITED::draw(maker); 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger maker.fPaint = save; 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger maker.fCanvas->restore(); 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return result; 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DUMP_ENABLED 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkSaveLayer::dump(SkAnimateMaker* maker) 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger dumpBase(maker); 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger //would dump enabled be defined but not debug? 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (paint) 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkDebugf("paint=\"%s\" ", paint->id); 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (bounds) 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkDebugf("bounds=\"%s\" ", bounds->id); 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger dumpDrawables(maker); 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergervoid SkSaveLayer::onEndElement(SkAnimateMaker& maker) 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger{ 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger if (!bounds) 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger maker.setErrorCode(SkDisplayXMLParserError::kSaveLayerNeedsBounds); 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger INHERITED::onEndElement(maker); 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger} 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 79