egl/sfopenvg/riContext.h
author Jose Thachil<jose.thachil@cell-telecom.com>
Wed, 12 May 2010 11:20:41 +0100
branchEGL_MERGE
changeset 57 2bf8a359aa2f
permissions -rw-r--r--
Create EGL 1.4 implementation by merging eglrefimpl and EGL from sfopenvg Subject to some fixes in uiresources and uiaccelerator, this version removes the EGL 1 panics. A quick attempt to use the compositor renderstage wasn't successful, but not apparently due to EGL issues. There are a lot of RDebug::Printf statements still in this code, which will be removed in the next commit.

#ifndef __RICONTEXT_H
#define __RICONTEXT_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	VGContext class. Used for storing OpenVG state.
 * \note	
 *//*-------------------------------------------------------------------*/

#ifndef OPENVG_H
#include "openvg.h"
#endif

#ifndef __RIDEFS_H
#include "riDefs.h"
#endif

#ifndef __RIMATH_H
#include "riMath.h"
#endif

#ifndef __RIIMAGE_H
#include "riImage.h"
#endif

#ifndef __RIPATH_H
#include "riPath.h"
#endif

#ifndef __RIFONT_H
#include "riFont.h"
#endif

#ifndef __RIARRAY_H
#include "riArray.h"
#endif

//==============================================================================================

namespace OpenVGRI
{

class VGContext;

/*-------------------------------------------------------------------*//*!
* \brief	A list of resources (Images, Paths, or Paints) shared by a
*			set of contexts.
* \param	
* \return	
* \note		
*//*-------------------------------------------------------------------*/

template <class Resource> class ResourceManager
{
public:
	ResourceManager() :
		m_referenceCount(0),
		m_resources()
	{
	}

	~ResourceManager()
	{
		RI_ASSERT(m_referenceCount == 0);
		RI_ASSERT(m_resources.size() == 0);
	}

	void			addReference()
	{
		m_referenceCount++;
	}

	int				removeReference()
	{
		m_referenceCount--;
		RI_ASSERT(m_referenceCount >= 0);
		return m_referenceCount;
	}

	void			addResource(Resource* resource, VGContext* context)
	{
		Entry r;
		r.resource = resource;
		r.context = context;
		m_resources.push_back(r);	//throws bad_alloc
		resource->addReference();
	}

	void			removeResource(Resource* resource)
	{
		if(!resource->removeReference())
			RI_DELETE(resource);

		int i=0;
		bool found = false;
		for(;i<m_resources.size();i++)
		{
			if(m_resources[i].resource == resource)
			{
				found = true;
				break;
			}
		}
		RI_ASSERT(found);

		for(;i<m_resources.size()-1;i++)
		{
			m_resources[i] = m_resources[i+1];
		}
		m_resources.resize(m_resources.size()-1);
	}

	bool			isValid(Resource* resource)
	{
		for(int i=0;i<m_resources.size();i++)
		{
			if(m_resources[i].resource == resource)
				return true;
		}
		return false;
	}

	Resource*		getFirstResource(VGContext* context)
	{
		for(int i=0;i<m_resources.size();i++)
		{
			if(m_resources[i].context == context)
				return m_resources[i].resource;
		}
		return NULL;
	}

private:
	ResourceManager(const ResourceManager&);
	ResourceManager operator=(const ResourceManager&);

	struct Entry
	{
		Resource*	resource;
		VGContext*	context;
	};

	int				m_referenceCount;
	Array<Entry>	m_resources;
};

/*-------------------------------------------------------------------*//*!
* \brief	
* \param	
* \return	
* \note		
*//*-------------------------------------------------------------------*/

class VGContext
{
public:
	VGContext(VGContext* shareContext);	//throws bad_alloc
	~VGContext();

    void            setDefaultDrawable(Drawable* drawable); //called from EGL
    Drawable*       getCurrentDrawable()        { return m_eglDrawable; }

	bool			isValidImage(VGImage image);
	bool			isValidPath(VGPath path);
	bool			isValidPaint(VGPaint paint);
	bool			isValidFont(VGFont font);
	bool			isValidMaskLayer(VGMaskLayer layer);

	void			releasePaint(VGbitfield paintModes);

	void			setError(VGErrorCode error)		{ if(m_error == VG_NO_ERROR) m_error = error; }

	// Mode settings
	VGMatrixMode					m_matrixMode;
	VGFillRule						m_fillRule;
	VGImageQuality					m_imageQuality;
	VGRenderingQuality				m_renderingQuality;
	VGBlendMode						m_blendMode;
	VGImageMode						m_imageMode;
	
	// Scissor rectangles
	Array<Rectangle>				m_scissor;

	// Stroke parameters
	RIfloat							m_strokeLineWidth;
	RIfloat							m_inputStrokeLineWidth;
	VGCapStyle						m_strokeCapStyle;
	VGJoinStyle						m_strokeJoinStyle;
	RIfloat							m_strokeMiterLimit;
	RIfloat							m_inputStrokeMiterLimit;
	Array<RIfloat>					m_strokeDashPattern;
	Array<RIfloat>					m_inputStrokeDashPattern;
	RIfloat							m_strokeDashPhase;
	RIfloat							m_inputStrokeDashPhase;
	VGboolean						m_strokeDashPhaseReset;

	// Edge fill color for vgConvolve and pattern paint
	Color							m_tileFillColor;
	Color							m_inputTileFillColor;

	// Color for vgClear
	Color							m_clearColor;
	Color							m_inputClearColor;

    Vector2                         m_glyphOrigin;
    Vector2                         m_inputGlyphOrigin;

	VGboolean						m_masking;
	VGboolean						m_scissoring;

	VGPixelLayout					m_pixelLayout;

	VGboolean						m_filterFormatLinear;
	VGboolean						m_filterFormatPremultiplied;
	VGbitfield						m_filterChannelMask;

	// Matrices
	Matrix3x3						m_pathUserToSurface;
	Matrix3x3						m_imageUserToSurface;
	Matrix3x3						m_glyphUserToSurface;
	Matrix3x3						m_fillPaintToUser;
	Matrix3x3						m_strokePaintToUser;

	VGPaint							m_fillPaint;
	VGPaint							m_strokePaint;

    VGboolean                       m_colorTransform;
    RIfloat                         m_colorTransformValues[8];
    RIfloat                         m_inputColorTransformValues[8];

	VGErrorCode						m_error;

	ResourceManager<Image>*			m_imageManager;
	ResourceManager<Path>*			m_pathManager;
	ResourceManager<Paint>*			m_paintManager;
	ResourceManager<Font>*			m_fontManager;
	ResourceManager<Surface>*		m_maskLayerManager;
private:
	Drawable*                       m_eglDrawable;

	VGContext(const VGContext&);			//!< Not allowed.
	void operator=(const VGContext&);		//!< Not allowed.
};

//==============================================================================================

}	//namespace OpenVGRI

//==============================================================================================

#endif /* __RICONTEXT_H */