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