Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tcolorfunctions.h"
Toshihiro Shimizu 890ddd
#include "trandom.h"
Toshihiro Shimizu 890ddd
#include "tflash.h"
Toshihiro Shimizu 890ddd
#include "tcurves.h"
Toshihiro Shimizu 890ddd
#include "tvectorrenderdata.h"
Toshihiro Shimizu 890ddd
#include "tmathutil.h"
Toshihiro Shimizu 890ddd
#include "colorfxutils.h"
Toshihiro Shimizu 890ddd
#include "tpixelutils.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// tcg includes
Toshihiro Shimizu 890ddd
#include "tcg/tcg_misc.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qcoreapplication></qcoreapplication>
Toshihiro Shimizu 890ddd
#include <qstringlist></qstringlist>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "strokestyles.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define MINTHICK 1.0
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class TOptimizedStrokePropT : public TStrokeProp
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	double m_pixelSize;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOptimizedStrokeStyleT<t> *m_colorStyle;</t>
Toshihiro Shimizu 890ddd
	T m_data;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TOptimizedStrokePropT(const TStroke *stroke, TOptimizedStrokeStyleT<t> *style);</t>
Toshihiro Shimizu 890ddd
	~TOptimizedStrokePropT() { m_colorStyle->release(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const TColorStyle *getColorStyle() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TStrokeProp *clone(const TStroke *stroke) const;
Toshihiro Shimizu 890ddd
	void draw(const TVectorRenderData &rd);
Toshihiro Shimizu 890ddd
	void draw(TFlash &flash)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		getColorStyle()->drawStroke(flash, getStroke());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
TOptimizedStrokePropT<t>::TOptimizedStrokePropT(const TStroke *stroke, TOptimizedStrokeStyleT<t> *style)</t></t>
Toshihiro Shimizu 890ddd
	: TStrokeProp(stroke), m_colorStyle(style), m_pixelSize(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_styleVersionNumber = style->getVersionNumber();
Toshihiro Shimizu 890ddd
	m_colorStyle->addRef();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
const TColorStyle *TOptimizedStrokePropT<t>::getColorStyle() const</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_colorStyle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
TStrokeProp *TOptimizedStrokePropT<t>::clone(const TStroke *stroke) const</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TOptimizedStrokePropT<t> *prop = new TOptimizedStrokePropT<t>(stroke, m_colorStyle);</t></t>
Toshihiro Shimizu 890ddd
	prop->m_strokeChanged = m_strokeChanged;
Toshihiro Shimizu 890ddd
	prop->m_data = m_data;
Toshihiro Shimizu 890ddd
	return prop;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
void TOptimizedStrokePropT<t>::draw(const TVectorRenderData &rd) /*assenza di const non e' una dimenticanza! Alcune sottoclassi devono ridefinire questo metodo e serbve che non sia const*/</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (rd.m_clippingRect != TRect() && !rd.m_is3dView && !convert(rd.m_aff * m_stroke->getBBox()).overlaps(rd.m_clippingRect))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	tglMultMatrix(rd.m_aff);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double pixelSize = sqrt(tglGetPixelSize2());
Toshihiro Shimizu 890ddd
	if (m_strokeChanged ||
Toshihiro Shimizu 890ddd
		m_styleVersionNumber != m_colorStyle->getVersionNumber() ||
Toshihiro Shimizu 890ddd
		!isAlmostZero(pixelSize - m_pixelSize, 1e-5)) {
Toshihiro Shimizu 890ddd
		m_strokeChanged = false;
Toshihiro Shimizu 890ddd
		m_pixelSize = pixelSize;
Toshihiro Shimizu 890ddd
		m_styleVersionNumber = m_colorStyle->getVersionNumber();
Toshihiro Shimizu 890ddd
		m_colorStyle->computeData(m_data, m_stroke, rd.m_cf);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_colorStyle->drawStroke(rd.m_cf, m_data, m_stroke);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
TStrokeProp *TOptimizedStrokeStyleT<t>::makeStrokeProp(const TStroke *stroke)</t>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TOptimizedStrokePropT<t>(stroke, this);</t>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void tglNormal(const T3DPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glNormal3d(p.x, p.y, p.z);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void tglVertex(const T3DPointD &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glVertex3d(p.x, p.y, p.z);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFurStrokeStyle::TFurStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Black), m_angle(120.0), m_length(1.0), m_cs(0.0), m_sn(0.0)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka ee259f
	double rad = m_angle * M_PI_180;
Toshihiro Shimizu 890ddd
	m_cs = cos(rad);
Toshihiro Shimizu 890ddd
	m_sn = sin(rad);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TFurStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TFurStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TFurStrokeStyle::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 TFurStrokeStyle::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 TFurStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("TFurStrokeStyle", "Angle") : QCoreApplication::translate("TFurStrokeStyle", "Size");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFurStrokeStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	if (index == 0) {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 180.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TFurStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	return index == 0 ? m_angle : m_length;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFurStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	if (index == 0) {
Toshihiro Shimizu 890ddd
		m_angle = value;
Shinya Kitaoka ee259f
		double rad = m_angle * M_PI_180;
Toshihiro Shimizu 890ddd
		m_cs = cos(rad);
Toshihiro Shimizu 890ddd
		m_sn = sin(rad);
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		m_length = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFurStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0.0;
Toshihiro Shimizu 890ddd
	double ds = 4;
Toshihiro Shimizu 890ddd
	double vs = 1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
	vector<tsegment> segmentsArray;</tsegment>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD pos1 = (TPointD)pos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0.0) {
Toshihiro Shimizu 890ddd
			s += 0.5;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double length = m_length * pos.thick;
Toshihiro Shimizu 890ddd
		vs = -vs;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double q = 0.01 * (rnd.getFloat() * 2 - 1);
Toshihiro Shimizu 890ddd
		segmentsArray.push_back(TSegment(pos1, pos1 + length * ((m_cs + q) * u + (vs * m_sn) * v)));
Toshihiro Shimizu 890ddd
		s += ds;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.drawSegments(segmentsArray, true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TFurStrokeStyle::computeData(Points &positions,
Toshihiro Shimizu 890ddd
								  const TStroke *stroke,
Toshihiro Shimizu 890ddd
								  const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0.0;
Toshihiro Shimizu 890ddd
	double ds = 4;
Toshihiro Shimizu 890ddd
	double vs = 1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	positions.clear();
Toshihiro Shimizu 890ddd
	positions.reserve(tceil(length / ds) + 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0.0) {
Toshihiro Shimizu 890ddd
			s += 0.5;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double length = 0;
Toshihiro Shimizu 890ddd
		if (pos.thick)
Toshihiro Shimizu 890ddd
			length = m_length * pos.thick;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			length = 1.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vs = -vs;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		positions.push_back(pos);
Toshihiro Shimizu 890ddd
		double q = 0.01 * (rnd.getFloat() * 2 - 1);
Toshihiro Shimizu 890ddd
		positions.push_back(pos + length * ((m_cs + q) * u + (vs * m_sn) * v));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		s += ds;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TFurStrokeStyle::drawStroke(const TColorFunction *cf, Points &positions, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < positions.size(); i += 2) {
Toshihiro Shimizu 890ddd
		glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
		tglColor(color);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
		glColor4d(1, 1, 1, 0.0);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i + 1]);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TChainStrokeStyle::TChainStrokeStyle(const TPixel32 &color)
Toshihiro Shimizu 890ddd
	: m_color(color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TChainStrokeStyle::TChainStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32(20, 10, 0))
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TChainStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TChainStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChainStrokeStyle::computeData(Points &data, const TStroke *stroke, const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// spessore della catena = spessore "medio" dello stroke
Toshihiro Shimizu 890ddd
	double thickness = 0.25 * (stroke->getThickPoint(0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(1.0 / 3.0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(2.0 / 3.0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(1).thick);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (thickness == 0)
Toshihiro Shimizu 890ddd
		thickness = 0.1;
Toshihiro Shimizu 890ddd
	double ringHeight = thickness;
Toshihiro Shimizu 890ddd
	double ringWidth = 1.5 * ringHeight;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// distanza fra i centri degli anelli
Toshihiro Shimizu 890ddd
	double ringDistance = 2 * 1.2 * ringWidth;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// distanza fra il centro dell'anello e il punto di attacco dell'anello trasversale
Toshihiro Shimizu 890ddd
	//double joinPos = 0.45 * ringWidth;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldPos;
Toshihiro Shimizu 890ddd
	//bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	data.clear();
Toshihiro Shimizu 890ddd
	data.reserve(tceil(length / ringDistance) * 2 + 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		data.push_back(pos);
Toshihiro Shimizu 890ddd
		data.push_back(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// se e' il caso unisco la catena alla precedente
Toshihiro Shimizu 890ddd
		s += ringDistance;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChainStrokeStyle::drawStroke(const TColorFunction *cf, Points &data, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	//double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// spessore della catena = spessore "medio" dello stroke
Toshihiro Shimizu 890ddd
	double thickness = 0.25 * (stroke->getThickPoint(0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(1.0 / 3.0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(2.0 / 3.0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(1).thick);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (thickness * thickness < 4 * tglGetPixelSize2()) {
Toshihiro Shimizu 890ddd
		TCenterLineStrokeStyle *appStyle = new TCenterLineStrokeStyle(m_color, 0x0, thickness);
Toshihiro Shimizu 890ddd
		appStyle->drawStroke(cf, stroke);
Toshihiro Shimizu 890ddd
		delete appStyle;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(thickness);
Toshihiro Shimizu 890ddd
	double ringHeight = thickness;
Toshihiro Shimizu 890ddd
	double ringWidth = 1.5 * ringHeight;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// distanza fra i centri degli anelli
Toshihiro Shimizu 890ddd
	//double ringDistance = 2 * 1.2 * ringWidth;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// distanza fra il centro dell'anello e il punto di attacco dell'anello trasversale
Toshihiro Shimizu 890ddd
	double joinPos = 0.45 * ringWidth;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// definisco la forma dell'anello della catena
Toshihiro Shimizu 890ddd
	GLuint ringId;
Toshihiro Shimizu 890ddd
	ringId = glGenLists(1);
Toshihiro Shimizu 890ddd
	double a = .6, b = .6;
Toshihiro Shimizu 890ddd
	glNewList(ringId, GL_COMPILE);
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glScaled(ringWidth, ringHeight, 1);
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	glVertex2d(1, b);
Toshihiro Shimizu 890ddd
	glVertex2d(a, 1);
Toshihiro Shimizu 890ddd
	glVertex2d(-a, 1);
Toshihiro Shimizu 890ddd
	glVertex2d(-1, b);
Toshihiro Shimizu 890ddd
	glVertex2d(-1, -b);
Toshihiro Shimizu 890ddd
	glVertex2d(-a, -1);
Toshihiro Shimizu 890ddd
	glVertex2d(a, -1);
Toshihiro Shimizu 890ddd
	glVertex2d(1, -b);
Toshihiro Shimizu 890ddd
	glVertex2d(1, b);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
	glEndList();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// disegno la catena
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		tglColor((*cf)(m_color));
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		tglColor(m_color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldPos;
Toshihiro Shimizu 890ddd
	//bool firstRing = true;
Toshihiro Shimizu 890ddd
	//double s = 0;
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < data.size(); i += 2) {
Toshihiro Shimizu 890ddd
		TPointD pos = data[i];
Toshihiro Shimizu 890ddd
		TPointD u = data[i + 1];
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// disegno un anello della catena
Toshihiro Shimizu 890ddd
		glPushMatrix();
Toshihiro Shimizu 890ddd
		TAffine aff(u.x, v.x, pos.x, u.y, v.y, pos.y);
Toshihiro Shimizu 890ddd
		tglMultMatrix(aff);
Toshihiro Shimizu 890ddd
		glCallList(ringId);
Toshihiro Shimizu 890ddd
		glPopMatrix();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// se e' il caso unisco la catena alla precedente
Toshihiro Shimizu 890ddd
		if (i != 0) {
Toshihiro Shimizu 890ddd
			TPointD q = pos - u * joinPos;
Toshihiro Shimizu 890ddd
			tglDrawSegment(oldPos, q);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		oldPos = pos + u * joinPos;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glDeleteLists(ringId, 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChainStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// spessore della catena = spessore "medio" dello stroke
Toshihiro Shimizu 890ddd
	double thickness = 0.25 * (stroke->getThickPoint(0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(1.0 / 3.0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(2.0 / 3.0).thick +
Toshihiro Shimizu 890ddd
							   stroke->getThickPoint(1).thick);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (thickness < 2) {
Toshihiro Shimizu 890ddd
		TCenterLineStrokeStyle *appStyle = new TCenterLineStrokeStyle(m_color, 0x0, thickness);
Toshihiro Shimizu 890ddd
		appStyle->drawStroke(flash, stroke);
Toshihiro Shimizu 890ddd
		delete appStyle;
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(thickness);
Toshihiro Shimizu 890ddd
	double ringHeight = thickness;
Toshihiro Shimizu 890ddd
	double ringWidth = 1.5 * ringHeight;
Toshihiro Shimizu 890ddd
	double ringDistance = 2 * 1.2 * ringWidth;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double joinPos = 0.45 * ringWidth;
Toshihiro Shimizu 890ddd
	//const int ringId = 124;
Toshihiro Shimizu 890ddd
	double a = .6, b = .6;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TScale scaleM(ringWidth, ringHeight);
Toshihiro Shimizu 890ddd
	vector<tpointd> chain;</tpointd>
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(1, b));   //0
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(a, 1));   //1
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(-a, 1));  //2
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(-1, b));  //3
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(-1, -b)); //4
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(-a, -1)); //5
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(a, -1));  //6
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(1, -b));  //7
Toshihiro Shimizu 890ddd
	chain.push_back(scaleM * TPointD(1, b));   //8
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*  
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD(1, b));	//0
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD( a, 1));	//1
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD(-a, 1));	//2
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD(-1, b));	//3
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD(-1,-b));	//4
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD(-a,-1));	//5
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD( a,-1));	//6
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD( 1,-b));	//7
Toshihiro Shimizu 890ddd
  chain.push_back( TPointD(1, b));	//8
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<tsegment> chainS;</tsegment>
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[0], chain[1]));
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[1], chain[2]));
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[2], chain[3]));
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[3], chain[4]));
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[4], chain[5]));
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[5], chain[6]));
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[6], chain[7]));
Toshihiro Shimizu 890ddd
	chainS.push_back(TSegment(chain[7], chain[0]));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldPos;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		//     TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TTranslation translM(pos.x, pos.y);
Toshihiro Shimizu 890ddd
		TRotation rotM(rad2degree(atan(u)));
Toshihiro Shimizu 890ddd
		TAffine tM = translM * rotM;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//	 With direct transformation
Toshihiro Shimizu 890ddd
		vector<tsegment> lchainS;</tsegment>
Toshihiro Shimizu 890ddd
		for (int i = 0; i < 8; i++)
Toshihiro Shimizu 890ddd
			lchainS.push_back(TSegment(tM * chain[i], tM * chain[i + 1]));
