openvg/openvgrefimplementation/sfopenvg/sfopenvg/riRasterizer.cpp
author andy simpson <andrews@symbian.org>
Thu, 19 Aug 2010 17:37:00 +0100
changeset 151 563e02d0a60c
parent 43 7579f232bae7
permissions -rw-r--r--
apply work-a-round for syborg graphics to symbian^4 branch, part of fixes described in Bug 2339
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     1
/*------------------------------------------------------------------------
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     2
 *
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     3
 * OpenVG 1.1 Reference Implementation
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     4
 * -----------------------------------
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     5
 *
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     6
 * Copyright (c) 2007 The Khronos Group Inc.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     7
 *
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     8
 * Permission is hereby granted, free of charge, to any person obtaining a
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
     9
 * copy of this software and /or associated documentation files
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    10
 * (the "Materials "), to deal in the Materials without restriction,
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    11
 * including without limitation the rights to use, copy, modify, merge,
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    12
 * publish, distribute, sublicense, and/or sell copies of the Materials,
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    13
 * and to permit persons to whom the Materials are furnished to do so,
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    14
 * subject to the following conditions: 
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    15
 *
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    16
 * The above copyright notice and this permission notice shall be included 
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    17
 * in all copies or substantial portions of the Materials. 
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    18
 *
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    19
 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    20
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    21
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    22
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    23
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    24
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    25
 * THE USE OR OTHER DEALINGS IN THE MATERIALS.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    26
 *
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    27
 *//**
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    28
 * \file
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    29
 * \brief	Implementation of polygon rasterizer.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    30
 * \note	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    31
 *//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    32
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    33
#include "riRasterizer.h"
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    34
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    35
//==============================================================================================
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    36
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    37
namespace OpenVGRI
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    38
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    39
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    40
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    41
* \brief	Rasterizer constructor.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    42
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    43
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    44
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    45
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    46
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    47
Rasterizer::Rasterizer() :
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    48
	m_edges(),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    49
	m_scissorEdges(),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    50
	m_scissor(false),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    51
	m_samples(),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    52
	m_numSamples(0),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    53
	m_numFSAASamples(0),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    54
	m_sumWeights(0.0f),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    55
	m_sampleRadius(0.0f),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    56
    m_vpx(0),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    57
    m_vpy(0),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    58
    m_vpwidth(0),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    59
    m_vpheight(0),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    60
    m_fillRule(VG_EVEN_ODD),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    61
    m_pixelPipe(NULL),
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    62
    m_covBuffer(NULL)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    63
{}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    64
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    65
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    66
* \brief	Rasterizer destructor.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    67
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    68
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    69
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    70
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    71
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    72
Rasterizer::~Rasterizer()
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    73
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    74
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    75
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    76
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    77
* \brief	Removes all appended edges.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    78
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    79
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    80
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    81
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    82
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    83
void Rasterizer::clear()
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    84
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    85
	m_edges.clear();
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    86
    m_edgeMin.set(RI_FLOAT_MAX, RI_FLOAT_MAX);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    87
    m_edgeMax.set(-RI_FLOAT_MAX, -RI_FLOAT_MAX);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    88
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    89
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    90
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    91
* \brief	Appends an edge to the rasterizer.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    92
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    93
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    94
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    95
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    96
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    97
void Rasterizer::addBBox(const Vector2& v)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    98
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
    99
    if(v.x < m_edgeMin.x) m_edgeMin.x = v.x;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   100
    if(v.y < m_edgeMin.y) m_edgeMin.y = v.y;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   101
    if(v.x > m_edgeMax.x) m_edgeMax.x = v.x;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   102
    if(v.y > m_edgeMax.y) m_edgeMax.y = v.y;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   103
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   104
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   105
void Rasterizer::addEdge(const Vector2& v0, const Vector2& v1)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   106
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   107
	if( m_edges.size() >= RI_MAX_EDGES )
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   108
		throw std::bad_alloc();	//throw an out of memory error if there are too many edges
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   109
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   110
	if(v0.y == v1.y)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   111
		return;	//skip horizontal edges (they don't affect rasterization since we scan horizontally)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   112
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   113
	Edge e;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   114
	if(v0.y < v1.y)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   115
	{	//edge is going upward
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   116
		e.v0 = v0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   117
		e.v1 = v1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   118
		e.direction = 1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   119
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   120
	else
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   121
	{	//edge is going downward
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   122
		e.v0 = v1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   123
		e.v1 = v0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   124
		e.direction = -1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   125
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   126
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   127
    addBBox(v0);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   128
    addBBox(v1);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   129
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   130
	m_edges.push_back(e);	//throws bad_alloc
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   131
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   132
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   133
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   134
* \brief	Set up rasterizer
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   135
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   136
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   137
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   138
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   139
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   140
void Rasterizer::setup(int vpx, int vpy, int vpwidth, int vpheight, VGFillRule fillRule, const PixelPipe* pixelPipe, unsigned int* covBuffer)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   141
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   142
	RI_ASSERT(vpwidth >= 0 && vpheight >= 0);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   143
	RI_ASSERT(vpx + vpwidth >= vpx && vpy + vpheight >= vpy);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   144
	RI_ASSERT(fillRule == VG_EVEN_ODD || fillRule == VG_NON_ZERO);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   145
    RI_ASSERT(pixelPipe || covBuffer);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   146
    m_vpx = vpx;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   147
    m_vpy = vpy;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   148
    m_vpwidth = vpwidth;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   149
    m_vpheight = vpheight;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   150
    m_fillRule = fillRule;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   151
    m_pixelPipe = pixelPipe;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   152
    m_covBuffer = covBuffer;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   153
    m_covMinx = vpx+vpwidth;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   154
    m_covMiny = vpy+vpheight;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   155
    m_covMaxx = vpx;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   156
    m_covMaxy = vpy;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   157
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   158
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   159
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   160
* \brief	Sets scissor rectangles.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   161
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   162
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   163
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   164
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   165
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   166
void Rasterizer::setScissor(const Array<Rectangle>& scissors)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   167
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   168
	m_scissor = true;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   169
	try
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   170
	{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   171
		m_scissorEdges.clear();
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   172
		for(int i=0;i<scissors.size();i++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   173
		{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   174
			if(scissors[i].width > 0 && scissors[i].height > 0)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   175
			{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   176
				ScissorEdge e;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   177
				e.miny = scissors[i].y;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   178
				e.maxy = RI_INT_ADDSATURATE(scissors[i].y, scissors[i].height);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   179
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   180
				e.x = scissors[i].x;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   181
				e.direction = 1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   182
				m_scissorEdges.push_back(e);	//throws bad_alloc
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   183
				e.x = RI_INT_ADDSATURATE(scissors[i].x, scissors[i].width);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   184
				e.direction = -1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   185
				m_scissorEdges.push_back(e);	//throws bad_alloc
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   186
			}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   187
		}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   188
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   189
	catch(std::bad_alloc)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   190
	{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   191
		m_scissorEdges.clear();
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   192
		throw;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   193
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   194
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   195
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   196
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   197
* \brief	Returns a radical inverse of a given integer for Hammersley
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   198
*			point set.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   199
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   200
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   201
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   202
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   203
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   204
static double radicalInverseBase2(unsigned int i)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   205
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   206
	if( i == 0 )
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   207
		return 0.0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   208
	double p = 0.0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   209
	double f = 0.5;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   210
	double ff = f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   211
	for(unsigned int j=0;j<32;j++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   212
	{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   213
		if( i & (1<<j) )
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   214
			p += f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   215
		f *= ff;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   216
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   217
	return p;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   218
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   219
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   220
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   221
* \brief	Calls PixelPipe::pixelPipe for each pixel with coverage greater
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   222
*			than zero.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   223
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   224
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   225
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   226
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   227
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   228
int Rasterizer::setupSamplingPattern(VGRenderingQuality renderingQuality, int numFSAASamples)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   229
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   230
	RI_ASSERT(renderingQuality == VG_RENDERING_QUALITY_NONANTIALIASED ||
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   231
			  renderingQuality == VG_RENDERING_QUALITY_FASTER ||
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   232
			  renderingQuality == VG_RENDERING_QUALITY_BETTER);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   233
	RI_ASSERT(numFSAASamples > 0 && numFSAASamples <= RI_MAX_SAMPLES);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   234
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   235
	//make a sampling pattern
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   236
	m_sumWeights = 0.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   237
	m_sampleRadius = 0.0f;		//max offset of the sampling points from a pixel center
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   238
	m_numFSAASamples = numFSAASamples;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   239
	if(numFSAASamples == 1)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   240
	{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   241
		if(renderingQuality == VG_RENDERING_QUALITY_NONANTIALIASED)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   242
		{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   243
			m_numSamples = 1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   244
			m_samples[0].x = 0.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   245
			m_samples[0].y = 0.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   246
			m_samples[0].weight = 1.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   247
			m_sampleRadius = 0.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   248
			m_sumWeights = 1.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   249
		}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   250
		else if(renderingQuality == VG_RENDERING_QUALITY_FASTER)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   251
		{	//box filter of diameter 1.0f, 8-queen sampling pattern
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   252
			m_numSamples = 8;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   253
			m_samples[0].x = 3;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   254
			m_samples[1].x = 7;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   255
			m_samples[2].x = 0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   256
			m_samples[3].x = 2;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   257
			m_samples[4].x = 5;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   258
			m_samples[5].x = 1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   259
			m_samples[6].x = 6;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   260
			m_samples[7].x = 4;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   261
			for(int i=0;i<m_numSamples;i++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   262
			{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   263
				m_samples[i].x = (m_samples[i].x + 0.5f) / (RScalar)m_numSamples - 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   264
				m_samples[i].y = ((RScalar)i + 0.5f) / (RScalar)m_numSamples - 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   265
				m_samples[i].weight = 1.0f / (RScalar)m_numSamples;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   266
				m_sumWeights += m_samples[i].weight;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   267
			}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   268
			m_sampleRadius = 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   269
		}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   270
		else
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   271
		{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   272
			RI_ASSERT(renderingQuality == VG_RENDERING_QUALITY_BETTER);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   273
			m_numSamples = RI_MAX_SAMPLES;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   274
			m_sampleRadius = 0.75f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   275
			for(int i=0;i<m_numSamples;i++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   276
			{	//Gaussian filter, implemented using Hammersley point set for sample point locations
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   277
				RScalar x = (RScalar)radicalInverseBase2(i);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   278
				RScalar y = ((RScalar)i + 0.5f) / (RScalar)m_numSamples;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   279
				RI_ASSERT(x >= 0.0f && x < 1.0f);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   280
				RI_ASSERT(y >= 0.0f && y < 1.0f);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   281
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   282
				//map unit square to unit circle
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   283
				RScalar r = (RScalar)sqrt(x) * m_sampleRadius;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   284
				x = r * (RScalar)sin(y*2.0f*PI);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   285
				y = r * (RScalar)cos(y*2.0f*PI);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   286
				m_samples[i].weight = (RScalar)exp(-0.5f * RI_SQR(r/m_sampleRadius));
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   287
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   288
				RI_ASSERT(x >= -1.5f && x <= 1.5f && y >= -1.5f && y <= 1.5f);	//the specification restricts the filter radius to be less than or equal to 1.5
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   289
				
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   290
				m_samples[i].x = x;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   291
				m_samples[i].y = y;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   292
				m_sumWeights += m_samples[i].weight;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   293
			}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   294
		}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   295
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   296
	else
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   297
	{	//box filter
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   298
        m_numSamples = numFSAASamples;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   299
        RI_ASSERT(numFSAASamples >= 1 && numFSAASamples <= 32);	//sample mask is a 32-bit uint => can't support more than 32 samples
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   300
		//use Hammersley point set as a sampling pattern
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   301
        for(int i=0;i<m_numSamples;i++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   302
        {
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   303
            m_samples[i].x = (RScalar)radicalInverseBase2(i) + 1.0f / (RScalar)(m_numSamples<<1) - 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   304
            m_samples[i].y = ((RScalar)i + 0.5f) / (RScalar)m_numSamples - 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   305
            m_samples[i].weight = 1.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   306
			RI_ASSERT(m_samples[i].x > -0.5f && m_samples[i].x < 0.5f);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   307
			RI_ASSERT(m_samples[i].y > -0.5f && m_samples[i].y < 0.5f);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   308
        }
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   309
        m_sumWeights = (RScalar)m_numSamples;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   310
        m_sampleRadius = 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   311
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   312
    return m_numSamples;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   313
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   314
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   315
/*-------------------------------------------------------------------*//*!
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   316
* \brief	Calls PixelPipe::pixelPipe for each pixel with coverage greater
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   317
*			than zero.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   318
* \param	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   319
* \return	
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   320
* \note		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   321
*//*-------------------------------------------------------------------*/
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   322
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   323
void Rasterizer::fill()
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   324
{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   325
	if(m_scissor && !m_scissorEdges.size())
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   326
		return;	//scissoring is on, but there are no scissor rectangles => nothing is visible
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   327
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   328
	//proceed scanline by scanline
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   329
	//keep track of edges that can intersect the pixel filters of the current scanline (Active Edge Table)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   330
	//until all pixels of the scanline have been processed
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   331
	//  for all sampling points of the current pixel
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   332
	//    determine the winding number using edge functions
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   333
	//    add filter weight to coverage
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   334
	//  divide coverage by the number of samples
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   335
	//  determine a run of pixels with constant coverage
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   336
	//  call fill callback for each pixel of the run
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   337
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   338
	int fillRuleMask = 1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   339
	if(m_fillRule == VG_NON_ZERO)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   340
		fillRuleMask = -1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   341
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   342
    int bbminx = (int)floor(m_edgeMin.x);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   343
    int bbminy = (int)floor(m_edgeMin.y);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   344
    int bbmaxx = (int)floor(m_edgeMax.x)+1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   345
    int bbmaxy = (int)floor(m_edgeMax.y)+1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   346
    int sx = RI_INT_MAX(m_vpx, bbminx);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   347
    int ex = RI_INT_MIN(m_vpx+m_vpwidth, bbmaxx);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   348
    int sy = RI_INT_MAX(m_vpy, bbminy);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   349
    int ey = RI_INT_MIN(m_vpy+m_vpheight, bbmaxy);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   350
    if(sx < m_covMinx) m_covMinx = sx;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   351
    if(sy < m_covMiny) m_covMiny = sy;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   352
    if(ex > m_covMaxx) m_covMaxx = ex;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   353
    if(ey > m_covMaxy) m_covMaxy = ey;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   354
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   355
	//fill the screen
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   356
	Array<ActiveEdge> aet;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   357
	Array<ScissorEdge> scissorAet;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   358
	for(int j=sy;j<ey;j++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   359
	{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   360
		//gather scissor edges intersecting this scanline
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   361
		scissorAet.clear();
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   362
		if( m_scissor )
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   363
		{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   364
			for(int e=0;e<m_scissorEdges.size();e++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   365
			{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   366
				const ScissorEdge& se = m_scissorEdges[e];
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   367
				if(j >= se.miny && j < se.maxy)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   368
					scissorAet.push_back(m_scissorEdges[e]);	//throws bad_alloc
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   369
			}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   370
			if(!scissorAet.size())
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   371
				continue;	//scissoring is on, but there are no scissor rectangles on this scanline
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   372
		}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   373
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   374
		//simple AET: scan through all the edges and pick the ones intersecting this scanline
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   375
		aet.clear();
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   376
		for(int e=0;e<m_edges.size();e++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   377
		{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   378
			RScalar cminy = (RScalar)j - m_sampleRadius + 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   379
			RScalar cmaxy = (RScalar)j + m_sampleRadius + 0.5f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   380
			const Edge& ed = m_edges[e];
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   381
			RI_ASSERT(ed.v0.y <= ed.v1.y);	//horizontal edges should have been dropped already
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   382
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   383
			ActiveEdge ae;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   384
			ae.v0 = ed.v0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   385
			ae.v1 = ed.v1;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   386
			ae.direction = ed.direction;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   387
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   388
			if(cmaxy >= ae.v0.y && cminy < ae.v1.y)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   389
			{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   390
				ae.n.set(ae.v0.y - ae.v1.y, ae.v1.x - ae.v0.x);	//edge normal
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   391
				ae.cnst = ae.v0.x * ae.n.x + ae.v0.y * ae.n.y;	//distance of v0 from the origin along the edge normal
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   392
				
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   393
				//compute edge min and max x-coordinates for this scanline
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   394
				Vector2 vd(ae.v1.x - ae.v0.x, ae.v1.y - ae.v0.y);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   395
				RScalar wl = 1.0f / vd.y;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   396
				RScalar sx = ae.v0.x + vd.x * (cminy - ae.v0.y) * wl;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   397
				RScalar ex = ae.v0.x + vd.x * (cmaxy - ae.v0.y) * wl;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   398
				RScalar bminx = RI_MIN(ae.v0.x, ae.v1.x);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   399
				RScalar bmaxx = RI_MAX(ae.v0.x, ae.v1.x);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   400
				sx = RI_CLAMP(sx, bminx, bmaxx);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   401
				ex = RI_CLAMP(ex, bminx, bmaxx);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   402
				ae.minx = RI_MIN(sx,ex);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   403
				ae.maxx = RI_MAX(sx,ex);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   404
				aet.push_back(ae);	//throws bad_alloc
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   405
			}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   406
		}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   407
		if(!aet.size())
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   408
			continue;	//no edges on the whole scanline, skip it
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   409
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   410
		//sort AET by edge minx
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   411
		aet.sort();
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   412
		
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   413
		//sort scissor AET by edge x
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   414
		scissorAet.sort();
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   415
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   416
		//fill the scanline
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   417
		int scissorWinding = m_scissor ? 0 : 1;	//if scissoring is off, winding is always 1
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   418
		int scissorIndex = 0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   419
		int aes = 0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   420
		int aen = 0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   421
		for(int i=sx;i<ex;)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   422
		{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   423
			Vector2 pc(i + 0.5f, j + 0.5f);		//pixel center
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   424
			
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   425
			//find edges that intersect or are to the left of the pixel antialiasing filter
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   426
			while(aes < aet.size() && pc.x + m_sampleRadius >= aet[aes].minx)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   427
				aes++;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   428
			//edges [0,aes[ may have an effect on winding, and need to be evaluated while sampling
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   429
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   430
			//compute coverage
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   431
			RScalar coverage = 0.0f;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   432
			unsigned int sampleMask = 0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   433
			for(int s=0;s<m_numSamples;s++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   434
			{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   435
				Vector2 sp = pc;	//sampling point
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   436
				sp.x += m_samples[s].x;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   437
				sp.y += m_samples[s].y;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   438
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   439
				//compute winding number by evaluating the edge functions of edges to the left of the sampling point
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   440
				int winding = 0;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   441
				for(int e=0;e<aes;e++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   442
				{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   443
					if(sp.y >= aet[e].v0.y && sp.y < aet[e].v1.y)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   444
					{	//evaluate edge function to determine on which side of the edge the sampling point lies
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   445
						RScalar side = sp.x * aet[e].n.x + sp.y * aet[e].n.y - aet[e].cnst;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   446
						if(side <= 0.0f)	//implicit tie breaking: a sampling point on an opening edge is in, on a closing edge it's out
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   447
						{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   448
                            winding += aet[e].direction;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   449
						}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   450
					}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   451
				}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   452
                if(winding & fillRuleMask)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   453
				{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   454
					coverage += m_samples[s].weight;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   455
					sampleMask |= (unsigned int)(1<<s);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   456
				}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   457
			}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   458
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   459
			//constant coverage optimization:
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   460
			//scan AET from left to right and skip all the edges that are completely to the left of the pixel filter.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   461
			//since AET is sorted by minx, the edge we stop at is the leftmost of the edges we haven't passed yet.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   462
			//if that edge is to the right of this pixel, coverage is constant between this pixel and the start of the edge.
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   463
			while(aen < aet.size() && aet[aen].maxx < pc.x - m_sampleRadius - 0.01f)	//0.01 is a safety region to prevent too aggressive optimization due to numerical inaccuracy
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   464
				aen++;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   465
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   466
			int endSpan = m_vpx + m_vpwidth;	//endSpan is the first pixel NOT part of the span
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   467
			if(aen < aet.size())
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   468
				endSpan = RI_INT_MAX(i+1, RI_INT_MIN(endSpan, (int)ceil(aet[aen].minx - m_sampleRadius - 0.5f)));
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   469
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   470
			coverage /= m_sumWeights;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   471
			RI_ASSERT(coverage >= 0.0f && coverage <= 1.0f);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   472
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   473
			//fill a run of pixels with constant coverage
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   474
			if(sampleMask)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   475
			{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   476
				for(;i<endSpan;i++)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   477
				{
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   478
					//update scissor winding number
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   479
					while(scissorIndex < scissorAet.size() && scissorAet[scissorIndex].x <= i)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   480
						scissorWinding += scissorAet[scissorIndex++].direction;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   481
					RI_ASSERT(scissorWinding >= 0);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   482
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   483
					if(scissorWinding)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   484
                    {
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   485
                        if(m_covBuffer)
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   486
                            m_covBuffer[j*m_vpwidth+i] |= (RIuint32)sampleMask;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   487
                        else
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   488
                            m_pixelPipe->pixelPipe(i, j, coverage, sampleMask);
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   489
                    }
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   490
				}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   491
			}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   492
			i = endSpan;
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   493
		}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   494
	}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   495
}
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   496
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   497
//=======================================================================
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   498
7579f232bae7 Transplant KhronosRI changeset 22d01ad3515c -
Shabe Razvi <shaber@symbian.org>
parents:
diff changeset
   499
}	//namespace OpenVGRI