File indexing completed on 2024-04-28 05:32:09

0001 #ifndef oxygencairopattern_h
0002 #define oxygencairopattern_h
0003 /*
0004 * this file is part of the oxygen gtk engine
0005 * SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0006 *
0007 * SPDX-License-Identifier: LGPL-2.0-or-later
0008 */
0009 
0010 #include <cairo.h>
0011 #include <cassert>
0012 
0013 namespace Oxygen
0014 {
0015     namespace Cairo
0016     {
0017 
0018         //! wrapper class around cairo_pattern_t structure
0019         class Pattern
0020         {
0021             public:
0022 
0023             //! empty constructor is private
0024             Pattern( void ):
0025                 _pattern( 0L )
0026             {}
0027 
0028             //! constructor
0029             Pattern( cairo_pattern_t* pattern ):
0030                 _pattern( pattern )
0031             {}
0032 
0033             //! destructor
0034             virtual ~Pattern( void )
0035             { free(); }
0036 
0037 
0038             //! copy constructor is private
0039             Pattern( const Pattern& other ):
0040                 _pattern( other._pattern )
0041             { if( _pattern ) cairo_pattern_reference( _pattern ); }
0042 
0043             //! equal to operator is private
0044             Pattern& operator = (const Pattern& other )
0045             {
0046                 cairo_pattern_t* old( _pattern );
0047                 _pattern = other._pattern;
0048                 if( _pattern ) cairo_pattern_reference( _pattern );
0049                 if( old ) cairo_pattern_destroy( old );
0050                 return *this;
0051             }
0052 
0053             //! set pattern
0054             void set( cairo_pattern_t* pattern )
0055             {
0056                 assert( !_pattern );
0057                 _pattern = pattern;
0058             }
0059 
0060             //! free the pattern
0061             /*!
0062             it should not be necessary to call this method
0063             since it is already handled in destructor
0064             */
0065             void free( void )
0066             {
0067                 if( _pattern )
0068                 {
0069                     cairo_pattern_destroy( _pattern );
0070                     _pattern = 0L;
0071                 }
0072             }
0073 
0074             //! cast to cairo_pattern_t
0075             operator cairo_pattern_t* (void) const
0076             { return _pattern; }
0077 
0078             private:
0079 
0080             //! pattern
0081             cairo_pattern_t* _pattern;
0082 
0083 
0084         };
0085 
0086     }
0087 }
0088 #endif