Toshihiro Shimizu 890ddd
		flash.drawSegments(lchainS, false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*	 
Toshihiro Shimizu 890ddd
// With TFlash transformations
Toshihiro Shimizu 890ddd
	 flash.pushMatrix();
Toshihiro Shimizu 890ddd
	 flash.multMatrix(translM);
Toshihiro Shimizu 890ddd
	 flash.multMatrix(rotM);
Toshihiro Shimizu 890ddd
//	 flash.multMatrix(scaleM);
Toshihiro Shimizu 890ddd
     flash.drawSegments(chainS,false);
Toshihiro Shimizu 890ddd
//	 if (chainId==-1) 
Toshihiro Shimizu 890ddd
//		chainId=flash.drawSegments(chainS,false);
Toshihiro Shimizu 890ddd
//	 else
Toshihiro Shimizu 890ddd
//		 flash.drawShape(chainId);
Toshihiro Shimizu 890ddd
	 flash.popMatrix();
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!firstRing) {
Toshihiro Shimizu 890ddd
			TPointD q = pos - u * joinPos;
Toshihiro Shimizu 890ddd
			vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
			sv.push_back(TSegment(oldPos, q));
Toshihiro Shimizu 890ddd
			flash.drawSegments(sv, false);
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		oldPos = pos + u * joinPos;
Toshihiro Shimizu 890ddd
		s += ringDistance;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TSprayStrokeStyle::TSprayStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Blue), m_blend(0.5), m_intensity(10.0), m_radius(0.3)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TSprayStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TSprayStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TSprayStrokeStyle::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 TSprayStrokeStyle::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 TSprayStrokeStyle::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("TSprayStrokeStyle", "Border Fade");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TSprayStrokeStyle", "Density");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TSprayStrokeStyle", "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 TSprayStrokeStyle::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 = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TSprayStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	double value = 0;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_blend;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_intensity;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_radius;
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 TSprayStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_blend = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_intensity = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_radius = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSprayStrokeStyle::drawStroke(const TColorFunction *cf, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//  TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 4;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double blend = m_blend;			//distanza che controlla da dove il gessetto comincia il fade out  (0, 1)
Toshihiro Shimizu 890ddd
	double intensity = m_intensity; //quanti punti vengono disegnati ad ogni step
Toshihiro Shimizu 890ddd
	double radius = m_radius;
Toshihiro Shimizu 890ddd
	double decay = 1 - blend;
Toshihiro Shimizu 890ddd
	bool fill = 0;
Toshihiro Shimizu 890ddd
	TPointD pos1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	double minthickness = MINTHICK * sqrt(tglGetPixelSize2());
Toshihiro Shimizu 890ddd
	double thickness = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		double normu = norm2(u);
Toshihiro Shimizu 890ddd
		if (normu == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		TPointD shift;
Toshihiro Shimizu 890ddd
		if (pos.thick < MINTHICK)
Toshihiro Shimizu 890ddd
			thickness = minthickness;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			thickness = pos.thick;
Toshihiro Shimizu 890ddd
		for (int i = 0; i < intensity; i++) {
Toshihiro Shimizu 890ddd
			double vrandnorm = (0.5 - rnd.getFloat()) * 2;
Toshihiro Shimizu 890ddd
			double randomv = vrandnorm * pos.thick;
Toshihiro Shimizu 890ddd
			double randomu = (0.5 - rnd.getFloat()) * step;
Toshihiro Shimizu 890ddd
			shift = u * randomu + v * randomv;
Toshihiro Shimizu 890ddd
			pos1 = pos + shift;
Toshihiro Shimizu 890ddd
			double mod = fabs(vrandnorm);
Toshihiro Shimizu 890ddd
			if (mod < decay)
Toshihiro Shimizu 890ddd
				glColor4d(dcolor.r, dcolor.g, dcolor.b, rnd.getFloat() * dcolor.m);
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				glColor4d(dcolor.r, dcolor.g, dcolor.b, rnd.getFloat() * (1 - mod) * dcolor.m);
Toshihiro Shimizu 890ddd
			if (fill)
Toshihiro Shimizu 890ddd
				tglDrawDisk(pos1, radius * thickness * rnd.getFloat());
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				tglDrawCircle(pos1, radius * thickness * rnd.getFloat());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSprayStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 4;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double blend = m_blend;			//distanza che controlla da dove il gessetto comincia il fade out  (0, 1)
Toshihiro Shimizu 890ddd
	double intensity = m_intensity; //quanti punti vengono disegnati ad ogni step
Toshihiro Shimizu 890ddd
	double radius = m_radius;
Toshihiro Shimizu 890ddd
	double decay = 1 - blend;
Toshihiro Shimizu 890ddd
	bool fill = 0;
Toshihiro Shimizu 890ddd
	TPointD pos1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		double normu = norm2(u);
Toshihiro Shimizu 890ddd
		if (normu == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		TPointD shift;
Toshihiro Shimizu 890ddd
		for (int i = 0; i < intensity; i++) {
Toshihiro Shimizu 890ddd
			double vrandnorm = (0.5 - rnd.getFloat()) * 2;
Toshihiro Shimizu 890ddd
			double randomv = vrandnorm * pos.thick;
Toshihiro Shimizu 890ddd
			double randomu = (0.5 - rnd.getFloat()) * step;
Toshihiro Shimizu 890ddd
			shift = u * randomu + v * randomv;
Toshihiro Shimizu 890ddd
			pos1 = pos + shift;
Toshihiro Shimizu 890ddd
			double mod = fabs(vrandnorm);
Toshihiro Shimizu 890ddd
			TPixelD ldcolor = dcolor;
Toshihiro Shimizu 890ddd
			ldcolor.m = mod < decay ? rnd.getFloat() * dcolor.m : rnd.getFloat() * (1 - mod) * dcolor.m;
Toshihiro Shimizu 890ddd
			TPixel32 lcolor;
Toshihiro Shimizu 890ddd
			lcolor = toPixel32(ldcolor);
Toshihiro Shimizu 890ddd
			if (fill) {
Toshihiro Shimizu 890ddd
				flash.setFillColor(lcolor);
Toshihiro Shimizu 890ddd
				double r = radius * pos.thick * rnd.getFloat();
Toshihiro Shimizu 890ddd
				flash.drawEllipse(pos1, r, r);
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				flash.setLineColor(lcolor);
Toshihiro Shimizu 890ddd
				flash.setFillColor(TPixel32(0, 0, 0, 0));
Toshihiro Shimizu 890ddd
				flash.setThickness(0.5);
Toshihiro Shimizu 890ddd
				double r = radius * pos.thick * rnd.getFloat();
Toshihiro Shimizu 890ddd
				flash.drawEllipse(pos1, r, r);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TGraphicPenStrokeStyle::TGraphicPenStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Black), m_intensity(10.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TGraphicPenStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TGraphicPenStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TGraphicPenStrokeStyle::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 TGraphicPenStrokeStyle::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 TGraphicPenStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TGraphicPenStrokeStyle", "Density");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TGraphicPenStrokeStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = 0.0;
Toshihiro Shimizu 890ddd
	max = 10.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TGraphicPenStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return m_intensity;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TGraphicPenStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	m_intensity = value;
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TGraphicPenStrokeStyle::computeData(DrawmodePointsMatrix &data,
Toshihiro Shimizu 890ddd
										 const TStroke *stroke,
Toshihiro Shimizu 890ddd
										 const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	data.clear();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 10;
Toshihiro Shimizu 890ddd
	TPointD pos1, pos2;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	double intensity = m_intensity;
Toshihiro Shimizu 890ddd
	data.reserve(tceil(length / 10.0));
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		double normu = norm2(u);
Toshihiro Shimizu 890ddd
		if (normu == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		TPointD shift;
Toshihiro Shimizu 890ddd
		Points tmpPoints;
Toshihiro Shimizu 890ddd
		tmpPoints.clear();
Toshihiro Shimizu 890ddd
		GLenum drawMode;
Toshihiro Shimizu 890ddd
		for (int i = 0; i < intensity; i++) {
Toshihiro Shimizu 890ddd
			if (pos.thick) {
Toshihiro Shimizu 890ddd
				drawMode = GL_LINES;
Toshihiro Shimizu 890ddd
				tmpPoints.reserve((int)(intensity * 2 + 1));
Toshihiro Shimizu 890ddd
				double randomv = (0.5 - rnd.getFloat()) * pos.thick;
Toshihiro Shimizu 890ddd
				double randomu = (0.5 - rnd.getFloat()) * step;
Toshihiro Shimizu 890ddd
				shift = randomu * u + randomv * v;
Toshihiro Shimizu 890ddd
				pos1 = pos + shift + v * (pos.thick);
Toshihiro Shimizu 890ddd
				pos2 = pos + shift - v * (pos.thick);
Toshihiro Shimizu 890ddd
				tmpPoints.push_back(pos1);
Toshihiro Shimizu 890ddd
				tmpPoints.push_back(pos2);
Toshihiro Shimizu 890ddd
			} else {
Toshihiro Shimizu 890ddd
				drawMode = GL_POINTS;
Toshihiro Shimizu 890ddd
				tmpPoints.reserve((int)(intensity + 1));
Toshihiro Shimizu 890ddd
				tmpPoints.push_back((TPointD)pos);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (!tmpPoints.empty()) {
Toshihiro Shimizu 890ddd
			assert(drawMode == GL_POINTS || drawMode == GL_LINES);
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(drawMode, tmpPoints));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TGraphicPenStrokeStyle::drawStroke(const TColorFunction *cf,
Toshihiro Shimizu 890ddd
										DrawmodePointsMatrix &data,
Toshihiro Shimizu 890ddd
										const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DrawmodePointsMatrix::iterator it1 = data.begin();
Toshihiro Shimizu 890ddd
	for (; it1 != data.end(); ++it1) {
Toshihiro Shimizu 890ddd
		if (it1->first == GL_LINES) {
Toshihiro Shimizu 890ddd
			Points::iterator it2 = it1->second.begin();
Toshihiro Shimizu 890ddd
			glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
			for (; it2 != it1->second.end(); ++it2)
Toshihiro Shimizu 890ddd
				tglVertex(*it2);
Toshihiro Shimizu 890ddd
			glEnd();
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			assert(it1->first == GL_POINTS);
Toshihiro Shimizu 890ddd
			Points::iterator it2 = it1->second.begin();
Toshihiro Shimizu 890ddd
			glBegin(GL_POINTS);
Toshihiro Shimizu 890ddd
			for (; it2 != it1->second.end(); ++it2)
Toshihiro Shimizu 890ddd
				tglVertex(*it2);
Toshihiro Shimizu 890ddd
			glEnd();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TGraphicPenStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	vector<tsegment> segmentsArray;</tsegment>
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 10;
Toshihiro Shimizu 890ddd
	TPointD pos1, pos2;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	double intensity = m_intensity;
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		double normu = norm2(u);
Toshihiro Shimizu 890ddd
		if (normu == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		TPointD shift;
Toshihiro Shimizu 890ddd
		for (int i = 0; i < intensity; i++) {
Toshihiro Shimizu 890ddd
			double randomv = (0.5 - rnd.getFloat()) * pos.thick;
Toshihiro Shimizu 890ddd
			double randomu = (0.5 - rnd.getFloat()) * step;
Toshihiro Shimizu 890ddd
			shift = randomu * u + randomv * v;
Toshihiro Shimizu 890ddd
			pos1 = pos + shift + v * (pos.thick);
Toshihiro Shimizu 890ddd
			pos2 = pos + shift - v * (pos.thick);
Toshihiro Shimizu 890ddd
			segmentsArray.push_back(TSegment(pos1, pos2));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.drawSegments(segmentsArray, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
double inline get_line_slope(double meter, double inmax, double linemax,
Toshihiro Shimizu 890ddd
							 double outmax)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (meter <= inmax)
Toshihiro Shimizu 890ddd
		return meter / inmax;
Toshihiro Shimizu 890ddd
	else if (meter <= inmax + linemax)
Toshihiro Shimizu 890ddd
		return 1;
Toshihiro Shimizu 890ddd
	else if (meter <= inmax + linemax + outmax)
Toshihiro Shimizu 890ddd
		return (inmax + linemax - meter) / outmax + 1;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDottedLineStrokeStyle::TDottedLineStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Black), m_in(10.0), m_line(50.0), m_out(10.0), m_blank(10.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TDottedLineStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TDottedLineStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TDottedLineStrokeStyle::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 TDottedLineStrokeStyle::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 TDottedLineStrokeStyle::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("TDottedLineStrokeStyle", "Fade In");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TDottedLineStrokeStyle", "Dash");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TDottedLineStrokeStyle", "Fade Out");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TDottedLineStrokeStyle", "Gap");
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 TDottedLineStrokeStyle::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 = 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 = 1.;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
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 TDottedLineStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	double value = 0;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_in;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_line;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_out;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = m_blank;
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 TDottedLineStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_in = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_line = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_out = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_blank = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedLineStrokeStyle::computeData(Points &positions,
Toshihiro Shimizu 890ddd
										 const TStroke *stroke,
Toshihiro Shimizu 890ddd
										 const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
	double linemax = m_line;
Toshihiro Shimizu 890ddd
	double inmax = (m_in / 100);
Toshihiro Shimizu 890ddd
	double outmax = (m_out / 100);
Toshihiro Shimizu 890ddd
	double blankmax = m_blank;
Toshihiro Shimizu 890ddd
	double total = 0;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	positions.clear();
Toshihiro Shimizu 890ddd
	positions.reserve(tceil(length / step) + 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldPos1, oldPos2, oldPos3, oldPos4, pos1, pos2, pos3, pos4;
Toshihiro Shimizu 890ddd
	//bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	double meter = 0;
Toshihiro Shimizu 890ddd
	double center = 0;
Toshihiro Shimizu 890ddd
	double slopetmp = 0;
Toshihiro Shimizu 890ddd
	double minthickness = MINTHICK * sqrt(tglGetPixelSize2());
Toshihiro Shimizu 890ddd
	double thickness = 0;
Toshihiro Shimizu 890ddd
	double line = 0, in = 0, out = 0, blank = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (pos.thick < MINTHICK)
Toshihiro Shimizu 890ddd
			thickness = minthickness;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			thickness = pos.thick;
Toshihiro Shimizu 890ddd
		if (meter >= total) {
Toshihiro Shimizu 890ddd
			meter = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			line = linemax * (1 + rnd.getFloat()) * thickness;
Toshihiro Shimizu 890ddd
			if (line > length - s)
Toshihiro Shimizu 890ddd
				line = length - s;
Toshihiro Shimizu 890ddd
			in = inmax * line;
Toshihiro Shimizu 890ddd
			out = outmax * line;
Toshihiro Shimizu 890ddd
			line = line - in - out;
Toshihiro Shimizu 890ddd
			blank = blankmax * (1 + rnd.getFloat()) * thickness;
Toshihiro Shimizu 890ddd
			if (in + out > length) {
Toshihiro Shimizu 890ddd
				in = rnd.getFloat() * (length / 2);
Toshihiro Shimizu 890ddd
				out = length - in;
Toshihiro Shimizu 890ddd
				line = 0;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			total = in + line + out + blank;
Toshihiro Shimizu 890ddd
		} else if (meter > in + line + out + step) {
Toshihiro Shimizu 890ddd
			s += step;
Toshihiro Shimizu 890ddd
			meter += step;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		double slope = 0;
Toshihiro Shimizu 890ddd
		slope = get_line_slope(meter, in, line, out);
Toshihiro Shimizu 890ddd
		slopetmp = slope;
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * (thickness)*slope;
Toshihiro Shimizu 890ddd
		if (pos.thick * slope < 1)
Toshihiro Shimizu 890ddd
			center = 0.0;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			center = 0.5;
Toshihiro Shimizu 890ddd
		pos1 = pos + v;
Toshihiro Shimizu 890ddd
		pos2 = pos + v * 0.5;
Toshihiro Shimizu 890ddd
		pos3 = pos - v * 0.5;
Toshihiro Shimizu 890ddd
		pos4 = pos - v;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		positions.push_back(pos1);
Toshihiro Shimizu 890ddd
		positions.push_back(pos2);
Toshihiro Shimizu 890ddd
		positions.push_back(pos3);
Toshihiro Shimizu 890ddd
		positions.push_back(pos4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
		meter += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedLineStrokeStyle::drawStroke(const TColorFunction *cf, Points &positions, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (UINT i = 4; i < positions.size(); i += 4) {
Toshihiro Shimizu 890ddd
		glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
		glColor4ub(color.r, color.g, color.b, 0);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i - 4]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
		glColor4ub(color.r, color.g, color.b, color.m);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i - 3]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i + 1]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i - 2]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i + 2]);
Toshihiro Shimizu 890ddd
		glColor4ub(color.r, color.g, color.b, 0);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i - 1]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i + 3]);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDottedLineStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
	double linemax = m_line;
Toshihiro Shimizu 890ddd
	double inmax = m_in / 100;
Toshihiro Shimizu 890ddd
	double outmax = m_out / 100;
Toshihiro Shimizu 890ddd
	double blankmax = m_blank;
Toshihiro Shimizu 890ddd
	double total = 0;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
	TPixel32 color_transp(color.r, color.g, color.b, 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldPos1, oldPos2, oldPos3, oldPos4, pos1, pos2, pos3, pos4;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	double meter = 0;
Toshihiro Shimizu 890ddd
	double center = 0;
Toshihiro Shimizu 890ddd
	double slopetmp = 0;
Toshihiro Shimizu 890ddd
	double minthickness = MINTHICK;
Toshihiro Shimizu 890ddd
	double thickness = 0;
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		double line = 0, in = 0, out = 0, blank = 0;
Toshihiro Shimizu 890ddd
		if (pos.thick < MINTHICK)
Toshihiro Shimizu 890ddd
			thickness = minthickness;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			thickness = pos.thick;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (meter >= total) {
Toshihiro Shimizu 890ddd
			meter = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			line = linemax * (1 + rnd.getFloat()) * thickness;
Toshihiro Shimizu 890ddd
			if (line > length - s)
Toshihiro Shimizu 890ddd
				line = length - s;
Toshihiro Shimizu 890ddd
			in = inmax * line;
Toshihiro Shimizu 890ddd
			out = outmax * line;
Toshihiro Shimizu 890ddd
			line = line - in - out;
Toshihiro Shimizu 890ddd
			blank = blankmax * (1 + rnd.getFloat()) * thickness;
Toshihiro Shimizu 890ddd
			/*   --- OLD Version ---
Toshihiro Shimizu 890ddd
	  line=linemax*(1+rnd.getFloat());
Toshihiro Shimizu 890ddd
      in=inmax*(1+rnd.getFloat())*pos.thick;
Toshihiro Shimizu 890ddd
      out=outmax*(1+rnd.getFloat())*pos.thick;
Toshihiro Shimizu 890ddd
      blank=blankmax*(1+rnd.getFloat())*pos.thick;
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
			if (in + out > length) {
Toshihiro Shimizu 890ddd
				in = rnd.getFloat() * (length / 2);
Toshihiro Shimizu 890ddd
				out = length - in;
Toshihiro Shimizu 890ddd
				line = 0;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			total = in + line + out + blank;
Toshihiro Shimizu 890ddd
		} else if (meter > in + line + out + step) {
Toshihiro Shimizu 890ddd
			s += step;
Toshihiro Shimizu 890ddd
			meter += step;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		double slope = 0;
Toshihiro Shimizu 890ddd
		if (s <= length - out) {
Toshihiro Shimizu 890ddd
			slope = get_line_slope(meter, in, line, out);
Toshihiro Shimizu 890ddd
			slopetmp = slope;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			slope = (length - s) * (slopetmp / out);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * (pos.thick) * slope;
Toshihiro Shimizu 890ddd
		if (pos.thick * slope < 1)
Toshihiro Shimizu 890ddd
			center = 0.0;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			center = 0.5;
Toshihiro Shimizu 890ddd
		pos1 = pos + v;
Toshihiro Shimizu 890ddd
		pos2 = pos + v * 0.5;
Toshihiro Shimizu 890ddd
		pos3 = pos - v * 0.5;
Toshihiro Shimizu 890ddd
		pos4 = pos - v;
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
			pv.push_back(oldPos1);
Toshihiro Shimizu 890ddd
			pv.push_back(pos1);
Toshihiro Shimizu 890ddd
			pv.push_back(pos2);
Toshihiro Shimizu 890ddd
			pv.push_back(oldPos2);
Toshihiro Shimizu 890ddd
			sfu.drawGradedPolyline(flash, pv, color_transp, color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			pv.clear();
Toshihiro Shimizu 890ddd
			pv.push_back(oldPos2);
Toshihiro Shimizu 890ddd
			pv.push_back(pos2);
Toshihiro Shimizu 890ddd
			pv.push_back(pos3);
Toshihiro Shimizu 890ddd
			pv.push_back(oldPos3);
Toshihiro Shimizu 890ddd
			flash.setFillColor(color);
Toshihiro Shimizu 890ddd
			flash.drawPolyline(pv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			pv.clear();
Toshihiro Shimizu 890ddd
			pv.push_back(oldPos3);
Toshihiro Shimizu 890ddd
			pv.push_back(pos3);
Toshihiro Shimizu 890ddd
			pv.push_back(pos4);
Toshihiro Shimizu 890ddd
			pv.push_back(oldPos4);
Toshihiro Shimizu 890ddd
			sfu.drawGradedPolyline(flash, pv, color, color_transp);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		oldPos1 = pos1;
Toshihiro Shimizu 890ddd
		oldPos2 = pos2;
Toshihiro Shimizu 890ddd
		oldPos3 = pos3;
Toshihiro Shimizu 890ddd
		oldPos4 = pos4;
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
		meter += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TRopeStrokeStyle::TRopeStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32(255, 135, 0)), m_bend(0.4)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TRopeStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TRopeStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TRopeStrokeStyle::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 TRopeStrokeStyle::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 TRopeStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TRopeStrokeStyle", "Tilt");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRopeStrokeStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = -1.0;
Toshihiro Shimizu 890ddd
	max = 1.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TRopeStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return m_bend;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRopeStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	m_bend = value;
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRopeStrokeStyle::computeData(Points &positions,
Toshihiro Shimizu 890ddd
								   const TStroke *stroke,
Toshihiro Shimizu 890ddd
								   const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	// spessore della catena = spessore "medio" dello stroke
Toshihiro Shimizu 890ddd
	double step = 10.0;
Toshihiro Shimizu 890ddd
	double bend;
Toshihiro Shimizu 890ddd
	double bump;
Toshihiro Shimizu 890ddd
	double bump_max = step / 4;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	positions.clear();
Toshihiro Shimizu 890ddd
	positions.reserve(tceil(length / step) + 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldPos1, oldPos2;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		bend = pos.thick * m_bend;
Toshihiro Shimizu 890ddd
		bump = pos.thick * 0.3;
Toshihiro Shimizu 890ddd
		if (bump >= bump_max)
Toshihiro Shimizu 890ddd
			bump = bump_max;
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * pos.thick;
Toshihiro Shimizu 890ddd
		TPointD v1 = v * 0.2;
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			positions.push_back(pos + (bend + bump) * u + v - v1);
Toshihiro Shimizu 890ddd
			positions.push_back(pos + (bend)*u + v);
Toshihiro Shimizu 890ddd
			positions.push_back(oldPos1 + (bump)*u + v1);
Toshihiro Shimizu 890ddd
			positions.push_back(oldPos1);
Toshihiro Shimizu 890ddd
			positions.push_back(oldPos2);
Toshihiro Shimizu 890ddd
			positions.push_back(oldPos2 + bump * u - v1);
Toshihiro Shimizu 890ddd
			positions.push_back(pos + u * (-bend) - v);
Toshihiro Shimizu 890ddd
			positions.push_back(pos + u * (bump - bend) - v + v1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		oldPos1 = pos + (bend + bump) * u + v - v1;
Toshihiro Shimizu 890ddd
		oldPos2 = pos + u * (bump - bend) - v + v1;
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	positions.push_back(oldPos1);
Toshihiro Shimizu 890ddd
	positions.push_back(oldPos2);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRopeStrokeStyle::drawStroke(const TColorFunction *cf, Points &positions, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (positions.size() <= 1)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  GLuint  rope_id;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 blackcolor(TPixel32::Black);
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		blackcolor = (*(cf))(blackcolor);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		blackcolor = blackcolor;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//rope_id = glGenLists(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static const int stride = sizeof(TPointD);
Toshihiro Shimizu 890ddd
	glEnableClientState(GL_VERTEX_ARRAY);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UINT i = 0;
Toshihiro Shimizu 890ddd
	for (; i < positions.size() - 2; i += 8) {
Toshihiro Shimizu 890ddd
		/*
Toshihiro Shimizu 890ddd
      glNewList(rope_id,GL_COMPILE);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i+1]);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i+2]);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i+3]);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i+4]);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i+5]);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i+6]);
Toshihiro Shimizu 890ddd
		  tglVertex(positions[i+7]);
Toshihiro Shimizu 890ddd
      glEndList();
Toshihiro Shimizu 890ddd
      */
Toshihiro Shimizu 890ddd
		tglColor(color);
Toshihiro Shimizu 890ddd
		//glBegin(GL_POLYGON);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glVertexPointer(2, GL_DOUBLE, stride, &positions[i]);
Toshihiro Shimizu 890ddd
		glDrawArrays(GL_POLYGON, 0, 8);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//glCallList(rope_id);
Toshihiro Shimizu 890ddd
		//glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		tglColor(blackcolor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
		glVertexPointer(2, GL_DOUBLE, stride, &positions[i]);
Toshihiro Shimizu 890ddd
		glDrawArrays(GL_LINE_STRIP, 0, 8);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//glCallList(rope_id);
Toshihiro Shimizu 890ddd
		//glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glDisableClientState(GL_VERTEX_ARRAY);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
	tglVertex(positions[i + 1]);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//glDeleteLists(rope_id,1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TRopeStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// spessore della catena = spessore "medio" dello stroke
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double step = 10.0;
Toshihiro Shimizu 890ddd
	double bend;
Toshihiro Shimizu 890ddd
	double bump;
Toshihiro Shimizu 890ddd
	double bump_max = step / 4;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
	TPixel32 blackcolor(TPixel32::Black);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD oldPos1, oldPos2;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		bend = pos.thick * m_bend;
Toshihiro Shimizu 890ddd
		bump = pos.thick * 0.3;
Toshihiro Shimizu 890ddd
		if (bump >= bump_max)
Toshihiro Shimizu 890ddd
			bump = bump_max;
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * pos.thick;
Toshihiro Shimizu 890ddd
		TPointD v1 = v * 0.2;
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			const int nbpp = 8;
Toshihiro Shimizu 890ddd
			TPointD pp[nbpp];
Toshihiro Shimizu 890ddd
			pp[0] = (pos + (bend + bump) * u + v - v1);
Toshihiro Shimizu 890ddd
			pp[1] = (pos + (bend)*u + v);
Toshihiro Shimizu 890ddd
			pp[2] = (oldPos1 + (bump)*u + v1);
Toshihiro Shimizu 890ddd
			pp[3] = (oldPos1);
Toshihiro Shimizu 890ddd
			pp[4] = (oldPos2);
Toshihiro Shimizu 890ddd
			pp[5] = (oldPos2 + bump * u - v1);
Toshihiro Shimizu 890ddd
			pp[6] = (pos + u * (-bend) - v);
Toshihiro Shimizu 890ddd
			pp[7] = (pos + u * (bump - bend) - v + v1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
			int i;
Toshihiro Shimizu 890ddd
			for (i = 0; i < nbpp; i++)
Toshihiro Shimizu 890ddd
				pv.push_back(pp[i]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			flash.setFillColor(color);
Toshihiro Shimizu 890ddd
			flash.drawPolyline(pv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
			for (i = 0; i < (nbpp - 1); i++)
Toshihiro Shimizu 890ddd
				sv.push_back(TSegment(pp[i], pp[i + 1]));
Toshihiro Shimizu 890ddd
			flash.setThickness(1.0);
Toshihiro Shimizu 890ddd
			flash.setLineColor(blackcolor);
Toshihiro Shimizu 890ddd
			flash.drawSegments(sv, false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		oldPos1 = pos + (bend + bump) * u + v - v1;
Toshihiro Shimizu 890ddd
		oldPos2 = pos + u * (bump - bend) - v + v1;
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
	sv.push_back(TSegment(oldPos1, oldPos2));
Toshihiro Shimizu 890ddd
	flash.setLineColor(blackcolor);
Toshihiro Shimizu 890ddd
	flash.drawSegments(sv, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TCrystallizeStrokeStyle::TCrystallizeStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32(255, 150, 150, 255)), m_period(10.0), m_opacity(0.5)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TCrystallizeStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TCrystallizeStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TCrystallizeStrokeStyle::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 TCrystallizeStrokeStyle::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 TCrystallizeStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("TCrystallizeStrokeStyle", "Crease") : QCoreApplication::translate("TCrystallizeStrokeStyle", "Opacity");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCrystallizeStrokeStyle::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 = 1.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TCrystallizeStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? m_period : m_opacity;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCrystallizeStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_period = value;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_opacity = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//updateVersionNumber(); non serve perche' i parametri vengono sfrutttati direttamente nella draw
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCrystallizeStrokeStyle::computeData(Points &positions,
Toshihiro Shimizu 890ddd
										  const TStroke *stroke,
Toshihiro Shimizu 890ddd
										  const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 10.0;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	positions.clear();
Toshihiro Shimizu 890ddd
	positions.reserve(tceil((length + 1) / step));
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * (pos.thick / 2);
Toshihiro Shimizu 890ddd
		positions.push_back(pos + v * (1 + rnd.getFloat()) + u * 2 * rnd.getFloat());
Toshihiro Shimizu 890ddd
		positions.push_back(pos - v * (1 + rnd.getFloat()) - u * 2 * rnd.getFloat());
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCrystallizeStrokeStyle::drawStroke(const TColorFunction *cf, Points &positions, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 10.0;
Toshihiro Shimizu 890ddd
	double period = (101 - m_period) * step;
Toshihiro Shimizu 890ddd
	double counter = 0;
Toshihiro Shimizu 890ddd
	double opacity = m_opacity;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixelD dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
	//double s = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < (int)positions.size() / 2; i++) {
Toshihiro Shimizu 890ddd
		if (counter > period)
Toshihiro Shimizu 890ddd
			counter = 0;
Toshihiro Shimizu 890ddd
		glColor4d(dcolor.r, dcolor.g, dcolor.b, (opacity + (counter / period) * rnd.getFloat()) * dcolor.m);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i * 2]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i * 2 + 1]);
Toshihiro Shimizu 890ddd
		counter += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	counter = 0;
Toshihiro Shimizu 890ddd
	glColor4d(dcolor.r, dcolor.g, dcolor.b, dcolor.m);
Toshihiro Shimizu 890ddd
	for (int j = 1; j < (int)positions.size() / 2; j++) {
Toshihiro Shimizu 890ddd
		glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
		tglVertex(positions[(j - 1) * 2]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[j * 2]);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
		glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
		tglVertex(positions[(j - 1) * 2 + 1]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[j * 2 + 1]);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TCrystallizeStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 10.0;
Toshihiro Shimizu 890ddd
	double period = m_period * step;
Toshihiro Shimizu 890ddd
	double counter = 0;
Toshihiro Shimizu 890ddd
	double opacity = m_opacity;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	//  const double flashGrad=16384.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixelD dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
	vector<tpointd> points1;</tpointd>
Toshihiro Shimizu 890ddd
	vector<tpointd> points2;</tpointd>
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * (pos.thick / 2);
Toshihiro Shimizu 890ddd
		points1.push_back(pos + v * (1 + rnd.getFloat()) + u * 2 * rnd.getFloat());
Toshihiro Shimizu 890ddd
		points2.push_back(pos - v * (1 + rnd.getFloat()) - u * 2 * rnd.getFloat());
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Just for the polygon grading function
Toshihiro Shimizu 890ddd
	//  SRegionDrawInFlash rdf;
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	TPixelD ldcolorPrev = dcolor;
Toshihiro Shimizu 890ddd
	ldcolorPrev.m = (opacity + (0.0 / period) * rnd.getFloat()) * dcolor.m;
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < (int)(points1.size() - 1); i++) {
Toshihiro Shimizu 890ddd
		if (counter > period)
Toshihiro Shimizu 890ddd
			counter = 0;
Toshihiro Shimizu 890ddd
		TPixelD ldcolor = dcolor;
Toshihiro Shimizu 890ddd
		ldcolor.m = (opacity + (counter / period) * rnd.getFloat()) * dcolor.m;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPixel32 lcolorPrev;
Toshihiro Shimizu 890ddd
		lcolorPrev = toPixel32(ldcolorPrev);
Toshihiro Shimizu 890ddd
		TPixel32 lcolor;
Toshihiro Shimizu 890ddd
		lcolor = toPixel32(ldcolor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vector<tpointd> tpv;</tpointd>
Toshihiro Shimizu 890ddd
		tpv.push_back(points1[i]);
Toshihiro Shimizu 890ddd
		tpv.push_back(points2[i]);
Toshihiro Shimizu 890ddd
		tpv.push_back(points2[i + 1]);
Toshihiro Shimizu 890ddd
		tpv.push_back(points1[i + 1]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Solid Color version
Toshihiro Shimizu 890ddd
		//	flash.setFillColor(blend(lcolorPrev,lcolor,0.5));
Toshihiro Shimizu 890ddd
		//    flash.drawPolyline(tpv);
Toshihiro Shimizu 890ddd
		sfu.drawGradedPolyline(flash, tpv, lcolorPrev, lcolor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		counter += step;
Toshihiro Shimizu 890ddd
		ldcolorPrev = ldcolor;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	counter = 0;
Toshihiro Shimizu 890ddd
	vector<tsegment> tsv1, tsv2;</tsegment>
Toshihiro Shimizu 890ddd
	for (int j = 1; j < (int)points1.size(); j++) {
Toshihiro Shimizu 890ddd
		tsv1.push_back(TSegment(points1[j - 1], points1[j]));
Toshihiro Shimizu 890ddd
		tsv2.push_back(TSegment(points2[j - 1], points2[j]));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	flash.setThickness(1.0);
Toshihiro Shimizu 890ddd
	flash.setLineColor(color);
Toshihiro Shimizu 890ddd
	flash.drawSegments(tsv1, false);
Toshihiro Shimizu 890ddd
	flash.drawSegments(tsv2, false);
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
class Stripe
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TPointD oldpos1;
Toshihiro Shimizu 890ddd
	TPointD oldpos2;
Toshihiro Shimizu 890ddd
	TPointD pos1;
Toshihiro Shimizu 890ddd
	TPointD pos2;
Toshihiro Shimizu 890ddd
	int phase;
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	Stripe();
Toshihiro Shimizu 890ddd
	void drawpolygon();
Toshihiro Shimizu 890ddd
	void drawpolygon(TFlash &flash);
Toshihiro Shimizu 890ddd
	void drawlines(TPixel32 blackcolor);
Toshihiro Shimizu 890ddd
	void addToSegment(vector<tsegment> *sv, vector<tsegment> &scontour, TPixel32 *colors);</tsegment></tsegment>
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Stripe::Stripe()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	oldpos1 = TPointD(0, 0);
Toshihiro Shimizu 890ddd
	oldpos2 = TPointD(0, 0);
Toshihiro Shimizu 890ddd
	pos1 = TPointD(0, 0);
Toshihiro Shimizu 890ddd
	pos2 = TPointD(0, 0);
Toshihiro Shimizu 890ddd
	color = TPixel32(0, 0, 0);
Toshihiro Shimizu 890ddd
	phase = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Stripe::drawpolygon()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
	glBegin(GL_POLYGON);
Toshihiro Shimizu 890ddd
	tglVertex(oldpos1);
Toshihiro Shimizu 890ddd
	tglVertex(pos1);
Toshihiro Shimizu 890ddd
	tglVertex(pos2);
Toshihiro Shimizu 890ddd
	tglVertex(oldpos2);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Stripe::drawpolygon(TFlash &flash)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
	pv.push_back(oldpos1);
Toshihiro Shimizu 890ddd
	pv.push_back(oldpos2);
Toshihiro Shimizu 890ddd
	pv.push_back(pos2);
Toshihiro Shimizu 890ddd
	pv.push_back(pos1);
Toshihiro Shimizu 890ddd
	flash.setThickness(0);
Toshihiro Shimizu 890ddd
	flash.setFillColor(color);
Toshihiro Shimizu 890ddd
	flash.drawPolyline(pv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Draws the black contour
Toshihiro Shimizu 890ddd
	flash.setThickness(0.5);
Toshihiro Shimizu 890ddd
	flash.setLineColor(TPixel32::Black);
Toshihiro Shimizu 890ddd
	vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
	sv.push_back(TSegment(oldpos1, pos1));
Toshihiro Shimizu 890ddd
	sv.push_back(TSegment(oldpos2, pos2));
Toshihiro Shimizu 890ddd
	flash.drawSegments(sv, false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// It is better, but the flash.drawLine() is missing in my SDK
Toshihiro Shimizu 890ddd
	/*	flash.setThickness(0.5);
Toshihiro Shimizu 890ddd
    flash.setLineColor(TPixel32::Black);
Toshihiro Shimizu 890ddd
	flash.drawLine(oldpos1,pos1);
Toshihiro Shimizu 890ddd
	flash.drawLine(oldpos2,pos2);
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Stripe::addToSegment(vector<tsegment> *sv, vector<tsegment> &scontour,</tsegment></tsegment>
Toshihiro Shimizu 890ddd
						  TPixel32 *colors)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPointD p0 = (oldpos1 + oldpos2) * 0.5;
Toshihiro Shimizu 890ddd
	TPointD p1 = (pos1 + pos2) * 0.5;
Toshihiro Shimizu 890ddd
	//	TPointD p0=oldpos1;
Toshihiro Shimizu 890ddd
	//	TPointD p1=pos1;
Toshihiro Shimizu 890ddd
	if (color == colors[0])
Toshihiro Shimizu 890ddd
		sv[0].push_back(TSegment(p0, p1));
Toshihiro Shimizu 890ddd
	if (color == colors[1])
Toshihiro Shimizu 890ddd
		sv[1].push_back(TSegment(p0, p1));
Toshihiro Shimizu 890ddd
	if (color == colors[2])
Toshihiro Shimizu 890ddd
		sv[2].push_back(TSegment(p0, p1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	scontour.push_back(TSegment(oldpos1, pos1));
Toshihiro Shimizu 890ddd
	scontour.push_back(TSegment(oldpos2, pos2));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Stripe::drawlines(TPixel32 blackcolor)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tglColor(blackcolor);
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglVertex(oldpos1);
Toshihiro Shimizu 890ddd
	tglVertex(pos1);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglVertex(pos2);
Toshihiro Shimizu 890ddd
	tglVertex(oldpos2);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TBraidStrokeStyle::TBraidStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_period(80.0)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_colors[0] = TPixel32::Red;
Toshihiro Shimizu 890ddd
	m_colors[1] = TPixel32::Green;
Toshihiro Shimizu 890ddd
	m_colors[2] = TPixel32::Blue;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TBraidStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TBraidStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TBraidStrokeStyle::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 TBraidStrokeStyle::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 TBraidStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TBraidStrokeStyle", "Twirl");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBraidStrokeStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = 1.0;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TBraidStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return m_period;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBraidStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	m_period = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TBraidStrokeStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 tmp;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case (0):
Toshihiro Shimizu 890ddd
		tmp = m_colors[0];
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case (1):
Toshihiro Shimizu 890ddd
		tmp = m_colors[1];
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case (2):
Toshihiro Shimizu 890ddd
		tmp = m_colors[2];
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return tmp;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBraidStrokeStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case (0):
Toshihiro Shimizu 890ddd
		m_colors[0] = color;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case (1):
Toshihiro Shimizu 890ddd
		m_colors[1] = color;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case (2):
Toshihiro Shimizu 890ddd
		m_colors[2] = color;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBraidStrokeStyle::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 112)
Toshihiro Shimizu 890ddd
		throw TException("Braid stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_colors[0] >> m_period;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_period /= 10.0;
Toshihiro Shimizu 890ddd
	m_colors[0] = TPixel32::Red;
Toshihiro Shimizu 890ddd
	m_colors[1] = TPixel32::Green;
Toshihiro Shimizu 890ddd
	m_colors[2] = TPixel32::Blue;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBraidStrokeStyle::drawStroke(const TColorFunction *cf, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	const int ntick = 81;
Toshihiro Shimizu 890ddd
	const double stripethickness = 0.3;
Toshihiro Shimizu 890ddd
	int period = (int)(101 - m_period) * 20;
Toshihiro Shimizu 890ddd
	double step = period / (double)ntick;
Shinya Kitaoka ee259f
	double freq = M_2PI / ntick;
Toshihiro Shimizu 890ddd
	int swapcount = 0;
Toshihiro Shimizu 890ddd
	int count = 0;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	double swap;
Toshihiro Shimizu 890ddd
	vector<stripe> braid;</stripe>
Toshihiro Shimizu 890ddd
	vector<double> ssin;</double>
Toshihiro Shimizu 890ddd
	int k = 0;
Toshihiro Shimizu 890ddd
	TPixel32 colors[3];
Toshihiro Shimizu 890ddd
	for (k = 0; k < 3; k++) {
Toshihiro Shimizu 890ddd
		if (cf)
Toshihiro Shimizu 890ddd
			colors[k] = (*(cf))(m_colors[k]);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			colors[k] = m_colors[k];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TPixel32 blackcolor = TPixel32::Black;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		blackcolor = (*(cf))(blackcolor);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (k = 0; k < 3; k++) {
Toshihiro Shimizu 890ddd
		Stripe tmp;
Toshihiro Shimizu 890ddd
		tmp.phase = (ntick * k) / 3;
Toshihiro Shimizu 890ddd
		tmp.color = colors[k];
Toshihiro Shimizu 890ddd
		braid.push_back(tmp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int z = 0; z < ntick; z++) {
Toshihiro Shimizu 890ddd
		double tmpsin = sin(z * freq);
Toshihiro Shimizu 890ddd
		ssin.push_back(tmpsin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		count++;
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * pos.thick;
Toshihiro Shimizu 890ddd
		TPointD v1 = v * stripethickness;
Toshihiro Shimizu 890ddd
		v = v * 0.5;
Toshihiro Shimizu 890ddd
		//int modper=(int)s%(int)period;
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
			swap = 0;
Toshihiro Shimizu 890ddd
			for (int j = 0; j < (int)braid.size(); j++) {
Toshihiro Shimizu 890ddd
				int tmp = (count + braid[j].phase) % ntick;
Toshihiro Shimizu 890ddd
				braid[j].oldpos1 = pos + v * ssin[tmp];
Toshihiro Shimizu 890ddd
				braid[j].oldpos2 = pos + v * ssin[tmp] + v1;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			for (int i = 0; i < (int)braid.size(); i++) {
Toshihiro Shimizu 890ddd
				int tmp = (count + braid[i].phase) % ntick;
Toshihiro Shimizu 890ddd
				braid[i].pos1 = pos + v * ssin[tmp];
Toshihiro Shimizu 890ddd
				braid[i].pos2 = pos + v * ssin[tmp] + v1;
Toshihiro Shimizu 890ddd
				braid[i].drawpolygon();
Toshihiro Shimizu 890ddd
				braid[i].drawlines(blackcolor);
Toshihiro Shimizu 890ddd
				braid[i].oldpos1 = pos + v * ssin[tmp];
Toshihiro Shimizu 890ddd
				braid[i].oldpos2 = pos + v * ssin[tmp] + v1;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
		swap += step;
Toshihiro Shimizu 890ddd
		if (swap > (period / 3.0)) {
Toshihiro Shimizu 890ddd
			swapcount++;
Toshihiro Shimizu 890ddd
			tswap(braid[0], braid[1 + (swapcount & 1)]);
Toshihiro Shimizu 890ddd
			swap -= period / 3.0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBraidStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	const int ntick = 162;
Toshihiro Shimizu 890ddd
	const double stripethickness = 0.3;
Toshihiro Shimizu 890ddd
	int period = (int)(101 - m_period) * 20;
Toshihiro Shimizu 890ddd
	double step = period / (double)ntick;
Shinya Kitaoka ee259f
	double freq = M_2PI / ntick;
Toshihiro Shimizu 890ddd
	int swapcount = 0;
Toshihiro Shimizu 890ddd
	int count = 0;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	double swap;
Toshihiro Shimizu 890ddd
	vector<stripe> braid;</stripe>
Toshihiro Shimizu 890ddd
	vector<double> ssin;</double>
Toshihiro Shimizu 890ddd
	int k = 0;
Toshihiro Shimizu 890ddd
	TPixel32 colors[3];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (k = 0; k < 3; k++)
Toshihiro Shimizu 890ddd
		colors[k] = m_colors[k];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 blackcolor = TPixel32::Black;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (k = 0; k < 3; k++) {
Toshihiro Shimizu 890ddd
		Stripe tmp;
Toshihiro Shimizu 890ddd
		tmp.phase = (ntick * k) / 3;
Toshihiro Shimizu 890ddd
		tmp.color = colors[k];
Toshihiro Shimizu 890ddd
		braid.push_back(tmp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int z = 0; z < ntick; z++) {
Toshihiro Shimizu 890ddd
		double tmpsin = sin(z * freq);
Toshihiro Shimizu 890ddd
		ssin.push_back(tmpsin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		count++;
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * pos.thick;
Toshihiro Shimizu 890ddd
		TPointD v1 = v * stripethickness;
Toshihiro Shimizu 890ddd
		v = v * 0.5;
Toshihiro Shimizu 890ddd
		//int modper=(int)s%(int)period;
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
			swap = 0;
Toshihiro Shimizu 890ddd
			for (int j = 0; j < (int)braid.size(); j++) {
Toshihiro Shimizu 890ddd
				int tmp = (count + braid[j].phase) % ntick;
Toshihiro Shimizu 890ddd
				braid[j].oldpos1 = pos + v * ssin[tmp];
Toshihiro Shimizu 890ddd
				braid[j].oldpos2 = pos + v * ssin[tmp] + v1;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			for (int i = 0; i < (int)braid.size(); i++) {
Toshihiro Shimizu 890ddd
				int tmp = (count + braid[i].phase) % ntick;
Toshihiro Shimizu 890ddd
				braid[i].pos1 = pos + v * ssin[tmp];
Toshihiro Shimizu 890ddd
				braid[i].pos2 = pos + v * ssin[tmp] + v1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				braid[i].drawpolygon(flash);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				braid[i].oldpos1 = pos + v * ssin[tmp];
Toshihiro Shimizu 890ddd
				braid[i].oldpos2 = pos + v * ssin[tmp] + v1;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
		swap += step;
Toshihiro Shimizu 890ddd
		if (swap > (period / 3.0)) {
Toshihiro Shimizu 890ddd
			swapcount++;
Toshihiro Shimizu 890ddd
			tswap(braid[0], braid[1 + (swapcount & 1)]);
Toshihiro Shimizu 890ddd
			swap -= period / 3.0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TSketchStrokeStyle::TSketchStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32(100, 100, 150, 127)), m_density(0.4)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TSketchStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TSketchStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TSketchStrokeStyle::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 TSketchStrokeStyle::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 TSketchStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TSketchStrokeStyle", "Density");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSketchStrokeStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = 0.0;
Toshihiro Shimizu 890ddd
	max = 1.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TSketchStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return m_density;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSketchStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	m_density = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSketchStrokeStyle::drawStroke(const TColorFunction *cf, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	if (length <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int count = (int)(length * m_density);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 12c444
	double maxDw = std::min(1.0, 20.0 / length);
Toshihiro Shimizu 890ddd
	double minDw = 1.0 / length;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < count; i++) {
Toshihiro Shimizu 890ddd
		double r = rnd.getFloat();
Toshihiro Shimizu 890ddd
		double dw = (1 - r) * minDw + r * maxDw;
Toshihiro Shimizu 890ddd
		double wmin = dw, wmax = 1 - dw;
Toshihiro Shimizu 890ddd
		if (wmin >= wmax)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		r = rnd.getFloat();
Toshihiro Shimizu 890ddd
		double w = (1 - r) * wmin + r * wmax;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double w0 = w - dw;
Toshihiro Shimizu 890ddd
		double w1 = w + dw;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TThickPoint p0 = stroke->getThickPoint(w0);
Toshihiro Shimizu 890ddd
		TThickPoint p1 = stroke->getThickPoint(w1);
Toshihiro Shimizu 890ddd
		double d01 = tdistance(p0, p1);
Toshihiro Shimizu 890ddd
		if (d01 == 0)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int count = (int)(d01);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPointD v0 = stroke->getSpeed(w0);
Toshihiro Shimizu 890ddd
		TPointD v1 = stroke->getSpeed(w1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (norm2(v0) == 0 || norm2(v1) == 0)
Toshihiro Shimizu 890ddd
			continue; // non dovrebbe succedere mai, ma....
Toshihiro Shimizu 890ddd
		v0 = rotate90(normalize(v0));
Toshihiro Shimizu 890ddd
		v1 = rotate90(normalize(v1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double delta = 0.5 * (rnd.getFloat() - 0.5) * (p0.thick + p1.thick);
Toshihiro Shimizu 890ddd
		double d = 0.1 * d01;
Toshihiro Shimizu 890ddd
		double delta0 = delta - d;
Toshihiro Shimizu 890ddd
		double delta1 = delta + d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
		tglVertex(p0 + v0 * delta0);
Toshihiro Shimizu 890ddd
		for (int j = 1; j < count; j++) {
Toshihiro Shimizu 890ddd
			double t = j / (double)count;
Toshihiro Shimizu 890ddd
			w = (1 - t) * w0 + t * w1;
Toshihiro Shimizu 890ddd
			TPointD v = rotate90(normalize(stroke->getSpeed(w)));
Toshihiro Shimizu 890ddd
			assert(0 <= w && w <= 1);
Toshihiro Shimizu 890ddd
			TPointD p = stroke->getPoint(w);
Toshihiro Shimizu 890ddd
			double delta_t = (1 - t) * delta0 + t * delta1;
Toshihiro Shimizu 890ddd
			tglVertex(p + v * delta_t);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		tglVertex(p1 + v1 * delta1);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glColor4d(0, 0, 0, 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSketchStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	if (length <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	vector<tquadratic> quadsArray;</tquadratic>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int count = (int)(length * m_density);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 12c444
	double maxDw = std::min(1.0, 20.0 / length);
Toshihiro Shimizu 890ddd
	double minDw = 1.0 / length;
Toshihiro Shimizu 890ddd
	TPixel color(m_color.r, m_color.g, m_color.b, m_color.m);
Toshihiro Shimizu 890ddd
	flash.setLineColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < count; i++) {
Toshihiro Shimizu 890ddd
		double r = rnd.getFloat();
Toshihiro Shimizu 890ddd
		double dw = (1 - r) * minDw + r * maxDw;
Toshihiro Shimizu 890ddd
		double wmin = dw, wmax = 1 - dw;
Toshihiro Shimizu 890ddd
		if (wmin >= wmax)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		r = rnd.getFloat();
Toshihiro Shimizu 890ddd
		double w = (1 - r) * wmin + r * wmax;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double w0 = w - dw;
Toshihiro Shimizu 890ddd
		double w1 = w + dw;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TThickPoint p0 = stroke->getThickPoint(w0);
Toshihiro Shimizu 890ddd
		TThickPoint p1 = stroke->getThickPoint(w1);
Toshihiro Shimizu 890ddd
		double d01 = tdistance(p0, p1);
Toshihiro Shimizu 890ddd
		if (d01 == 0)
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//int count = (int)(d01);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPointD v0 = stroke->getSpeed(w0);
Toshihiro Shimizu 890ddd
		TPointD v1 = stroke->getSpeed(w1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (norm2(v0) == 0 || norm2(v1) == 0)
Toshihiro Shimizu 890ddd
			continue; // non dovrebbe succedere mai, ma....
Toshihiro Shimizu 890ddd
		v0 = rotate90(normalize(v0));
Toshihiro Shimizu 890ddd
		v1 = rotate90(normalize(v1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double delta = 0.5 * (rnd.getFloat() - 0.5) * (p0.thick + p1.thick);
Toshihiro Shimizu 890ddd
		double d = 0.1 * d01;
Toshihiro Shimizu 890ddd
		double delta0 = delta - d;
Toshihiro Shimizu 890ddd
		double delta1 = delta + d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(normalize(stroke->getSpeed(0.5 * (w0 + w1))));
Toshihiro Shimizu 890ddd
		TPointD p = stroke->getPoint(0.5 * (w0 + w1));
Toshihiro Shimizu 890ddd
		double delta_t = 0.5 * (delta0 + delta1);
Toshihiro Shimizu 890ddd
		//quadsArray.push_back(TSegment(p0 + v0*delta0, p1 + v1*delta1));
Toshihiro Shimizu 890ddd
		TPointD pp0 = p0 + v0 * delta0;
Toshihiro Shimizu 890ddd
		TPointD pp2 = p1 + v1 * delta1;
Toshihiro Shimizu 890ddd
		TPointD pp1 = 2 * (p + v * delta_t) - 0.5 * (pp0 + pp2); //punto p1 ottenuto imponendo che la quad passi per il punto p in t=.5
Toshihiro Shimizu 890ddd
		quadsArray.push_back(TQuadratic(pp0, pp1, pp2));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	flash.drawquads(quadsArray);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TBubbleStrokeStyle::TBubbleStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color0(TPixel32::Red), m_color1(TPixel32::Green)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TBubbleStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TBubbleStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBubbleStrokeStyle::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 114)
Toshihiro Shimizu 890ddd
		throw TException("Bubble  stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_color0 = TPixel32::Red;
Toshihiro Shimizu 890ddd
	m_color1 = TPixel32::Green;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBubbleStrokeStyle::drawStroke(const TColorFunction *cf, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	if (length <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRandom rnd(0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color0, color1;
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		color0 = (*(cf))(m_color0);
Toshihiro Shimizu 890ddd
		color1 = (*(cf))(m_color1);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		color0 = m_color0;
Toshihiro Shimizu 890ddd
		color1 = m_color1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double minthickness = MINTHICK * sqrt(tglGetPixelSize2());
Toshihiro Shimizu 890ddd
	double thickness = 0;
Toshihiro Shimizu 890ddd
	for (double s = 0; s < length; s += 5) {
Toshihiro Shimizu 890ddd
		TPointD p = stroke->getPointAtLength(s);
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		int toff = rnd.getInt(0, 999);
Toshihiro Shimizu 890ddd
		int t = (m_currentFrame + toff) % 1000;
Toshihiro Shimizu 890ddd
		TRandom rnd2(t >> 2);
Toshihiro Shimizu 890ddd
		p += 2 * TPointD(-0.5 + rnd2.getFloat(), -0.5 + rnd2.getFloat());
Toshihiro Shimizu 890ddd
		if (pos.thick < MINTHICK)
Toshihiro Shimizu 890ddd
			thickness = minthickness;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			thickness = pos.thick;
Toshihiro Shimizu 890ddd
		tglColor(blend(color0, color1, rnd.getFloat()));
Toshihiro Shimizu 890ddd
		double radius = (t & ((int)(thickness)));
Toshihiro Shimizu 890ddd
		tglDrawCircle(p, radius);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBubbleStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	if (length <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRandom rnd(0);
Toshihiro Shimizu 890ddd
	static int count = 0;
Toshihiro Shimizu 890ddd
	count++;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color0 = m_color0;
Toshihiro Shimizu 890ddd
	TPixel32 color1 = m_color1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (double s = 0; s < length; s += 5) {
Toshihiro Shimizu 890ddd
		TPointD p = stroke->getPointAtLength(s);
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		int toff = rnd.getInt(0, 999);
Toshihiro Shimizu 890ddd
		int t = (count + toff) % 1000;
Toshihiro Shimizu 890ddd
		TRandom rnd2(t >> 2);
Toshihiro Shimizu 890ddd
		p += 2 * TPointD(-0.5 + rnd2.getFloat(), -0.5 + rnd2.getFloat());
Toshihiro Shimizu 890ddd
		double r = (t & ((int)(pos.thick)));
Toshihiro Shimizu 890ddd
		flash.setThickness(0.5);
Toshihiro Shimizu 890ddd
		flash.setLineColor(blend(color0, color1, rnd.getFloat()));
Toshihiro Shimizu 890ddd
		flash.setFillColor(TPixel32(0, 0, 0, 0));
Toshihiro Shimizu 890ddd
		flash.drawEllipse(p, r, r);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTissueStrokeStyle::TTissueStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Black), m_density(3.0), m_border(1.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TTissueStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TTissueStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TTissueStrokeStyle::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 TTissueStrokeStyle::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 TTissueStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("TTissueStrokeStyle", "Density") : QCoreApplication::translate("TTissueStrokeStyle", "Border Size");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTissueStrokeStyle::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 = 2.0;
Toshihiro Shimizu 890ddd
		max = 10.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TTissueStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? m_density : m_border;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTissueStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_density = value;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_border = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTissueStrokeStyle::computeData(PointMatrix &data,
Toshihiro Shimizu 890ddd
									 const TStroke *stroke,
Toshihiro Shimizu 890ddd
									 const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	data.clear();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
	double border = m_border;
Toshihiro Shimizu 890ddd
	TPointD pos1, oldPos1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	double increment = 0.0;
Toshihiro Shimizu 890ddd
	int intensity = (int)m_density + 2;
Toshihiro Shimizu 890ddd
	vector<tpointd> points;</tpointd>
Toshihiro Shimizu 890ddd
	vector<tpointd> oldpoints;</tpointd>
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		increment = (2 * pos.thick) / (intensity - 1);
Toshihiro Shimizu 890ddd
		for (int i = 1; i < intensity - 1; i++) {
Toshihiro Shimizu 890ddd
			pos1 = pos + v * (-pos.thick + i * increment);
Toshihiro Shimizu 890ddd
			points.push_back(pos1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			Points tmpPoints1;
Toshihiro Shimizu 890ddd
			tmpPoints1.clear();
Toshihiro Shimizu 890ddd
			tmpPoints1.reserve(intensity);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			for (int i = 1; i < intensity - 1; i++) {
Toshihiro Shimizu 890ddd
				pos1 = points[i - 1];
Toshihiro Shimizu 890ddd
				oldPos1 = oldpoints[i - 1];
Toshihiro Shimizu 890ddd
				tmpPoints1.push_back(oldPos1);
Toshihiro Shimizu 890ddd
				tmpPoints1.push_back(pos1);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			data.push_back(tmpPoints1);
Toshihiro Shimizu 890ddd
			if (increment > 1) {
Toshihiro Shimizu 890ddd
				int count = tceil(step / increment + 1);
Toshihiro Shimizu 890ddd
				Points tmpPoints2;
Toshihiro Shimizu 890ddd
				tmpPoints2.clear();
Toshihiro Shimizu 890ddd
				tmpPoints2.reserve(count);
Toshihiro Shimizu 890ddd
				double startpoint = -step - increment / 2.0;
Toshihiro Shimizu 890ddd
				for (int j = 1; j < step / increment + 1; j++) {
Toshihiro Shimizu 890ddd
					tmpPoints2.push_back(points[0] - v * border * increment * rnd.getFloat() + u * (startpoint + j * (increment)));
Toshihiro Shimizu 890ddd
					tmpPoints2.push_back(points[intensity - 3] + v * border * increment * rnd.getFloat() + u * (startpoint + j * (increment)));
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
				data.push_back(tmpPoints2);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		oldpoints = points;
Toshihiro Shimizu 890ddd
		points.clear();
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTissueStrokeStyle::drawStroke(const TColorFunction *cf,
Toshihiro Shimizu 890ddd
									PointMatrix &data,
Toshihiro Shimizu 890ddd
									const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PointMatrix::iterator it1 = data.begin();
Toshihiro Shimizu 890ddd
	for (; it1 != data.end(); ++it1) {
Toshihiro Shimizu 890ddd
		glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
		Points::iterator it2 = (*it1).begin();
Toshihiro Shimizu 890ddd
		for (; it2 != (*it1).end(); ++it2) {
Toshihiro Shimizu 890ddd
			tglVertex(*it2);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTissueStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
	double border = m_border;
Toshihiro Shimizu 890ddd
	TPointD pos1, oldPos1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	double increment = 0.0;
Toshihiro Shimizu 890ddd
	int intensity = (int)m_density + 2;
Toshihiro Shimizu 890ddd
	vector<tpointd> points;</tpointd>
Toshihiro Shimizu 890ddd
	vector<tpointd> oldpoints;</tpointd>
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
	flash.setThickness(1.0);
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		increment = (2 * pos.thick) / (intensity - 1);
Toshihiro Shimizu 890ddd
		for (int i = 1; i < intensity - 1; i++) {
Toshihiro Shimizu 890ddd
			pos1 = pos + v * (-pos.thick + i * increment);
Toshihiro Shimizu 890ddd
			points.push_back(pos1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			flash.setThickness(1.5);
Toshihiro Shimizu 890ddd
			vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
			for (int i = 1; i < intensity - 1; i++) {
Toshihiro Shimizu 890ddd
				pos1 = points[i - 1];
Toshihiro Shimizu 890ddd
				oldPos1 = oldpoints[i - 1];
Toshihiro Shimizu 890ddd
				sv.push_back(TSegment(oldPos1, pos1));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			flash.drawSegments(sv, false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (increment > 1) {
Toshihiro Shimizu 890ddd
				sv.clear();
Toshihiro Shimizu 890ddd
				double startpoint = -step - increment / 2.0;
Toshihiro Shimizu 890ddd
				for (int j = 1; j < step / increment + 1; j++) {
Toshihiro Shimizu 890ddd
					TPointD p0 = points[0] - v * border * increment * rnd.getFloat() + u * (startpoint + j * (increment));
Toshihiro Shimizu 890ddd
					TPointD p1 = points[intensity - 3] + v * border * increment * rnd.getFloat() + u * (startpoint + j * (increment));
Toshihiro Shimizu 890ddd
					//			vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
					sv.push_back(TSegment(p0, p1));
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
				flash.drawSegments(sv, false);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		oldpoints = points;
Toshihiro Shimizu 890ddd
		points.clear();
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TBiColorStrokeStyle::TBiColorStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color0(TPixel32::Red), m_color1(TPixel32::Black)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TBiColorStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TBiColorStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBiColorStrokeStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	is >> m_color0 >> m_color1 >> m_parameter;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBiColorStrokeStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	os << m_color0 << m_color1 << m_parameter;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBiColorStrokeStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBiColorStrokeStyle::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 115 && ids != 119)
Toshihiro Shimizu 890ddd
		throw TException("Bicolor stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_color0 >> m_parameter;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_color1 = TPixel32::Black;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBiColorStrokeStyle::drawStroke(const TColorFunction *cf, TStrokeOutline *outline,
Toshihiro Shimizu 890ddd
									 const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color0 = m_color0;
Toshihiro Shimizu 890ddd
	TPixel32 color1 = m_color1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		color0 = (*(cf))(m_color0);
Toshihiro Shimizu 890ddd
		color1 = (*(cf))(m_color1);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		color0 = m_color0;
Toshihiro Shimizu 890ddd
		color1 = m_color1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline->getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// outline with antialiasing
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(color0);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2)
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(color1);
Toshihiro Shimizu 890ddd
	for (i = 1; i < v.size(); i += 2)
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		tglColor(color0);
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
		tglColor(color1);
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i + 1].x);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBiColorStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TOutlineUtil::OutlineParameter param;
Shinya Kitaoka 12c444
	param.m_lengthStep = std::max(10.0, m_parameter);
Toshihiro Shimizu 890ddd
	TStrokeOutline outline;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline.getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color0 = m_color0;
Toshihiro Shimizu 890ddd
	TPixel32 color1 = m_color1;
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	// Just for the polygon grading function
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < (v.size() - 3); i += 2) {
Toshihiro Shimizu 890ddd
		vector<tpointd> plv;</tpointd>
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i].x, v[i].y));
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i + 2].x, v[i + 2].y));
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i + 3].x, v[i + 3].y));
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i + 1].x, v[i + 1].y));
Toshihiro Shimizu 890ddd
		//	 flash.setFillColor(blend(color0,color1,0.5));
Toshihiro Shimizu 890ddd
		//	 flash.drawPolyline(plv);
Toshihiro Shimizu 890ddd
		// graded multipolygons
Toshihiro Shimizu 890ddd
		sfu.drawGradedPolyline(flash, plv, color0, color1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TNormal2StrokeStyle::TNormal2StrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Yellow), m_lightx(45.0), m_lighty(200.0), m_shininess(50.0), m_metal(0.5), m_bend(1.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TNormal2StrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TNormal2StrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TNormal2StrokeStyle::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 TNormal2StrokeStyle::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 TNormal2StrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TNormal2StrokeStyle", "Light X Pos");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TNormal2StrokeStyle", "Light Y Pos");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TNormal2StrokeStyle", "Shininess");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TNormal2StrokeStyle", "Plastic");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TNormal2StrokeStyle", "Bump");
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 TNormal2StrokeStyle::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 = -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.1;
Toshihiro Shimizu 890ddd
		max = 128.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TNormal2StrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	double value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_lightx;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_lighty;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_shininess;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = m_metal;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		value = m_bend;
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 TNormal2StrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_lightx = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_lighty = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_shininess = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_metal = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		m_bend = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TNormal2StrokeStyle::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 121)
Toshihiro Shimizu 890ddd
		throw TException("Normal  stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_color >> m_lightx >> m_lighty >> m_shininess >> m_metal;
Toshihiro Shimizu 890ddd
	m_bend = 1.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TNormal2StrokeStyle::drawRegion(const TColorFunction *cf, const bool antiAliasing, TRegionOutline &boundary) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TNormal2StrokeStyle::drawStroke(const TColorFunction *cf, TStrokeOutline *outline,
Toshihiro Shimizu 890ddd
									 const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
	double bend = 2 * m_bend;
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline->getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	vector<t3dpointd> normal;</t3dpointd>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	GLfloat light_position[] = {(float)(m_lightx), (float)(m_lighty), 100.0, 0.0};
Toshihiro Shimizu 890ddd
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);
Toshihiro Shimizu 890ddd
	glEnable(GL_LIGHTING);
Toshihiro Shimizu 890ddd
	glEnable(GL_LIGHT0);
Toshihiro Shimizu 890ddd
	glEnable(GL_NORMALIZE);
Toshihiro Shimizu 890ddd
	GLfloat mat_ambient[] = {(float)dcolor.r, (float)dcolor.g, (float)dcolor.b, 1.0};
Toshihiro Shimizu 890ddd
	GLfloat mat_specular[] = {(float)(m_metal * (1 - dcolor.r) + dcolor.r),
Toshihiro Shimizu 890ddd
							  (float)(m_metal * (1 - dcolor.g) + dcolor.g),
Toshihiro Shimizu 890ddd
							  (float)(m_metal * (1 - dcolor.b) + dcolor.b), 1.0};
Toshihiro Shimizu 890ddd
	GLfloat mat_shininess[] = {(float)m_shininess};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
Toshihiro Shimizu 890ddd
	glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
Toshihiro Shimizu 890ddd
	glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_ambient);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// outline with antialiasing
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		T3DPointD pointa(v[i].x, v[i].y, 0);
Toshihiro Shimizu 890ddd
		T3DPointD pointb(v[i + 1].x, v[i + 1].y, 0);
Toshihiro Shimizu 890ddd
		T3DPointD d = pointb - pointa;
Toshihiro Shimizu 890ddd
		if (norm2(d) > 0.0)
Toshihiro Shimizu 890ddd
			d = normalize(d);
Toshihiro Shimizu 890ddd
		normal.push_back(d);
Toshihiro Shimizu 890ddd
		T3DPointD pointaNormal = T3DPointD(0, 0, 1) - bend * d;
Toshihiro Shimizu 890ddd
		tglNormal(pointaNormal);
Toshihiro Shimizu 890ddd
		tglVertex(pointa);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int normalcounter = 0;
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 1; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		T3DPointD pointa(v[i].x, v[i].y, 0);
Toshihiro Shimizu 890ddd
		T3DPointD pointaNormal = T3DPointD(0, 0, 1) + bend * normal[normalcounter++];
Toshihiro Shimizu 890ddd
		tglNormal(pointaNormal);
Toshihiro Shimizu 890ddd
		tglVertex(pointa);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	normalcounter = 0;
Toshihiro Shimizu 890ddd
	for (i = 0; i <= v.size() - 4; i += 2) {
Toshihiro Shimizu 890ddd
		glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
		T3DPointD olda(v[i].x, v[i].y, 0);
Toshihiro Shimizu 890ddd
		T3DPointD oldb(v[i + 1].x, v[i + 1].y, 0);
Toshihiro Shimizu 890ddd
		T3DPointD oldcenter = 0.5 * (olda + oldb);
Toshihiro Shimizu 890ddd
		T3DPointD oldcenterNormal(0, 0, 1);
Toshihiro Shimizu 890ddd
		T3DPointD oldaNormal = T3DPointD(0, 0, 1) - bend * normal[normalcounter];
Toshihiro Shimizu 890ddd
		T3DPointD oldbNormal = T3DPointD(0, 0, 1) + bend * normal[normalcounter];
Toshihiro Shimizu 890ddd
		T3DPointD a(v[i + 2].x, v[i + 2].y, 0);
Toshihiro Shimizu 890ddd
		T3DPointD b(v[i + 3].x, v[i + 3].y, 0);
Toshihiro Shimizu 890ddd
		T3DPointD center = 0.5 * (a + b);
Toshihiro Shimizu 890ddd
		T3DPointD centerNormal(0, 0, 1);
Toshihiro Shimizu 890ddd
		T3DPointD aNormal = T3DPointD(0, 0, 1) - bend * normal[normalcounter++];
Toshihiro Shimizu 890ddd
		T3DPointD bNormal = T3DPointD(0, 0, 1) + bend * normal[normalcounter];
Toshihiro Shimizu 890ddd
		tglNormal(oldaNormal);
Toshihiro Shimizu 890ddd
		tglVertex(olda);
Toshihiro Shimizu 890ddd
		tglNormal(aNormal);
Toshihiro Shimizu 890ddd
		tglVertex(a);
Toshihiro Shimizu 890ddd
		tglNormal(oldcenterNormal);
Toshihiro Shimizu 890ddd
		tglVertex(oldcenter);
Toshihiro Shimizu 890ddd
		tglNormal(centerNormal);
Toshihiro Shimizu 890ddd
		tglVertex(center);
Toshihiro Shimizu 890ddd
		tglNormal(oldbNormal);
Toshihiro Shimizu 890ddd
		tglVertex(oldb);
Toshihiro Shimizu 890ddd
		tglNormal(bNormal);
Toshihiro Shimizu 890ddd
		tglVertex(b);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glDisable(GL_NORMALIZE);
Toshihiro Shimizu 890ddd
	glDisable(GL_LIGHTING);
Toshihiro Shimizu 890ddd
	glDisable(GL_LIGHT0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TNormal2StrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	//double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	//double step=10.0;
Toshihiro Shimizu 890ddd
	TPointD pos1, pos2, pos3, pos4, oldPos1, oldPos2, oldPos3, oldPos4;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOutlineUtil::OutlineParameter param;
Toshihiro Shimizu 890ddd
	param.m_lengthStep = 10.0;
Toshihiro Shimizu 890ddd
	TStrokeOutline outline;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline.getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color1;
Toshihiro Shimizu 890ddd
	TPixelD dcolor1(0.5 * dcolor.r, 0.5 * dcolor.g, 0.5 * dcolor.b, 1.0);
Toshihiro Shimizu 890ddd
	color1 = toPixel32(dcolor1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	dcolor = TPixelD(dcolor.r + (1.0 - dcolor.r) * m_metal,
Toshihiro Shimizu 890ddd
					 dcolor.g + (1.0 - dcolor.g) * m_metal,
Toshihiro Shimizu 890ddd
					 dcolor.b + (1.0 - dcolor.b) * m_metal, dcolor.m);
Toshihiro Shimizu 890ddd
	color = toPixel32(dcolor);
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	for (int i = 0; i <= (int)(v.size() - 4); i += 2) {
Toshihiro Shimizu 890ddd
		TPointD olda(v[i].x, v[i].y);
Toshihiro Shimizu 890ddd
		TPointD oldb(v[i + 1].x, v[i + 1].y);
Toshihiro Shimizu 890ddd
		TPointD oldcenter = 0.5 * (olda + oldb);
Toshihiro Shimizu 890ddd
		TPointD a(v[i + 2].x, v[i + 2].y);
Toshihiro Shimizu 890ddd
		TPointD b(v[i + 3].x, v[i + 3].y);
Toshihiro Shimizu 890ddd
		TPointD center = 0.5 * (a + b);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vector<tpointd> vpl;</tpointd>
Toshihiro Shimizu 890ddd
		vpl.push_back(olda);
Toshihiro Shimizu 890ddd
		vpl.push_back(a);
Toshihiro Shimizu 890ddd
		vpl.push_back(center);
Toshihiro Shimizu 890ddd
		vpl.push_back(oldcenter);
Toshihiro Shimizu 890ddd
		sfu.drawGradedPolyline(flash, vpl, color1, color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vpl.clear();
Toshihiro Shimizu 890ddd
		vpl.push_back(oldb);
Toshihiro Shimizu 890ddd
		vpl.push_back(b);
Toshihiro Shimizu 890ddd
		vpl.push_back(center);
Toshihiro Shimizu 890ddd
		vpl.push_back(oldcenter);
Toshihiro Shimizu 890ddd
		sfu.drawGradedPolyline(flash, vpl, color1, color);
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
double get_inout_intensityslope(double in, double out, double t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (out < in)
Toshihiro Shimizu 890ddd
		out = in;
Toshihiro Shimizu 890ddd
	if (t < in)
Toshihiro Shimizu 890ddd
		return t / in;
Toshihiro Shimizu 890ddd
	else if (t > out)
Toshihiro Shimizu 890ddd
		return (t - 1) / (out - 1);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return 1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TChalkStrokeStyle2::TChalkStrokeStyle2()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Black), m_blend(1.0), m_intensity(50.0), m_in(0.25), m_out(0.25), m_noise(0.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TChalkStrokeStyle2::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TChalkStrokeStyle2(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TChalkStrokeStyle2::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 TChalkStrokeStyle2::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 TChalkStrokeStyle2::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChalkStrokeStyle2", "Border Fade");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChalkStrokeStyle2", "Density");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChalkStrokeStyle2", "Fade In");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChalkStrokeStyle2", "Fade Out");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TChalkStrokeStyle2", "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 TChalkStrokeStyle2::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 = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TChalkStrokeStyle2::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	double value = 0;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_blend;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_intensity;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_in;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = m_out;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		value = m_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 TChalkStrokeStyle2::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_blend = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_intensity = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_in = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_out = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		m_noise = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//updateVersionNumber(); non serve perche' i parametri vengono sfrutttati direttamente nella draw
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkStrokeStyle2::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 105)
Toshihiro Shimizu 890ddd
		throw TException("chalk stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
	m_in = 0.0, m_out = 0.0, m_noise = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	is >> m_color >> m_blend >> m_intensity;
Toshihiro Shimizu 890ddd
	m_blend = 1 - m_blend;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkStrokeStyle2::computeData(Doubles &data, const TStroke *stroke, const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 4;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	data.clear();
Toshihiro Shimizu 890ddd
	data.reserve(tceil(length / step) * 6 + 6);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		double normu = norm2(u);
Toshihiro Shimizu 890ddd
		if (normu == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		data.push_back(pos.x);
Toshihiro Shimizu 890ddd
		data.push_back(pos.y);
Toshihiro Shimizu 890ddd
		data.push_back(pos.thick);
Toshihiro Shimizu 890ddd
		data.push_back(u.x);
Toshihiro Shimizu 890ddd
		data.push_back(u.y);
Toshihiro Shimizu 890ddd
		data.push_back(s / length);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TChalkStrokeStyle2::drawStroke(const TColorFunction *cf, Doubles &data, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double step = 4;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double blend = m_blend;			   //distanza che controlla da dove il gessetto comincia il fade out  (0, 1)
Toshihiro Shimizu 890ddd
	double intensitymax = m_intensity; //quanti punti vengono disegnati ad ogni step
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	TRandom rnd_noise;
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
	double mattedcolor = 0.5 * dcolor.m;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double noise = 0;
Toshihiro Shimizu 890ddd
	double noiseslope = 0;
Toshihiro Shimizu 890ddd
	double tmpnoise = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	GLuint chalkId;
Toshihiro Shimizu 890ddd
	chalkId = glGenLists(1);
Toshihiro Shimizu 890ddd
	glNewList(chalkId, GL_COMPILE);
Toshihiro Shimizu 890ddd
	glBegin(GL_QUADS);
Toshihiro Shimizu 890ddd
	glVertex2d(1, 1);
Toshihiro Shimizu 890ddd
	glVertex2d(-1, 1);
Toshihiro Shimizu 890ddd
	glVertex2d(-1, -1);
Toshihiro Shimizu 890ddd
	glVertex2d(1, -1);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glEndList();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < data.size(); i += 6) {
Toshihiro Shimizu 890ddd
		TThickPoint pos;
Toshihiro Shimizu 890ddd
		pos.x = data[i];
Toshihiro Shimizu 890ddd
		pos.y = data[i + 1];
Toshihiro Shimizu 890ddd
		pos.thick = data[i + 2];
Toshihiro Shimizu 890ddd
		TPointD u;
Toshihiro Shimizu 890ddd
		u.x = data[i + 3];
Toshihiro Shimizu 890ddd
		u.y = data[i + 4];
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPointD shift;
Toshihiro Shimizu 890ddd
		double intslope = get_inout_intensityslope(m_in, 1 - m_out, data[i + 5]);
Toshihiro Shimizu 890ddd
		double transpslope = (intslope / blend) * dcolor.m;
Toshihiro Shimizu 890ddd
		if (m_noise) {
Toshihiro Shimizu 890ddd
			if (tmpnoise <= 0) {
Toshihiro Shimizu 890ddd
				noise = (100 / m_noise) * rnd_noise.getFloat();
Toshihiro Shimizu 890ddd
				tmpnoise = noise;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			noiseslope = get_inout_intensityslope(0.5, 0.5, tmpnoise / noise);
Toshihiro Shimizu 890ddd
			tmpnoise -= step;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			noiseslope = 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int i = 0; i < intensitymax * intslope * noiseslope; i++) {
Toshihiro Shimizu 890ddd
			double vrandnorm = rnd.getFloat(-1.0, 1.0);
Toshihiro Shimizu 890ddd
			double randomv = vrandnorm * pos.thick * noiseslope;
Toshihiro Shimizu 890ddd
			double randomu = (0.5 - rnd.getFloat()) * step;
Toshihiro Shimizu 890ddd
			shift = pos + u * randomu + v * randomv;
Toshihiro Shimizu 890ddd
			double mod = fabs(vrandnorm);
Toshihiro Shimizu 890ddd
			if (mod > 1 - blend)
Toshihiro Shimizu 890ddd
				glColor4d(dcolor.r, dcolor.g, dcolor.b, (double)rnd.getFloat() * ((1 - mod) * transpslope));
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				glColor4d(dcolor.r, dcolor.g, dcolor.b, mattedcolor);
Toshihiro Shimizu 890ddd
			glPushMatrix();
Toshihiro Shimizu 890ddd
			glTranslated(shift.x, shift.y, 0.0);
Toshihiro Shimizu 890ddd
			glCallList(chalkId);
Toshihiro Shimizu 890ddd
			glPopMatrix();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glDeleteLists(chalkId, 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TBlendStrokeStyle2::TBlendStrokeStyle2()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Red), m_blend(1.0), m_in(0.25), m_out(0.25)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TBlendStrokeStyle2::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TBlendStrokeStyle2(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TBlendStrokeStyle2::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 TBlendStrokeStyle2::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 TBlendStrokeStyle2::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("TBlendStrokeStyle2", "Border Fade");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TBlendStrokeStyle2", "Fade In");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TBlendStrokeStyle2", "Fade Out");
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 TBlendStrokeStyle2::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	min = 0.0;
Toshihiro Shimizu 890ddd
	max = 1.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TBlendStrokeStyle2::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	double value = 0;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_blend;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_in;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_out;
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 TBlendStrokeStyle2::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 3);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_blend = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_in = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_out = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBlendStrokeStyle2::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 110)
Toshihiro Shimizu 890ddd
		throw TException("Blend  stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
	m_in = 0.0, m_out = 0.0;
Toshihiro Shimizu 890ddd
	is >> m_color >> m_blend;
Toshihiro Shimizu 890ddd
	m_blend = 1 - m_blend;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBlendStrokeStyle2::computeData(PointsAndDoubles &data,
Toshihiro Shimizu 890ddd
									 const TStroke *stroke,
Toshihiro Shimizu 890ddd
									 const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	data.clear();
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 10.0;
Toshihiro Shimizu 890ddd
	TPointD pos1, pos2, pos3, pos4, oldPos1, oldPos2, oldPos3, oldPos4;
Toshihiro Shimizu 890ddd
	double oldintslope;
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	double maxfactor = 2 * m_blend / step; //max definisce il numero di intervalli in cui la regione viene divisa
Toshihiro Shimizu 890ddd
										   //per evitare il problema del blend poco efficiente sui triangoli
Toshihiro Shimizu 890ddd
	double minthickness = MINTHICK * sqrt(tglGetPixelSize2());
Toshihiro Shimizu 890ddd
	double thickness = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		if (pos.thick < MINTHICK)
Toshihiro Shimizu 890ddd
			thickness = minthickness;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			thickness = pos.thick;
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * thickness;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPointD v1 = v * (1 - m_blend);
Toshihiro Shimizu 890ddd
		pos1 = pos + v;
Toshihiro Shimizu 890ddd
		pos2 = pos + v1;
Toshihiro Shimizu 890ddd
		pos3 = pos - v1;
Toshihiro Shimizu 890ddd
		pos4 = pos - v;
Toshihiro Shimizu 890ddd
		double intslope = get_inout_intensityslope(m_in, 1 - m_out, s / length) * dcolor.m;
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			int max = (int)(maxfactor * thickness);
Toshihiro Shimizu 890ddd
			double invmax = 1.0 / max;
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(oldPos1, 0.0));
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(pos1, 0.0));
Toshihiro Shimizu 890ddd
			int i;
Toshihiro Shimizu 890ddd
			for (i = 1; i < max; i++) {
Toshihiro Shimizu 890ddd
				data.push_back(make_pair(i * (oldPos2 - oldPos1) * invmax + oldPos1, (i * oldintslope) * invmax));
Toshihiro Shimizu 890ddd
				data.push_back(make_pair(i * (pos2 - pos1) * invmax + pos1, (i * intslope) * invmax));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(oldPos2, oldintslope));
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(pos2, intslope));
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(oldPos3, oldintslope));
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(pos3, intslope));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			for (i = 0; i < max; i++) {
Toshihiro Shimizu 890ddd
				data.push_back(make_pair(i * (oldPos4 - oldPos3) * invmax + oldPos3, (oldintslope * invmax) * (max - i)));
Toshihiro Shimizu 890ddd
				data.push_back(make_pair(i * (pos4 - pos3) * invmax + pos3, (intslope * invmax) * (max - i)));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(oldPos4, 0.0));
Toshihiro Shimizu 890ddd
			data.push_back(make_pair(pos4, 0.0));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		oldPos1 = pos1;
Toshihiro Shimizu 890ddd
		oldPos2 = pos2;
Toshihiro Shimizu 890ddd
		oldPos3 = pos3;
Toshihiro Shimizu 890ddd
		oldPos4 = pos4;
Toshihiro Shimizu 890ddd
		oldintslope = intslope;
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBlendStrokeStyle2::drawStroke(const TColorFunction *cf,
Toshihiro Shimizu 890ddd
									PointsAndDoubles &data,
Toshihiro Shimizu 890ddd
									const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PointsAndDoubles::iterator it = data.begin();
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	for (; it != data.end(); ++it) {
Toshihiro Shimizu 890ddd
		glColor4d(dcolor.r, dcolor.g, dcolor.b, it->second);
Toshihiro Shimizu 890ddd
		tglVertex(it->first);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TBlendStrokeStyle2::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 10.0;
Toshihiro Shimizu 890ddd
	TPointD pos1, pos2, pos3, pos4, oldPos1, oldPos2, oldPos3, oldPos4;
Toshihiro Shimizu 890ddd
	double oldintslope;
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double lblend = m_blend;
Toshihiro Shimizu 890ddd
	// For the Flash version, to simplify the grading.
Toshihiro Shimizu 890ddd
	lblend = 1.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixelD dcolor;
Toshihiro Shimizu 890ddd
	dcolor = toPixelD(color);
Toshihiro Shimizu 890ddd
	bool firstRing = true;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	//double maxfactor=2*lblend/step; //max definisce il numero di intervalli in cui la regione viene divisa
Toshihiro Shimizu 890ddd
	//per evitare il problema del blend poco efficiente sui triangoli
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<tpointd> vp1, vp2;</tpointd>
Toshihiro Shimizu 890ddd
	vector<tpixeld> vdc1, vdc2;</tpixeld>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setThickness(0);
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * pos.thick;
Toshihiro Shimizu 890ddd
		TPointD v1 = v * (1 - lblend);
Toshihiro Shimizu 890ddd
		pos1 = pos + v;
Toshihiro Shimizu 890ddd
		pos2 = pos + v1;
Toshihiro Shimizu 890ddd
		pos3 = pos - v1;
Toshihiro Shimizu 890ddd
		pos4 = pos - v;
Toshihiro Shimizu 890ddd
		double intslope = get_inout_intensityslope(m_in, 1 - m_out, s / length) * dcolor.m;
Toshihiro Shimizu 890ddd
		if (firstRing) {
Toshihiro Shimizu 890ddd
			firstRing = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			vp1.clear();
Toshihiro Shimizu 890ddd
			vp2.clear();
Toshihiro Shimizu 890ddd
			vdc1.clear();
Toshihiro Shimizu 890ddd
			vdc2.clear();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// The Flash version has been simplified. Only one direction grading!
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			vdc1.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, 0));
Toshihiro Shimizu 890ddd
			vp1.push_back(oldPos1);
Toshihiro Shimizu 890ddd
			vdc2.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, 0));
Toshihiro Shimizu 890ddd
			vp2.push_back(pos1);
Toshihiro Shimizu 890ddd
			vdc1.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, oldintslope));
Toshihiro Shimizu 890ddd
			vp1.push_back(oldPos2);
Toshihiro Shimizu 890ddd
			vdc2.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, intslope));
Toshihiro Shimizu 890ddd
			vp2.push_back(pos2);
Toshihiro Shimizu 890ddd
			vdc1.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, oldintslope));
Toshihiro Shimizu 890ddd
			vp1.push_back(oldPos3);
Toshihiro Shimizu 890ddd
			vdc2.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, intslope));
Toshihiro Shimizu 890ddd
			vp2.push_back(pos3);
Toshihiro Shimizu 890ddd
			vdc1.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, 0));
Toshihiro Shimizu 890ddd
			vp1.push_back(oldPos4);
Toshihiro Shimizu 890ddd
			vdc2.push_back(TPixelD(dcolor.r, dcolor.g, dcolor.b, 0));
Toshihiro Shimizu 890ddd
			vp2.push_back(pos4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			vector<tpointd> vpl;</tpointd>
Toshihiro Shimizu 890ddd
			vpl.push_back(vp1[0]);
Toshihiro Shimizu 890ddd
			vpl.push_back(vp1[3]);
Toshihiro Shimizu 890ddd
			vpl.push_back(vp2[3]);
Toshihiro Shimizu 890ddd
			vpl.push_back(vp2[0]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TPixel32 col[4];
Toshihiro Shimizu 890ddd
			col[0] = toPixel32(vdc1[1]);
Toshihiro Shimizu 890ddd
			col[1] = toPixel32(vdc1[2]);
Toshihiro Shimizu 890ddd
			col[2] = toPixel32(vdc2[2]);
Toshihiro Shimizu 890ddd
			col[3] = toPixel32(vdc2[1]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			sfu.drawGradedPolyline(flash, vpl, blend(col[0], col[1], 0.5), blend(col[2], col[3], 0.5));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		oldPos1 = pos1;
Toshihiro Shimizu 890ddd
		oldPos2 = pos2;
Toshihiro Shimizu 890ddd
		oldPos3 = pos3;
Toshihiro Shimizu 890ddd
		oldPos4 = pos4;
Toshihiro Shimizu 890ddd
		oldintslope = intslope;
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTwirlStrokeStyle::TTwirlStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Green), m_period(30.0), m_blend(0.5)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TTwirlStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TTwirlStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TTwirlStrokeStyle::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 TTwirlStrokeStyle::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 TTwirlStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("TTwirlStrokeStyle", "Twirl") : QCoreApplication::translate("TTwirlStrokeStyle", "Shade");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTwirlStrokeStyle::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 = 1.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TTwirlStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? m_period : m_blend;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTwirlStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_period = value;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_blend = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTwirlStrokeStyle::computeData(Doubles &data, const TStroke *stroke, const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
	double period = 10 * (102 - m_period);
Toshihiro Shimizu 890ddd
	double hperiod = period / 2;
Toshihiro Shimizu 890ddd
	double blendval = 0;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	data.clear();
Toshihiro Shimizu 890ddd
	data.reserve(tceil(length / step) + 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	TPointD app;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * (pos.thick);
Shinya Kitaoka ee259f
		double shift = sin((M_PI / hperiod) * s);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		app = pos + v * shift;
Toshihiro Shimizu 890ddd
		data.push_back(app.x);
Toshihiro Shimizu 890ddd
		data.push_back(app.y);
Toshihiro Shimizu 890ddd
		app = pos - v * shift;
Toshihiro Shimizu 890ddd
		data.push_back(app.x);
Toshihiro Shimizu 890ddd
		data.push_back(app.y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		blendval = get_inout_intensityslope(m_blend, 1.0 - m_blend, (s - ((int)(s / hperiod) * hperiod)) / hperiod);
Toshihiro Shimizu 890ddd
		data.push_back(blendval);
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTwirlStrokeStyle::drawStroke(const TColorFunction *cf, Doubles &data, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 blackcolor = TPixel32::Black;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
		blackcolor = (*(cf))(blackcolor);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	blackcolor.m = m_color.m;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD app;
Toshihiro Shimizu 890ddd
	UINT i = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	for (; i < data.size(); i += 5) {
Toshihiro Shimizu 890ddd
		tglColor(blend(blackcolor, color, data[i + 4]));
Toshihiro Shimizu 890ddd
		app.x = data[i];
Toshihiro Shimizu 890ddd
		app.y = data[i + 1];
Toshihiro Shimizu 890ddd
		tglVertex(app);
Toshihiro Shimizu 890ddd
		app.x = data[i + 2];
Toshihiro Shimizu 890ddd
		app.y = data[i + 3];
Toshihiro Shimizu 890ddd
		tglVertex(app);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 5; i < data.size(); i += 5) {
Toshihiro Shimizu 890ddd
		tglColor(blend(color, blackcolor, data[i + 4]));
Toshihiro Shimizu 890ddd
		glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
		app.x = data[i - 5];
Toshihiro Shimizu 890ddd
		app.y = data[i - 4];
Toshihiro Shimizu 890ddd
		tglVertex(app);
Toshihiro Shimizu 890ddd
		app.x = data[i];
Toshihiro Shimizu 890ddd
		app.y = data[i + 1];
Toshihiro Shimizu 890ddd
		tglVertex(app);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
		glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
		app.x = data[i - 3];
Toshihiro Shimizu 890ddd
		app.y = data[i - 2];
Toshihiro Shimizu 890ddd
		tglVertex(app);
Toshihiro Shimizu 890ddd
		app.x = data[i + 2];
Toshihiro Shimizu 890ddd
		app.y = data[i + 3];
Toshihiro Shimizu 890ddd
		tglVertex(app);
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TTwirlStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
	double period = 10 * (102 - m_period);
Toshihiro Shimizu 890ddd
	double hperiod = period / 2;
Toshihiro Shimizu 890ddd
	double blendval = 0;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	TPixel32 blackcolor = TPixel32::Black;
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
	blackcolor.m = m_color.m;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<tpointd> points1;</tpointd>
Toshihiro Shimizu 890ddd
	vector<tpointd> points2;</tpointd>
Toshihiro Shimizu 890ddd
	vector<double> vblend;</double>
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u) * (pos.thick);
Shinya Kitaoka ee259f
		double shift = sin((M_PI / hperiod) * s);
Toshihiro Shimizu 890ddd
		points1.push_back(pos + v * shift);
Toshihiro Shimizu 890ddd
		points2.push_back(pos - v * shift);
Toshihiro Shimizu 890ddd
		blendval = get_inout_intensityslope(m_blend, 1.0 - m_blend, (s - ((int)(s / hperiod) * hperiod)) / hperiod);
Toshihiro Shimizu 890ddd
		vblend.push_back(blendval);
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	for (int i = 1; i < (int)points1.size(); i++) {
Toshihiro Shimizu 890ddd
		vector<tpointd> vp;</tpointd>
Toshihiro Shimizu 890ddd
		vp.push_back(points1[i - 1]);
Toshihiro Shimizu 890ddd
		vp.push_back(points2[i - 1]);
Toshihiro Shimizu 890ddd
		vp.push_back(points2[i]);
Toshihiro Shimizu 890ddd
		vp.push_back(points1[i]);
Toshihiro Shimizu 890ddd
		flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
		sfu.drawGradedPolyline(flash, vp, blend(blackcolor, color, vblend[i - 1]),
Toshihiro Shimizu 890ddd
							   blend(blackcolor, color, vblend[i]));
Toshihiro Shimizu 890ddd
		//	flash.setFillColor(blend(blackcolor, color , vblend[i-1]));
Toshihiro Shimizu 890ddd
		//	flash.drawPolyline(vp);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
		sv.push_back(TSegment(points1[i - 1], points1[i]));
Toshihiro Shimizu 890ddd
		sv.push_back(TSegment(points2[i - 1], points2[i]));
Toshihiro Shimizu 890ddd
		flash.setThickness(1.0);
Toshihiro Shimizu 890ddd
		flash.setLineColor(blend(color, blackcolor, vblend[i - 1]));
Toshihiro Shimizu 890ddd
		flash.drawSegments(sv, false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TSawToothStrokeStyle::TSawToothStrokeStyle(TPixel32 color, double parameter)
Toshihiro Shimizu 890ddd
	: m_color(color), m_parameter(parameter)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TSawToothStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TSawToothStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSawToothStrokeStyle::computeOutline(const TStroke *stroke,
Toshihiro Shimizu 890ddd
										  TStrokeOutline &outline,
Toshihiro Shimizu 890ddd
										  TOutlineUtil::OutlineParameter param) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	param.m_lengthStep = m_parameter;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSawToothStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TOutlineUtil::OutlineParameter param;
Shinya Kitaoka 12c444
	param.m_lengthStep = std::max(20.0, m_parameter);
Toshihiro Shimizu 890ddd
	TStrokeOutline outline;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline.getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 color = m_color;
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	flash.setFillColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	double old[2];
Toshihiro Shimizu 890ddd
	int counter = 0;
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < v.size() - 2; i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			if (counter) {
Toshihiro Shimizu 890ddd
				vector<tpointd> plv;</tpointd>
Toshihiro Shimizu 890ddd
				//        flash.setFillColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				plv.push_back(TPointD(old[0], old[1]));
Toshihiro Shimizu 890ddd
				plv.push_back(TPointD(v[i].x, v[i].y));
Toshihiro Shimizu 890ddd
				plv.push_back(TPointD(v[i + 1].x, v[i + 1].y));
Toshihiro Shimizu 890ddd
				flash.drawPolyline(plv);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			old[0] = v[i].x;
Toshihiro Shimizu 890ddd
			old[1] = v[i].y;
Toshihiro Shimizu 890ddd
			counter++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSawToothStrokeStyle::drawStroke(const TColorFunction *cf, TStrokeOutline *outline,
Toshihiro Shimizu 890ddd
									  const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
	int counter = 0;
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline->getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	double old[2];
Toshihiro Shimizu 890ddd
	// outline with antialiasing
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size() - 2; i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			if (counter) {
Toshihiro Shimizu 890ddd
				glVertex2dv(old);
Toshihiro Shimizu 890ddd
				glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
				glVertex2dv(&v[i + 1].x);
Toshihiro Shimizu 890ddd
				glVertex2dv(old);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			old[0] = v[i].x;
Toshihiro Shimizu 890ddd
			old[1] = v[i].y;
Toshihiro Shimizu 890ddd
			counter++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	counter = 0;
Toshihiro Shimizu 890ddd
	glBegin(GL_TRIANGLES);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size() - 2; i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			if (counter) {
Toshihiro Shimizu 890ddd
				glVertex2dv(old);
Toshihiro Shimizu 890ddd
				glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
				glVertex2dv(&v[i + 1].x);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			old[0] = v[i].x;
Toshihiro Shimizu 890ddd
			old[1] = v[i].y;
Toshihiro Shimizu 890ddd
			counter++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TSawToothStrokeStyle::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 TSawToothStrokeStyle::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 TSawToothStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TSawToothStrokeStyle", "Distance");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSawToothStrokeStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = 0.1;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TSawToothStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return m_parameter;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSawToothStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	m_parameter = value;
Toshihiro Shimizu 890ddd
	updateVersionNumber(); //questo si chiama per ogno cambiamento di parametro per cui di deve ricalcolare l'outline
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMultiLineStrokeStyle2::TMultiLineStrokeStyle2()
Toshihiro Shimizu 890ddd
	: m_color0(TPixel32(0, 255, 0)), m_color1(TPixel32(0, 0, 0)), m_intensity(0.2), m_length(20.0), m_thick(0.3), m_noise(0.5)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TMultiLineStrokeStyle2::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TMultiLineStrokeStyle2(*this);
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
typedef struct {
Toshihiro Shimizu 890ddd
	TPointD u, v;
Toshihiro Shimizu 890ddd
	TThickPoint p;
Toshihiro Shimizu 890ddd
} myLineData;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TMultiLineStrokeStyle2::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 TMultiLineStrokeStyle2::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 TMultiLineStrokeStyle2::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("TMultiLineStrokeStyle2", "Density");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TMultiLineStrokeStyle2", "Size");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TMultiLineStrokeStyle2", "Thickness");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TMultiLineStrokeStyle2", "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 TMultiLineStrokeStyle2::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 = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 100.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TMultiLineStrokeStyle2::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	double value = 0;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_intensity;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_length;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_thick;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = m_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 TMultiLineStrokeStyle2::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_intensity = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_length = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_thick = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_noise = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMultiLineStrokeStyle2::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 118 && ids != 128)
Toshihiro Shimizu 890ddd
		throw TException("Multi Line stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
	if (ids == 118) {
Toshihiro Shimizu 890ddd
		m_length = 20.0, m_thick = 0.3, m_noise = 0.0;
Toshihiro Shimizu 890ddd
		is >> m_color0 >> m_intensity;
Toshihiro Shimizu 890ddd
		m_color1 = TPixel32::Black;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		is >> m_color0 >> m_intensity >> m_length >> m_thick >> m_noise;
Toshihiro Shimizu 890ddd
		m_color1 = TPixel32::Black;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMultiLineStrokeStyle2::computeData(BlendAndPoints &data, const TStroke *stroke, const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 4.0;
Toshihiro Shimizu 890ddd
	int maxlength = (int)m_length;
Toshihiro Shimizu 890ddd
	double factor = 0;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<mylinedata> LineData;</mylinedata>
Toshihiro Shimizu 890ddd
	myLineData Data;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double minthickness = MINTHICK * sqrt(tglGetPixelSize2());
Toshihiro Shimizu 890ddd
	double thickness = 0;
Toshihiro Shimizu 890ddd
	double strokethick = m_thick;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		Data.p = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		Data.u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(Data.u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		Data.u = normalize(Data.u);
Toshihiro Shimizu 890ddd
		if (Data.p.thick < MINTHICK)
Toshihiro Shimizu 890ddd
			thickness = minthickness;
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			thickness = Data.p.thick;
Toshihiro Shimizu 890ddd
		Data.v = rotate90(Data.u) * thickness;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		LineData.push_back(Data);
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	BlendAndPoint appData;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	data.clear();
Toshihiro Shimizu 890ddd
	data.reserve(LineData.size());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < m_intensity * LineData.size(); i++) {
Toshihiro Shimizu 890ddd
		appData.points.clear();
Toshihiro Shimizu 890ddd
		int start = rnd.getInt(0, LineData.size());
Toshihiro Shimizu 890ddd
		int end = start + maxlength + rnd.getInt(0, maxlength);
Toshihiro Shimizu 890ddd
		if (end > (int)LineData.size())
Toshihiro Shimizu 890ddd
			end = LineData.size();
Toshihiro Shimizu 890ddd
		double halfcount = (end - start) / 2.0;
Toshihiro Shimizu 890ddd
		double vshift = (0.5 - rnd.getFloat());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		appData.blend = rnd.getFloat();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int j = 0; j < (end - start); j++) {
Toshihiro Shimizu 890ddd
			if (j < halfcount)
Toshihiro Shimizu 890ddd
				factor = j / halfcount;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				factor = 1 - (j - halfcount) / halfcount;
Toshihiro Shimizu 890ddd
			appData.points.push_back(LineData[j + start].p + LineData[j + start].v * (vshift - strokethick * factor * (1 - m_noise * (1 - rnd.getFloat()))));
Toshihiro Shimizu 890ddd
			appData.points.push_back(LineData[j + start].p + LineData[j + start].v * (vshift + strokethick * factor * (1 - m_noise * (1 - rnd.getFloat()))));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		data.push_back(appData);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMultiLineStrokeStyle2::drawStroke(const TColorFunction *cf, BlendAndPoints &data, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color0, color1;
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		color0 = (*(cf))(m_color0);
Toshihiro Shimizu 890ddd
		color1 = (*(cf))(m_color1);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		color0 = m_color0;
Toshihiro Shimizu 890ddd
		color1 = m_color1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnable(GL_POLYGON_SMOOTH);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < data.size(); i++) {
Toshihiro Shimizu 890ddd
		tglColor(blend(color0, color1, data[i].blend));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
		for (UINT j = 0; j < data[i].points.size(); j++)
Toshihiro Shimizu 890ddd
			tglVertex(data[i].points[j]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glEnd();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glDisable(GL_POLYGON_SMOOTH);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMultiLineStrokeStyle2::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 4.0;
Toshihiro Shimizu 890ddd
	int maxlength = (int)m_length;
Toshihiro Shimizu 890ddd
	double factor = 0;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	TPixel32 color0, color1;
Toshihiro Shimizu 890ddd
	color0 = m_color0;
Toshihiro Shimizu 890ddd
	color1 = m_color1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<mylinedata> LineData;</mylinedata>
Toshihiro Shimizu 890ddd
	myLineData Data;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	double strokethick = m_thick;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		Data.p = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		Data.u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		if (norm2(Data.u) == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		Data.u = normalize(Data.u);
Toshihiro Shimizu 890ddd
		Data.v = rotate90(Data.u) * Data.p.thick;
Toshihiro Shimizu 890ddd
		LineData.push_back(Data);
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < m_intensity * LineData.size(); i++) {
Toshihiro Shimizu 890ddd
		int start = rnd.getInt(0, LineData.size());
Toshihiro Shimizu 890ddd
		int end = start + maxlength + rnd.getInt(0, maxlength);
Toshihiro Shimizu 890ddd
		if (end > (int)LineData.size())
Toshihiro Shimizu 890ddd
			end = LineData.size();
Toshihiro Shimizu 890ddd
		double halfcount = (end - start) / 2.0;
Toshihiro Shimizu 890ddd
		double vshift = (0.5 - rnd.getFloat());
Toshihiro Shimizu 890ddd
		flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
		flash.setFillColor(blend(color0, color1, rnd.getFloat()));
Toshihiro Shimizu 890ddd
		vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
		int j;
Toshihiro Shimizu 890ddd
		for (j = 0; j < (end - start); j++) {
Toshihiro Shimizu 890ddd
			if (j < halfcount)
Toshihiro Shimizu 890ddd
				factor = j / halfcount;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				factor = 1 - (j - halfcount) / halfcount;
Toshihiro Shimizu 890ddd
			float rand = rnd.getFloat();
Toshihiro Shimizu 890ddd
			TPointD p0 = (LineData[j + start].p + LineData[j + start].v * (vshift - strokethick * factor * (1 - m_noise * (1 - rand))));
Toshihiro Shimizu 890ddd
			TPointD p1 = (LineData[j + start].p + LineData[j + start].v * (vshift + strokethick * factor * (1 - m_noise * (1 - rand))));
Toshihiro Shimizu 890ddd
			sv.push_back(TSegment(p0, p1));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		for (j = 0; j < ((int)sv.size() - 1); j++) {
Toshihiro Shimizu 890ddd
			vector<tpointd> pv;</tpointd>
Toshihiro Shimizu 890ddd
			pv.push_back(sv[j].getP0());
Toshihiro Shimizu 890ddd
			pv.push_back(sv[j].getP1());
Toshihiro Shimizu 890ddd
			pv.push_back(sv[j + 1].getP1());
Toshihiro Shimizu 890ddd
			pv.push_back(sv[j + 1].getP0());
Toshihiro Shimizu 890ddd
			flash.drawPolyline(pv);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TZigzagStrokeStyle::TZigzagStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32(0, 0, 0)), m_minDist(0.5), m_maxDist(6.0), m_minAngle(30.0), m_maxAngle(60.0), m_thickness(1.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TZigzagStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TZigzagStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TZigzagStrokeStyle::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 TZigzagStrokeStyle::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 TZigzagStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	QString value;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TZigzagStrokeStyle", "Min Distance");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TZigzagStrokeStyle", "Max Distance");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TZigzagStrokeStyle", "Min Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TZigzagStrokeStyle", "Max Angle");
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		value = QCoreApplication::translate("TZigzagStrokeStyle", "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 TZigzagStrokeStyle::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 = 0.5;
Toshihiro Shimizu 890ddd
		max = 50.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		min = 0.5;
Toshihiro Shimizu 890ddd
		max = 50.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		min = -90.0;
Toshihiro Shimizu 890ddd
		max = 90.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		min = -90.0;
Toshihiro Shimizu 890ddd
		max = 90.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 3.0;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TZigzagStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	double value = 0;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		value = m_minDist;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		value = m_maxDist;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		value = m_minAngle;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		value = m_maxAngle;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 4:
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 TZigzagStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 5);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		m_minDist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		m_maxDist = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		m_minAngle = value;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		m_maxAngle = 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
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TZigzagStrokeStyle::getZigZagPosition(const TStroke *stroke, TRandom &rnd,
Toshihiro Shimizu 890ddd
										   const double s, const int first,
Toshihiro Shimizu 890ddd
										   const double minTranslLength,
Toshihiro Shimizu 890ddd
										   TThickPoint &pos, TThickPoint &pos1) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
	pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
	TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
	if (norm2(u) < TConsts::epsilon)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	u = normalize(u);
Toshihiro Shimizu 890ddd
	TPointD uu = u;
Toshihiro Shimizu 890ddd
	double angle = m_minAngle + (m_maxAngle - m_minAngle) * (double)rnd.getUInt(101) * 0.01;
Toshihiro Shimizu 890ddd
	TRotation rotM(angle);
Toshihiro Shimizu 890ddd
	u = rotM * u;
Toshihiro Shimizu 890ddd
	double maxTranslLength = angle == 90 ? 1.0 : 2.0;
Toshihiro Shimizu 890ddd
	if (angle > 30 && angle < 90) {
Toshihiro Shimizu 890ddd
		double rta = 1.0 / tan(degree2rad(angle));
Toshihiro Shimizu 890ddd
		maxTranslLength = sqrt(sq(rta) + 1.0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	double r = (minTranslLength + (maxTranslLength - minTranslLength) * rnd.getFloat()) * pos.thick * first;
Toshihiro Shimizu 890ddd
	pos = pos + r * u;
Toshihiro Shimizu 890ddd
	pos1 = pos + uu * m_thickness;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TZigzagStrokeStyle::setRealMinMax() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TZigzagStrokeStyle *ncpthis = const_cast<tzigzagstrokestyle *="">(this);</tzigzagstrokestyle>
Shinya Kitaoka 12c444
	double minDist = std::min(m_minDist, m_maxDist);
Shinya Kitaoka 12c444
	double maxDist = std::max(m_minDist, m_maxDist);
Shinya Kitaoka 12c444
	double minAngle = std::min(m_minAngle, m_maxAngle);
Shinya Kitaoka 12c444
	double maxAngle = std::max(m_minAngle, m_maxAngle);
Toshihiro Shimizu 890ddd
	ncpthis->m_minDist = minDist;
Toshihiro Shimizu 890ddd
	ncpthis->m_maxDist = maxDist;
Toshihiro Shimizu 890ddd
	ncpthis->m_minAngle = minAngle;
Toshihiro Shimizu 890ddd
	ncpthis->m_maxAngle = maxAngle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TZigzagStrokeStyle::computeData(Points &points, const TStroke *stroke, const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(glGetError() == GL_NO_ERROR);
Toshihiro Shimizu 890ddd
	assert(!!stroke);
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	if (length <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setRealMinMax();
Toshihiro Shimizu 890ddd
	// e.g minimum translation length is the half of the thickness
Toshihiro Shimizu 890ddd
	const double minTranslLength = 0.7;
Toshihiro Shimizu 890ddd
	//const bool isTransparent=m_color.m<255;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int first = 1;
Toshihiro Shimizu 890ddd
	TThickPoint pos;
Toshihiro Shimizu 890ddd
	TThickPoint pos1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	points.clear();
Toshihiro Shimizu 890ddd
	points.reserve(tceil(length / m_minDist) * 2 + 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (double s = 0.0; s <= length; first = -first) {
Toshihiro Shimizu 890ddd
		if (getZigZagPosition(stroke, rnd, s, first, minTranslLength, pos, pos1)) {
Toshihiro Shimizu 890ddd
			//TRectD rec(pos.x,pos.y,pos1.x,pos1.y);
Toshihiro Shimizu 890ddd
			points.push_back(pos);
Toshihiro Shimizu 890ddd
			points.push_back(pos1);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += m_minDist + (m_maxDist - m_minDist) * (double)rnd.getUInt(101) * 0.01;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (getZigZagPosition(stroke, rnd, length - TConsts::epsilon, first, minTranslLength, pos, pos1)) {
Toshihiro Shimizu 890ddd
		points.push_back(pos);
Toshihiro Shimizu 890ddd
		points.push_back(pos1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TZigzagStrokeStyle::drawStroke(const TColorFunction *cf, Points &points, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (points.size() <= 1)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(m_color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnableClientState(GL_VERTEX_ARRAY);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertexPointer(2, GL_DOUBLE, sizeof(TPointD), &points[0]);
Toshihiro Shimizu 890ddd
	glDrawArrays(GL_QUAD_STRIP, 0, points.size());
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
  for(UINT i=0; i
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
      tglVertex(rects[i].getP00());  
Toshihiro Shimizu 890ddd
      tglVertex(rects[i].getP11()); 
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  glEnd();
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertexPointer(2, GL_DOUBLE, sizeof(TPointD) * 2, &points[0]);
Toshihiro Shimizu 890ddd
	glDrawArrays(GL_LINE_STRIP, 0, points.size() / 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertexPointer(2, GL_DOUBLE, sizeof(TPointD) * 2, &points[1]);
Toshihiro Shimizu 890ddd
	glDrawArrays(GL_LINE_STRIP, 0, points.size() / 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertexPointer(2, GL_DOUBLE, sizeof(TPointD), &points[0]);
Toshihiro Shimizu 890ddd
	glDrawArrays(GL_LINES, 0, points.size());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glDisableClientState(GL_VERTEX_ARRAY);
Toshihiro Shimizu 890ddd
	//drawBLines(rects);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TZigzagStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!stroke)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	if (length <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setRealMinMax();
Toshihiro Shimizu 890ddd
	// e.g minimum translation length is the half of the thickness
Toshihiro Shimizu 890ddd
	const double minTranslLength = 0.7;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int first = 1;
Toshihiro Shimizu 890ddd
	TThickPoint pos;
Toshihiro Shimizu 890ddd
	TThickPoint pos1;
Toshihiro Shimizu 890ddd
	TRandom rnd;
Toshihiro Shimizu 890ddd
	RectVector rects;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (double s = 0.0; s <= length; first = -first) {
Toshihiro Shimizu 890ddd
		if (getZigZagPosition(stroke, rnd, s, first, minTranslLength, pos, pos1)) {
Toshihiro Shimizu 890ddd
			TRectD rec(pos.x, pos.y, pos1.x, pos1.y);
Toshihiro Shimizu 890ddd
			rects.push_back(rec);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		s += m_minDist + (m_maxDist - m_minDist) * (double)rnd.getUInt(101) * 0.01;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	if (getZigZagPosition(stroke, rnd, length - TConsts::epsilon, first, minTranslLength, pos, pos1)) {
Toshihiro Shimizu 890ddd
		TRectD rec(pos.x, pos.y, pos1.x, pos1.y);
Toshihiro Shimizu 890ddd
		rects.push_back(rec);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
	vector<tsegment> segmentsArray;</tsegment>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setThickness(m_thickness);
Toshihiro Shimizu 890ddd
	RectVector::const_iterator rvi = rects.begin();
Toshihiro Shimizu 890ddd
	for (; rvi != (rects.end() - 1); rvi++) {
Toshihiro Shimizu 890ddd
		RectVector::const_iterator rvii = rvi + 1;
Toshihiro Shimizu 890ddd
		TPointD p0((rvi->x0 + rvi->x1) / 2.0, (rvi->y0 + rvi->y1) / 2.0);
Toshihiro Shimizu 890ddd
		TPointD p1((rvii->x0 + rvii->x1) / 2.0, (rvii->y0 + rvii->y1) / 2.0);
Toshihiro Shimizu 890ddd
		segmentsArray.push_back(TSegment(p0, p1));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.drawSegments(segmentsArray, false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TSinStrokeStyle::TSinStrokeStyle()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Black), m_frequency(10.0), m_thick(0.4)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TSinStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TSinStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TSinStrokeStyle::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 TSinStrokeStyle::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 TSinStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? QCoreApplication::translate("TSinStrokeStyle", "Frequency") : QCoreApplication::translate("TZigzTSinStrokeStyleagStrokeStyle", "Thickness");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSinStrokeStyle::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 = 1.0;
Toshihiro Shimizu 890ddd
		max = 20.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TSinStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	return index == 0 ? m_frequency : m_thick;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSinStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_frequency = value;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_thick = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSinStrokeStyle::computeData(Points &positions,
Toshihiro Shimizu 890ddd
								  const TStroke *stroke,
Toshihiro Shimizu 890ddd
								  const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	positions.clear();
Toshihiro Shimizu 890ddd
	positions.reserve(tceil((length + 1) / step));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double frequency = m_frequency / 100;
Toshihiro Shimizu 890ddd
	;
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	//bool firstRing = true;
Toshihiro Shimizu 890ddd
	double thick = 1 - m_thick;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		double normu = norm2(u);
Toshihiro Shimizu 890ddd
		if (normu == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		double sinvalue = sin(frequency * s);
Toshihiro Shimizu 890ddd
		positions.push_back(pos + v * pos.thick * sinvalue);
Toshihiro Shimizu 890ddd
		positions.push_back(pos + v * thick * pos.thick * sinvalue);
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSinStrokeStyle::drawStroke(const TColorFunction *cf, std::vector<tpointd> &positions,</tpointd>
Toshihiro Shimizu 890ddd
								 const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (; i < (int)positions.size(); i += 2) {
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i + 1]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)positions.size(); i += 2) {
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 1; i < (int)positions.size() - 1; i += 2) {
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TSinStrokeStyle::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
	double step = 5.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double frequency = m_frequency / 100;
Toshihiro Shimizu 890ddd
	;
Toshihiro Shimizu 890ddd
	vector<tpointd> points;</tpointd>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0;
Toshihiro Shimizu 890ddd
	//bool firstRing = true;
Toshihiro Shimizu 890ddd
	double thick = 1 - m_thick;
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		//if(w<0) {s+=0.1; continue;} // per tamponare il baco della getParameterAtLength()
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = stroke->getSpeed(w);
Toshihiro Shimizu 890ddd
		double normu = norm2(u);
Toshihiro Shimizu 890ddd
		if (normu == 0) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		} // non dovrebbe succedere mai, ma per prudenza....
Toshihiro Shimizu 890ddd
		u = normalize(u);
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
		double sinvalue = sin(frequency * s);
Toshihiro Shimizu 890ddd
		points.push_back(pos + v * pos.thick * sinvalue);
Toshihiro Shimizu 890ddd
		points.push_back(pos + v * thick * pos.thick * sinvalue);
Toshihiro Shimizu 890ddd
		s += step;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Polyline version
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	flash.setFillColor(m_color);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < ((int)points.size() - 2); i += 2) {
Toshihiro Shimizu 890ddd
		vector<tpointd> plv;</tpointd>
Toshihiro Shimizu 890ddd
		plv.push_back(points[i]);
Toshihiro Shimizu 890ddd
		plv.push_back(points[i + 1]);
Toshihiro Shimizu 890ddd
		plv.push_back(points[i + 3]);
Toshihiro Shimizu 890ddd
		plv.push_back(points[i + 2]);
Toshihiro Shimizu 890ddd
		flash.drawPolyline(plv);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Quadratic version
Toshihiro Shimizu 890ddd
	/*  flash.setThickness(m_thick);
Toshihiro Shimizu 890ddd
  vector<tpointd> pp;</tpointd>
Toshihiro Shimizu 890ddd
  for( int i=0; i<(int)(points.size()-1); i+=2 )
Toshihiro Shimizu 890ddd
	  pp.push_back(TPointD((points[i]+points[i+1])*0.5));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  if ( pp.size()<=2 ) {
Toshihiro Shimizu 890ddd
	  if ( pp.size()==2 ) {
Toshihiro Shimizu 890ddd
	     vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
	     sv.push_back(TSegment(pp[0],pp[1]));
Toshihiro Shimizu 890ddd
		 flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
		 flash.drawSegments(sv,false);
Toshihiro Shimizu 890ddd
	  }
Toshihiro Shimizu 890ddd
	  return;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
  vector<tquadratic> qv;</tquadratic>
Toshihiro Shimizu 890ddd
  qv.push_back(TQuadratic(pp[i],pp[i]*0.75+pp[i+1]*0.25,(pp[i]+pp[i+1])*0.5));
Toshihiro Shimizu 890ddd
  for( i=1; i<(int)(pp.size()-1); i++ ) {
Toshihiro Shimizu 890ddd
	 TPointD p0=((pp[i-1]+pp[i])*0.5);
Toshihiro Shimizu 890ddd
	 TPointD p1=pp[i];
Toshihiro Shimizu 890ddd
	 TPointD p2=((pp[i]+pp[i+1])*0.5);
Toshihiro Shimizu 890ddd
	 qv.push_back(TQuadratic(p0,p1,p2));
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  int n=pp.size()-1;
Toshihiro Shimizu 890ddd
  qv.push_back(TQuadratic((pp[n-1]+pp[n])*0.5,pp[n-1]*0.25+pp[n]*0.75,pp[n]));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
  flash.setThickness(m_thick);
Toshihiro Shimizu 890ddd
  flash.drawquads(qv);
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFriezeStrokeStyle2::TFriezeStrokeStyle2()
Toshihiro Shimizu 890ddd
	: m_color(TPixel32::Black), m_parameter(0.7), m_thick(0.3)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TFriezeStrokeStyle2::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TFriezeStrokeStyle2(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TFriezeStrokeStyle2::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 TFriezeStrokeStyle2::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 TFriezeStrokeStyle2::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("TFriezeStrokeStyle2", "Twirl");
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("TFriezeStrokeStyle2", "Thickness");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFriezeStrokeStyle2::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 = -1.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		min = 0.0;
Toshihiro Shimizu 890ddd
		max = 1.0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TFriezeStrokeStyle2::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		return m_parameter;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return m_thick;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFriezeStrokeStyle2::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	if (index == 0)
Toshihiro Shimizu 890ddd
		m_parameter = value;
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_thick = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFriezeStrokeStyle2::loadData(int ids, TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (ids != 102)
Toshihiro Shimizu 890ddd
		throw TException("Frieze  stroke style: unknown obsolete format");
Toshihiro Shimizu 890ddd
	m_thick = 0.0;
Toshihiro Shimizu 890ddd
	is >> m_color >> m_parameter;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFriezeStrokeStyle2::computeData(Points &positions,
Toshihiro Shimizu 890ddd
									  const TStroke *stroke,
Toshihiro Shimizu 890ddd
									  const TColorFunction *cf) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double ds = 0.5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	positions.clear();
Toshihiro Shimizu 890ddd
	positions.reserve(tceil((length + 1) / ds));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0.01;
Toshihiro Shimizu 890ddd
	double lastS = 0;
Toshihiro Shimizu 890ddd
	double phi = 0;
Toshihiro Shimizu 890ddd
	double lastW = 0;
Toshihiro Shimizu 890ddd
	double thick = 1 - m_thick;
Toshihiro Shimizu 890ddd
	vector<tpointd> points;</tpointd>
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < lastW) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		lastW = w;
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = normalize(stroke->getSpeed(w));
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double thickness = pos.thick; // 5; //(1-t)*40 + t * 10;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (thickness > 0) {
Shinya Kitaoka ee259f
			double omega = M_PI / thickness;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			double q = 0.5 * (1 - cos(phi));
Shinya Kitaoka ee259f
			double theta = M_PI_2 - M_PI * m_parameter * q;
Toshihiro Shimizu 890ddd
			double r = thickness * sin(phi);
Toshihiro Shimizu 890ddd
			double r1 = r * thick;
Toshihiro Shimizu 890ddd
			double costheta = cos(theta);
Toshihiro Shimizu 890ddd
			double sintheta = sin(theta);
Toshihiro Shimizu 890ddd
			positions.push_back(pos + u * (r * costheta) + v * (r * sintheta));
Toshihiro Shimizu 890ddd
			positions.push_back(pos + u * (r1 * costheta) + v * (r1 * sintheta));
Toshihiro Shimizu 890ddd
			phi += (s - lastS) * omega;
Toshihiro Shimizu 890ddd
			lastS = s;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			positions.push_back(pos);
Toshihiro Shimizu 890ddd
			positions.push_back(pos);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		s += ds;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFriezeStrokeStyle2::drawStroke(const TColorFunction *cf, Points &positions,
Toshihiro Shimizu 890ddd
									 const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(m_color);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = m_color;
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (; i < (int)positions.size(); i += 2) {
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
		tglVertex(positions[i + 1]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)positions.size(); i += 2) {
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 1; i < (int)positions.size() - 1; i += 2) {
Toshihiro Shimizu 890ddd
		tglVertex(positions[i]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TFriezeStrokeStyle2::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//TStroke *stroke = getStroke();
Toshihiro Shimizu 890ddd
	double length = stroke->getLength();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double s = 0.01;
Toshihiro Shimizu 890ddd
	double lastS = 0;
Toshihiro Shimizu 890ddd
	double phi = 0;
Toshihiro Shimizu 890ddd
	double lastW = 0;
Toshihiro Shimizu 890ddd
	double thick = 1 - m_thick;
Toshihiro Shimizu 890ddd
	vector<tpointd> points;</tpointd>
Toshihiro Shimizu 890ddd
	while (s <= length) {
Toshihiro Shimizu 890ddd
		double w = stroke->getParameterAtLength(s);
Toshihiro Shimizu 890ddd
		if (w < lastW) {
Toshihiro Shimizu 890ddd
			s += 0.1;
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		lastW = w;
Toshihiro Shimizu 890ddd
		TThickPoint pos = stroke->getThickPoint(w);
Toshihiro Shimizu 890ddd
		TPointD u = normalize(stroke->getSpeed(w));
Toshihiro Shimizu 890ddd
		TPointD v = rotate90(u);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double thickness = pos.thick; // 5; //(1-t)*40 + t * 10;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (thickness > 0) {
Shinya Kitaoka ee259f
			double omega = M_PI / thickness;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			double q = 0.5 * (1 - cos(phi));
Shinya Kitaoka ee259f
			double theta = M_PI_2 - M_PI * m_parameter * q;
Toshihiro Shimizu 890ddd
			double r = thickness * sin(phi);
Toshihiro Shimizu 890ddd
			double r1 = r * thick;
Toshihiro Shimizu 890ddd
			double costheta = cos(theta);
Toshihiro Shimizu 890ddd
			double sintheta = sin(theta);
Toshihiro Shimizu 890ddd
			points.push_back(pos + u * (r * costheta) + v * (r * sintheta));
Toshihiro Shimizu 890ddd
			points.push_back(pos + u * (r1 * costheta) + v * (r1 * sintheta));
Toshihiro Shimizu 890ddd
			phi += (s - lastS) * omega;
Toshihiro Shimizu 890ddd
			lastS = s;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			points.push_back(pos);
Toshihiro Shimizu 890ddd
			points.push_back(pos);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		double ds = 0.5;
Toshihiro Shimizu 890ddd
		s += ds;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Polyline version
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	flash.setFillColor(m_color);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < ((int)points.size() - 2); i += 2) {
Toshihiro Shimizu 890ddd
		vector<tpointd> plv;</tpointd>
Toshihiro Shimizu 890ddd
		plv.push_back(points[i]);
Toshihiro Shimizu 890ddd
		plv.push_back(points[i + 1]);
Toshihiro Shimizu 890ddd
		plv.push_back(points[i + 3]);
Toshihiro Shimizu 890ddd
		plv.push_back(points[i + 2]);
Toshihiro Shimizu 890ddd
		flash.drawPolyline(plv);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  vector<tpointd> pp;</tpointd>
Toshihiro Shimizu 890ddd
  for( int i=0; i<((int)points.size()-1); i+=2 )
Toshihiro Shimizu 890ddd
	  pp.push_back(TPointD((points[i]+points[i+1])*0.5));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Quadratic version
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  if ( pp.size()<=2 ) {
Toshihiro Shimizu 890ddd
	  if ( pp.size()==2 ) {
Toshihiro Shimizu 890ddd
	     vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
	     sv.push_back(TSegment(pp[0],pp[1]));
Toshihiro Shimizu 890ddd
		 flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
		 flash.drawSegments(sv,false);
Toshihiro Shimizu 890ddd
	  }
Toshihiro Shimizu 890ddd
	  return;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
  vector<tquadratic> qv;</tquadratic>
Toshihiro Shimizu 890ddd
  qv.push_back(TQuadratic(pp[i],pp[i]*0.75+pp[i+1]*0.25,(pp[i]+pp[i+1])*0.5));
Toshihiro Shimizu 890ddd
  for( i=1; i<(int)(pp.size()-1); i++ ) {
Toshihiro Shimizu 890ddd
	 TPointD p0=((pp[i-1]+pp[i])*0.5);
Toshihiro Shimizu 890ddd
	 TPointD p1=pp[i];
Toshihiro Shimizu 890ddd
	 TPointD p2=((pp[i]+pp[i+1])*0.5);
Toshihiro Shimizu 890ddd
	 qv.push_back(TQuadratic(p0,p1,p2));
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  int n=pp.size()-1;
Toshihiro Shimizu 890ddd
  qv.push_back(TQuadratic((pp[n-1]+pp[n])*0.5,pp[n-1]*0.25+pp[n]*0.75,pp[n]));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
  flash.setThickness(m_thick);
Toshihiro Shimizu 890ddd
  flash.drawquads(qv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
	// Segment version
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
    flash.setThickness(m_thick);
Toshihiro Shimizu 890ddd
    flash.setLineColor(m_color);
Toshihiro Shimizu 890ddd
	for( i=0; i<(int)(pp.size()-1); i++ ) {
Toshihiro Shimizu 890ddd
    	vector<tsegment> sv;</tsegment>
Toshihiro Shimizu 890ddd
		sv.push_back(TSegment(pp[i],pp[i+1]));
Toshihiro Shimizu 890ddd
    	flash.drawSegments(sv,false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TDualColorStrokeStyle2::TDualColorStrokeStyle2(
Toshihiro Shimizu 890ddd
	TPixel32 color0, TPixel32 color1, double parameter)
Toshihiro Shimizu 890ddd
	: m_color0(color0), m_color1(color1), m_parameter(parameter)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TDualColorStrokeStyle2::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TDualColorStrokeStyle2(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDualColorStrokeStyle2::computeOutline(const TStroke *stroke,
Toshihiro Shimizu 890ddd
											TStrokeOutline &outline,
Toshihiro Shimizu 890ddd
											TOutlineUtil::OutlineParameter param) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	param.m_lengthStep = m_parameter;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDualColorStrokeStyle2::drawStroke(const TColorFunction *cf, TStrokeOutline *outline,
Toshihiro Shimizu 890ddd
										const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline->getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	TPixel32 colorv[2];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		colorv[0] = (*(cf))(m_color0);
Toshihiro Shimizu 890ddd
		colorv[1] = (*(cf))(m_color1);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		colorv[0] = m_color0;
Toshihiro Shimizu 890ddd
		colorv[1] = m_color1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	int colorindex = 0;
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(colorv[0]);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			colorindex++;
Toshihiro Shimizu 890ddd
			tglColor(colorv[colorindex & 1]);
Toshihiro Shimizu 890ddd
			glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	colorindex = 0;
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(colorv[0]);
Toshihiro Shimizu 890ddd
	for (i = 1; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			colorindex++;
Toshihiro Shimizu 890ddd
			tglColor(colorv[colorindex & 1]);
Toshihiro Shimizu 890ddd
			glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	colorindex = 0;
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	tglColor(colorv[0]);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i + 1].x);
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			colorindex++;
Toshihiro Shimizu 890ddd
			tglColor(colorv[colorindex & 1]);
Toshihiro Shimizu 890ddd
			glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
			glVertex2dv(&v[i + 1].x);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//antialias delle linee normali
Toshihiro Shimizu 890ddd
	tglColor(colorv[0]);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
			glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
			glVertex2dv(&v[i + 1].x);
Toshihiro Shimizu 890ddd
			glEnd();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDualColorStrokeStyle2::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TOutlineUtil::OutlineParameter param;
Toshihiro Shimizu 890ddd
	param.m_lengthStep = m_parameter;
Toshihiro Shimizu 890ddd
	TStrokeOutline outline;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline.getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPixel32 colorv[2] = {m_color0, m_color1};
Toshihiro Shimizu 890ddd
	int colorindex = 0;
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
	flash.setFillColor(TPixel32(0, 0, 0, 255));
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < (v.size() - 2); i += 2) {
Toshihiro Shimizu 890ddd
		vector<tpointd> tpv;</tpointd>
Toshihiro Shimizu 890ddd
		tpv.push_back(TPointD(v[i].x, v[i].y));
Toshihiro Shimizu 890ddd
		tpv.push_back(TPointD(v[i + 1].x, v[i + 1].y));
Toshihiro Shimizu 890ddd
		tpv.push_back(TPointD(v[i + 3].x, v[i + 3].y));
Toshihiro Shimizu 890ddd
		tpv.push_back(TPointD(v[i + 2].x, v[i + 2].y));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			colorindex++;
Toshihiro Shimizu 890ddd
			flash.setFillColor(colorv[colorindex & 1]);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		flash.drawPolyline(tpv);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*  --- testing ---
Toshihiro Shimizu 890ddd
	vector<tsegment> s;</tsegment>
Toshihiro Shimizu 890ddd
	s.push_back(TSegment(tpv[0],tpv[1]));
Toshihiro Shimizu 890ddd
	s.push_back(TSegment(tpv[1],tpv[2]));
Toshihiro Shimizu 890ddd
	s.push_back(TSegment(tpv[2],tpv[3]));
Toshihiro Shimizu 890ddd
	s.push_back(TSegment(tpv[3],tpv[0]));
Toshihiro Shimizu 890ddd
	flash.drawSegments(s,false);
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TDualColorStrokeStyle2::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 TDualColorStrokeStyle2::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 TDualColorStrokeStyle2::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TDualColorStrokeStyle2", "Distance");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDualColorStrokeStyle2::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = 1.0;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TDualColorStrokeStyle2::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return m_parameter;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TDualColorStrokeStyle2::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	m_parameter = value;
Toshihiro Shimizu 890ddd
	updateVersionNumber(); //questo si chiama per ogno cambiamento di parametro per cui di deve ricalcolare l'outline
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TLongBlendStrokeStyle2::TLongBlendStrokeStyle2(
Toshihiro Shimizu 890ddd
	TPixel32 color0, TPixel32 color1, double parameter)
Toshihiro Shimizu 890ddd
	: m_color0(color0), m_color1(color1), m_parameter(parameter)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TLongBlendStrokeStyle2::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TLongBlendStrokeStyle2(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLongBlendStrokeStyle2::computeOutline(const TStroke *stroke,
Toshihiro Shimizu 890ddd
											TStrokeOutline &outline,
Toshihiro Shimizu 890ddd
											TOutlineUtil::OutlineParameter param) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	param.m_lengthStep = m_parameter;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLongBlendStrokeStyle2::drawStroke(const TColorFunction *cf, TStrokeOutline *outline,
Toshihiro Shimizu 890ddd
										const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color0, color1;
Toshihiro Shimizu 890ddd
	if (cf) {
Toshihiro Shimizu 890ddd
		color0 = (*(cf))(m_color0);
Toshihiro Shimizu 890ddd
		color1 = (*(cf))(m_color1);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		color0 = m_color0;
Toshihiro Shimizu 890ddd
		color1 = m_color1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline->getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// outline with antialiasing
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	int mystepCount = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double totallength = stroke->getLength();
Toshihiro Shimizu 890ddd
	double ntick = totallength / m_parameter + 1;
Toshihiro Shimizu 890ddd
	tglColor(color0);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			tglColor(blend(color0, color1, (double)mystepCount / ntick));
Toshihiro Shimizu 890ddd
			mystepCount++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	mystepCount = 0;
Toshihiro Shimizu 890ddd
	tglColor(color0);
Toshihiro Shimizu 890ddd
	for (i = 1; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			tglColor(blend(color0, color1, (double)mystepCount / ntick));
Toshihiro Shimizu 890ddd
			mystepCount++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_QUAD_STRIP);
Toshihiro Shimizu 890ddd
	mystepCount = 0;
Toshihiro Shimizu 890ddd
	tglColor(color0);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			tglColor(blend(color0, color1, (double)mystepCount / ntick));
Toshihiro Shimizu 890ddd
			mystepCount++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i + 1].x);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLongBlendStrokeStyle2::drawStroke(TFlash &flash, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color0, color1;
Toshihiro Shimizu 890ddd
	color0 = m_color0;
Toshihiro Shimizu 890ddd
	color1 = m_color1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
	TOutlineUtil::OutlineParameter param;
Toshihiro Shimizu 890ddd
	double lParameter = m_parameter >= 20.0 || m_parameter < 0.0 ? 10.0 : m_parameter;
Toshihiro Shimizu 890ddd
	param.m_lengthStep = lParameter;
Toshihiro Shimizu 890ddd
	TStrokeOutline outline;
Toshihiro Shimizu 890ddd
	TOutlineStyle::computeOutline(stroke, outline, param);
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline.getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	flash.setThickness(0.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int mystepCount = 0;
Toshihiro Shimizu 890ddd
	double totallength = stroke->getLength();
Toshihiro Shimizu 890ddd
	double ntick = totallength / lParameter + 1;
Toshihiro Shimizu 890ddd
	SFlashUtils sfu;
Toshihiro Shimizu 890ddd
	TPixel32 col0, col1;
Toshihiro Shimizu 890ddd
	col0 = col1 = color0;
Toshihiro Shimizu 890ddd
	for (i = 2; i < v.size(); i += 2) {
Toshihiro Shimizu 890ddd
		if (0 != v[i].stepCount) {
Toshihiro Shimizu 890ddd
			col1 = blend(color0, color1, (double)mystepCount / ntick);
Toshihiro Shimizu 890ddd
			mystepCount++;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		vector<tpointd> plv;</tpointd>
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i - 2].x, v[i - 2].y));
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i - 1].x, v[i - 1].y));
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i + 1].x, v[i + 1].y));
Toshihiro Shimizu 890ddd
		plv.push_back(TPointD(v[i].x, v[i].y));
Toshihiro Shimizu 890ddd
		sfu.drawGradedPolyline(flash, plv, col0, col1);
Toshihiro Shimizu 890ddd
		col0 = col1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TLongBlendStrokeStyle2::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 TLongBlendStrokeStyle2::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 TLongBlendStrokeStyle2::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return "Distance"; //W_Watercolor_Distance
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLongBlendStrokeStyle2::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	min = 0.1;
Toshihiro Shimizu 890ddd
	max = 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TLongBlendStrokeStyle2::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	return m_parameter;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TLongBlendStrokeStyle2::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
	m_parameter = value;
Toshihiro Shimizu 890ddd
	updateVersionNumber(); //questo si chiama per ogno cambiamento di parametro per cui di deve ricalcolare l'outline
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef _DEBUG
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
OutlineViewerStyle::OutlineViewerStyle(
Toshihiro Shimizu 890ddd
	TPixel32 color, double parameter0, double parameter1,
Toshihiro Shimizu 890ddd
	double parameter2, double parameter3)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(color), m_boolPar(false), m_intPar(1), m_enumPar(2), m_pathPar("testPath")
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_parameter[0] = parameter0;
Toshihiro Shimizu 890ddd
	m_parameter[1] = parameter1;
Toshihiro Shimizu 890ddd
	m_parameter[2] = parameter2;
Toshihiro Shimizu 890ddd
	m_parameter[3] = parameter3;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *OutlineViewerStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new OutlineViewerStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int OutlineViewerStyle::getParamCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return 8;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle::ParamType OutlineViewerStyle::getParamType(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < getParamCount());
Toshihiro Shimizu 890ddd
	static const TColorStyle::ParamType types[8] =
Toshihiro Shimizu 890ddd
		{TColorStyle::DOUBLE, TColorStyle::DOUBLE, TColorStyle::DOUBLE, TColorStyle::DOUBLE,
Toshihiro Shimizu 890ddd
		 TColorStyle::BOOL, TColorStyle::INT, TColorStyle::ENUM, TColorStyle::FILEPATH};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return types[index];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString OutlineViewerStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 8);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case 0:
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("OutlineViewerStyle", "Control Point");
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("OutlineViewerStyle", "Center Line");
Toshihiro Shimizu 890ddd
	case 2:
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("OutlineViewerStyle", "Outline Mode");
Toshihiro Shimizu 890ddd
	case 3:
Toshihiro Shimizu 890ddd
		return QCoreApplication::translate("OutlineViewerStyle", "Distance");
Toshihiro Shimizu 890ddd
	case 4:
Toshihiro Shimizu 890ddd
		return "Bool";
Toshihiro Shimizu 890ddd
	case 5:
Toshihiro Shimizu 890ddd
		return "Int";
Toshihiro Shimizu 890ddd
	case 6:
Toshihiro Shimizu 890ddd
		return "Enum";
Toshihiro Shimizu 890ddd
	case 7:
Toshihiro Shimizu 890ddd
		return "Path";
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(0);
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("OutlineViewerStyle", "distance");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	switch (index) {
Shinya Kitaoka d4642c
	case 0: min = 0.0; max = 2.99; break;
Shinya Kitaoka d4642c
	case 1: min = 0.0; max = 1.99; break;
Shinya Kitaoka d4642c
	case 2: min = 0.0; max = 3.99; break;
Shinya Kitaoka d4642c
	case 3: min = 3.0; max = 100.0; break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::getParamRange(int index, int &min, int &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(5 <= index && index < 7);
Toshihiro Shimizu 890ddd
	switch (index) {
Shinya Kitaoka d4642c
	case 5: min = 0, max = 10; break;
Shinya Kitaoka d4642c
	case 6: min = 0, max = 4; break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::getParamRange(int index, QStringList &enumItems) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	enumItems << "Prova 1"
Toshihiro Shimizu 890ddd
			  << "Prova 2"
Toshihiro Shimizu 890ddd
			  << "Prova 3"
Toshihiro Shimizu 890ddd
			  << "Prova 4";
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool OutlineViewerStyle::getParamValue(TColorStyle::bool_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(index == 4);
Toshihiro Shimizu 890ddd
	return m_boolPar;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int OutlineViewerStyle::getParamValue(TColorStyle::int_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(5 <= index && index < 7);
Toshihiro Shimizu 890ddd
	return (index == 5) ? m_intPar : m_enumPar;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double OutlineViewerStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
	return m_parameter[index];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath OutlineViewerStyle::getParamValue(TColorStyle::TFilePath_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(index == 7);
Toshihiro Shimizu 890ddd
	return m_pathPar;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::setParamValue(int index, bool value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(index == 4);
Toshihiro Shimizu 890ddd
	m_boolPar = value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::setParamValue(int index, int value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(5 <= index && index < 7);
Toshihiro Shimizu 890ddd
	(index == 5) ? m_intPar = value : m_enumPar = value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (index >= 2 && (int)m_parameter[index] != (int)value) //cambia l'outline
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		updateVersionNumber();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_parameter[index] = value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::setParamValue(int index, const TFilePath &value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(index == 7);
Toshihiro Shimizu 890ddd
	m_pathPar = value;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	is >> color;
Toshihiro Shimizu 890ddd
	TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
	is >> m_parameter[0];
Toshihiro Shimizu 890ddd
	is >> m_parameter[1];
Toshihiro Shimizu 890ddd
	is >> m_parameter[2];
Toshihiro Shimizu 890ddd
	is >> m_parameter[3];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int boolPar;
Toshihiro Shimizu 890ddd
	is >> boolPar;
Toshihiro Shimizu 890ddd
	m_boolPar = boolPar;
Toshihiro Shimizu 890ddd
	is >> m_intPar;
Toshihiro Shimizu 890ddd
	is >> m_enumPar;
Toshihiro Shimizu 890ddd
	std::string str;
Toshihiro Shimizu 890ddd
	is >> str;
Shinya Kitaoka 9eb50d
	m_pathPar = TFilePath(::to_wstring(str));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	os << TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
	os << m_parameter[0];
Toshihiro Shimizu 890ddd
	os << m_parameter[1];
Toshihiro Shimizu 890ddd
	os << m_parameter[2];
Toshihiro Shimizu 890ddd
	os << m_parameter[3];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	os << int(m_boolPar);
Toshihiro Shimizu 890ddd
	os << m_intPar;
Toshihiro Shimizu 890ddd
	os << m_enumPar;
Shinya Kitaoka 9eb50d
	os << ::to_string(m_pathPar.getWideString());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::computeOutline(const TStroke *stroke,
Toshihiro Shimizu 890ddd
										TStrokeOutline &outline,
Toshihiro Shimizu 890ddd
										TOutlineUtil::OutlineParameter param) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_parameter[2] >= 1.0) {
Toshihiro Shimizu 890ddd
		param.m_lengthStep = (m_parameter[2] >= 3.0) ? m_parameter[3] : 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TOutlineStyle::computeOutline(stroke, outline, param);
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 drawOutline(TStrokeOutline *outline, bool cut)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const std::vector<toutlinepoint> &v = outline->getArray();</toutlinepoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (v.empty())
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
	// outline with antialiasing
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 0; i < v.size(); i += 2)
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	for (i = 1; i < v.size(); i += 2)
Toshihiro Shimizu 890ddd
		glVertex2dv(&v[i].x);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cut) {
Toshihiro Shimizu 890ddd
		static const int stride = sizeof(TOutlinePoint);
Toshihiro Shimizu 890ddd
		glEnableClientState(GL_VERTEX_ARRAY);
Toshihiro Shimizu 890ddd
		glVertexPointer(2, GL_DOUBLE, stride, &v[0]);
Toshihiro Shimizu 890ddd
		glDrawArrays(GL_LINES, 0, v.size());
Toshihiro Shimizu 890ddd
		glDisableClientState(GL_VERTEX_ARRAY);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawControlPoints(const TStroke *stroke, bool allPoints)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
	TPointD p;
Toshihiro Shimizu 890ddd
	glPointSize(4.0);
Toshihiro Shimizu 890ddd
	glBegin(GL_POINTS);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (allPoints) {
Toshihiro Shimizu 890ddd
		int n = stroke->getControlPointCount();
Toshihiro Shimizu 890ddd
		for (i = 0; i < n; ++i) {
Toshihiro Shimizu 890ddd
			p = stroke->getControlPoint(i);
Toshihiro Shimizu 890ddd
			glColor3d((i + 1) & 1, i & 1, 0.0);
Toshihiro Shimizu 890ddd
			glVertex2d(p.x, p.y);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		int n = stroke->getChunkCount();
Toshihiro Shimizu 890ddd
		for (i = 0; i < n; ++i) {
Toshihiro Shimizu 890ddd
			const TThickQuadratic *chunk = stroke->getChunk(i);
Toshihiro Shimizu 890ddd
			p = chunk->getP0();
Toshihiro Shimizu 890ddd
			glColor3d(1.0, 0.0, 0.0);
Toshihiro Shimizu 890ddd
			glVertex2d(p.x, p.y);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		const TThickQuadratic *chunk = stroke->getChunk(n - 1);
Toshihiro Shimizu 890ddd
		glColor3d(1.0, 0.0, 0.0);
Toshihiro Shimizu 890ddd
		p = chunk->getP2();
Toshihiro Shimizu 890ddd
		glVertex2d(p.x, p.y);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawCenterline(const TStroke *stroke)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_STRIP);
Toshihiro Shimizu 890ddd
	int n = stroke->getChunkCount();
Toshihiro Shimizu 890ddd
	int i = 0;
Toshihiro Shimizu 890ddd
	for (i = 0; i < n; ++i) {
Toshihiro Shimizu 890ddd
		const TThickQuadratic *chunk = stroke->getChunk(i);
Toshihiro Shimizu 890ddd
		double length = chunk->getLength(0, 1);
Shinya Kitaoka 12c444
		int maxCount = std::max(tceil(length / (5 * sqrt(tglGetPixelSize2()))), 1);
Toshihiro Shimizu 890ddd
		double deltaT = 1.0 / maxCount;
Toshihiro Shimizu 890ddd
		double t = 0;
Toshihiro Shimizu 890ddd
		for (t = 0; t < 1 + (deltaT / 2); t += deltaT) {
Toshihiro Shimizu 890ddd
			TPointD point = chunk->getPoint(t);
Toshihiro Shimizu 890ddd
			glVertex2d(point.x, point.y);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	return;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void OutlineViewerStyle::drawStroke(const TColorFunction *cf, TStrokeOutline *outline, const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixel32 color;
Toshihiro Shimizu 890ddd
	if (cf)
Toshihiro Shimizu 890ddd
		color = (*(cf))(getMainColor());
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		color = getMainColor();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_parameter[1] >= 1.0)
Toshihiro Shimizu 890ddd
		drawCenterline(stroke);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_parameter[2] >= 1.0)
Toshihiro Shimizu 890ddd
		drawOutline(outline, m_parameter[2] >= 2.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_parameter[0] >= 1.0)
Toshihiro Shimizu 890ddd
		drawControlPoints(stroke, m_parameter[0] >= 2.0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMatrioskaStrokeProp::TMatrioskaStrokeProp(const TStroke *stroke, TMatrioskaStrokeStyle *style)
Toshihiro Shimizu 890ddd
	: TStrokeProp(stroke), m_colorStyle(style), m_outline(), m_outlinePixelSize(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_styleVersionNumber = m_colorStyle->getVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TStrokeProp *TMatrioskaStrokeProp::clone(const TStroke *stroke) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TMatrioskaStrokeProp *prop = new TMatrioskaStrokeProp(stroke, m_colorStyle);
Toshihiro Shimizu 890ddd
	prop->m_strokeChanged = m_strokeChanged;
Toshihiro Shimizu 890ddd
	prop->m_outline = m_outline;
Toshihiro Shimizu 890ddd
	prop->m_outlinePixelSize = m_outlinePixelSize;
Toshihiro Shimizu 890ddd
	return prop;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TColorStyle *TMatrioskaStrokeProp::getColorStyle() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_colorStyle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
void recomputeStrokes(const TStroke *stroke, vector<tstroke *=""> &strokes, int strokeNumber)</tstroke>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	clearPointerContainer(strokes);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	strokes.resize(strokeNumber);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nCP = stroke->getControlPointCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double reduction;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int strokeId = 0; strokeId != strokeNumber; strokeId++) {
Toshihiro Shimizu 890ddd
		strokes[strokeId] = new TStroke(*stroke);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		reduction = ((double)strokeId + 0.5) / (double)(strokeNumber + 0.5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int i = 0; i < nCP; i++) {
Toshihiro Shimizu 890ddd
			TThickPoint tp = strokes[strokeId]->getControlPoint(i);
Toshihiro Shimizu 890ddd
			tp.thick *= reduction;
Toshihiro Shimizu 890ddd
			strokes[strokeId]->setControlPoint(i, tp);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void recomputeOutlines(const TStroke *stroke, vector<tstroke *=""> &strokes, vector<tstrokeoutline> &outlines, const TSolidColorStyle *style)</tstrokeoutline></tstroke>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TOutlineUtil::OutlineParameter param;
Toshihiro Shimizu 890ddd
	int strokeNumber = strokes.size();
Toshihiro Shimizu 890ddd
	outlines.resize(strokeNumber + 1);
Toshihiro Shimizu 890ddd
	int strokeId;
Toshihiro Shimizu 890ddd
	for (strokeId = 0; strokeId != strokeNumber; strokeId++) {
Toshihiro Shimizu 890ddd
		outlines[strokeId].getArray().clear();
Toshihiro Shimizu 890ddd
		style->computeOutline(strokes[strokeId], outlines[strokeId], param);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	outlines[strokeId].getArray().clear();
Toshihiro Shimizu 890ddd
	style->computeOutline(stroke, outlines[strokeId], param);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMatrioskaStrokeProp::draw(const TVectorRenderData &rd)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (rd.m_clippingRect != TRect() && !rd.m_is3dView && !convert(rd.m_aff * m_stroke->getBBox()).overlaps(rd.m_clippingRect))
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int strokeId;
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	tglMultMatrix(rd.m_aff);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double pixelSize = sqrt(tglGetPixelSize2());
Toshihiro Shimizu 890ddd
	int strokeNumber = (int)(m_colorStyle->getParamValue(TColorStyle::double_tag(), 0)) - 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_strokeChanged || (UINT)strokeNumber != m_appStrokes.size()) {
Toshihiro Shimizu 890ddd
		m_strokeChanged = false;
Toshihiro Shimizu 890ddd
		m_outlinePixelSize = pixelSize;
Toshihiro Shimizu 890ddd
		recomputeStrokes(m_stroke, m_appStrokes, strokeNumber);
Toshihiro Shimizu 890ddd
		recomputeOutlines(m_stroke, m_appStrokes, m_outline, m_colorStyle);
Toshihiro Shimizu 890ddd
	} else if (!isAlmostZero(pixelSize - m_outlinePixelSize, 1e-5)
Toshihiro Shimizu 890ddd
			   //      || m_styleVersionNumber != m_colorStyle->getVersionNumber()
Toshihiro Shimizu 890ddd
			   ) {
Toshihiro Shimizu 890ddd
		m_strokeChanged = false;
Toshihiro Shimizu 890ddd
		m_outlinePixelSize = pixelSize;
Toshihiro Shimizu 890ddd
		recomputeOutlines(m_stroke, m_appStrokes, m_outline, m_colorStyle);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_colorStyle->drawStroke(rd.m_cf, &m_outline[m_appStrokes.size()], m_stroke);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSolidColorStyle appStyle(m_colorStyle->getColorParamValue(1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  if(m_colorStyle->isAlternate())
Toshihiro Shimizu 890ddd
	//  {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (strokeId = strokeNumber - 1; strokeId >= 0; strokeId--) {
Toshihiro Shimizu 890ddd
		if ((m_appStrokes.size() - strokeId) & 1)
Toshihiro Shimizu 890ddd
			appStyle.drawStroke(rd.m_cf, &m_outline[strokeId], m_appStrokes[strokeId]);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			m_colorStyle->drawStroke(rd.m_cf, &m_outline[strokeId], m_appStrokes[strokeId]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  }
Toshihiro Shimizu 890ddd
	//  else
Toshihiro Shimizu 890ddd
	//  {
Toshihiro Shimizu 890ddd
	//    TPixel32 color0=m_colorStyle->getColorParamValue(0);
Toshihiro Shimizu 890ddd
	//    TPixel32 color1=m_colorStyle->getColorParamValue(1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//    for(strokeId=strokeNumber-1; strokeId>=0;strokeId--)
Toshihiro Shimizu 890ddd
	//    {
Toshihiro Shimizu 890ddd
	//      double r2=(double)strokeId/(double)(strokeNumber);
Toshihiro Shimizu 890ddd
	//      double r1=1-r2;
Toshihiro Shimizu 890ddd
	//      TPixel32  color((int)(color0.r*r2+color1.r*r1),
Toshihiro Shimizu 890ddd
	//                    (int)(color0.g*r2+color1.g*r1),
Toshihiro Shimizu 890ddd
	//                    (int)(color0.b*r2+color1.b*r1),
Toshihiro Shimizu 890ddd
	//                    (int)(color0.m*r2+color1.m*r1)
Toshihiro Shimizu 890ddd
	//                    );
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//      appStyle.setMainColor(color);
Toshihiro Shimizu 890ddd
	//      appStyle.drawStroke(rd.m_cf, &m_outline[strokeId],m_appStrokes[strokeId]);
Toshihiro Shimizu 890ddd
	//    }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMatrioskaStrokeProp::draw(TFlash &flash)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int strokeId, strokeNumber = (int)(m_colorStyle->getParamValue(TColorStyle::double_tag(), 0)) - 1;
Toshihiro Shimizu 890ddd
	if ((UINT)strokeNumber != m_appStrokes.size()) {
Toshihiro Shimizu 890ddd
		recomputeStrokes(m_stroke, m_appStrokes, strokeNumber);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_colorStyle->TOutlineStyle::drawStroke(flash, m_stroke);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TSolidColorStyle appStyle(m_colorStyle->getColorParamValue(1));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (strokeId = strokeNumber - 1; strokeId >= 0; strokeId--) {
Toshihiro Shimizu 890ddd
		if ((m_appStrokes.size() - strokeId) & 1)
Toshihiro Shimizu 890ddd
			appStyle.TOutlineStyle::drawStroke(flash, m_appStrokes[strokeId]);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			m_colorStyle->TOutlineStyle::drawStroke(flash, m_appStrokes[strokeId]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMatrioskaStrokeProp::~TMatrioskaStrokeProp()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	clearPointerContainer(m_appStrokes);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TMatrioskaStrokeStyle::TMatrioskaStrokeStyle(
Toshihiro Shimizu 890ddd
	TPixel32 color1, TPixel32 color2, double parameter, bool alternate)
Toshihiro Shimizu 890ddd
	: TSolidColorStyle(color1), m_color2(color2), m_parameter(parameter)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TColorStyle *TMatrioskaStrokeStyle::clone() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TMatrioskaStrokeStyle(*this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TStrokeProp *TMatrioskaStrokeStyle::makeStrokeProp(const TStroke *stroke)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TMatrioskaStrokeProp(stroke, this);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TMatrioskaStrokeStyle::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 TMatrioskaStrokeStyle::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 TMatrioskaStrokeStyle::getParamNames(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  if(index)
Toshihiro Shimizu 890ddd
	//    return "alter/gradual";
Toshihiro Shimizu 890ddd
	//  else
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return QCoreApplication::translate("TMatrioskaStrokeStyle", "Stripes");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMatrioskaStrokeStyle::getParamRange(int index, double &min, double &max) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  if(index)
Toshihiro Shimizu 890ddd
	//  {
Toshihiro Shimizu 890ddd
	//    min = 0;
Toshihiro Shimizu 890ddd
	//    max = 1;
Toshihiro Shimizu 890ddd
	//  }
Toshihiro Shimizu 890ddd
	//  else
Toshihiro Shimizu 890ddd
	//  {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	min = 1.0;
Toshihiro Shimizu 890ddd
	max = 10.0;
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double TMatrioskaStrokeStyle::getParamValue(TColorStyle::double_tag, int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  if(index)
Toshihiro Shimizu 890ddd
	//    return (m_alternate)? 0 : 1;
Toshihiro Shimizu 890ddd
	//  else
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return m_parameter;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMatrioskaStrokeStyle::setParamValue(int index, double value)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  if(index)
Toshihiro Shimizu 890ddd
	//    m_alternate = value<0.5;
Toshihiro Shimizu 890ddd
	//  else
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_parameter = value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	updateVersionNumber();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TPixel32 TMatrioskaStrokeStyle::getColorParamValue(int index) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	TPixel32 tmp;
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case (0):
Toshihiro Shimizu 890ddd
		tmp = TSolidColorStyle::getMainColor();
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case (1):
Toshihiro Shimizu 890ddd
		tmp = m_color2;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return tmp;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMatrioskaStrokeStyle::setColorParamValue(int index, const TPixel32 &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(0 <= index && index < 2);
Toshihiro Shimizu 890ddd
	switch (index) {
Toshihiro Shimizu 890ddd
	case (0):
Toshihiro Shimizu 890ddd
		TSolidColorStyle::setMainColor(color);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case (1):
Toshihiro Shimizu 890ddd
		m_color2 = color;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
void TMatrioskaStrokeStyle::loadData(TInputStreamInterface &is)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::loadData(is);
Toshihiro Shimizu 890ddd
	is >> m_parameter;
Toshihiro Shimizu 890ddd
	is >> m_color2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TMatrioskaStrokeStyle::saveData(TOutputStreamInterface &os) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TSolidColorStyle::saveData(os);
Toshihiro Shimizu 890ddd
	os << m_parameter;
Toshihiro Shimizu 890ddd
	os << m_color2;
Toshihiro Shimizu 890ddd
}