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