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