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