#ifndef __RIPIXELPIPE_H #define __RIPIXELPIPE_H /*------------------------------------------------------------------------ * * OpenVG 1.1 Reference Implementation * ----------------------------------- * * Copyright (c) 2007 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and /or associated documentation files * (the "Materials "), to deal in the Materials without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Materials, * and to permit persons to whom the Materials are furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Materials. * * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR * THE USE OR OTHER DEALINGS IN THE MATERIALS. * *//** * \file * \brief Paint and PixelPipe classes. * \note *//*-------------------------------------------------------------------*/ #ifndef __RIMATH_H #include "riMath.h" #endif #ifndef __RIIMAGE_H #include "riImage.h" #endif //======================================================================= namespace OpenVGRI { /*-------------------------------------------------------------------*//*! * \brief Storage and operations for VGPaint. * \param * \return * \note *//*-------------------------------------------------------------------*/ class Paint { public: Paint(); ~Paint(); void addReference() { m_referenceCount++; } int removeReference() { m_referenceCount--; RI_ASSERT(m_referenceCount >= 0); return m_referenceCount; } struct GradientStop { GradientStop() : offset(0.0f), color(0.0f, 0.0f, 0.0f, 0.0f, Color::sRGBA) {} RIfloat offset; Color color; }; VGPaintType m_paintType; Color m_paintColor; Color m_inputPaintColor; VGColorRampSpreadMode m_colorRampSpreadMode; Array m_colorRampStops; Array m_inputColorRampStops; VGboolean m_colorRampPremultiplied; Vector2 m_inputLinearGradientPoint0; Vector2 m_inputLinearGradientPoint1; Vector2 m_inputRadialGradientCenter; Vector2 m_inputRadialGradientFocalPoint; RIfloat m_inputRadialGradientRadius; Vector2 m_linearGradientPoint0; Vector2 m_linearGradientPoint1; Vector2 m_radialGradientCenter; Vector2 m_radialGradientFocalPoint; RIfloat m_radialGradientRadius; VGTilingMode m_patternTilingMode; Image* m_pattern; private: Paint(const Paint&); //!< Not allowed. const Paint& operator=(const Paint&); //!< Not allowed. int m_referenceCount; }; /*-------------------------------------------------------------------*//*! * \brief Encapsulates all information needed for painting a pixel. * \param * \return * \note *//*-------------------------------------------------------------------*/ class PixelPipe { public: PixelPipe(); //throws bad_alloc ~PixelPipe(); void pixelPipe(int x, int y, RIfloat coverage, unsigned int sampleMask) const; //rasterizer calls this function for each pixel void setDrawable(Drawable* drawable); void setBlendMode(VGBlendMode blendMode); void setMask(bool masking); void setImage(Image* image, VGImageMode imageMode); //image = NULL disables drawImage functionality void setSurfaceToPaintMatrix(const Matrix3x3& surfaceToPaintMatrix); void setSurfaceToImageMatrix(const Matrix3x3& surfaceToImageMatrix); void setImageQuality(VGImageQuality imageQuality); void setTileFillColor(const Color& c); void setPaint(const Paint* paint); void setColorTransform(bool enable, RIfloat values[8]); private: void linearGradient(RIfloat& g, RIfloat& rho, RIfloat x, RIfloat y) const; void radialGradient(RIfloat& g, RIfloat& rho, RIfloat x, RIfloat y) const; Color integrateColorRamp(RIfloat gmin, RIfloat gmax) const; Color colorRamp(RIfloat gradient, RIfloat rho) const; Color blend(const Color& s, RIfloat ar, RIfloat ag, RIfloat ab, const Color& d, VGBlendMode blendMode) const; void colorTransform(Color& c) const; PixelPipe(const PixelPipe&); //!< Not allowed. const PixelPipe& operator=(const PixelPipe&); //!< Not allowed. Drawable* m_drawable; bool m_masking; Image* m_image; const Paint* m_paint; Paint m_defaultPaint; VGBlendMode m_blendMode; VGImageMode m_imageMode; VGImageQuality m_imageQuality; Color m_tileFillColor; bool m_colorTransform; RIfloat m_colorTransformValues[8]; Matrix3x3 m_surfaceToPaintMatrix; Matrix3x3 m_surfaceToImageMatrix; }; //======================================================================= } //namespace OpenVGRI //======================================================================= #endif /* __RIPIXELPIPE_H */