Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "regionstyles.h"
Toshihiro Shimizu 890ddd
#include "tgl.h"
Toshihiro Shimizu 890ddd
#include "tcolorfunctions.h"
Toshihiro Shimizu 890ddd
#include "trandom.h"
Toshihiro Shimizu 890ddd
//#include "tsystem.h"
Toshihiro Shimizu 890ddd
//#include "tvectorrenderdata.h"
Toshihiro Shimizu 890ddd
#include "colorfxutils.h"
Toshihiro Shimizu 890ddd
//#include "tgl.h"
Toshihiro Shimizu 890ddd
//#include "tregionoutline.h"
Toshihiro Shimizu 890ddd
//#include "tpalette.h"
Toshihiro Shimizu 890ddd
//#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
//#include "tstroke.h"
Toshihiro Shimizu 890ddd
#include "tflash.h"
Toshihiro Shimizu 890ddd
#include "tregion.h"
Toshihiro Shimizu 890ddd
#include "tcurves.h"
Toshihiro Shimizu 890ddd
//#include "drawutil.h"
Toshihiro Shimizu 890ddd
#include "tmathutil.h"
Toshihiro Shimizu 890ddd
#include "tstencilcontrol.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    MovingModifier  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TOutlineStyle::RegionOutlineModifier *MovingModifier::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new MovingModifier(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MovingModifier::modify(TRegionOutline &outline) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regIt = outline.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regItEnd = outline.m_exterior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator pIt;
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator pItEnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (; regIt != regItEnd; ++regIt) {
Toshihiro Shimizu 890ddd
		pIt = regIt->begin();
Toshihiro Shimizu 890ddd
		pItEnd = regIt->end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (; pIt != pItEnd; ++pIt) {
Toshihiro Shimizu 890ddd
			pIt->x += m_move.x;
Toshihiro Shimizu 890ddd
			pIt->y += m_move.y;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	regIt = outline.m_interior.begin();
Toshihiro Shimizu 890ddd
	regItEnd = outline.m_interior.end();
Toshihiro Shimizu 890ddd
	for (; regIt != regItEnd; ++regIt) {
Toshihiro Shimizu 890ddd
		pIt = regIt->begin();
Toshihiro Shimizu 890ddd
		pItEnd = regIt->end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (; pIt != pItEnd; ++pIt) {
Toshihiro Shimizu 890ddd
			pIt->x += m_move.x;
Toshihiro Shimizu 890ddd
			pIt->y += m_move.y;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    MovingSolidColor  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
MovingSolidColor::MovingSolidColor(const TPixel32 &color, const TPointD &move)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier = new MovingModifier(move);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *MovingSolidColor::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new MovingSolidColor(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MovingSolidColor::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
	MovingModifier *mov = new MovingModifier(TPointD());
Toshihiro Shimizu 890ddd
	mov->loadData(is);
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier = mov;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MovingSolidColor::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_regionOutlineModifier);
Toshihiro Shimizu 890ddd
	((MovingModifier *)m_regionOutlineModifier)->saveData(os);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int MovingSolidColor::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType MovingSolidColor::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString MovingSolidColor::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("MovingSolidColor", "Horiz Offset") : QCoreApplication::translate("MovingSolidColor", "Vert Offset");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MovingSolidColor::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	min = -100.0;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double MovingSolidColor::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (index)
Toshihiro Shimizu 890ddd
		return ((MovingModifier *)m_regionOutlineModifier)->getMovePoint().y;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return ((MovingModifier *)m_regionOutlineModifier)->getMovePoint().x;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MovingSolidColor::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldMove = ((MovingModifier *)m_regionOutlineModifier)->getMovePoint();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!index) {
Toshihiro Shimizu 890ddd
		if (oldMove.x != value) {
Toshihiro Shimizu 890ddd
			delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
			oldMove.x = value;
Toshihiro Shimizu 890ddd
			m_regionOutlineModifier = new MovingModifier(oldMove);
Toshihiro Shimizu 890ddd
			updateVersionNumber();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		if (oldMove.y != value) {
Toshihiro Shimizu 890ddd
			delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
			oldMove.y = value;
Toshihiro Shimizu 890ddd
			m_regionOutlineModifier = new MovingModifier(oldMove);
Toshihiro Shimizu 890ddd
			updateVersionNumber();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MovingSolidColor::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::drawRegion(cf, true, boundary);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MovingSolidColor::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	SFlashUtils rdf(r);
Toshihiro Shimizu 890ddd
	rdf.computeRegionOutline();
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier->modify(rdf.m_ro);
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	rdf.drawRegionOutline(flash, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    ShadowStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ShadowStyle::ShadowStyle(const TPixel32 &bgColor,
Toshihiro Shimizu 890ddd
						 const TPixel32 &shadowColor,
Toshihiro Shimizu 890ddd
						 const TPointD &shadowDirection,
Toshihiro Shimizu 890ddd
						 double len,
Toshihiro Shimizu 890ddd
						 double density)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_shadowColor(shadowColor), m_shadowDirection(normalize(shadowDirection)), m_len(len), m_density(density)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *ShadowStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new ShadowStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_shadowDirection.x >> m_shadowDirection.y;
Toshihiro Shimizu 890ddd
	is >> m_density;
Toshihiro Shimizu 890ddd
	is >> m_shadowColor;
Toshihiro Shimizu 890ddd
	is >> m_len;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_shadowDirection.x << m_shadowDirection.y;
Toshihiro Shimizu 890ddd
	os << m_density;
Toshihiro Shimizu 890ddd
	os << m_shadowColor;
Toshihiro Shimizu 890ddd
	os << m_len;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int ShadowStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 3;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType ShadowStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString ShadowStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("ShadowStyle", "Angle");
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("ShadowStyle", "Density");
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("ShadowStyle", "Length");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		return QString();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0);
Toshihiro Shimizu 890ddd
	return QString();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 360.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double ShadowStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double degree;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		degree = asin(m_shadowDirection.y);
Toshihiro Shimizu 890ddd
		if (m_shadowDirection.x < 0)
Shinya Kitaoka ee259f
			degree = M_PI - degree;
Toshihiro Shimizu 890ddd
		if (degree < 0)
Shinya Kitaoka ee259f
			degree += M_2PI;
Shinya Kitaoka ee259f
		return degree * M_180_PI;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_density;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_len;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0);
Toshihiro Shimizu 890ddd
	return 0.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	double degree;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Shinya Kitaoka ee259f
		degree = value * M_PI_180;
Toshihiro Shimizu 890ddd
		m_shadowDirection.x = cos(degree);
Toshihiro Shimizu 890ddd
		m_shadowDirection.y = sin(degree);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_density = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_len = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
void ShadowStyle::drawPolyline(const TColorFunction *cf, std::vector<t3dpointd> &polyline, TPointD shadowDirection) const</t3dpointd>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	int stepNumber;
Toshihiro Shimizu 890ddd
	double distance;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD v1, v2, diff, midPoint, ratio;
Toshihiro Shimizu 890ddd
	double len;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_shadowColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_shadowColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
	//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it;
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it_b = polyline.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it_e = polyline.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	v1.x = polyline.back().x;
Toshihiro Shimizu 890ddd
	v1.y = polyline.back().y;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (it = it_b; it != it_e; ++it) {
Toshihiro Shimizu 890ddd
		v2.x = it->x;
Toshihiro Shimizu 890ddd
		v2.y = it->y;
Toshihiro Shimizu 890ddd
		if (v1 == v2)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		diff = normalize(rotate90(v2 - v1));
Toshihiro Shimizu 890ddd
		len = diff * shadowDirection;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (len > 0) {
Toshihiro Shimizu 890ddd
			distance = tdistance(v1, v2) * m_density;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			ratio = (v2 - v1) * (1.0 / distance);
Toshihiro Shimizu 890ddd
			midPoint = v1;
Toshihiro Shimizu 890ddd
			stepNumber = (int)distance;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			for (i = 0; i < stepNumber; i++) {
Toshihiro Shimizu 890ddd
				glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				tglColor(TPixel32(color.r, color.g, color.b, 0));
Toshihiro Shimizu 890ddd
				tglVertex(midPoint);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				tglColor(color);
Toshihiro Shimizu 890ddd
				tglVertex(midPoint + (shadowDirection * len * m_len * 0.5));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				tglColor(TPixel32(color.r, color.g, color.b, 0));
Toshihiro Shimizu 890ddd
				tglVertex(midPoint + (shadowDirection * len * m_len));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				midPoint += ratio;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				glEnd();
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		v1 = v2;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing,
Toshihiro Shimizu 890ddd
							 TRegionOutline ®ionOutline) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	////stenc->beginMask();
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  glBegin(GL_QUADS);      
Toshihiro Shimizu 890ddd
  glVertex2d (regionOutline.m_bbox.getP00().x, regionOutline.m_bbox.getP00().y);
Toshihiro Shimizu 890ddd
  glVertex2d (regionOutline.m_bbox.getP01().x, regionOutline.m_bbox.getP01().y);
Toshihiro Shimizu 890ddd
  glVertex2d (regionOutline.m_bbox.getP11().x, regionOutline.m_bbox.getP11().y);
Toshihiro Shimizu 890ddd
  glVertex2d (regionOutline.m_bbox.getP10().x, regionOutline.m_bbox.getP10().y);
Toshihiro Shimizu 890ddd
  glEnd();
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	////stenc->endMask();
Toshihiro Shimizu 890ddd
	////stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask();
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, regionOutline);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, regionOutline);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it;
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_b = regionOutline.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_e = regionOutline.m_exterior.end();
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
		drawPolyline(cf, *regions_it, m_shadowDirection);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_OUTSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	regions_it_b = regionOutline.m_interior.begin();
Toshihiro Shimizu 890ddd
	regions_it_e = regionOutline.m_interior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
		drawPolyline(cf, *regions_it, -m_shadowDirection);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Shinya Kitaoka 3bfa54
int ShadowStyle::drawPolyline(TFlash& flash, std::vector<t3dpointd> &polyline,</t3dpointd>
Toshihiro Shimizu 890ddd
							   TPointD shadowDirection, const bool isDraw) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  int i;
Toshihiro Shimizu 890ddd
  int stepNumber;
Toshihiro Shimizu 890ddd
  double distance;
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
  TPointD v1,v2,diff,midPoint,ratio;
Toshihiro Shimizu 890ddd
  double len;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
   
Toshihiro Shimizu 890ddd
  TRegionOutline::PointVector::iterator it;
Toshihiro Shimizu 890ddd
  TRegionOutline::PointVector::iterator it_b = polyline.begin();
Toshihiro Shimizu 890ddd
  TRegionOutline::PointVector::iterator it_e = polyline.end();            
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
 
Shinya Kitaoka 3bfa54
  std::vector<tsegment> segmentArray;</tsegment>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  v1.x = polyline.back().x;
Toshihiro Shimizu 890ddd
  v1.y = polyline.back().y;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  for(it = it_b; it!= it_e; ++it)
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    v2.x = it->x;
Toshihiro Shimizu 890ddd
    v2.y = it->y;
Toshihiro Shimizu 890ddd
    if (v1==v2)
Toshihiro Shimizu 890ddd
      continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    diff = normalize(rotate90(v2-v1));
Toshihiro Shimizu 890ddd
    len=diff*shadowDirection;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    if(len>0)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      distance = tdistance(v1,v2)*m_density;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
      ratio= (v2-v1)*(1.0/distance);
Toshihiro Shimizu 890ddd
      midPoint=v1;
Toshihiro Shimizu 890ddd
      stepNumber= (int)distance;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
      for(i=0; i
Toshihiro Shimizu 890ddd
      {	  
Shinya Kitaoka 3bfa54
		  std::vector<tsegment> sa;</tsegment>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		  TPointD p0=midPoint;
Toshihiro Shimizu 890ddd
		  TPointD p1=midPoint+(shadowDirection*len*m_len*0.5);
Toshihiro Shimizu 890ddd
		  TPointD p2=midPoint+(shadowDirection*len*m_len);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		  segmentArray.push_back(TSegment(p1,p0));
Toshihiro Shimizu 890ddd
		  segmentArray.push_back(TSegment(p1,p2));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
          midPoint += ratio;
Toshihiro Shimizu 890ddd
      }
Toshihiro Shimizu 890ddd
            
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    v1=v2;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  if ( isDraw && segmentArray.size()>0 ) {
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_shadowColor);
Toshihiro Shimizu 890ddd
	flash.drawSegments(segmentArray, true);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  if ( segmentArray.size()>0 )
Toshihiro Shimizu 890ddd
	 return 1;
Toshihiro Shimizu 890ddd
  return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::drawRegion( TFlash& flash, const TRegion* r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  SFlashUtils rdf(r);
Toshihiro Shimizu 890ddd
  rdf.computeRegionOutline();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  TRegionOutline::Boundary::iterator regions_it;
Toshihiro Shimizu 890ddd
  TRegionOutline::Boundary::iterator regions_it_b = rdf.m_ro.m_exterior->begin();
Toshihiro Shimizu 890ddd
  TRegionOutline::Boundary::iterator regions_it_e = rdf.m_ro.m_exterior->end();            
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 
Toshihiro Shimizu 890ddd
// In the GL version the shadow lines are not croped into the filled region.
Toshihiro Shimizu 890ddd
// This is the reason why I don't calculate the number of shadow lines. 
Toshihiro Shimizu 890ddd
//  int nbDraw=0;
Toshihiro Shimizu 890ddd
//  for( regions_it = regions_it_b ; regions_it!= regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
//	  nbDraw+=drawPolyline(flash,*regions_it, m_shadowDirection,false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//  regions_it_b = rdf.m_ro.m_interior->begin();
Toshihiro Shimizu 890ddd
//  regions_it_e = rdf.m_ro.m_interior->end();            
Toshihiro Shimizu 890ddd
//  for( regions_it = regions_it_b ; regions_it!= regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
//     nbDraw+=drawPolyline(flash,*regions_it,-m_shadowDirection,false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Only the bbox rectangle is croped.
Toshihiro Shimizu 890ddd
  flash.drawRegion(*r,1);  
Toshihiro Shimizu 890ddd
  flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
  flash.drawRectangle(rdf.m_ro.m_bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  regions_it_b = rdf.m_ro.m_exterior->begin();
Toshihiro Shimizu 890ddd
  regions_it_e = rdf.m_ro.m_exterior->end();            
Toshihiro Shimizu 890ddd
  for( regions_it = regions_it_b ; regions_it!= regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
	  drawPolyline(flash,*regions_it, m_shadowDirection);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  regions_it_b = rdf.m_ro.m_interior->begin();
Toshihiro Shimizu 890ddd
  regions_it_e = rdf.m_ro.m_interior->end();            
Toshihiro Shimizu 890ddd
  for( regions_it = regions_it_b ; regions_it!= regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
     drawPolyline(flash,*regions_it,-m_shadowDirection);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 ShadowStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_shadowColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_shadowColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle::makeIcon(const TDimension &d)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double oldVal = getParamValue(TColorStyle::double_tag(), 1);
Toshihiro Shimizu 890ddd
	setParamValue(1, oldVal * 0.25);
Toshihiro Shimizu 890ddd
	TColorStyle::makeIcon(d);
Toshihiro Shimizu 890ddd
	setParamValue(1, oldVal);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    ShadowStyle2  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ShadowStyle2::ShadowStyle2(const TPixel32 &bgColor,
Toshihiro Shimizu 890ddd
						   const TPixel32 &shadowColor,
Toshihiro Shimizu 890ddd
						   const TPointD &shadowDirection,
Toshihiro Shimizu 890ddd
						   double shadowLength)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_shadowColor(shadowColor), m_shadowLength(shadowLength), m_shadowDirection(normalize(shadowDirection))
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *ShadowStyle2::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new ShadowStyle2(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle2::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_shadowDirection.x >> m_shadowDirection.y;
Toshihiro Shimizu 890ddd
	is >> m_shadowLength;
Toshihiro Shimizu 890ddd
	is >> m_shadowColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle2::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_shadowDirection.x << m_shadowDirection.y;
Toshihiro Shimizu 890ddd
	os << m_shadowLength;
Toshihiro Shimizu 890ddd
	os << m_shadowColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int ShadowStyle2::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType ShadowStyle2::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString ShadowStyle2::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("ShadowStyle2", "Angle") : QCoreApplication::translate("ShadowStyle2", "Size");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle2::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0) {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 360.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 500.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double ShadowStyle2::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (index == 1)
Toshihiro Shimizu 890ddd
		return m_shadowLength;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double degree = asin(m_shadowDirection.y);
Toshihiro Shimizu 890ddd
	if (m_shadowDirection.x < 0)
Shinya Kitaoka ee259f
		degree = M_PI - degree;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (degree < 0)
Shinya Kitaoka ee259f
		degree += M_2PI;
Toshihiro Shimizu 890ddd
Shinya Kitaoka ee259f
	return degree * M_180_PI;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
int nbDiffVerts(const std::vector<tpointd> &pv)</tpointd>
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tpointd> lpv;</tpointd>
Toshihiro Shimizu 890ddd
	bool isMissing[4] = {true, true, true, true};
Toshihiro Shimizu 890ddd
	if (pv.size() == 0)
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	lpv.push_back(pv[0]);
Toshihiro Shimizu 890ddd
	isMissing[0] = false;
Toshihiro Shimizu 890ddd
	for (int i = 1; i < (int)pv.size(); i++) {
Toshihiro Shimizu 890ddd
		bool isDiff = true;
Toshihiro Shimizu 890ddd
		for (int j = 0; j < (int)lpv.size() && isDiff; j++)
Toshihiro Shimizu 890ddd
			isDiff = lpv[j] == pv[i] ? false : isDiff;
Toshihiro Shimizu 890ddd
		if (isDiff) {
Toshihiro Shimizu 890ddd
			lpv.push_back(pv[i]);
Toshihiro Shimizu 890ddd
			isMissing[i] = false;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return lpv.size();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle2::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (index == 1) {
Toshihiro Shimizu 890ddd
		m_shadowLength = value;
Toshihiro Shimizu 890ddd
	} else {
Shinya Kitaoka ee259f
		double degree = value * M_PI_180;
Toshihiro Shimizu 890ddd
		m_shadowDirection.x = cos(degree);
Toshihiro Shimizu 890ddd
		m_shadowDirection.y = sin(degree);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawShadowLine(TPixel32 shadowColor, TPixel32 color, TPointD v1, TPointD v2, TPointD diff1, TPointD diff2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	v1 = v1 + diff1;
Toshihiro Shimizu 890ddd
	v2 = v2 + diff2;
Toshihiro Shimizu 890ddd
	diff1 = -diff1;
Toshihiro Shimizu 890ddd
	diff2 = -diff2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double r1, r2;
Toshihiro Shimizu 890ddd
	double t = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (; t <= 1; t += 0.1) {
Toshihiro Shimizu 890ddd
		r1 = t * t * t;
Toshihiro Shimizu 890ddd
		r2 = 1 - r1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPixel32 c((int)(color.r * r2 + shadowColor.r * r1),
Toshihiro Shimizu 890ddd
				   (int)(color.g * r2 + shadowColor.g * r1),
Toshihiro Shimizu 890ddd
				   (int)(color.b * r2 + shadowColor.b * r1),
Toshihiro Shimizu 890ddd
				   (int)(color.m * r2 + shadowColor.m * r1));
Toshihiro Shimizu 890ddd
		tglColor(c);
Toshihiro Shimizu 890ddd
		tglVertex(v1 + t * diff1);
Toshihiro Shimizu 890ddd
		tglVertex(v2 + t * diff2);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int drawShadowLine(TFlash &flash, TPixel32 shadowColor, TPixel32 color,
Toshihiro Shimizu 890ddd
				   TPointD v1, TPointD v2, TPointD diff1, TPointD diff2,
Toshihiro Shimizu 890ddd
				   const bool isDraw = true)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int nbDraw = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	v1 = v1 + diff1;
Toshihiro Shimizu 890ddd
	v2 = v2 + diff2;
Toshihiro Shimizu 890ddd
	diff1 = -diff1;
Toshihiro Shimizu 890ddd
	diff2 = -diff2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD vv1, vv2, ovv1, ovv2;
Toshihiro Shimizu 890ddd
	TPixel32 oc;
Toshihiro Shimizu 890ddd
	double r1, r2;
Toshihiro Shimizu 890ddd
	double t = 0.0;
Toshihiro Shimizu 890ddd
	bool isFirst = true;
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	for (; t <= 1; t += 0.1) {
Toshihiro Shimizu 890ddd
		if (isFirst) {
Toshihiro Shimizu 890ddd
			r1 = t * t * t;
Toshihiro Shimizu 890ddd
			r2 = 1 - r1;
Toshihiro Shimizu 890ddd
			oc = TPixel32((int)(color.r * r2 + shadowColor.r * r1),
Toshihiro Shimizu 890ddd
						  (int)(color.g * r2 + shadowColor.g * r1),
Toshihiro Shimizu 890ddd
						  (int)(color.b * r2 + shadowColor.b * r1),
Toshihiro Shimizu 890ddd
						  (int)(color.m * r2 + shadowColor.m * r1));
Toshihiro Shimizu 890ddd
			ovv1 = v1 + t * diff1;
Toshihiro Shimizu 890ddd
			ovv2 = v2 + t * diff2;
Toshihiro Shimizu 890ddd
			isFirst = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			r1 = t * t * t;
Toshihiro Shimizu 890ddd
			r2 = 1 - r1;
Toshihiro Shimizu 890ddd
			TPixel32 c((int)(color.r * r2 + shadowColor.r * r1),
Toshihiro Shimizu 890ddd
					   (int)(color.g * r2 + shadowColor.g * r1),
Toshihiro Shimizu 890ddd
					   (int)(color.b * r2 + shadowColor.b * r1),
Toshihiro Shimizu 890ddd
					   (int)(color.m * r2 + shadowColor.m * r1));
Toshihiro Shimizu 890ddd
			vv1 = (v1 + t * diff1);
Toshihiro Shimizu 890ddd
			vv2 = (v2 + t * diff2);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
			std::vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
			pv.push_back(ovv1);
Toshihiro Shimizu 890ddd
			pv.push_back(ovv2);
Toshihiro Shimizu 890ddd
			pv.push_back(vv2);
Toshihiro Shimizu 890ddd
			pv.push_back(vv1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			int nbDV = nbDiffVerts(pv);
Toshihiro Shimizu 890ddd
			if (nbDV >= 3 && nbDV <= 4)
Toshihiro Shimizu 890ddd
				nbDraw++;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (isDraw)
Toshihiro Shimizu 890ddd
				sfu.drawGradedPolyline(flash, pv, oc, c);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			oc = c;
Toshihiro Shimizu 890ddd
			ovv1 = vv1;
Toshihiro Shimizu 890ddd
			ovv2 = vv2;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return nbDraw;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
void ShadowStyle2::drawPolyline(const TColorFunction *cf, const std::vector<t3dpointd> &polyline, TPointD shadowDirection) const</t3dpointd>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (polyline.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TPointD v0, v1, diff;
Toshihiro Shimizu 890ddd
	double len1, len2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color, shadowColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(TSolidColorStyle::getMainColor());
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		shadowColor = (*(cf))(m_shadowColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		shadowColor = m_shadowColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(shadowColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
	//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::const_iterator it;
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::const_iterator it_b = polyline.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::const_iterator it_e = polyline.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int size = polyline.size();
Shinya Kitaoka 3bfa54
	std::vector<double> lens(size);</double>
Toshihiro Shimizu 890ddd
	v0.x = polyline.back().x;
Toshihiro Shimizu 890ddd
	v0.y = polyline.back().y;
Toshihiro Shimizu 890ddd
	int count = 0;
Toshihiro Shimizu 890ddd
	for (it = it_b; it != it_e; ++it) {
Toshihiro Shimizu 890ddd
		v1.x = it->x;
Toshihiro Shimizu 890ddd
		v1.y = it->y;
Toshihiro Shimizu 890ddd
		if (v1 != v0) {
Toshihiro Shimizu 890ddd
			diff = normalize(rotate90(v1 - v0));
Toshihiro Shimizu 890ddd
			len1 = diff * shadowDirection;
Toshihiro Shimizu 890ddd
			if (len1 < 0)
Toshihiro Shimizu 890ddd
				len1 = 0;
Toshihiro Shimizu 890ddd
			lens[count++] = len1;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			lens[count++] = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		v0 = v1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double firstVal = lens.front();
Toshihiro Shimizu 890ddd
	for (count = 0; count != size - 1; count++) {
Toshihiro Shimizu 890ddd
		lens[count] = (lens[count] + lens[count + 1]) * 0.5;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	lens[size - 1] = (lens[size - 1] + firstVal) * 0.5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (count = 0; count != size - 1; count++) {
Toshihiro Shimizu 890ddd
		v0.x = polyline[count].x;
Toshihiro Shimizu 890ddd
		v0.y = polyline[count].y;
Toshihiro Shimizu 890ddd
		v1.x = polyline[count + 1].x;
Toshihiro Shimizu 890ddd
		v1.y = polyline[count + 1].y;
Toshihiro Shimizu 890ddd
		len1 = lens[count];
Toshihiro Shimizu 890ddd
		len2 = lens[count + 1];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (v0 != v1 && len1 >= 0 && len2 >= 0 && (len1 + len2) > 0)
Toshihiro Shimizu 890ddd
			drawShadowLine(shadowColor, color, v0, v1, shadowDirection * len1 * m_shadowLength, shadowDirection * len2 * m_shadowLength);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	v0.x = polyline[count].x;
Toshihiro Shimizu 890ddd
	v0.y = polyline[count].y;
Toshihiro Shimizu 890ddd
	v1.x = polyline.front().x;
Toshihiro Shimizu 890ddd
	v1.y = polyline.front().y;
Toshihiro Shimizu 890ddd
	len1 = lens[count];
Toshihiro Shimizu 890ddd
	len2 = lens[0];
Toshihiro Shimizu 890ddd
	if (v0 != v1 && len1 >= 0 && len2 >= 0 && (len1 + len2) > 0)
Toshihiro Shimizu 890ddd
		drawShadowLine(shadowColor, color, v0, v1, shadowDirection * len1 * m_shadowLength, shadowDirection * len2 * m_shadowLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 ShadowStyle2::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_shadowColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle2::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_shadowColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle2::drawRegion(const TColorFunction *cf, const bool antiAliasing,
Toshihiro Shimizu 890ddd
							  TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it;
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_b = boundary.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_e = boundary.m_exterior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
		drawPolyline(cf, *regions_it, m_shadowDirection);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
int ShadowStyle2::drawPolyline(TFlash &flash, std::vector<t3dpointd> &polyline,</t3dpointd>
Toshihiro Shimizu 890ddd
							   TPointD shadowDirection, const bool isDraw) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int nbDraw = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD v0, v1, diff;
Toshihiro Shimizu 890ddd
	double len1, len2;
Toshihiro Shimizu 890ddd
	TPixel32 color, shadowColor;
Toshihiro Shimizu 890ddd
	color = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	shadowColor = m_shadowColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it;
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it_b = polyline.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it_e = polyline.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int size = polyline.size();
Shinya Kitaoka 3bfa54
	std::vector<double> lens(size);</double>
Toshihiro Shimizu 890ddd
	v0.x = polyline.back().x;
Toshihiro Shimizu 890ddd
	v0.y = polyline.back().y;
Toshihiro Shimizu 890ddd
	int count = 0;
Toshihiro Shimizu 890ddd
	for (it = it_b; it != it_e; ++it) {
Toshihiro Shimizu 890ddd
		v1.x = it->x;
Toshihiro Shimizu 890ddd
		v1.y = it->y;
Toshihiro Shimizu 890ddd
		if (v1 != v0) {
Toshihiro Shimizu 890ddd
			diff = normalize(rotate90(v1 - v0));
Toshihiro Shimizu 890ddd
			len1 = diff * shadowDirection;
Toshihiro Shimizu 890ddd
			if (len1 < 0)
Toshihiro Shimizu 890ddd
				len1 = 0;
Toshihiro Shimizu 890ddd
			lens[count++] = len1;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			lens[count++] = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		v0 = v1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double firstVal = lens.front();
Toshihiro Shimizu 890ddd
	for (count = 0; count != size - 1; count++) {
Toshihiro Shimizu 890ddd
		lens[count] = (lens[count] + lens[count + 1]) * 0.5;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	lens[size - 1] = (lens[size - 1] + firstVal) * 0.5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (count = 0; count != size - 1; count++) {
Toshihiro Shimizu 890ddd
		v0.x = polyline[count].x;
Toshihiro Shimizu 890ddd
		v0.y = polyline[count].y;
Toshihiro Shimizu 890ddd
		v1.x = polyline[count + 1].x;
Toshihiro Shimizu 890ddd
		v1.y = polyline[count + 1].y;
Toshihiro Shimizu 890ddd
		len1 = lens[count];
Toshihiro Shimizu 890ddd
		len2 = lens[count + 1];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (v0 != v1 && len1 >= 0 && len2 >= 0 && (len1 + len2) > 0)
Toshihiro Shimizu 890ddd
			nbDraw += drawShadowLine(flash, shadowColor, color, v0, v1, shadowDirection * len1 * m_shadowLength,
Toshihiro Shimizu 890ddd
									 shadowDirection * len2 * m_shadowLength, isDraw);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	v0.x = polyline[count].x;
Toshihiro Shimizu 890ddd
	v0.y = polyline[count].y;
Toshihiro Shimizu 890ddd
	v1.x = polyline.front().x;
Toshihiro Shimizu 890ddd
	v1.y = polyline.front().y;
Toshihiro Shimizu 890ddd
	len1 = lens[count];
Toshihiro Shimizu 890ddd
	len2 = lens[0];
Toshihiro Shimizu 890ddd
	if (v0 != v1 && len1 >= 0 && len2 >= 0 && (len1 + len2) > 0)
Toshihiro Shimizu 890ddd
		nbDraw += drawShadowLine(flash, shadowColor, color, v0, v1, shadowDirection * len1 * m_shadowLength,
Toshihiro Shimizu 890ddd
								 shadowDirection * len2 * m_shadowLength, isDraw);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return nbDraw;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ShadowStyle2::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	SFlashUtils rdf(r);
Toshihiro Shimizu 890ddd
	rdf.computeRegionOutline();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it;
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_b = rdf.m_ro.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_e = rdf.m_ro.m_exterior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nbDraw = 0;
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
		nbDraw += drawPolyline(flash, *regions_it, m_shadowDirection, false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbDraw + 1);
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	flash.drawRectangle(rdf.m_ro.m_bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it)
Toshihiro Shimizu 890ddd
		drawPolyline(flash, *regions_it, m_shadowDirection);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    RubberModifier  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TOutlineStyle::RegionOutlineModifier *RubberModifier::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new RubberModifier(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void RubberModifier::modify(TRegionOutline &outline) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double deformSize = 40.0 + (100 - m_deform) * 0.60;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it;
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_b = outline.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_e = outline.m_exterior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it) {
Toshihiro Shimizu 890ddd
		RubberDeform rd(®ions_it[0]);
Toshihiro Shimizu 890ddd
		rd.deform(deformSize);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	regions_it_b = outline.m_interior.begin();
Toshihiro Shimizu 890ddd
	regions_it_e = outline.m_interior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it) {
Toshihiro Shimizu 890ddd
		RubberDeform rd(®ions_it[0]);
Toshihiro Shimizu 890ddd
		rd.deform(deformSize);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TRubberFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TRubberFillStyle::TRubberFillStyle(const TPixel32 &color, double deform)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier = new RubberModifier(deform);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TRubberFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TRubberFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRubberFillStyle::makeIcon(const TDimension &d)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// Saves the values of member variables and sets the right icon values
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	RubberModifier *prm = (RubberModifier *)(m_regionOutlineModifier);
Toshihiro Shimizu 890ddd
	double LDeform = prm->getDeform();
Toshihiro Shimizu 890ddd
	prm->setDeform(LDeform);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TColorStyle::makeIcon(d);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Loads the original values
Toshihiro Shimizu 890ddd
	prm->setDeform(LDeform);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TRubberFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TRubberFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TRubberFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TRubberFillStyle", "Intensity");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRubberFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = 0.;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TRubberFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return ((RubberModifier *)m_regionOutlineModifier)->getDeform();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRubberFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double oldDeform = ((RubberModifier *)m_regionOutlineModifier)->getDeform();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (oldDeform != value) {
Toshihiro Shimizu 890ddd
		delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
		m_regionOutlineModifier = new RubberModifier(value);
Toshihiro Shimizu 890ddd
		updateVersionNumber();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRubberFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
	RubberModifier *rub = new RubberModifier(0.0);
Toshihiro Shimizu 890ddd
	rub->loadData(is);
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier = rub;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRubberFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_regionOutlineModifier);
Toshihiro Shimizu 890ddd
	((RubberModifier *)m_regionOutlineModifier)->saveData(os);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRubberFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::drawRegion(cf, true, boundary);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRubberFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	SFlashUtils rdf(r);
Toshihiro Shimizu 890ddd
	rdf.computeRegionOutline();
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier->modify(rdf.m_ro);
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	rdf.drawRegionOutline(flash);
Toshihiro Shimizu 890ddd
	//  If Valentina prefers the angled version use this
Toshihiro Shimizu 890ddd
	//	rdf.drawRegionOutline(flash,false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TPointShadowFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPointShadowFillStyle::TPointShadowFillStyle(
Toshihiro Shimizu 890ddd
	const TPixel32 &bgColor,
Toshihiro Shimizu 890ddd
	const TPixel32 &shadowColor,
Toshihiro Shimizu 890ddd
	const TPointD &shadowDirection,
Toshihiro Shimizu 890ddd
	double density,
Toshihiro Shimizu 890ddd
	double shadowSize,
Toshihiro Shimizu 890ddd
	double pointSize)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_shadowColor(shadowColor), m_shadowDirection(normalize(shadowDirection)), m_shadowSize(shadowSize), m_density(density), m_pointSize(pointSize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TPointShadowFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TPointShadowFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TPointShadowFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 4;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TPointShadowFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TPointShadowFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TPointShadowFillStyle", "Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TPointShadowFillStyle", "Density");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TPointShadowFillStyle", "Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TPointShadowFillStyle", "Point Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 360.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = 0.01;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TPointShadowFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double degree = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		degree = asin(m_shadowDirection.y);
Toshihiro Shimizu 890ddd
		if (m_shadowDirection.x < 0)
Shinya Kitaoka ee259f
			degree = M_PI - degree;
Toshihiro Shimizu 890ddd
		if (degree < 0)
Shinya Kitaoka ee259f
			degree += M_2PI;
Shinya Kitaoka ee259f
		return degree * M_180_PI;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_density;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_shadowSize;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		return m_pointSize;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//never
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double degree = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Shinya Kitaoka ee259f
		degree = value * M_PI_180;
Toshihiro Shimizu 890ddd
		m_shadowDirection.x = cos(degree);
Toshihiro Shimizu 890ddd
		m_shadowDirection.y = sin(degree);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_density = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_shadowSize = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_pointSize = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_shadowDirection.x >> m_shadowDirection.y;
Toshihiro Shimizu 890ddd
	is >> m_density;
Toshihiro Shimizu 890ddd
	is >> m_shadowSize;
Toshihiro Shimizu 890ddd
	is >> m_pointSize;
Toshihiro Shimizu 890ddd
	is >> m_shadowColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_shadowDirection.x << m_shadowDirection.y;
Toshihiro Shimizu 890ddd
	os << m_density;
Toshihiro Shimizu 890ddd
	os << m_shadowSize;
Toshihiro Shimizu 890ddd
	os << m_pointSize;
Toshihiro Shimizu 890ddd
	os << m_shadowColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TPointShadowFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_shadowColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_shadowColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TPointShadowFillStyle::triangleArea(const TPointD &a, const TPointD &b, const TPointD &c) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double ab = tdistance(a, b);
Toshihiro Shimizu 890ddd
	double ac = tdistance(a, c);
Toshihiro Shimizu 890ddd
	double bc = tdistance(b, c);
Toshihiro Shimizu 890ddd
	double s = (ab + bc + ac) / 2.0;
Toshihiro Shimizu 890ddd
	return sqrt(s * (s - ab) * (s - ac) * (s - bc));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::shadowOnEdge_parallel(const TPointD &p0, const TPointD &p1,
Toshihiro Shimizu 890ddd
												  const TPointD &p2, TRandom &rnd) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (p0 == p1 || p1 == p2)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD diff = normalize(rotate90(p1 - p0));
Toshihiro Shimizu 890ddd
	double len1 = diff * m_shadowDirection;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	diff = normalize(rotate90(p2 - p1));
Toshihiro Shimizu 890ddd
	double len2 = diff * m_shadowDirection;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (len1 >= 0 && len2 >= 0 && (len1 + len2) > 0) {
Toshihiro Shimizu 890ddd
		TPointD la = p1 + m_shadowDirection * len1 * m_shadowSize;
Toshihiro Shimizu 890ddd
		TPointD lb = p2 + m_shadowDirection * len2 * m_shadowSize;
Toshihiro Shimizu 890ddd
		double t = triangleArea(p1, p2, lb) + triangleArea(p2, lb, la);
Toshihiro Shimizu 890ddd
		int nb = (int)(m_density * t);
Toshihiro Shimizu 890ddd
		for (int i = 0; i < nb; i++) {
Toshihiro Shimizu 890ddd
			double q = rnd.getUInt(1001) / 1000.0;
Toshihiro Shimizu 890ddd
			double r = rnd.getUInt(1001) / 1000.0;
Toshihiro Shimizu 890ddd
			r = r * r;
Toshihiro Shimizu 890ddd
			TPointD u = p1 + (p2 - p1) * q;
Toshihiro Shimizu 890ddd
			u = u + r * (len1 * (1.0 - q) + len2 * q) * m_shadowDirection * m_shadowSize;
Toshihiro Shimizu 890ddd
			tglColor(TPixel32(m_shadowColor.r,
Toshihiro Shimizu 890ddd
							  m_shadowColor.g,
Toshihiro Shimizu 890ddd
							  m_shadowColor.b,
Toshihiro Shimizu 890ddd
							  (int)((1.0 - r) * (double)m_shadowColor.m)));
Toshihiro Shimizu 890ddd
			tglVertex(u);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TPointShadowFillStyle::shadowOnEdge_parallel(TFlash &flash,
Toshihiro Shimizu 890ddd
												 const TPointD &p0, const TPointD &p1,
Toshihiro Shimizu 890ddd
												 const TPointD &p2, TRandom &rnd,
Toshihiro Shimizu 890ddd
												 const double radius,
Toshihiro Shimizu 890ddd
												 const bool isDraw) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int nbDraw = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (p0 == p1 || p1 == p2)
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD diff = normalize(rotate90(p1 - p0));
Toshihiro Shimizu 890ddd
	double len1 = diff * m_shadowDirection;
Shinya Kitaoka 12c444
	len1 = std::max(0.0, len1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	diff = normalize(rotate90(p2 - p1));
Toshihiro Shimizu 890ddd
	double len2 = diff * m_shadowDirection;
Shinya Kitaoka 12c444
	len2 = std::max(0.0, len2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if ((len1 + len2) > 0) {
Toshihiro Shimizu 890ddd
		TPointD la = p1 + m_shadowDirection * len1 * m_shadowSize;
Toshihiro Shimizu 890ddd
		TPointD lb = p2 + m_shadowDirection * len2 * m_shadowSize;
Toshihiro Shimizu 890ddd
		double t = triangleArea(p1, p2, lb) + triangleArea(p2, lb, la);
Toshihiro Shimizu 890ddd
		int nb = (int)(m_density * t);
Toshihiro Shimizu 890ddd
		for (int i = 0; i < nb; i++) {
Toshihiro Shimizu 890ddd
			double q = rnd.getUInt(1001) / 1000.0;
Toshihiro Shimizu 890ddd
			double r = rnd.getUInt(1001) / 1000.0;
Toshihiro Shimizu 890ddd
			r = r * r;
Toshihiro Shimizu 890ddd
			TPointD u = p1 + (p2 - p1) * q;
Toshihiro Shimizu 890ddd
			u = u + r * (len1 * (1.0 - q) + len2 * q) * m_shadowDirection * m_shadowSize;
Toshihiro Shimizu 890ddd
			nbDraw++;
Toshihiro Shimizu 890ddd
			if (isDraw) {
Toshihiro Shimizu 890ddd
				flash.setFillColor(TPixel32(m_shadowColor.r, m_shadowColor.g, m_shadowColor.b, (int)((1.0 - r) * 255)));
Toshihiro Shimizu 890ddd
				flash.drawEllipse(u, radius, radius);
Toshihiro Shimizu 890ddd
				//flash.drawDot(u,radius);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return nbDraw;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::deleteSameVerts(TRegionOutline::Boundary::iterator &rit,
Shinya Kitaoka 3bfa54
											std::vector<t3dpointd> &pv) const</t3dpointd>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	pv.clear();
Toshihiro Shimizu 890ddd
	if (rit->size() <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it_beg = rit->begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it_end = rit->end();
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator it = it_beg;
Toshihiro Shimizu 890ddd
	pv.push_back(*it);
Toshihiro Shimizu 890ddd
	it++;
Toshihiro Shimizu 890ddd
	for (; it != it_end; it++) {
Toshihiro Shimizu 890ddd
		if (tdistance(*it, pv.back()) > TConsts::epsilon) {
Toshihiro Shimizu 890ddd
			pv.push_back(*it);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (pv.size() > 2) {
Toshihiro Shimizu 890ddd
		if (tdistance(*(pv.begin()), pv.back()) <= TConsts::epsilon)
Toshihiro Shimizu 890ddd
			pv.pop_back();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	GLfloat pointSizeSave;
Toshihiro Shimizu 890ddd
	glGetFloatv(GL_POINT_SIZE, &pointSizeSave);
Toshihiro Shimizu 890ddd
	GLfloat sizes[2];
Toshihiro Shimizu 890ddd
	glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
Toshihiro Shimizu 890ddd
	//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
	//glEnable(GL_POINT_SMOOTH);
Toshihiro Shimizu 890ddd
	//glPointSize((float)(sizes[0]+(sizes[1]-sizes[0])*m_pointSize*0.01));
Toshihiro Shimizu 890ddd
	tglEnablePointSmooth((float)(sizes[0] + (sizes[1] - sizes[0]) * m_pointSize * 0.01));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it;
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_b = boundary.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_e = boundary.m_exterior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_shadowColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_shadowColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it) {
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd> pv;</t3dpointd>
Toshihiro Shimizu 890ddd
		deleteSameVerts(regions_it, pv);
Toshihiro Shimizu 890ddd
		if (pv.size() < 3)
Toshihiro Shimizu 890ddd
			continue;
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_beg = pv.begin();</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_end = pv.end();</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_last = it_end - 1;</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it0, it1, it2;</t3dpointd>
Toshihiro Shimizu 890ddd
		glBegin(GL_POINTS);
Toshihiro Shimizu 890ddd
		for (it1 = it_beg; it1 != it_end; it1++) {
Toshihiro Shimizu 890ddd
			it0 = it1 == it_beg ? it_last : it1 - 1;
Toshihiro Shimizu 890ddd
			it2 = it1 == it_last ? it_beg : it1 + 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			shadowOnEdge_parallel(TPointD(it0->x, it0->y), TPointD(it1->x, it1->y),
Toshihiro Shimizu 890ddd
								  TPointD(it2->x, it2->y), rnd);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPointSize(pointSizeSave);
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPointShadowFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	SFlashUtils rdf(r);
Toshihiro Shimizu 890ddd
	rdf.computeRegionOutline();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it;
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_b = rdf.m_ro.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regions_it_e = rdf.m_ro.m_exterior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color = m_shadowColor;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	rnd.reset();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double sizes[2] = {0.15, 10.0};
Toshihiro Shimizu 890ddd
	double radius = (sizes[0] + (sizes[1] - sizes[0]) * m_pointSize * 0.01);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nbDraw = 0;
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it) {
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd> pv;</t3dpointd>
Toshihiro Shimizu 890ddd
		deleteSameVerts(regions_it, pv);
Toshihiro Shimizu 890ddd
		if (pv.size() < 3)
Toshihiro Shimizu 890ddd
			continue;
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_beg = pv.begin();</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_end = pv.end();</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_last = it_end - 1;</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it0, it1, it2;</t3dpointd>
Toshihiro Shimizu 890ddd
		for (it1 = it_beg; it1 != it_end; it1++) {
Toshihiro Shimizu 890ddd
			it0 = it1 == it_beg ? it_last : it1 - 1;
Toshihiro Shimizu 890ddd
			it2 = it1 == it_last ? it_beg : it1 + 1;
Toshihiro Shimizu 890ddd
			nbDraw += shadowOnEdge_parallel(flash, TPointD(it0->x, it0->y), TPointD(it1->x, it1->y),
Toshihiro Shimizu 890ddd
											TPointD(it2->x, it2->y), rnd, radius, false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	rnd.reset();
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbDraw + 1); // +1 bbox
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	flash.drawRectangle(rdf.m_ro.m_bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	for (regions_it = regions_it_b; regions_it != regions_it_e; ++regions_it) {
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd> pv;</t3dpointd>
Toshihiro Shimizu 890ddd
		deleteSameVerts(regions_it, pv);
Toshihiro Shimizu 890ddd
		if (pv.size() < 3)
Toshihiro Shimizu 890ddd
			continue;
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_beg = pv.begin();</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_end = pv.end();</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it_last = it_end - 1;</t3dpointd>
Shinya Kitaoka 3bfa54
		std::vector<t3dpointd>::iterator it0, it1, it2;</t3dpointd>
Toshihiro Shimizu 890ddd
		for (it1 = it_beg; it1 != it_end; it1++) {
Toshihiro Shimizu 890ddd
			it0 = it1 == it_beg ? it_last : it1 - 1;
Toshihiro Shimizu 890ddd
			it2 = it1 == it_last ? it_beg : it1 + 1;
Toshihiro Shimizu 890ddd
			shadowOnEdge_parallel(flash, TPointD(it0->x, it0->y), TPointD(it1->x, it1->y),
Toshihiro Shimizu 890ddd
								  TPointD(it2->x, it2->y), rnd, radius, true);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TDottedFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDottedFillStyle::TDottedFillStyle(
Toshihiro Shimizu 890ddd
	const TPixel32 &bgColor,
Toshihiro Shimizu 890ddd
	const TPixel32 &pointColor,
Toshihiro Shimizu 890ddd
	const double dotSize,
Toshihiro Shimizu 890ddd
	const double dotDist,
Toshihiro Shimizu 890ddd
	const bool isShifted)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_pointColor(pointColor), m_dotSize(dotSize), m_dotDist(dotDist), m_isShifted(isShifted)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDottedFillStyle::TDottedFillStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(TPixel32(0, 0, 200)), m_pointColor(color), m_dotSize(3.0), m_dotDist(15.0), m_isShifted(true)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TDottedFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TDottedFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TDottedFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TDottedFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TDottedFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("TDottedFillStyle", "Dot Size") : QCoreApplication::translate("TDottedFillStyle", "Dot Distance");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0) {
Toshihiro Shimizu 890ddd
		min = 0.001;
Toshihiro Shimizu 890ddd
		max = 30.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 2.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TDottedFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!index)
Toshihiro Shimizu 890ddd
		return m_dotSize;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return m_dotDist;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!index) {
Toshihiro Shimizu 890ddd
		m_dotSize = value;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_dotDist = value;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_dotSize;
Toshihiro Shimizu 890ddd
	is >> m_dotDist;
Toshihiro Shimizu 890ddd
	is >> m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_dotSize;
Toshihiro Shimizu 890ddd
	os << m_dotDist;
Toshihiro Shimizu 890ddd
	os << m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TDottedFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_pointColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_pointColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 12c444
	double LDotDist = std::max(m_dotDist, 0.1);
Toshihiro Shimizu 890ddd
	//double LDotSize=m_dotSize;
Toshihiro Shimizu 890ddd
	bool LIsShifted = m_isShifted;
Toshihiro Shimizu 890ddd
	const bool isTransparent = m_pointColor.m < 255;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isTransparent) {
Toshihiro Shimizu 890ddd
		//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
		//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
		//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_pointColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (double y = boundary.m_bbox.y0; y <= boundary.m_bbox.y1; y += LDotDist, ++i) {
Toshihiro Shimizu 890ddd
		double x = LIsShifted && (i % 2) == 1 ? boundary.m_bbox.x0 + LDotDist / 2.0 : boundary.m_bbox.x0;
Toshihiro Shimizu 890ddd
		for (; x <= boundary.m_bbox.x1; x += LDotDist)
Toshihiro Shimizu 890ddd
			tglDrawDisk(TPointD(x, y), m_dotSize);
Toshihiro Shimizu 890ddd
		//			tglDrawCircle(TPointD(x,y),m_dotSize);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isTransparent) {
Toshihiro Shimizu 890ddd
		//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
		//glDisable(GL_BLEND);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TDottedFillStyle::nbClip(const double LDotDist, const bool LIsShifted,
Toshihiro Shimizu 890ddd
							 const TRectD &bbox) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int nbClipLayers = 1; // the bbox rectangle
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (double y = bbox.y0; y <= bbox.y1; y += LDotDist, ++i) {
Toshihiro Shimizu 890ddd
		double x = LIsShifted && (i % 2) == 1 ? bbox.x0 + LDotDist / 2.0 : bbox.x0;
Toshihiro Shimizu 890ddd
		for (; x <= bbox.x1; x += LDotDist)
Toshihiro Shimizu 890ddd
			nbClipLayers++;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return nbClipLayers;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 12c444
	double LDotDist = std::max(m_dotDist, 0.1);
Toshihiro Shimizu 890ddd
	double LDotSize = m_dotSize;
Toshihiro Shimizu 890ddd
	bool LIsShifted = m_isShifted;
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(TPixel::Black);
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, true);
Toshihiro Shimizu 890ddd
	int nClip = nbClip(LDotDist, LIsShifted, bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nClip);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	flash.drawRectangle(bbox);
Toshihiro Shimizu 890ddd
	flash.setFillColor(m_pointColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (double y = bbox.y0; y <= bbox.y1; y += LDotDist, ++i) {
Toshihiro Shimizu 890ddd
		double x = LIsShifted && (i % 2) == 1 ? bbox.x0 + LDotDist / 2.0 : bbox.x0;
Toshihiro Shimizu 890ddd
		for (; x <= bbox.x1; x += LDotDist)
Toshihiro Shimizu 890ddd
			flash.drawEllipse(TPointD(x, y), LDotSize, LDotSize);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TCheckedFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TCheckedFillStyle::TCheckedFillStyle(
Toshihiro Shimizu 890ddd
	const TPixel32 &bgColor, const TPixel32 &pointColor,
Toshihiro Shimizu 890ddd
	const double HDist, const double HAngle,
Toshihiro Shimizu 890ddd
	const double VDist, const double VAngle, const double Thickness)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_pointColor(pointColor), m_HDist(HDist), m_HAngle(HAngle), m_VDist(VDist), m_VAngle(VAngle), m_Thickness(Thickness)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TCheckedFillStyle::TCheckedFillStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(TPixel32::Transparent), m_pointColor(color), m_HDist(15.0), m_HAngle(0.0), m_VDist(15.0), m_VAngle(0.0), m_Thickness(6.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TCheckedFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TCheckedFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TCheckedFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 5;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TCheckedFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TCheckedFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCheckedFillStyle", "Horiz Dist");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCheckedFillStyle", "Horiz Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCheckedFillStyle", "Vert Dist");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCheckedFillStyle", "Vert Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCheckedFillStyle", "Thickness");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = 1.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = -45.0;
Toshihiro Shimizu 890ddd
		max = 45.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 1.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = -45.0;
Toshihiro Shimizu 890ddd
		max = 45.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		min = 0.5;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TCheckedFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return m_HDist;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_HAngle;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_VDist;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		return m_VAngle;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		return m_Thickness;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_HDist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_HAngle = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_VDist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_VAngle = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		m_Thickness = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_HDist;
Toshihiro Shimizu 890ddd
	is >> m_HAngle;
Toshihiro Shimizu 890ddd
	is >> m_VDist;
Toshihiro Shimizu 890ddd
	is >> m_VAngle;
Toshihiro Shimizu 890ddd
	is >> m_Thickness;
Toshihiro Shimizu 890ddd
	is >> m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_HDist;
Toshihiro Shimizu 890ddd
	os << m_HAngle;
Toshihiro Shimizu 890ddd
	os << m_VDist;
Toshihiro Shimizu 890ddd
	os << m_VAngle;
Toshihiro Shimizu 890ddd
	os << m_Thickness;
Toshihiro Shimizu 890ddd
	os << m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::getHThickline(const TPointD &lc, const double lx,
Toshihiro Shimizu 890ddd
									  TPointD &p0, TPointD &p1,
Toshihiro Shimizu 890ddd
									  TPointD &p2, TPointD &p3) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double l = m_Thickness / cos(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	l *= 0.5;
Toshihiro Shimizu 890ddd
	p0 = TPointD(lc.x, lc.y - l);
Toshihiro Shimizu 890ddd
	p1 = TPointD(lc.x, lc.y + l);
Toshihiro Shimizu 890ddd
	double y = lc.y + lx * tan(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	p2 = TPointD(lc.x + lx, y + l);
Toshihiro Shimizu 890ddd
	p3 = TPointD(lc.x + lx, y - l);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::getVThickline(const TPointD &lc, const double ly,
Toshihiro Shimizu 890ddd
									  TPointD &p0, TPointD &p1,
Toshihiro Shimizu 890ddd
									  TPointD &p2, TPointD &p3) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double l = m_Thickness / cos(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	l *= 0.5;
Toshihiro Shimizu 890ddd
	p0 = TPointD(lc.x - l, lc.y);
Toshihiro Shimizu 890ddd
	p1 = TPointD(lc.x + l, lc.y);
Toshihiro Shimizu 890ddd
	double x = lc.x + ly * tan(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	p2 = TPointD(x + l, lc.y + ly);
Toshihiro Shimizu 890ddd
	p3 = TPointD(x - l, lc.y + ly);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TCheckedFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_pointColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_pointColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const bool isTransparent = m_pointColor.m < 255;
Toshihiro Shimizu 890ddd
	if (isTransparent) {
Toshihiro Shimizu 890ddd
		//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
		//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
		//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_pointColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Horizontal Lines
Toshihiro Shimizu 890ddd
	double lx = boundary.m_bbox.x1 - boundary.m_bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = boundary.m_bbox.y1 - boundary.m_bbox.y0;
Toshihiro Shimizu 890ddd
	double beg = boundary.m_bbox.y0;
Toshihiro Shimizu 890ddd
	double end = boundary.m_bbox.y1;
Toshihiro Shimizu 890ddd
	beg = m_HAngle <= 0 ? beg : beg - lx * tan(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	end = m_HAngle >= 0 ? end : end - lx * tan(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	double dist = m_HDist / cos(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	for (double y = beg; y <= end; y += dist) {
Toshihiro Shimizu 890ddd
		TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
		getHThickline(TPointD(boundary.m_bbox.x0, y), lx, p0, p1, p2, p3);
Toshihiro Shimizu 890ddd
		tglVertex(p0);
Toshihiro Shimizu 890ddd
		tglVertex(p1);
Toshihiro Shimizu 890ddd
		tglVertex(p2);
Toshihiro Shimizu 890ddd
		tglVertex(p3);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Vertical Lines
Toshihiro Shimizu 890ddd
	beg = boundary.m_bbox.x0;
Toshihiro Shimizu 890ddd
	end = boundary.m_bbox.x1;
Toshihiro Shimizu 890ddd
	beg = (-m_VAngle) <= 0 ? beg : beg - ly * tan(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	end = (-m_VAngle) >= 0 ? end : end - ly * tan(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	dist = m_VDist / cos(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	for (double x = beg; x <= end; x += dist) {
Toshihiro Shimizu 890ddd
		TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
		getVThickline(TPointD(x, boundary.m_bbox.y0), ly, p0, p1, p2, p3);
Toshihiro Shimizu 890ddd
		tglVertex(p0);
Toshihiro Shimizu 890ddd
		tglVertex(p1);
Toshihiro Shimizu 890ddd
		tglVertex(p2);
Toshihiro Shimizu 890ddd
		tglVertex(p3);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isTransparent) {
Toshihiro Shimizu 890ddd
		//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
		//glDisable(GL_BLEND);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TCheckedFillStyle::nbClip(const TRectD &bbox) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int nbClip = 1; // the bbox rectangle
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Toshihiro Shimizu 890ddd
	double beg = bbox.y0;
Toshihiro Shimizu 890ddd
	double end = bbox.y1;
Toshihiro Shimizu 890ddd
	beg = m_HAngle <= 0 ? beg : beg - lx * tan(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	end = m_HAngle >= 0 ? end : end - lx * tan(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	double dist = m_HDist / cos(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	for (double y = beg; y <= end; y += dist)
Toshihiro Shimizu 890ddd
		nbClip++;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Vertical lines
Toshihiro Shimizu 890ddd
	beg = bbox.x0;
Toshihiro Shimizu 890ddd
	end = bbox.x1;
Toshihiro Shimizu 890ddd
	beg = (-m_VAngle) <= 0 ? beg : beg - ly * tan(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	end = (-m_VAngle) >= 0 ? end : end - ly * tan(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	dist = m_VDist / cos(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	for (double x = beg; x <= end; x += dist)
Toshihiro Shimizu 890ddd
		nbClip++;
Toshihiro Shimizu 890ddd
	return nbClip;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCheckedFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//	flash.drawRegion(*r,true);
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbClip(bbox));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	flash.drawRectangle(bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(m_pointColor);
Toshihiro Shimizu 890ddd
	// Horizontal Lines
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Toshihiro Shimizu 890ddd
	double beg = bbox.y0;
Toshihiro Shimizu 890ddd
	double end = bbox.y1;
Toshihiro Shimizu 890ddd
	beg = m_HAngle <= 0 ? beg : beg - lx * tan(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	end = m_HAngle >= 0 ? end : end - lx * tan(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	double dist = m_HDist / cos(degree2rad(m_HAngle));
Toshihiro Shimizu 890ddd
	for (double y = beg; y <= end; y += dist) {
Toshihiro Shimizu 890ddd
		TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
		getHThickline(TPointD(bbox.x0, y), lx, p0, p1, p2, p3);
Shinya Kitaoka 3bfa54
		std::vector<tpointd> v;</tpointd>
Toshihiro Shimizu 890ddd
		v.push_back(p0);
Toshihiro Shimizu 890ddd
		v.push_back(p1);
Toshihiro Shimizu 890ddd
		v.push_back(p2);
Toshihiro Shimizu 890ddd
		v.push_back(p3);
Toshihiro Shimizu 890ddd
		flash.drawPolyline(v);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Vertical lines
Toshihiro Shimizu 890ddd
	beg = bbox.x0;
Toshihiro Shimizu 890ddd
	end = bbox.x1;
Toshihiro Shimizu 890ddd
	beg = (-m_VAngle) <= 0 ? beg : beg - ly * tan(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	end = (-m_VAngle) >= 0 ? end : end - ly * tan(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	dist = m_VDist / cos(degree2rad(-m_VAngle));
Toshihiro Shimizu 890ddd
	for (double x = beg; x <= end; x += dist) {
Toshihiro Shimizu 890ddd
		TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
		getVThickline(TPointD(x, bbox.y0), ly, p0, p1, p2, p3);
Shinya Kitaoka 3bfa54
		std::vector<tpointd> v;</tpointd>
Toshihiro Shimizu 890ddd
		v.push_back(p0);
Toshihiro Shimizu 890ddd
		v.push_back(p1);
Toshihiro Shimizu 890ddd
		v.push_back(p2);
Toshihiro Shimizu 890ddd
		v.push_back(p3);
Toshihiro Shimizu 890ddd
		flash.drawPolyline(v);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    ArtisticModifier  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArtisticModifier::modify(TRegionOutline &outline) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regIt = outline.m_exterior.begin();
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary::iterator regItEnd = outline.m_exterior.end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator pIt;
Toshihiro Shimizu 890ddd
	TRegionOutline::PointVector::iterator pItEnd;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	double counter = 0;
Toshihiro Shimizu 890ddd
	double maxcounter = 0;
Toshihiro Shimizu 890ddd
	for (; regIt != regItEnd; ++regIt) {
Toshihiro Shimizu 890ddd
		pIt = regIt->begin();
Toshihiro Shimizu 890ddd
		pItEnd = regIt->end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (; pIt != pItEnd; ++pIt) {
Toshihiro Shimizu 890ddd
			if (counter >= maxcounter) {
Toshihiro Shimizu 890ddd
				double tmp = (201 - m_period) * (rnd.getFloat() + 1);
Toshihiro Shimizu 890ddd
				maxcounter = tmp * tmp;
Toshihiro Shimizu 890ddd
				counter = 0;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			if (pIt != regIt->begin()) {
Toshihiro Shimizu 890ddd
				double distance = (pIt->x - (pIt - 1)->x) * (pIt->x - (pIt - 1)->x) + (pIt->y - (pIt - 1)->y) * (pIt->y - (pIt - 1)->y);
Toshihiro Shimizu 890ddd
				counter += distance;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			double wave = 1;
Toshihiro Shimizu 890ddd
			if (maxcounter)
Shinya Kitaoka ee259f
				wave = sin(M_2PI * counter / maxcounter);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			pIt->x += m_move.x * wave;
Toshihiro Shimizu 890ddd
			pIt->y += m_move.y * wave;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	regIt = outline.m_interior.begin();
Toshihiro Shimizu 890ddd
	regItEnd = outline.m_interior.end();
Toshihiro Shimizu 890ddd
	for (; regIt != regItEnd; ++regIt) {
Toshihiro Shimizu 890ddd
		pIt = regIt->begin();
Toshihiro Shimizu 890ddd
		pItEnd = regIt->end();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (; pIt != pItEnd; ++pIt) {
Toshihiro Shimizu 890ddd
			pIt->x += (0.5 - rnd.getFloat()) * m_move.x;
Toshihiro Shimizu 890ddd
			pIt->y += (0.5 - rnd.getFloat()) * m_move.y;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TOutlineStyle::RegionOutlineModifier *ArtisticModifier::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new ArtisticModifier(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    ArtisticSolidColor  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ArtisticSolidColor::ArtisticSolidColor(
Toshihiro Shimizu 890ddd
	const TPixel32 &color, const TPointD &move, double period)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier = new ArtisticModifier(move, period);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *ArtisticSolidColor::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new ArtisticSolidColor(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArtisticSolidColor::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
	ArtisticModifier *mov = new ArtisticModifier(TPointD(), double());
Toshihiro Shimizu 890ddd
	mov->loadData(is);
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier = mov;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArtisticSolidColor::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_regionOutlineModifier);
Toshihiro Shimizu 890ddd
	((ArtisticModifier *)m_regionOutlineModifier)->saveData(os);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int ArtisticSolidColor::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 3;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType ArtisticSolidColor::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString ArtisticSolidColor::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("ArtisticSolidColor", "Horiz Offset");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("ArtisticSolidColor", "Vert Offset");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("ArtisticSolidColor", "Noise");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArtisticSolidColor::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 20.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 20.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 200.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double ArtisticSolidColor::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	double value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = ((ArtisticModifier *)m_regionOutlineModifier)->getMovePoint().x;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = ((ArtisticModifier *)m_regionOutlineModifier)->getMovePoint().y;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = ((ArtisticModifier *)m_regionOutlineModifier)->getPeriod();
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArtisticSolidColor::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldMove = ((ArtisticModifier *)m_regionOutlineModifier)->getMovePoint();
Toshihiro Shimizu 890ddd
	double oldPeriod = ((ArtisticModifier *)m_regionOutlineModifier)->getPeriod();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		if (oldMove.x != value) {
Toshihiro Shimizu 890ddd
			delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
			oldMove.x = value;
Toshihiro Shimizu 890ddd
			m_regionOutlineModifier = new ArtisticModifier(oldMove, oldPeriod);
Toshihiro Shimizu 890ddd
			updateVersionNumber();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		if (oldMove.y != value) {
Toshihiro Shimizu 890ddd
			delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
			oldMove.y = value;
Toshihiro Shimizu 890ddd
			m_regionOutlineModifier = new ArtisticModifier(oldMove, oldPeriod);
Toshihiro Shimizu 890ddd
			updateVersionNumber();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		if (oldPeriod != value) {
Toshihiro Shimizu 890ddd
			delete m_regionOutlineModifier;
Toshihiro Shimizu 890ddd
			oldPeriod = value;
Toshihiro Shimizu 890ddd
			m_regionOutlineModifier = new ArtisticModifier(oldMove, oldPeriod);
Toshihiro Shimizu 890ddd
			updateVersionNumber();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArtisticSolidColor::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::drawRegion(cf, true, boundary);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ArtisticSolidColor::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	SFlashUtils rdf(r);
Toshihiro Shimizu 890ddd
	rdf.computeRegionOutline();
Toshihiro Shimizu 890ddd
	m_regionOutlineModifier->modify(rdf.m_ro);
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	rdf.drawRegionOutline(flash, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TChalkFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TChalkFillStyle::TChalkFillStyle(const TPixel32 &color0, const TPixel32 &color1,
Toshihiro Shimizu 890ddd
								 const double density, const double size)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(color1), m_color0(color0), m_density(density), m_size(size)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TChalkFillStyle::TChalkFillStyle(const TPixel32 &color0, const TPixel32 &color1)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(color0), m_color0(color1), m_density(25.0), m_size(1.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TChalkFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TChalkFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TChalkFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TChalkFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TChalkFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChalkFillStyle", "Density");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChalkFillStyle", "Dot Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkFillStyle::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 1133)
Toshihiro Shimizu 890ddd
		throw TException("Chalk Fill style: unknown obsolete format");
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_color0 >> m_density >> m_size;
Toshihiro Shimizu 890ddd
	m_density = m_density / 1000;
Toshihiro Shimizu 890ddd
	if (m_density > 100)
Toshihiro Shimizu 890ddd
		m_density = 100;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = 0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 10.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TChalkFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	double value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_density;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_size;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_density = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_size = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_color0;
Toshihiro Shimizu 890ddd
	is >> m_density;
Toshihiro Shimizu 890ddd
	is >> m_size;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TChalkFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_color0;
Toshihiro Shimizu 890ddd
	os << m_density;
Toshihiro Shimizu 890ddd
	os << m_size;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
TPixel32 TChalkFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_color0 : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TChalkFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_color0 = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//const bool isTransparent=m_color0.m<255;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//TRegionOutline::Boundary& exter=*(boundary.m_exterior);
Toshihiro Shimizu 890ddd
	//TRegionOutline::Boundary& inter=*(boundary.m_interior);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color0;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color0 = (*(cf))(m_color0);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color0 = m_color0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int chalkId = glGenLists(1);
Toshihiro Shimizu 890ddd
	glNewList(chalkId, GL_COMPILE);
Toshihiro Shimizu 890ddd
	glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
	glVertex2d(m_size, m_size);
Toshihiro Shimizu 890ddd
	glVertex2d(-m_size, m_size);
Toshihiro Shimizu 890ddd
	glVertex2d(-m_size, -m_size);
Toshihiro Shimizu 890ddd
	glVertex2d(m_size, -m_size);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glEndList();
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double lx = boundary.m_bbox.x1 - boundary.m_bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = boundary.m_bbox.y1 - boundary.m_bbox.y0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// cioe' imposta una densita' tale, per cui in una regione che ha bbox 200x200
Toshihiro Shimizu 890ddd
	// inserisce esattamente m_density punti
Toshihiro Shimizu 890ddd
	int pointNumber = (int)(m_density * ((lx * ly) * 0.02));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < pointNumber; i++) {
Toshihiro Shimizu 890ddd
		TPixel32 tmpcolor = color0;
Toshihiro Shimizu 890ddd
		double shiftx = boundary.m_bbox.x0 + rnd.getFloat() * lx;
Toshihiro Shimizu 890ddd
		double shifty = boundary.m_bbox.y0 + rnd.getFloat() * ly;
Toshihiro Shimizu 890ddd
		tmpcolor.m = (UCHAR)(tmpcolor.m * rnd.getFloat());
Toshihiro Shimizu 890ddd
		tglColor(tmpcolor);
Toshihiro Shimizu 890ddd
		glPushMatrix();
Toshihiro Shimizu 890ddd
		glTranslated(shiftx, shifty, 0.0);
Toshihiro Shimizu 890ddd
		glCallList(chalkId);
Toshihiro Shimizu 890ddd
		glPopMatrix();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//glEnd(); e questo che era???
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glDeleteLists(chalkId, 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 bgColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double minDensity;
Toshihiro Shimizu 890ddd
	double maxDensity;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	getParamRange(0, minDensity, maxDensity);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double r1 = (m_density - minDensity) / (maxDensity - minDensity);
Toshihiro Shimizu 890ddd
	double r2 = 1.0 - r1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color((int)(bgColor.r * r2 + m_color0.r * r1),
Toshihiro Shimizu 890ddd
				   (int)(bgColor.g * r2 + m_color0.g * r1),
Toshihiro Shimizu 890ddd
				   (int)(bgColor.b * r2 + m_color0.b * r1),
Toshihiro Shimizu 890ddd
				   (int)(bgColor.m * r2 + m_color0.m * r1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(color);
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
	SFlashUtils rdf(r);
Toshihiro Shimizu 890ddd
	rdf.computeRegionOutline();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    const bool isTransparent=m_color0.m<255;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary& exter=*(rdf.m_ro.m_exterior);
Toshihiro Shimizu 890ddd
	TRegionOutline::Boundary& inter=*(rdf.m_ro.m_interior);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    TPixel32 color0=m_color0;
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
	double lx=rdf.m_ro.m_bbox.x1-rdf.m_ro.m_bbox.x0;
Toshihiro Shimizu 890ddd
	double ly=rdf.m_ro.m_bbox.y1-rdf.m_ro.m_bbox.y0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  // cioe' imposta una densita' tale, per cui in una regione che ha bbox 200x200
Toshihiro Shimizu 890ddd
  // inserisce esattamente m_density punti
Toshihiro Shimizu 890ddd
  int pointNumber= (int)(m_density*((lx*ly)*0.000025));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  flash.drawRegion(*r,pointNumber+1); // -1 i don't know why
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
  flash.drawRectangle(TRectD(TPointD(rdf.m_ro.m_bbox.x0,rdf.m_ro.m_bbox.y0),
Toshihiro Shimizu 890ddd
	                         TPointD(rdf.m_ro.m_bbox.x1,rdf.m_ro.m_bbox.y1)));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  flash.setThickness(0.0);	
Toshihiro Shimizu 890ddd
  for( int i=0;i< pointNumber; i++ ) {
Toshihiro Shimizu 890ddd
       TPixel32 tmpcolor=color0;
Toshihiro Shimizu 890ddd
       double shiftx=rdf.m_ro.m_bbox.x0+rnd.getFloat()*lx;
Toshihiro Shimizu 890ddd
       double shifty=rdf.m_ro.m_bbox.y0+rnd.getFloat()*ly;
Toshihiro Shimizu 890ddd
       tmpcolor.m=(UCHAR)(tmpcolor.m*rnd.getFloat());
Toshihiro Shimizu 890ddd
       flash.setFillColor(tmpcolor);	
Toshihiro Shimizu 890ddd
       flash.pushMatrix();
Toshihiro Shimizu 890ddd
	   TTranslation tM(shiftx, shifty);
Toshihiro Shimizu 890ddd
       flash.multMatrix(tM);
Toshihiro Shimizu 890ddd
       flash.drawRectangle(TRectD(TPointD(-1,-1),TPointD(1,1)));
Toshihiro Shimizu 890ddd
       flash.popMatrix();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TChessFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TChessFillStyle::TChessFillStyle(const TPixel32 &bgColor, const TPixel32 &pointColor,
Toshihiro Shimizu 890ddd
								 const double HDist, const double VDist, const double Angle)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_pointColor(pointColor), m_HDist(HDist), m_VDist(VDist), m_Angle(Angle)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TChessFillStyle::TChessFillStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(TPixel32::White), m_pointColor(color), m_HDist(10.0), m_VDist(10.0), m_Angle(0.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TChessFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TChessFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TChessFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 3;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TChessFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TChessFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChessFillStyle", "Horiz Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChessFillStyle", "Vert Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChessFillStyle", "Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChessFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = 1.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 1.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = -45.0;
Toshihiro Shimizu 890ddd
		max = 45.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TChessFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return m_HDist;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_VDist;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_Angle;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChessFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_HDist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_VDist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_Angle = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChessFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_HDist;
Toshihiro Shimizu 890ddd
	is >> m_VDist;
Toshihiro Shimizu 890ddd
	is >> m_Angle;
Toshihiro Shimizu 890ddd
	is >> m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChessFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_HDist;
Toshihiro Shimizu 890ddd
	os << m_VDist;
Toshihiro Shimizu 890ddd
	os << m_Angle;
Toshihiro Shimizu 890ddd
	os << m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TChessFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_pointColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChessFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_pointColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
void TChessFillStyle::makeGrid(TRectD &bbox, TRotation &rotM, std::vector<tpointd> &grid,</tpointd>
Toshihiro Shimizu 890ddd
							   int &nbClip) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Toshihiro Shimizu 890ddd
	TPointD center = TPointD((bbox.x1 + bbox.x0) * 0.5,
Toshihiro Shimizu 890ddd
							 (bbox.y1 + bbox.y0) * 0.5);
Toshihiro Shimizu 890ddd
	double l = (lx + ly) / 1.3;
Toshihiro Shimizu 890ddd
	double l2 = l / 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isFirst = true;
Toshihiro Shimizu 890ddd
	for (double y = -l2; y < (l2 + m_VDist); y += m_VDist) {
Toshihiro Shimizu 890ddd
		double x = isFirst ? -l2 : -l2 + m_HDist;
Toshihiro Shimizu 890ddd
		isFirst = !isFirst;
Toshihiro Shimizu 890ddd
		for (; x < (l2 + m_HDist); x += 2 * m_HDist) {
Toshihiro Shimizu 890ddd
			grid.push_back(rotM * TPointD(x, y) + center);
Toshihiro Shimizu 890ddd
			nbClip++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChessFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//	const bool isTransparent=m_pointColor.m<255;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_pointColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD vert[4];
Toshihiro Shimizu 890ddd
	vert[0].x = -0.5;
Toshihiro Shimizu 890ddd
	vert[0].y = 0.5;
Toshihiro Shimizu 890ddd
	vert[1].x = -0.5;
Toshihiro Shimizu 890ddd
	vert[1].y = -0.5;
Toshihiro Shimizu 890ddd
	vert[2].x = 0.5;
Toshihiro Shimizu 890ddd
	vert[2].y = -0.5;
Toshihiro Shimizu 890ddd
	vert[3].x = 0.5;
Toshihiro Shimizu 890ddd
	vert[3].y = 0.5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRotation rotM(m_Angle);
Toshihiro Shimizu 890ddd
	TScale scaleM(m_HDist, m_VDist);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 4; i++)
Toshihiro Shimizu 890ddd
		vert[i] = rotM * scaleM * vert[i];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int chessId = glGenLists(1);
Toshihiro Shimizu 890ddd
	glNewList(chessId, GL_COMPILE);
Toshihiro Shimizu 890ddd
	glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
	glVertex2d(vert[0].x, vert[0].y);
Toshihiro Shimizu 890ddd
	glVertex2d(vert[1].x, vert[1].y);
Toshihiro Shimizu 890ddd
	glVertex2d(vert[2].x, vert[2].y);
Toshihiro Shimizu 890ddd
	glVertex2d(vert[3].x, vert[3].y);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glEndList();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nbClip = 1;
Shinya Kitaoka 3bfa54
	std::vector<tpointd> grid;</tpointd>
Toshihiro Shimizu 890ddd
	makeGrid(boundary.m_bbox, rotM, grid, nbClip);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd>::const_iterator it = grid.begin();</tpointd>
Shinya Kitaoka 3bfa54
	std::vector<tpointd>::const_iterator ite = grid.end();</tpointd>
Toshihiro Shimizu 890ddd
	for (; it != ite; it++) {
Toshihiro Shimizu 890ddd
		glPushMatrix();
Toshihiro Shimizu 890ddd
		glTranslated(it->x, it->y, 0.0);
Toshihiro Shimizu 890ddd
		glCallList(chessId);
Toshihiro Shimizu 890ddd
		glPopMatrix();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
	glDeleteLists(chessId, 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChessFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD vert[4];
Toshihiro Shimizu 890ddd
	vert[0].x = -0.5;
Toshihiro Shimizu 890ddd
	vert[0].y = 0.5;
Toshihiro Shimizu 890ddd
	vert[1].x = -0.5;
Toshihiro Shimizu 890ddd
	vert[1].y = -0.5;
Toshihiro Shimizu 890ddd
	vert[2].x = 0.5;
Toshihiro Shimizu 890ddd
	vert[2].y = -0.5;
Toshihiro Shimizu 890ddd
	vert[3].x = 0.5;
Toshihiro Shimizu 890ddd
	vert[3].y = 0.5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRotation rotM(m_Angle);
Toshihiro Shimizu 890ddd
	TScale scaleM(m_HDist, m_VDist);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 4; i++)
Toshihiro Shimizu 890ddd
		vert[i] = rotM * scaleM * vert[i];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nbClip = 1; // just for the getMainColor() rectangle
Shinya Kitaoka 3bfa54
	std::vector<tpointd> grid;</tpointd>
Toshihiro Shimizu 890ddd
	makeGrid(bbox, rotM, grid, nbClip);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//	flash.drawRegion(*r,true);
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbClip);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	flash.drawRectangle(bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(m_pointColor);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd>::const_iterator it = grid.begin();</tpointd>
Shinya Kitaoka 3bfa54
	std::vector<tpointd>::const_iterator ite = grid.end();</tpointd>
Toshihiro Shimizu 890ddd
	for (; it != ite; it++) {
Toshihiro Shimizu 890ddd
		TTranslation trM(it->x, it->y);
Shinya Kitaoka 3bfa54
		std::vector<tpointd> lvert;</tpointd>
Toshihiro Shimizu 890ddd
		lvert.push_back(trM * vert[0]);
Toshihiro Shimizu 890ddd
		lvert.push_back(trM * vert[1]);
Toshihiro Shimizu 890ddd
		lvert.push_back(trM * vert[2]);
Toshihiro Shimizu 890ddd
		lvert.push_back(trM * vert[3]);
Toshihiro Shimizu 890ddd
		flash.drawPolyline(lvert);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TStripeFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TStripeFillStyle::TStripeFillStyle(
Toshihiro Shimizu 890ddd
	const TPixel32 &bgColor, const TPixel32 &pointColor,
Toshihiro Shimizu 890ddd
	const double Dist, const double Angle, const double Thickness)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_pointColor(pointColor), m_Dist(Dist), m_Angle(Angle), m_Thickness(Thickness)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TStripeFillStyle::TStripeFillStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(TPixel32::Transparent), m_pointColor(color), m_Dist(15.0), m_Angle(0.0), m_Thickness(6.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TStripeFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TStripeFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TStripeFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 3;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TStripeFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TStripeFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TStripeFillStyle", "Distance");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TStripeFillStyle", "Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TStripeFillStyle", "Thickness");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = 1.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = -90.0;
Toshihiro Shimizu 890ddd
		max = 90.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.5;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TStripeFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return m_Dist;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_Angle;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_Thickness;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_Dist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_Angle = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_Thickness = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_Dist;
Toshihiro Shimizu 890ddd
	is >> m_Angle;
Toshihiro Shimizu 890ddd
	is >> m_Thickness;
Toshihiro Shimizu 890ddd
	is >> m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_Dist;
Toshihiro Shimizu 890ddd
	os << m_Angle;
Toshihiro Shimizu 890ddd
	os << m_Thickness;
Toshihiro Shimizu 890ddd
	os << m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::getThickline(const TPointD &lc, const double lx,
Toshihiro Shimizu 890ddd
									TPointD &p0, TPointD &p1,
Toshihiro Shimizu 890ddd
									TPointD &p2, TPointD &p3) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double l = m_Thickness / cos(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
	l *= 0.5;
Toshihiro Shimizu 890ddd
	p0 = TPointD(lc.x, lc.y - l);
Toshihiro Shimizu 890ddd
	p1 = TPointD(lc.x, lc.y + l);
Toshihiro Shimizu 890ddd
	double y = lc.y + lx * tan(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
	p2 = TPointD(lc.x + lx, y + l);
Toshihiro Shimizu 890ddd
	p3 = TPointD(lc.x + lx, y - l);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TStripeFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_pointColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TStripeFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_pointColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void trim(TPointD &p0, TPointD &p1, double y0, double y1)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (p0.y < y0) {
Toshihiro Shimizu 890ddd
		//Trim the first extreme of the segment at y0
Toshihiro Shimizu 890ddd
		double t = (y0 - p0.y) / (p1.y - p0.y);
Toshihiro Shimizu 890ddd
		p0.x = p0.x + t * (p1.x - p0.x);
Toshihiro Shimizu 890ddd
		p0.y = y0;
Toshihiro Shimizu 890ddd
	} else if (p0.y > y1) {
Toshihiro Shimizu 890ddd
		//The same, at y1
Toshihiro Shimizu 890ddd
		double t = (y1 - p0.y) / (p1.y - p0.y);
Toshihiro Shimizu 890ddd
		p0.x = p0.x + t * (p1.x - p0.x);
Toshihiro Shimizu 890ddd
		p0.y = y1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Same for p1
Toshihiro Shimizu 890ddd
	if (p1.y < y0) {
Toshihiro Shimizu 890ddd
		double t = (y0 - p1.y) / (p0.y - p1.y);
Toshihiro Shimizu 890ddd
		p1.x = p1.x + t * (p0.x - p1.x);
Toshihiro Shimizu 890ddd
		p1.y = y0;
Toshihiro Shimizu 890ddd
	} else if (p1.y > y1) {
Toshihiro Shimizu 890ddd
		double t = (y1 - p1.y) / (p0.y - p1.y);
Toshihiro Shimizu 890ddd
		p1.x = p1.x + t * (p0.x - p1.x);
Toshihiro Shimizu 890ddd
		p1.y = y1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const bool isTransparent = m_pointColor.m < 255;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask();
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isTransparent) {
Toshihiro Shimizu 890ddd
		//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
		//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
		//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_pointColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Horizontal Lines
Toshihiro Shimizu 890ddd
	if (fabs(m_Angle) != 90) {
Toshihiro Shimizu 890ddd
		double lx = boundary.m_bbox.x1 - boundary.m_bbox.x0;
Toshihiro Shimizu 890ddd
		//double ly=boundary.m_bbox.y1-boundary.m_bbox.y0;
Toshihiro Shimizu 890ddd
		double beg = boundary.m_bbox.y0;
Toshihiro Shimizu 890ddd
		double end = boundary.m_bbox.y1;
Toshihiro Shimizu 890ddd
		beg = m_Angle <= 0 ? beg : beg - lx * tan(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		end = m_Angle >= 0 ? end : end - lx * tan(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		double dist = m_Dist / cos(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double y;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TStencilControl *stenc2 = TStencilControl::instance();
Toshihiro Shimizu 890ddd
		stenc2->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
		for (y = beg; y <= end; y += dist) {
Toshihiro Shimizu 890ddd
			TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
			getThickline(TPointD(boundary.m_bbox.x0, y), lx, p0, p1, p2, p3);
Toshihiro Shimizu 890ddd
			tglVertex(p0);
Toshihiro Shimizu 890ddd
			tglVertex(p1);
Toshihiro Shimizu 890ddd
			tglVertex(p2);
Toshihiro Shimizu 890ddd
			tglVertex(p3);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
		stenc2->endMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		stenc2->enableMask(TStencilControl::SHOW_OUTSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_Angle != 0) //ANTIALIASING
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
Toshihiro Shimizu 890ddd
			//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
			//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
			//glEnable(GL_LINE_SMOOTH);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			tglEnableLineSmooth();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			//NOTE: Trimming the fat lines is necessary outside the (-60, 60) angles interval
Toshihiro Shimizu 890ddd
			//seemingly due to a bug in MAC-Leopard's openGL implementation...
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
			for (y = beg; y <= end; y += dist) {
Toshihiro Shimizu 890ddd
				TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
				getThickline(TPointD(boundary.m_bbox.x0, y), lx, p0, p1, p2, p3);
Toshihiro Shimizu 890ddd
				trim(p1, p2, boundary.m_bbox.y0, boundary.m_bbox.y1);
Toshihiro Shimizu 890ddd
				tglVertex(p1);
Toshihiro Shimizu 890ddd
				tglVertex(p2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				trim(p0, p3, boundary.m_bbox.y0, boundary.m_bbox.y1);
Toshihiro Shimizu 890ddd
				tglVertex(p0);
Toshihiro Shimizu 890ddd
				tglVertex(p3);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			glEnd();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		stenc2->disableMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		double beg = boundary.m_bbox.x0;
Toshihiro Shimizu 890ddd
		double end = boundary.m_bbox.x1;
Toshihiro Shimizu 890ddd
		double y0 = boundary.m_bbox.y0;
Toshihiro Shimizu 890ddd
		double y1 = boundary.m_bbox.y1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
		for (double x = beg; x <= end; x += m_Dist) {
Toshihiro Shimizu 890ddd
			TPointD p0(x, y0);
Toshihiro Shimizu 890ddd
			TPointD p1(x + m_Thickness, y0);
Toshihiro Shimizu 890ddd
			TPointD p2(x, y1);
Toshihiro Shimizu 890ddd
			TPointD p3(x + m_Thickness, y1);
Toshihiro Shimizu 890ddd
			tglVertex(p0);
Toshihiro Shimizu 890ddd
			tglVertex(p1);
Toshihiro Shimizu 890ddd
			tglVertex(p3);
Toshihiro Shimizu 890ddd
			tglVertex(p2);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TStripeFillStyle::nbClip(const TRectD &bbox) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int nbClip = 1; // the bbox rectangle
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (fabs(m_Angle) != 90) {
Toshihiro Shimizu 890ddd
		double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
		//double ly=bbox.y1-bbox.y0;
Toshihiro Shimizu 890ddd
		double beg = bbox.y0;
Toshihiro Shimizu 890ddd
		double end = bbox.y1;
Toshihiro Shimizu 890ddd
		beg = m_Angle <= 0 ? beg : beg - lx * tan(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		end = m_Angle >= 0 ? end : end - lx * tan(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		double dist = m_Dist / cos(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		for (double y = beg; y <= end; y += dist)
Toshihiro Shimizu 890ddd
			nbClip++;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		double beg = bbox.x0;
Toshihiro Shimizu 890ddd
		double end = bbox.x1;
Toshihiro Shimizu 890ddd
		//double y0=bbox.y0;
Toshihiro Shimizu 890ddd
		//double y1=bbox.y1;
Toshihiro Shimizu 890ddd
		for (double x = beg; x <= end; x += m_Dist)
Toshihiro Shimizu 890ddd
			nbClip++;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return nbClip;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//	flash.drawRegion(*r,true);
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbClip(bbox)); // -1 i don't know why
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	flash.drawRectangle(bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(m_pointColor);
Toshihiro Shimizu 890ddd
	// Horizontal Lines
Toshihiro Shimizu 890ddd
	if (fabs(m_Angle) != 90) {
Toshihiro Shimizu 890ddd
		double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
		//double ly=bbox.y1-bbox.y0;
Toshihiro Shimizu 890ddd
		double beg = bbox.y0;
Toshihiro Shimizu 890ddd
		double end = bbox.y1;
Toshihiro Shimizu 890ddd
		beg = m_Angle <= 0 ? beg : beg - lx * tan(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		end = m_Angle >= 0 ? end : end - lx * tan(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		double dist = m_Dist / cos(degree2rad(m_Angle));
Toshihiro Shimizu 890ddd
		for (double y = beg; y <= end; y += dist) {
Toshihiro Shimizu 890ddd
			TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
			getThickline(TPointD(bbox.x0, y), lx, p0, p1, p2, p3);
Shinya Kitaoka 3bfa54
			std::vector<tpointd> v;</tpointd>
Toshihiro Shimizu 890ddd
			v.push_back(p0);
Toshihiro Shimizu 890ddd
			v.push_back(p1);
Toshihiro Shimizu 890ddd
			v.push_back(p2);
Toshihiro Shimizu 890ddd
			v.push_back(p3);
Toshihiro Shimizu 890ddd
			flash.drawPolyline(v);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		double beg = bbox.x0;
Toshihiro Shimizu 890ddd
		double end = bbox.x1;
Toshihiro Shimizu 890ddd
		double y0 = bbox.y0;
Toshihiro Shimizu 890ddd
		double y1 = bbox.y1;
Toshihiro Shimizu 890ddd
		for (double x = beg; x <= end; x += m_Dist) {
Toshihiro Shimizu 890ddd
			TPointD p0(x, y0);
Toshihiro Shimizu 890ddd
			TPointD p1(x + m_Thickness, y0);
Toshihiro Shimizu 890ddd
			TPointD p2(x, y1);
Toshihiro Shimizu 890ddd
			TPointD p3(x + m_Thickness, y1);
Shinya Kitaoka 3bfa54
			std::vector<tpointd> v;</tpointd>
Toshihiro Shimizu 890ddd
			v.push_back(p0);
Toshihiro Shimizu 890ddd
			v.push_back(p1);
Toshihiro Shimizu 890ddd
			v.push_back(p3);
Toshihiro Shimizu 890ddd
			v.push_back(p2);
Toshihiro Shimizu 890ddd
			flash.drawPolyline(v);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TStripeFillStyle::makeIcon(const TDimension &d)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// Saves the values of member variables and sets the right icon values
Toshihiro Shimizu 890ddd
	double LDist = m_Dist;
Toshihiro Shimizu 890ddd
	double LAngle = m_Angle;
Toshihiro Shimizu 890ddd
	double LThickness = m_Thickness;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_Dist *= 1.33;
Toshihiro Shimizu 890ddd
	m_Thickness *= 1.66;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TColorStyle::makeIcon(d);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_Dist = LDist;
Toshihiro Shimizu 890ddd
	m_Angle = LAngle;
Toshihiro Shimizu 890ddd
	m_Thickness = LThickness;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TLinGradFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TLinGradFillStyle::TLinGradFillStyle(
Toshihiro Shimizu 890ddd
	const TPixel32 &bgColor, const TPixel32 &pointColor,
Toshihiro Shimizu 890ddd
	const double Angle, const double XPos, const double YPos,
Toshihiro Shimizu 890ddd
	const double Size)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_pointColor(pointColor), m_Angle(Angle), m_XPos(XPos), m_YPos(YPos), m_Size(Size)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TLinGradFillStyle::TLinGradFillStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(TPixel32::White), m_pointColor(color), m_Angle(0.0), m_XPos(0.0), m_YPos(0.0), m_Size(100.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TLinGradFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TLinGradFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TLinGradFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 4;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TLinGradFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TLinGradFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TLinGradFillStyle", "Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TLinGradFillStyle", "X Position");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TLinGradFillStyle", "Y Position");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TLinGradFillStyle", "Smoothness");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = -180.0;
Toshihiro Shimizu 890ddd
		max = 180.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = -100.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = -100.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = 1.0;
Toshihiro Shimizu 890ddd
		max = 500.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TLinGradFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return m_Angle;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_XPos;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_YPos;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		return m_Size;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_Angle = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_XPos = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_YPos = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_Size = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_Angle;
Toshihiro Shimizu 890ddd
	is >> m_XPos;
Toshihiro Shimizu 890ddd
	is >> m_YPos;
Toshihiro Shimizu 890ddd
	is >> m_Size;
Toshihiro Shimizu 890ddd
	is >> m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_Angle;
Toshihiro Shimizu 890ddd
	os << m_XPos;
Toshihiro Shimizu 890ddd
	os << m_YPos;
Toshihiro Shimizu 890ddd
	os << m_Size;
Toshihiro Shimizu 890ddd
	os << m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TLinGradFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_pointColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_pointColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::getRects(const TRectD &bbox,
Shinya Kitaoka 3bfa54
								 std::vector<tpointd> &r0,</tpointd>
Shinya Kitaoka 3bfa54
								 std::vector<tpointd> &r1,</tpointd>
Shinya Kitaoka 3bfa54
								 std::vector<tpointd> &r2) const</tpointd>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	r0.clear();
Toshihiro Shimizu 890ddd
	r1.clear();
Toshihiro Shimizu 890ddd
	r2.clear();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD p0, p1, p2, p3;
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Toshihiro Shimizu 890ddd
	TPointD center((bbox.x1 + bbox.x0) / 2.0, (bbox.y1 + bbox.y0) / 2.0);
Toshihiro Shimizu 890ddd
	center = center + TPointD(m_XPos * 0.01 * lx * 0.5, m_YPos * 0.01 * ly * 0.5);
Toshihiro Shimizu 890ddd
	double l = tdistance(TPointD(bbox.x0, bbox.y0), TPointD(bbox.x1, bbox.y1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	r0.push_back(TPointD(-m_Size - l, l));
Toshihiro Shimizu 890ddd
	r0.push_back(TPointD(-m_Size - l, -l));
Toshihiro Shimizu 890ddd
	r0.push_back(TPointD(-m_Size, -l));
Toshihiro Shimizu 890ddd
	r0.push_back(TPointD(-m_Size, l));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	r1.push_back(TPointD(-m_Size, l));
Toshihiro Shimizu 890ddd
	r1.push_back(TPointD(-m_Size, -l));
Toshihiro Shimizu 890ddd
	r1.push_back(TPointD(m_Size, -l));
Toshihiro Shimizu 890ddd
	r1.push_back(TPointD(m_Size, l));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	r2.push_back(TPointD(m_Size, l));
Toshihiro Shimizu 890ddd
	r2.push_back(TPointD(m_Size, -l));
Toshihiro Shimizu 890ddd
	r2.push_back(TPointD(m_Size + l, -l));
Toshihiro Shimizu 890ddd
	r2.push_back(TPointD(m_Size + l, l));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRotation rotM(m_Angle);
Toshihiro Shimizu 890ddd
	TTranslation traM(center);
Toshihiro Shimizu 890ddd
	TAffine M(traM * rotM);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 4; i++) {
Toshihiro Shimizu 890ddd
		r0[i] = M * r0[i];
Toshihiro Shimizu 890ddd
		r1[i] = M * r1[i];
Toshihiro Shimizu 890ddd
		r2[i] = M * r2[i];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//only to create stencil mask
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
	stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
	appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//compute colors
Toshihiro Shimizu 890ddd
	TPixel32 color1, color2;
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		color1 = (*(cf))(TSolidColorStyle::getMainColor());
Toshihiro Shimizu 890ddd
		color2 = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		color1 = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
		color2 = m_pointColor;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//compute points
Toshihiro Shimizu 890ddd
	TRectD bbox(boundary.m_bbox);
Shinya Kitaoka 3bfa54
	std::vector<tpointd> r0, r1, r2;</tpointd>
Toshihiro Shimizu 890ddd
	getRects(bbox, r0, r1, r2);
Toshihiro Shimizu 890ddd
	assert(r0.size() == 4);
Toshihiro Shimizu 890ddd
	assert(r1.size() == 4);
Toshihiro Shimizu 890ddd
	assert(r2.size() == 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//draw
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color2);
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (; i < 4; tglVertex(r0[i++]))
Toshihiro Shimizu 890ddd
		;
Toshihiro Shimizu 890ddd
	tglVertex(r1[0]);
Toshihiro Shimizu 890ddd
	tglVertex(r1[1]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color1);
Toshihiro Shimizu 890ddd
	tglVertex(r1[2]);
Toshihiro Shimizu 890ddd
	tglVertex(r1[3]);
Toshihiro Shimizu 890ddd
	for (i = 0; i < 4; tglVertex(r2[i++]))
Toshihiro Shimizu 890ddd
		;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// It is the new version, which uses XPos, YPos, Smooth parameters.
Toshihiro Shimizu 890ddd
// There is a gap between the flat and graded regions. This is the reason,
Toshihiro Shimizu 890ddd
// why the old version (without XPos, YPos, Smooth parameters) is used.
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Shinya Kitaoka 3bfa54
	std::vector<tpointd> rect;</tpointd>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD center((bbox.x1 + bbox.x0) / 2.0, (bbox.y1 + bbox.y0) / 2.0);
Toshihiro Shimizu 890ddd
	center = center + TPointD(m_XPos * 0.01 * (bbox.x1 - bbox.x0) * 0.5, m_YPos * 0.01 * (bbox.y1 - bbox.y0) * 0.5);
Toshihiro Shimizu 890ddd
	double l = tdistance(TPointD(bbox.x0, bbox.y0), TPointD(bbox.x1, bbox.y1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TAffine M(TTranslation(center) * TRotation(m_Angle));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	rect.push_back(M * TPointD(-m_Size, l));
Toshihiro Shimizu 890ddd
	rect.push_back(M * TPointD(-m_Size, -l));
Toshihiro Shimizu 890ddd
	rect.push_back(M * TPointD(m_Size, -l));
Toshihiro Shimizu 890ddd
	rect.push_back(M * TPointD(m_Size, l));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	sfu.drawGradedRegion(flash, rect, m_pointColor, getMainColor(), *r);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
// --- Old version ---
Toshihiro Shimizu 890ddd
void TLinGradFillStyle::drawRegion(TFlash& flash, const TRegion* r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  flash.drawRegion(*r,1); 
Toshihiro Shimizu 890ddd
  TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
  TPointD p0,p1,p2,p3;
Toshihiro Shimizu 890ddd
  p0=TPointD(bbox.x0,bbox.y0);
Toshihiro Shimizu 890ddd
  p1=TPointD(bbox.x0,bbox.y1);
Toshihiro Shimizu 890ddd
  p2=TPointD(bbox.x1,bbox.y0);
Toshihiro Shimizu 890ddd
  p3=TPointD(bbox.x1,bbox.y1);
Shinya Kitaoka 3bfa54
  std::vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
  if ( fabs(m_Angle)!=90 ) {
Toshihiro Shimizu 890ddd
		double tga=tan(degree2rad(fabs(m_Angle)));
Toshihiro Shimizu 890ddd
		double lx=bbox.x1-bbox.x0;
Toshihiro Shimizu 890ddd
		double ly=bbox.y1-bbox.y0;
Toshihiro Shimizu 890ddd
		double ax=lx/(tga*tga+1);
Toshihiro Shimizu 890ddd
		double bx=lx-ax;
Toshihiro Shimizu 890ddd
		double mx=ax*tga;
Toshihiro Shimizu 890ddd
		double rlylx=ly/lx;
Toshihiro Shimizu 890ddd
		double ay=ax*rlylx;
Toshihiro Shimizu 890ddd
		double by=bx*rlylx;
Toshihiro Shimizu 890ddd
		double my=mx*rlylx;
Toshihiro Shimizu 890ddd
		if ( m_Angle<=0.0) {
Toshihiro Shimizu 890ddd
			p0=p0+TPointD(-my,by);
Toshihiro Shimizu 890ddd
			p1=p1+TPointD(bx,mx);
Toshihiro Shimizu 890ddd
			p2=p2+TPointD(-bx,-mx);
Toshihiro Shimizu 890ddd
			p3=p3+TPointD(my,-by);
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			p0=p0+TPointD(bx,-mx);
Toshihiro Shimizu 890ddd
			p1=p1+TPointD(-my,-by);
Toshihiro Shimizu 890ddd
			p2=p2+TPointD(my,by);
Toshihiro Shimizu 890ddd
			p3=p3+TPointD(-bx,mx);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		pv.push_back(p0);
Toshihiro Shimizu 890ddd
		pv.push_back(p1);
Toshihiro Shimizu 890ddd
		pv.push_back(p3);
Toshihiro Shimizu 890ddd
		pv.push_back(p2);
Toshihiro Shimizu 890ddd
  } else {
Toshihiro Shimizu 890ddd
		if ( m_Angle==-90 ) {
Toshihiro Shimizu 890ddd
			pv.push_back(p1);
Toshihiro Shimizu 890ddd
			pv.push_back(p3);
Toshihiro Shimizu 890ddd
			pv.push_back(p2);
Toshihiro Shimizu 890ddd
			pv.push_back(p0);
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			pv.push_back(p0);
Toshihiro Shimizu 890ddd
			pv.push_back(p2);
Toshihiro Shimizu 890ddd
			pv.push_back(p3);
Toshihiro Shimizu 890ddd
			pv.push_back(p1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  SFlashUtils sfu;
Toshihiro Shimizu 890ddd
  sfu.drawGradedPolyline(flash,pv,m_pointColor,getMainColor());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TRadGradFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TRadGradFillStyle::TRadGradFillStyle(
Toshihiro Shimizu 890ddd
	const TPixel32 &bgColor, const TPixel32 &pointColor,
Toshihiro Shimizu 890ddd
	const double XPos, const double YPos,
Toshihiro Shimizu 890ddd
	const double Radius, const double Smooth)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_pointColor(pointColor), m_XPos(XPos), m_YPos(YPos), m_Radius(Radius), m_Smooth(Smooth)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TRadGradFillStyle::TRadGradFillStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(TPixel32::White), m_pointColor(color), m_XPos(0.0), m_YPos(0.0), m_Radius(50.0), m_Smooth(50)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TRadGradFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TRadGradFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TRadGradFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 4;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TRadGradFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TRadGradFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TRadGradFillStyle", "X Position");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TRadGradFillStyle", "Y Position");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TRadGradFillStyle", "Radius");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TRadGradFillStyle", "Smoothness");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRadGradFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = -100.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = -100.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.01;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = 0.01;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TRadGradFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return m_XPos;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_YPos;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_Radius;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		return m_Smooth;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRadGradFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_XPos = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_YPos = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_Radius = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_Smooth = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRadGradFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_XPos;
Toshihiro Shimizu 890ddd
	is >> m_YPos;
Toshihiro Shimizu 890ddd
	is >> m_Radius;
Toshihiro Shimizu 890ddd
	is >> m_Smooth;
Toshihiro Shimizu 890ddd
	is >> m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRadGradFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_XPos;
Toshihiro Shimizu 890ddd
	os << m_YPos;
Toshihiro Shimizu 890ddd
	os << m_Radius;
Toshihiro Shimizu 890ddd
	os << m_Smooth;
Toshihiro Shimizu 890ddd
	os << m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TRadGradFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_pointColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRadGradFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_pointColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRadGradFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	//only to create stencil mask
Toshihiro Shimizu 890ddd
	TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
	stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
	appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor, color;
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(TSolidColorStyle::getMainColor());
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
		color = m_pointColor;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectD bbox(boundary.m_bbox);
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Shinya Kitaoka 12c444
	double r2 = std::max(lx, ly) * 5.0;
Shinya Kitaoka 12c444
	double r1 = 0.5 * std::max(lx, ly) * m_Radius * 0.01;
Toshihiro Shimizu 890ddd
	double r0 = r1 * (100.0 - m_Smooth) * 0.01;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD center((bbox.x1 + bbox.x0) / 2.0, (bbox.y1 + bbox.y0) / 2.0);
Toshihiro Shimizu 890ddd
	center = center + TPointD(m_XPos * 0.01 * lx * 0.5, m_YPos * 0.01 * ly * 0.5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const double dAngle = 5.0;
Shinya Kitaoka 3bfa54
	std::vector<tpointd> sincos;</tpointd>
Toshihiro Shimizu 890ddd
	for (double angle = 0.0; angle <= 360.0; angle += dAngle)
Toshihiro Shimizu 890ddd
		sincos.push_back(TPointD(sin(degree2rad(angle)), cos(degree2rad(angle))));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_TRIANGLE_FAN);
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
	tglVertex(center);
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (; i < (int)sincos.size(); i++)
Toshihiro Shimizu 890ddd
		tglVertex(center + TPointD(r0 * sincos[i].x, r0 * sincos[i].y));
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (fabs(r0 - r1) > TConsts::epsilon) {
Toshihiro Shimizu 890ddd
		glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
		for (i = 0; i < (int)sincos.size(); i++) {
Toshihiro Shimizu 890ddd
			tglColor(color);
Toshihiro Shimizu 890ddd
			tglVertex(center + TPointD(r0 * sincos[i].x, r0 * sincos[i].y));
Toshihiro Shimizu 890ddd
			tglColor(backgroundColor);
Toshihiro Shimizu 890ddd
			tglVertex(center + TPointD(r1 * sincos[i].x, r1 * sincos[i].y));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(backgroundColor);
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)sincos.size(); i++) {
Toshihiro Shimizu 890ddd
		tglVertex(center + TPointD(r1 * sincos[i].x, r1 * sincos[i].y));
Toshihiro Shimizu 890ddd
		tglVertex(center + TPointD(r2 * sincos[i].x, r2 * sincos[i].y));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRadGradFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Shinya Kitaoka 12c444
	double r1 = 0.5 * std::max(lx, ly) * m_Radius * 0.01;
Toshihiro Shimizu 890ddd
	if (m_Smooth < 50)
Toshihiro Shimizu 890ddd
		r1 *= (0.3 * ((100 - m_Smooth) / 50.0) + 0.7);
Toshihiro Shimizu 890ddd
	TPointD center((bbox.x1 + bbox.x0) / 2.0, (bbox.y1 + bbox.y0) / 2.0);
Toshihiro Shimizu 890ddd
	center = center + TPointD(m_XPos * 0.01 * lx * 0.5, m_YPos * 0.01 * ly * 0.5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	TPixel32 mc(getMainColor());
Toshihiro Shimizu 890ddd
	flash.setGradientFill(false, m_pointColor, mc, m_Smooth);
Toshihiro Shimizu 890ddd
	const double flashGrad = 16384.0; // size of gradient square
Toshihiro Shimizu 890ddd
	TTranslation tM(center.x, center.y);
Toshihiro Shimizu 890ddd
	TScale sM(2.0 * r1 / (flashGrad), 2.0 * r1 / (flashGrad));
Toshihiro Shimizu 890ddd
	flash.setFillStyleMatrix(tM * sM);
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TCircleStripeFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TCircleStripeFillStyle::TCircleStripeFillStyle(
Toshihiro Shimizu 890ddd
	const TPixel32 &bgColor, const TPixel32 &pointColor,
Toshihiro Shimizu 890ddd
	const double XPos, const double YPos,
Toshihiro Shimizu 890ddd
	const double Dist, const double Thickness)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_pointColor(pointColor), m_XPos(XPos), m_YPos(YPos), m_Dist(Dist), m_Thickness(Thickness)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TCircleStripeFillStyle::TCircleStripeFillStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(TPixel32::Transparent), m_pointColor(color), m_XPos(0.0), m_YPos(0.0), m_Dist(15.0), m_Thickness(3.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TCircleStripeFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TCircleStripeFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TCircleStripeFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 4;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TCircleStripeFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TCircleStripeFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCircleStripeFillStyle", "X Position");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCircleStripeFillStyle", "Y Position");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCircleStripeFillStyle", "Distance");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TCircleStripeFillStyle", "Thickness");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		min = -200.0;
Toshihiro Shimizu 890ddd
		max = 200.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = -200.0;
Toshihiro Shimizu 890ddd
		max = 200.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.5;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = 0.5;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TCircleStripeFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return m_XPos;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return m_YPos;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return m_Dist;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		return m_Thickness;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return 0.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_XPos = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_YPos = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_Dist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_Thickness = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_XPos;
Toshihiro Shimizu 890ddd
	is >> m_YPos;
Toshihiro Shimizu 890ddd
	is >> m_Dist;
Toshihiro Shimizu 890ddd
	is >> m_Thickness;
Toshihiro Shimizu 890ddd
	is >> m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_XPos;
Toshihiro Shimizu 890ddd
	os << m_YPos;
Toshihiro Shimizu 890ddd
	os << m_Dist;
Toshihiro Shimizu 890ddd
	os << m_Thickness;
Toshihiro Shimizu 890ddd
	os << m_pointColor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TCircleStripeFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return index == 0 ? m_pointColor : TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_pointColor = color;
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::getCircleStripeQuads(const TPointD ¢er,
Toshihiro Shimizu 890ddd
												  const double r1, const double r2,
Shinya Kitaoka 3bfa54
												  std::vector<tpointd> &pv) const</tpointd>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	pv.clear();
Toshihiro Shimizu 890ddd
	const double dAng = 10.0;
Toshihiro Shimizu 890ddd
	for (double ang = 0.0; ang <= 360; ang += dAng) {
Toshihiro Shimizu 890ddd
		pv.push_back(center + TPointD(r1 * cos(degree2rad(ang)), r1 * sin(degree2rad(ang))));
Toshihiro Shimizu 890ddd
		pv.push_back(center + TPointD(r2 * cos(degree2rad(ang)), r2 * sin(degree2rad(ang))));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::drawCircleStripe(const TPointD ¢er,
Toshihiro Shimizu 890ddd
											  const double r1, const double r2,
Toshihiro Shimizu 890ddd
											  const TPixel32 &col) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
	getCircleStripeQuads(center, r1, r2, pv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stencil = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	stencil->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(col);
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (; i < (int)pv.size(); i++)
Toshihiro Shimizu 890ddd
		tglVertex(pv[i]);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stencil->endMask();
Toshihiro Shimizu 890ddd
	stencil->enableMask(TStencilControl::SHOW_OUTSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
Toshihiro Shimizu 890ddd
	//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
	//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	//glEnable(GL_LINE_SMOOTH);
Toshihiro Shimizu 890ddd
	tglEnableLineSmooth();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Just for the antialiasing
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(col);
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)pv.size(); i += 2)
Toshihiro Shimizu 890ddd
		tglVertex(pv[i]);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(col);
Toshihiro Shimizu 890ddd
	for (i = 1; i < (int)pv.size(); i += 2)
Toshihiro Shimizu 890ddd
		tglVertex(pv[i]);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stencil->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const bool isTransparent = m_pointColor.m < 255;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 foregroundColor;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		foregroundColor = (*(cf))(m_pointColor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		foregroundColor = m_pointColor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isTransparent) {
Toshihiro Shimizu 890ddd
		//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
		//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
		//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectD bbox = boundary.m_bbox;
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Toshihiro Shimizu 890ddd
	TPointD center((bbox.x1 + bbox.x0) * 0.5, (bbox.y1 + bbox.y0) * 0.5);
Toshihiro Shimizu 890ddd
	center.x = center.x + m_XPos * 0.01 * 0.5 * lx;
Toshihiro Shimizu 890ddd
	center.y = center.y + m_YPos * 0.01 * 0.5 * ly;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double maxDist = 0.0;
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x0, bbox.y0)), maxDist);
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x0, bbox.y1)), maxDist);
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x1, bbox.y0)), maxDist);
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x1, bbox.y1)), maxDist);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double halfThick = m_Thickness * 0.5;
Toshihiro Shimizu 890ddd
	for (double d = 0; d <= maxDist; d += m_Dist)
Toshihiro Shimizu 890ddd
		drawCircleStripe(center, d - halfThick, d + halfThick, foregroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (isTransparent) {
Toshihiro Shimizu 890ddd
		//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
		//glDisable(GL_BLEND);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCircleStripeFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double lx = bbox.x1 - bbox.x0;
Toshihiro Shimizu 890ddd
	double ly = bbox.y1 - bbox.y0;
Toshihiro Shimizu 890ddd
	TPointD center((bbox.x1 + bbox.x0) * 0.5, (bbox.y1 + bbox.y0) * 0.5);
Toshihiro Shimizu 890ddd
	center.x = center.x + m_XPos * 0.01 * 0.5 * lx;
Toshihiro Shimizu 890ddd
	center.y = center.y + m_YPos * 0.01 * 0.5 * ly;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double maxDist = 0.0;
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x0, bbox.y0)), maxDist);
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x0, bbox.y1)), maxDist);
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x1, bbox.y0)), maxDist);
Shinya Kitaoka 12c444
	maxDist = std::max(tdistance(center, TPointD(bbox.x1, bbox.y1)), maxDist);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nbClip = 2;
Toshihiro Shimizu 890ddd
	double d = m_Dist;
Toshihiro Shimizu 890ddd
	for (; d <= maxDist; d += m_Dist)
Toshihiro Shimizu 890ddd
		nbClip++;
Toshihiro Shimizu 890ddd
	flash.setFillColor(TPixel::Black);
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbClip);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(getMainColor());
Toshihiro Shimizu 890ddd
	flash.drawRectangle(bbox);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(m_pointColor);
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_pointColor);
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	d = m_Thickness / 2.0;
Toshihiro Shimizu 890ddd
	flash.drawEllipse(center, d, d);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(TPixel32(0, 0, 0, 0));
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_pointColor);
Toshihiro Shimizu 890ddd
	flash.setThickness(m_Thickness / 2.0);
Toshihiro Shimizu 890ddd
	for (d = m_Dist; d <= maxDist; d += m_Dist)
Toshihiro Shimizu 890ddd
		flash.drawEllipse(center, d, d);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TMosaicFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMosaicFillStyle::TMosaicFillStyle(const TPixel32 &bgColor,
Toshihiro Shimizu 890ddd
								   const TPixel32 pointColor[4],
Toshihiro Shimizu 890ddd
								   const double size,
Toshihiro Shimizu 890ddd
								   const double deform,
Toshihiro Shimizu 890ddd
								   const double minThickness,
Toshihiro Shimizu 890ddd
								   const double maxThickness)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_size(size), m_deform(deform), m_minThickness(minThickness), m_maxThickness(maxThickness)
Toshihiro Shimizu 890ddd
{
Michał Janiszewski bb8dc0
	for (int i = 0; i < 4; i++)
Toshihiro Shimizu 890ddd
		m_pointColor[i] = pointColor[i];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMosaicFillStyle::TMosaicFillStyle(const TPixel32 bgColor)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_size(25.0), m_deform(70.0), m_minThickness(20), m_maxThickness(40)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_pointColor[0] = TPixel32::Blue;
Toshihiro Shimizu 890ddd
	m_pointColor[1] = TPixel32::Green;
Toshihiro Shimizu 890ddd
	m_pointColor[2] = TPixel32::Yellow;
Toshihiro Shimizu 890ddd
	m_pointColor[3] = TPixel32::Cyan;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TMosaicFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TMosaicFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TMosaicFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 4;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TMosaicFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TMosaicFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TMosaicFillStyle", "Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TMosaicFillStyle", "Distortion");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TMosaicFillStyle", "Min Thick");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TMosaicFillStyle", "Max Thick");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMosaicFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	min = (index == 0) ? 2 : 0.001;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TMosaicFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_size;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_deform;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_minThickness;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = m_maxThickness;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMosaicFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_size = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_deform = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_minThickness = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_maxThickness = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMosaicFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_size;
Toshihiro Shimizu 890ddd
	is >> m_deform;
Toshihiro Shimizu 890ddd
	is >> m_minThickness;
Toshihiro Shimizu 890ddd
	is >> m_maxThickness;
Toshihiro Shimizu 890ddd
	is >> m_pointColor[0];
Toshihiro Shimizu 890ddd
	is >> m_pointColor[1];
Toshihiro Shimizu 890ddd
	is >> m_pointColor[2];
Toshihiro Shimizu 890ddd
	is >> m_pointColor[3];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMosaicFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_size;
Toshihiro Shimizu 890ddd
	os << m_deform;
Toshihiro Shimizu 890ddd
	os << m_minThickness;
Toshihiro Shimizu 890ddd
	os << m_maxThickness;
Toshihiro Shimizu 890ddd
	os << m_pointColor[0];
Toshihiro Shimizu 890ddd
	os << m_pointColor[1];
Toshihiro Shimizu 890ddd
	os << m_pointColor[2];
Toshihiro Shimizu 890ddd
	os << m_pointColor[3];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TMosaicFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 tmp;
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		tmp = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	else if (index >= 1 && index <= 4)
Toshihiro Shimizu 890ddd
		tmp = m_pointColor[index - 1];
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		assert(!"bad color index");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tmp;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TMosaicFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	else if (index >= 1 && index <= 4)
Toshihiro Shimizu 890ddd
		m_pointColor[index - 1] = color;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		assert(!"bad color index");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
void TMosaicFillStyle::preaprePos(const TRectD &box, std::vector<tpointd> &v,</tpointd>
Toshihiro Shimizu 890ddd
								  int &lX, int &lY, TRandom &rand) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double dist = 5.0 + (60.0 - 5.0) * tcrop(m_size, 0.0, 100.0) * 0.01;
Toshihiro Shimizu 890ddd
	lY = lX = 0;
Toshihiro Shimizu 890ddd
	double ld = 0.4 * tcrop(m_deform, 0.0, 100.0) * 0.01;
Toshihiro Shimizu 890ddd
	for (double y = box.y0 - dist; y <= (box.y1 + dist); y += dist, lY++) {
Toshihiro Shimizu 890ddd
		lX = 0;
Toshihiro Shimizu 890ddd
		for (double x = box.x0 - dist; x <= (box.x1 + dist); x += dist, lX++) {
Toshihiro Shimizu 890ddd
			double dx = (rand.getInt(0, 2001) * 0.001 - 1.0) * ld * dist;
Toshihiro Shimizu 890ddd
			double dy = (rand.getInt(0, 2001) * 0.001 - 1.0) * ld * dist;
Toshihiro Shimizu 890ddd
			TPointD pos(x + dx, y + dy);
Toshihiro Shimizu 890ddd
			v.push_back(pos);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TMosaicFillStyle::getQuad(const int ix, const int iy,
Toshihiro Shimizu 890ddd
							   const int lX, const int lY,
Shinya Kitaoka 3bfa54
							   std::vector<tpointd> &v,</tpointd>
Toshihiro Shimizu 890ddd
							   TPointD *pquad, TRandom &rand) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ix < 0 || iy < 0 || ix >= (lX - 1) || iy >= (lY - 1))
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double dmin = tcrop(m_minThickness, 0.0, 100.0) * 0.01;
Toshihiro Shimizu 890ddd
	double dmax = tcrop(m_maxThickness, 0.0, 100.0) * 0.01;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD &p1 = v[iy * lX + ix];
Toshihiro Shimizu 890ddd
	TPointD &p2 = v[iy * lX + ix + 1];
Toshihiro Shimizu 890ddd
	TPointD &p3 = v[(iy + 1) * lX + ix + 1];
Toshihiro Shimizu 890ddd
	TPointD &p4 = v[(iy + 1) * lX + ix];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double q1 = 0.5 * (dmin + (dmax - dmin) * rand.getInt(0, 101) * 0.01);
Toshihiro Shimizu 890ddd
	double q2 = 0.5 * (dmin + (dmax - dmin) * rand.getInt(0, 101) * 0.01);
Toshihiro Shimizu 890ddd
	double q3 = 0.5 * (dmin + (dmax - dmin) * rand.getInt(0, 101) * 0.01);
Toshihiro Shimizu 890ddd
	double q4 = 0.5 * (dmin + (dmax - dmin) * rand.getInt(0, 101) * 0.01);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	pquad[0] = (1.0 - q1) * p1 + q1 * p3;
Toshihiro Shimizu 890ddd
	pquad[1] = (1.0 - q2) * p2 + q2 * p4;
Toshihiro Shimizu 890ddd
	pquad[2] = (1.0 - q3) * p3 + q3 * p1;
Toshihiro Shimizu 890ddd
	pquad[3] = (1.0 - q4) * p4 + q4 * p2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMosaicFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
	//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color[4];
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 4; i++) {
Toshihiro Shimizu 890ddd
		if (cf)
Toshihiro Shimizu 890ddd
			color[i] = (*(cf))(m_pointColor[i]);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			color[i] = m_pointColor[i];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TPixel32 currentColor;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pos;</tpointd>
Toshihiro Shimizu 890ddd
	int posLX, posLY;
Toshihiro Shimizu 890ddd
	TRandom rand;
Toshihiro Shimizu 890ddd
	TPointD quad[4];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	preaprePos(boundary.m_bbox, pos, posLX, posLY, rand);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* ma serve ?
Toshihiro Shimizu 890ddd
	tglColor(getMainColor());	
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(boundary.m_bbox.x0,boundary.m_bbox.y0));
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(boundary.m_bbox.x0,boundary.m_bbox.y1));
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(boundary.m_bbox.x1,boundary.m_bbox.y1));
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(boundary.m_bbox.x1,boundary.m_bbox.y0));
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int y = 0; y < (posLY - 1); y++)
Toshihiro Shimizu 890ddd
		for (int x = 0; x < (posLX - 1); x++)
Toshihiro Shimizu 890ddd
			if (getQuad(x, y, posLX, posLY, pos, quad, rand)) {
Toshihiro Shimizu 890ddd
				currentColor = color[rand.getInt(0, 4)];
Toshihiro Shimizu 890ddd
				if (currentColor.m != 0) {
Toshihiro Shimizu 890ddd
					tglColor(currentColor);
Toshihiro Shimizu 890ddd
					tglVertex(quad[0]);
Toshihiro Shimizu 890ddd
					tglVertex(quad[1]);
Toshihiro Shimizu 890ddd
					tglVertex(quad[2]);
Toshihiro Shimizu 890ddd
					tglVertex(quad[3]);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMosaicFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pos;</tpointd>
Toshihiro Shimizu 890ddd
	int posLX, posLY;
Toshihiro Shimizu 890ddd
	TRandom rand;
Toshihiro Shimizu 890ddd
	TPointD quad[4];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	preaprePos(bbox, pos, posLX, posLY, rand);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (pos.size() <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nbClip = (posLX - 1) * (posLY - 1) + 1;
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbClip);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(TSolidColorStyle::getMainColor());
Toshihiro Shimizu 890ddd
	flash.setThickness(0);
Toshihiro Shimizu 890ddd
	flash.drawRectangle(bbox);
Toshihiro Shimizu 890ddd
	for (int y = 0; y < (posLY - 1); y++)
Toshihiro Shimizu 890ddd
		for (int x = 0; x < (posLX - 1); x++)
Toshihiro Shimizu 890ddd
			if (getQuad(x, y, posLX, posLY, pos, quad, rand)) {
Shinya Kitaoka 3bfa54
				std::vector<tpointd> lvert;</tpointd>
Toshihiro Shimizu 890ddd
				lvert.push_back(quad[0]);
Toshihiro Shimizu 890ddd
				lvert.push_back(quad[1]);
Toshihiro Shimizu 890ddd
				lvert.push_back(quad[2]);
Toshihiro Shimizu 890ddd
				lvert.push_back(quad[3]);
Toshihiro Shimizu 890ddd
				flash.setFillColor(m_pointColor[rand.getInt(0, 4)]);
Toshihiro Shimizu 890ddd
				flash.drawPolyline(lvert);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TPatchFillStyle  implementation
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPatchFillStyle::TPatchFillStyle(const TPixel32 &bgColor,
Toshihiro Shimizu 890ddd
								 const TPixel32 pointColor[6],
Toshihiro Shimizu 890ddd
								 const double size,
Toshihiro Shimizu 890ddd
								 const double deform,
Toshihiro Shimizu 890ddd
								 const double thickness)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_size(size), m_deform(deform), m_thickness(thickness)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 6; i++)
Toshihiro Shimizu 890ddd
		m_pointColor[i] = pointColor[i];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPatchFillStyle::TPatchFillStyle(const TPixel32 &bgColor)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(bgColor), m_size(25.0), m_deform(50.0), m_thickness(30)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_pointColor[0] = TPixel32::Red;
Toshihiro Shimizu 890ddd
	m_pointColor[1] = TPixel32::Green;
Toshihiro Shimizu 890ddd
	m_pointColor[2] = TPixel32::Yellow;
Toshihiro Shimizu 890ddd
	m_pointColor[3] = TPixel32::Cyan;
Toshihiro Shimizu 890ddd
	m_pointColor[4] = TPixel32::Magenta;
Toshihiro Shimizu 890ddd
	m_pointColor[5] = TPixel32::White;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TPatchFillStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TPatchFillStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TPatchFillStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 3;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType TPatchFillStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return TColorStyle::DOUBLE;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString TPatchFillStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TPatchFillStyle", "Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TPatchFillStyle", "Distortion");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TPatchFillStyle", "Thickness");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	min = (index == 0) ? 2 : 0.001;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TPatchFillStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_size;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_deform;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_thickness;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_size = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_deform = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_thickness = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_size;
Toshihiro Shimizu 890ddd
	is >> m_deform;
Toshihiro Shimizu 890ddd
	is >> m_thickness;
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 6; i++)
Toshihiro Shimizu 890ddd
		is >> m_pointColor[i];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_size;
Toshihiro Shimizu 890ddd
	os << m_deform;
Toshihiro Shimizu 890ddd
	os << m_thickness;
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 6; i++)
Toshihiro Shimizu 890ddd
		os << m_pointColor[i];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
TPixel32 TPatchFillStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 tmp;
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		tmp = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	else if (index >= 1 && index <= 6)
Toshihiro Shimizu 890ddd
		tmp = m_pointColor[index - 1];
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		assert(!"bad color index");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tmp;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TPatchFillStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	else if (index >= 1 && index <= 6)
Toshihiro Shimizu 890ddd
		m_pointColor[index - 1] = color;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		assert(!"bad color index");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
void TPatchFillStyle::preaprePos(const TRectD &box, std::vector<tpointd> &v,</tpointd>
Toshihiro Shimizu 890ddd
								 int &lX, int &lY, TRandom &rand) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double q = tcrop(m_size, 0.0, 100.0) * 0.01;
Toshihiro Shimizu 890ddd
	double r = 5.0 + (60.0 - 5.0) * q;
Toshihiro Shimizu 890ddd
	double m = r * sqrt(3.0) / 2.0;
Toshihiro Shimizu 890ddd
	lY = 5 + (int)((box.y1 - box.y0) / (2 * m));
Toshihiro Shimizu 890ddd
	int ix = 0;
Toshihiro Shimizu 890ddd
	for (double x = box.x0 - r; x <= (box.x1 + r); ix++) {
Toshihiro Shimizu 890ddd
		int nb = ix % 4;
Toshihiro Shimizu 890ddd
		double y = (nb == 0 || nb == 1) ? box.y0 - 2 * m : box.y0 - m;
Toshihiro Shimizu 890ddd
		for (int iy = 0; iy < lY; iy++, y += (2 * m))
Toshihiro Shimizu 890ddd
			v.push_back(TPointD(x, y));
Toshihiro Shimizu 890ddd
		x = (nb == 0 || nb == 2) ? x + r : x + r / 2.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	lX = ix;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double maxDeform = r * 0.6 * tcrop(m_deform, 0.0, 100.0) * 0.01;
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < v.size(); i++) {
Toshihiro Shimizu 890ddd
		v[i].x += (rand.getInt(0, 200) - 100) * 0.01 * maxDeform;
Toshihiro Shimizu 890ddd
		v[i].y += (rand.getInt(0, 200) - 100) * 0.01 * maxDeform;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TPatchFillStyle::getQuadLine(const TPointD &a, const TPointD &b,
Toshihiro Shimizu 890ddd
								  const double thickn, TPointD *quad) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (tdistance(a, b) < TConsts::epsilon)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD ab(b - a);
Toshihiro Shimizu 890ddd
	ab = normalize(ab);
Toshihiro Shimizu 890ddd
	ab = rotate90(ab);
Toshihiro Shimizu 890ddd
	ab = ab * thickn;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	quad[0] = a + ab;
Toshihiro Shimizu 890ddd
	quad[1] = a - ab;
Toshihiro Shimizu 890ddd
	quad[2] = b - ab;
Toshihiro Shimizu 890ddd
	quad[3] = b + ab;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::drawGLQuad(const TPointD *quad) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
	tglVertex(quad[0]);
Toshihiro Shimizu 890ddd
	tglVertex(quad[1]);
Toshihiro Shimizu 890ddd
	tglVertex(quad[2]);
Toshihiro Shimizu 890ddd
	tglVertex(quad[3]);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	double r = tdistance(quad[0], quad[1]) / 2.0;
Toshihiro Shimizu 890ddd
	tglDrawDisk(quad[0] * 0.5 + quad[1] * 0.5, r);
Toshihiro Shimizu 890ddd
	tglDrawDisk(quad[2] * 0.5 + quad[3] * 0.5, r);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStencilControl *stenc = TStencilControl::instance();
Toshihiro Shimizu 890ddd
	TPixel32 backgroundColor = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		backgroundColor = (*(cf))(backgroundColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (backgroundColor.m == 0) { //only to create stencil mask
Toshihiro Shimizu 890ddd
		TSolidColorStyle appStyle(TPixel32::White);
Toshihiro Shimizu 890ddd
		stenc->beginMask(); //does not draw on screen
Toshihiro Shimizu 890ddd
		appStyle.drawRegion(0, false, boundary);
Toshihiro Shimizu 890ddd
	} else { //create stencil mask and draw on screen
Toshihiro Shimizu 890ddd
		stenc->beginMask(TStencilControl::DRAW_ALSO_ON_SCREEN);
Toshihiro Shimizu 890ddd
		TSolidColorStyle::drawRegion(cf, antiAliasing, boundary);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	stenc->endMask();
Toshihiro Shimizu 890ddd
	stenc->enableMask(TStencilControl::SHOW_INSIDE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
	//// <-- tglEnableBlending();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color[6];
Toshihiro Shimizu 890ddd
	for (int i = 0; i < 6; i++)
Toshihiro Shimizu 890ddd
		if (cf)
Toshihiro Shimizu 890ddd
			color[i] = (*(cf))(m_pointColor[i]);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			color[i] = m_pointColor[i];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 currentColor;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pos;</tpointd>
Toshihiro Shimizu 890ddd
	int posLX, posLY;
Toshihiro Shimizu 890ddd
	TRandom rand;
Toshihiro Shimizu 890ddd
	TPointD quad[4];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	preaprePos(boundary.m_bbox, pos, posLX, posLY, rand);
Toshihiro Shimizu 890ddd
	glBegin(GL_TRIANGLES);
Toshihiro Shimizu 890ddd
	int x = 2;
Toshihiro Shimizu 890ddd
	for (; x < (posLX - 2); x += 2)
Toshihiro Shimizu 890ddd
		for (int y = 1; y < posLY; y++) {
Toshihiro Shimizu 890ddd
			TPointD q[6];
Toshihiro Shimizu 890ddd
			if ((x % 4) == 2) {
Toshihiro Shimizu 890ddd
				q[0] = pos[(x - 1) * posLY + y];
Toshihiro Shimizu 890ddd
				q[1] = pos[(x)*posLY + y];
Toshihiro Shimizu 890ddd
				q[2] = pos[(x + 1) * posLY + y];
Toshihiro Shimizu 890ddd
				q[3] = pos[(x + 2) * posLY + y];
Toshihiro Shimizu 890ddd
				q[4] = pos[(x + 1) * posLY + y - 1];
Toshihiro Shimizu 890ddd
				q[5] = pos[(x)*posLY + y - 1];
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				q[0] = pos[(x - 1) * posLY + y - 1];
Toshihiro Shimizu 890ddd
				q[1] = pos[(x)*posLY + y - 1];
Toshihiro Shimizu 890ddd
				q[2] = pos[(x + 1) * posLY + y - 1];
Toshihiro Shimizu 890ddd
				q[3] = pos[(x + 2) * posLY + y - 1];
Toshihiro Shimizu 890ddd
				q[4] = pos[(x + 1) * posLY + y];
Toshihiro Shimizu 890ddd
				q[5] = pos[(x)*posLY + y];
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			currentColor = color[rand.getInt(0, 6)];
Toshihiro Shimizu 890ddd
			if (currentColor.m != 0) {
Toshihiro Shimizu 890ddd
				tglColor(currentColor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				tglVertex(q[0]);
Toshihiro Shimizu 890ddd
				tglVertex(q[1]);
Toshihiro Shimizu 890ddd
				tglVertex(q[2]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				tglVertex(q[2]);
Toshihiro Shimizu 890ddd
				tglVertex(q[3]);
Toshihiro Shimizu 890ddd
				tglVertex(q[4]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				tglVertex(q[4]);
Toshihiro Shimizu 890ddd
				tglVertex(q[5]);
Toshihiro Shimizu 890ddd
				tglVertex(q[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				tglVertex(q[0]);
Toshihiro Shimizu 890ddd
				tglVertex(q[2]);
Toshihiro Shimizu 890ddd
				tglVertex(q[4]);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double thickn = tcrop(m_thickness, 0.0, 100.0) * 0.01 * 5.0;
Toshihiro Shimizu 890ddd
	if (thickn > 0.001)
Toshihiro Shimizu 890ddd
		tglColor(backgroundColor);
Toshihiro Shimizu 890ddd
	for (x = 0; x < (posLX - 1); x++) {
Toshihiro Shimizu 890ddd
		int nb = x % 4;
Toshihiro Shimizu 890ddd
		for (int y = 0; y < posLY; y++) {
Toshihiro Shimizu 890ddd
			if (getQuadLine(pos[x * posLY + y], pos[(x + 1) * posLY + y], thickn, quad))
Toshihiro Shimizu 890ddd
				drawGLQuad(quad);
Toshihiro Shimizu 890ddd
			if (y > 0 && nb == 1)
Toshihiro Shimizu 890ddd
				if (getQuadLine(pos[x * posLY + y], pos[(x + 1) * posLY + y - 1], thickn, quad))
Toshihiro Shimizu 890ddd
					drawGLQuad(quad);
Toshihiro Shimizu 890ddd
			if (y < (posLY - 1) && nb == 3)
Toshihiro Shimizu 890ddd
				if (getQuadLine(pos[x * posLY + y], pos[(x + 1) * posLY + y + 1], thickn, quad))
Toshihiro Shimizu 890ddd
					drawGLQuad(quad);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//tglColor(TPixel32::White);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	stenc->disableMask();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
int TPatchFillStyle::nbClip(const int lX, const int lY, const std::vector<tpointd> &v) const</tpointd>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPointD quad[4];
Toshihiro Shimizu 890ddd
	double thickn = tcrop(m_thickness, 0.0, 100.0) * 0.01 * 5.0;
Toshihiro Shimizu 890ddd
	int nbC = 0;
Toshihiro Shimizu 890ddd
	int x = 2;
Toshihiro Shimizu 890ddd
	for (; x < (lX - 2); x += 2)
Toshihiro Shimizu 890ddd
		for (int y = 1; y < lY; y++)
Toshihiro Shimizu 890ddd
			nbC += 1;
Toshihiro Shimizu 890ddd
	if (thickn > 0.001)
Toshihiro Shimizu 890ddd
		for (x = 0; x < (lX - 1); x++) {
Toshihiro Shimizu 890ddd
			int nb = x % 4;
Toshihiro Shimizu 890ddd
			for (int y = 0; y < lY; y++) {
Toshihiro Shimizu 890ddd
				if (getQuadLine(v[x * lY + y], v[(x + 1) * lY + y], thickn, quad))
Toshihiro Shimizu 890ddd
					nbC += 3;
Toshihiro Shimizu 890ddd
				if (y > 0 && nb == 1)
Toshihiro Shimizu 890ddd
					if (getQuadLine(v[x * lY + y], v[(x + 1) * lY + y - 1], thickn, quad))
Toshihiro Shimizu 890ddd
						nbC += 3;
Toshihiro Shimizu 890ddd
				if (y < (lY - 1) && nb == 3)
Toshihiro Shimizu 890ddd
					if (getQuadLine(v[x * lY + y], v[(x + 1) * lY + y + 1], thickn, quad))
Toshihiro Shimizu 890ddd
						nbC += 3;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	return nbC;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::drawFlashQuad(TFlash &flash, const TPointD *quad) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tpointd> lvert;</tpointd>
Toshihiro Shimizu 890ddd
	lvert.push_back(quad[0]);
Toshihiro Shimizu 890ddd
	lvert.push_back(quad[1]);
Toshihiro Shimizu 890ddd
	lvert.push_back(quad[2]);
Toshihiro Shimizu 890ddd
	lvert.push_back(quad[3]);
Toshihiro Shimizu 890ddd
	flash.drawPolyline(lvert);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double r = tdistance(quad[0], quad[1]) / 2.0;
Toshihiro Shimizu 890ddd
	flash.drawEllipse(quad[0] * 0.5 + quad[1] * 0.5, r, r);
Toshihiro Shimizu 890ddd
	flash.drawEllipse(quad[2] * 0.5 + quad[3] * 0.5, r, r);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::drawFlashTriangle(TFlash &flash,
Toshihiro Shimizu 890ddd
										const TPointD &p1,
Toshihiro Shimizu 890ddd
										const TPointD &p2,
Toshihiro Shimizu 890ddd
										const TPointD &p3) const
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tpointd> lvert;</tpointd>
Toshihiro Shimizu 890ddd
	lvert.push_back(p1);
Toshihiro Shimizu 890ddd
	lvert.push_back(p2);
Toshihiro Shimizu 890ddd
	lvert.push_back(p3);
Toshihiro Shimizu 890ddd
	flash.drawPolyline(lvert);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TPatchFillStyle::drawRegion(TFlash &flash, const TRegion *r) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRectD bbox(r->getBBox());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::vector<tpointd> pos;</tpointd>
Toshihiro Shimizu 890ddd
	int posLX, posLY;
Toshihiro Shimizu 890ddd
	TRandom rand;
Toshihiro Shimizu 890ddd
	TPointD quad[4];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	preaprePos(bbox, pos, posLX, posLY, rand);
Toshihiro Shimizu 890ddd
	if (pos.size() <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	flash.drawRegion(*r, nbClip(posLX, posLY, pos));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	int x;
Toshihiro Shimizu 890ddd
	for (x = 2; x < (posLX - 2); x += 2)
Toshihiro Shimizu 890ddd
		for (int y = 1; y < posLY; y++) {
Shinya Kitaoka 3bfa54
			std::vector<tpointd> lvert;</tpointd>
Toshihiro Shimizu 890ddd
			if ((x % 4) == 2) {
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x - 1) * posLY + y]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x)*posLY + y]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x + 1) * posLY + y]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x + 2) * posLY + y]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x + 1) * posLY + y - 1]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x)*posLY + y - 1]);
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x - 1) * posLY + y - 1]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x)*posLY + y - 1]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x + 1) * posLY + y - 1]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x + 2) * posLY + y - 1]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x + 1) * posLY + y]);
Toshihiro Shimizu 890ddd
				lvert.push_back(pos[(x)*posLY + y]);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			flash.setFillColor(m_pointColor[rand.getInt(0, 6)]);
Toshihiro Shimizu 890ddd
			flash.drawPolyline(lvert);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setFillColor(TSolidColorStyle::getMainColor());
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	double thickn = tcrop(m_thickness, 0.0, 100.0) * 0.01 * 5.0;
Toshihiro Shimizu 890ddd
	if (thickn > 0.001)
Toshihiro Shimizu 890ddd
		for (x = 0; x < (posLX - 1); x++) {
Toshihiro Shimizu 890ddd
			int nb = x % 4;
Toshihiro Shimizu 890ddd
			for (int y = 0; y < posLY; y++) {
Toshihiro Shimizu 890ddd
				if (getQuadLine(pos[x * posLY + y], pos[(x + 1) * posLY + y], thickn, quad))
Toshihiro Shimizu 890ddd
					drawFlashQuad(flash, quad);
Toshihiro Shimizu 890ddd
				if (y > 0 && nb == 1)
Toshihiro Shimizu 890ddd
					if (getQuadLine(pos[x * posLY + y], pos[(x + 1) * posLY + y - 1], thickn, quad))
Toshihiro Shimizu 890ddd
						drawFlashQuad(flash, quad);
Toshihiro Shimizu 890ddd
				if (y < (posLY - 1) && nb == 3)
Toshihiro Shimizu 890ddd
					if (getQuadLine(pos[x * posLY + y], pos[(x + 1) * posLY + y + 1], thickn, quad))
Toshihiro Shimizu 890ddd
						drawFlashQuad(flash, quad);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
}