181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// Copyright (C) 2013 Google Inc. All rights reserved.
281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)//
381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// modification, are permitted provided that the following conditions are
581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// met:
681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)//
781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)//    * Redistributions of source code must retain the above copyright
881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)//    * Redistributions in binary form must reproduce the above
1081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
1181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// in the documentation and/or other materials provided with the
1281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// distribution.
1381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)//    * Neither the name of Google Inc. nor the names of its
1481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
1581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// this software without specific prior written permission.
1681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)//
1781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#ifndef GraphicsContextStateSaver_h
3081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#define GraphicsContextStateSaver_h
3181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h"
33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
3481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
3681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
37a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT GraphicsContextStateSaver {
3881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED;
3981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)public:
4081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    GraphicsContextStateSaver(GraphicsContext& context, bool saveAndRestore = true)
4181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        : m_context(context)
4281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        , m_saveAndRestore(saveAndRestore)
4381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    {
4481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (m_saveAndRestore)
4581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            m_context.save();
4681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
4781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
4881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    ~GraphicsContextStateSaver()
4981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    {
5081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (m_saveAndRestore)
5181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            m_context.restore();
5281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
5381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
5481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void save()
5581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    {
5681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        ASSERT(!m_saveAndRestore);
5781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_context.save();
5881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_saveAndRestore = true;
5981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
6081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void saveIfNeeded()
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (saved())
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return;
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        save();
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
6881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void restore()
6981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    {
7081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        ASSERT(m_saveAndRestore);
7181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_context.restore();
7281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        m_saveAndRestore = false;
7381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
7481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
7581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    GraphicsContext* context() const { return &m_context; }
76e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    bool saved() const { return m_saveAndRestore; }
7781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
7881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)private:
7981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    GraphicsContext& m_context;
8081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    bool m_saveAndRestore;
8181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)};
8281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
83c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
8481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
8581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#endif // GraphicsContextStateSaver_h
86