|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzCore includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tsystem.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tthread.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstopwatch.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tvectorgl.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tvectorrenderdata.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tvectorimage.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "trasterimage.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tlevel_io.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstrokeprop.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ttessellator.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcolorfunctions.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tflash.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tofflinegl.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "drawutil.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "trop.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstencilcontrol.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpalette.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpixelutils.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tregionprop.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcurves.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcurveutil.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstrokeoutline.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tregion.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tsimplecolorstyles.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
9f5a1b |
#ifndef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
#define CALLBACK
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TRasterImagePatternStrokeStyle::m_rootDir = TFilePath();
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TVectorImagePatternStrokeStyle::m_rootDir = TFilePath();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef NDEBUG
|
|
Campbell Barton |
8c6c57 |
static void checkGlError() {
|
|
Shinya Kitaoka |
120a6e |
GLenum err = glGetError();
|
|
Shinya Kitaoka |
120a6e |
assert(err != GL_INVALID_ENUM);
|
|
Shinya Kitaoka |
120a6e |
assert(err != GL_INVALID_VALUE);
|
|
Shinya Kitaoka |
120a6e |
assert(err != GL_INVALID_OPERATION);
|
|
Shinya Kitaoka |
120a6e |
assert(err != GL_STACK_OVERFLOW);
|
|
Shinya Kitaoka |
120a6e |
assert(err != GL_STACK_UNDERFLOW);
|
|
Shinya Kitaoka |
120a6e |
assert(err != GL_OUT_OF_MEMORY);
|
|
Shinya Kitaoka |
120a6e |
assert(err == GL_NO_ERROR);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#define CHECK_GL_ERROR checkGlError();
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
#define CHECK_GL_ERROR
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Use GL_LINE_STRIP to debug the centerline-to-outline algorithm
|
|
Toshihiro Shimizu |
890ddd |
#define QUAD_PRIMITIVE GL_QUAD_STRIP
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Local namespace stuff
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// se ras ha le dimensioni giuste (potenze di due) ritorna ras. Altrimenti
|
|
Toshihiro Shimizu |
890ddd |
// crea il piu' piccolo raster con le dimensioni giuste che contenga ras e
|
|
Toshihiro Shimizu |
890ddd |
// copia il contenuto (scalandolo)
|
|
Toshihiro Shimizu |
890ddd |
// se il raster di partenza e' vuoto, non e' ras32 o e' piu' piccolo di 2x2
|
|
Toshihiro Shimizu |
890ddd |
// ritorna un raster vuoto
|
|
Shinya Kitaoka |
120a6e |
TRaster32P makeTexture(const TRaster32P &ras) {
|
|
Shinya Kitaoka |
120a6e |
if (!ras || ras->getLx() < 2 || ras->getLy() < 2) return TRaster32P();
|
|
Shinya Kitaoka |
120a6e |
TRaster32P ras32 = ras;
|
|
Shinya Kitaoka |
120a6e |
if (!ras32) return TRaster32P();
|
|
Shinya Kitaoka |
120a6e |
TDimension d(2, 2);
|
|
Shinya Kitaoka |
120a6e |
while (d.lx < 256 && d.lx * 2 <= ras32->getLx()) d.lx *= 2;
|
|
Shinya Kitaoka |
120a6e |
while (d.ly < 256 && d.ly * 2 <= ras32->getLy()) d.ly *= 2;
|
|
Shinya Kitaoka |
120a6e |
if (d == ras32->getSize())
|
|
Shinya Kitaoka |
120a6e |
return ras32;
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
TRaster32P texture(d);
|
|
Shinya Kitaoka |
120a6e |
TScale sc((double)d.lx / ras32->getLx(), (double)d.ly / ras32->getLy());
|
|
Shinya Kitaoka |
120a6e |
TRop::resample(texture, ras32, sc);
|
|
Shinya Kitaoka |
120a6e |
return texture;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void drawAntialiasedOutline(const std::vector<toutlinepoint> &_v,</toutlinepoint>
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) {
|
|
Shinya Kitaoka |
120a6e |
static const int stride = 2 * sizeof(TOutlinePoint);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
glEnableClientState(GL_VERTEX_ARRAY);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
glVertexPointer(2, GL_DOUBLE, stride, &_v[0]);
|
|
Shinya Kitaoka |
120a6e |
glDrawArrays(GL_LINE_STRIP, 0, _v.size() / 2);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
glVertexPointer(2, GL_DOUBLE, stride, &_v[1]);
|
|
Shinya Kitaoka |
120a6e |
glDrawArrays(GL_LINE_STRIP, 0, _v.size() / 2);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
glDisableClientState(GL_VERTEX_ARRAY);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// DisplayListManager definition
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DisplayListManager // singleton
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TThread::Mutex m_mutex;
|
|
Shinya Kitaoka |
120a6e |
typedef HGLRC T_hGlContext;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//----------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
struct Key {
|
|
Shinya Kitaoka |
120a6e |
std::string m_name;
|
|
Shinya Kitaoka |
120a6e |
TFrameId m_fid;
|
|
Shinya Kitaoka |
120a6e |
T_hGlContext m_glContext;
|
|
Shinya Kitaoka |
120a6e |
Key(std::string name, TFrameId fid, T_hGlContext glContext)
|
|
Shinya Kitaoka |
120a6e |
: m_name(name), m_fid(fid), m_glContext(glContext) {}
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//----------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
struct Info {
|
|
Shinya Kitaoka |
120a6e |
GLuint m_displayListId;
|
|
Shinya Kitaoka |
120a6e |
TColorFunction::Parameters m_parameters;
|
|
Shinya Kitaoka |
120a6e |
HDC m_hdc;
|
|
Shinya Kitaoka |
120a6e |
Info()
|
|
Shinya Kitaoka |
120a6e |
: m_displayListId(0)
|
|
Shinya Kitaoka |
120a6e |
, m_hdc(0)
|
|
Shinya Kitaoka |
120a6e |
, m_parameters(TColorFunction::Parameters()) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
Info(GLuint displayListId, HDC hdc, TColorFunction::Parameters parameters)
|
|
Shinya Kitaoka |
120a6e |
: m_displayListId(displayListId)
|
|
Shinya Kitaoka |
120a6e |
, m_hdc(hdc)
|
|
Shinya Kitaoka |
120a6e |
, m_parameters(parameters) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// se ad una stessa chiave corrispondono due displayInfo diversi (second
|
|
Shinya Kitaoka |
120a6e |
// questo metodo),
|
|
Shinya Kitaoka |
120a6e |
// si aggiorna la displayList secondo l'ultima chiamata.
|
|
Shinya Kitaoka |
120a6e |
// Serve per non duplicare troppe liste, per parametri che non cambiano
|
|
Shinya Kitaoka |
120a6e |
// spesso, come le cf.
|
|
Shinya Kitaoka |
120a6e |
bool isDrawnAs(const Info &linfo) {
|
|
Shinya Kitaoka |
120a6e |
return (this->m_parameters.m_mR == linfo.m_parameters.m_mR &&
|
|
Shinya Kitaoka |
120a6e |
this->m_parameters.m_mG == linfo.m_parameters.m_mG &&
|
|
Shinya Kitaoka |
120a6e |
this->m_parameters.m_mB == linfo.m_parameters.m_mB &&
|
|
Shinya Kitaoka |
120a6e |
this->m_parameters.m_mM == linfo.m_parameters.m_mM &&
|
|
Shinya Kitaoka |
120a6e |
this->m_parameters.m_cR == linfo.m_parameters.m_cR &&
|
|
Shinya Kitaoka |
120a6e |
this->m_parameters.m_cG == linfo.m_parameters.m_cG &&
|
|
Shinya Kitaoka |
120a6e |
this->m_parameters.m_cB == linfo.m_parameters.m_cB &&
|
|
Shinya Kitaoka |
120a6e |
this->m_parameters.m_cM == linfo.m_parameters.m_cM);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
//----------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
d1f6c4 |
struct KeyLess final : public std::binary_function<key, bool="" key,=""> {</key,>
|
|
Shinya Kitaoka |
120a6e |
bool operator()(const Key &d1, const Key &d2) const {
|
|
Shinya Kitaoka |
120a6e |
return d1.m_glContext < d2.m_glContext ||
|
|
Shinya Kitaoka |
120a6e |
(d1.m_glContext == d2.m_glContext &&
|
|
Shinya Kitaoka |
120a6e |
(d1.m_fid < d2.m_fid ||
|
|
Shinya Kitaoka |
120a6e |
d1.m_fid == d2.m_fid && d1.m_name < d2.m_name));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//----------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
typedef std::map<key, info,="" keyless=""> DisplayListMap;</key,>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
DisplayListMap m_displayListMap;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
DisplayListManager() {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void recordList(GLuint listId, TVectorImage *image,
|
|
Shinya Kitaoka |
120a6e |
const TVectorRenderData &rd) {
|
|
Shinya Kitaoka |
120a6e |
QMutexLocker sl(&m_mutex);
|
|
Shinya Kitaoka |
120a6e |
TRectD bbox = image->getBBox();
|
|
Shinya Kitaoka |
120a6e |
double ry = bbox.getLy() * 0.5;
|
|
Shinya Kitaoka |
120a6e |
if (ry < 1e-5) ry = 1e-5;
|
|
Shinya Kitaoka |
120a6e |
TAffine identity;
|
|
Shinya Kitaoka |
120a6e |
TRect rect;
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glLoadIdentity();
|
|
Shinya Kitaoka |
120a6e |
// forzo pixelSize come se si disegnasse su una stroke con thickness=10
|
|
Shinya Kitaoka |
120a6e |
// tglMultMatrix(TScale(10.0/ry));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// forzo pixelSize a 20.
|
|
Shinya Kitaoka |
120a6e |
// In questo modo, un'immagine piu' grande (nel pli
|
|
Shinya Kitaoka |
120a6e |
// che definisce il custom style) viene piu' definita di una piu' piccola,
|
|
Shinya Kitaoka |
120a6e |
// anche se appaiono della stessa dimensione (che dipende esclusivamente
|
|
Shinya Kitaoka |
120a6e |
// dalla thickness)
|
|
Shinya Kitaoka |
120a6e |
// tglMultMatrix(TScale(0.50));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPalette *vPalette = image->getPalette();
|
|
Shinya Kitaoka |
120a6e |
assert(vPalette);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TVectorRenderData rd2(identity, rect, vPalette, rd.m_cf, true, true);
|
|
Shinya Kitaoka |
120a6e |
rd2.m_isOfflineRender = rd.m_isOfflineRender;
|
|
Shinya Kitaoka |
120a6e |
rd2.m_isImagePattern = true;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
glNewList(listId, GL_COMPILE);
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
tglDraw(rd2, image);
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
glEndList();
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
static DisplayListManager *instance() {
|
|
Shinya Kitaoka |
120a6e |
static DisplayListManager singleton;
|
|
Shinya Kitaoka |
120a6e |
return &singleton;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
//--------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
GLuint getDisplayListId(TVectorImage *image, std::string name, TFrameId fid,
|
|
Shinya Kitaoka |
120a6e |
const TVectorRenderData &rd) {
|
|
Shinya Kitaoka |
120a6e |
QMutexLocker sl(&m_mutex);
|
|
Shinya Kitaoka |
120a6e |
TColorFunction::Parameters parameters;
|
|
Shinya Kitaoka |
120a6e |
if (rd.m_cf) rd.m_cf->getParameters(parameters);
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
HDC hDC = wglGetCurrentDC();
|
|
Shinya Kitaoka |
120a6e |
T_hGlContext hContext = wglGetCurrentContext();
|
|
Shinya Kitaoka |
120a6e |
Info listInfo(0, hDC, parameters);
|
|
Shinya Kitaoka |
120a6e |
Key key(name, fid, hContext);
|
|
Shinya Kitaoka |
120a6e |
DisplayListMap::iterator it = m_displayListMap.find(key);
|
|
Shinya Kitaoka |
120a6e |
if (it != m_displayListMap.end()) {
|
|
Shinya Kitaoka |
120a6e |
if (listInfo.isDrawnAs(it->second)) {
|
|
Shinya Kitaoka |
120a6e |
// lascia tutto com'e' ed utilizza la displaliList
|
|
Shinya Kitaoka |
120a6e |
listInfo.m_displayListId = it->second.m_displayListId;
|
|
Shinya Kitaoka |
120a6e |
} else { // aggiorna la displayList con le nuove info (attualmente solo
|
|
Shinya Kitaoka |
120a6e |
// la cf)
|
|
Shinya Kitaoka |
120a6e |
listInfo.m_displayListId = it->second.m_displayListId;
|
|
Shinya Kitaoka |
120a6e |
recordList(listInfo.m_displayListId, image, rd);
|
|
Shinya Kitaoka |
120a6e |
m_displayListMap[key] = listInfo;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
} else // se non ho mai disegnato l'immagine creo la displayList
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
listInfo.m_displayListId = glGenLists(1);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (listInfo.m_displayListId != 0)
|
|
Shinya Kitaoka |
120a6e |
recordList(listInfo.m_displayListId, image, rd);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
std::cout << "list of " << name << fid << " is 0." << std::endl;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
m_displayListMap[key] = listInfo;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return listInfo.m_displayListId;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void clearLists() {
|
|
Shinya Kitaoka |
120a6e |
// save current context and others
|
|
Shinya Kitaoka |
120a6e |
HDC hCurrentDC = wglGetCurrentDC();
|
|
Shinya Kitaoka |
120a6e |
T_hGlContext hCurrentContext = wglGetCurrentContext();
|
|
Shinya Kitaoka |
120a6e |
// free all display lists
|
|
Shinya Kitaoka |
120a6e |
DisplayListMap::iterator it = m_displayListMap.begin();
|
|
Shinya Kitaoka |
120a6e |
for (; it != m_displayListMap.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
wglMakeCurrent(it->second.m_hdc, it->first.m_glContext);
|
|
Shinya Kitaoka |
120a6e |
glDeleteLists(it->second.m_displayListId, 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_displayListMap.clear();
|
|
Shinya Kitaoka |
120a6e |
// restore current context
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
wglMakeCurrent(hCurrentDC, hCurrentContext);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
#endif // _WIN32
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TSimpleStrokeStyle implementation
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStrokeProp *TSimpleStrokeStyle::makeStrokeProp(const TStroke *stroke) {
|
|
Shinya Kitaoka |
120a6e |
return new TSimpleStrokeProp(stroke, this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TOutlineStyle implementation
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TOutlineStyle::TOutlineStyle() : m_regionOutlineModifier(0) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TOutlineStyle::TOutlineStyle(const TOutlineStyle &other)
|
|
Shinya Kitaoka |
120a6e |
: TColorStyle(other)
|
|
Shinya Kitaoka |
120a6e |
, m_regionOutlineModifier(other.m_regionOutlineModifier
|
|
Shinya Kitaoka |
120a6e |
? other.m_regionOutlineModifier->clone()
|
|
Shinya Kitaoka |
120a6e |
: 0) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TOutlineStyle::~TOutlineStyle() { delete m_regionOutlineModifier; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TOutlineStyle::setRegionOutlineModifier(RegionOutlineModifier *modifier) {
|
|
Shinya Kitaoka |
120a6e |
delete m_regionOutlineModifier;
|
|
Shinya Kitaoka |
120a6e |
m_regionOutlineModifier = modifier;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStrokeProp *TOutlineStyle::makeStrokeProp(const TStroke *stroke) {
|
|
Shinya Kitaoka |
120a6e |
return new OutlineStrokeProp(stroke, this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TRegionProp *TOutlineStyle::makeRegionProp(const TRegion *region) {
|
|
Shinya Kitaoka |
120a6e |
return new OutlineRegionProp(region, this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TOutlineStyle::computeOutline(const TStroke *stroke,
|
|
Shinya Kitaoka |
120a6e |
TStrokeOutline &outline,
|
|
Shinya Kitaoka |
120a6e |
TOutlineUtil::OutlineParameter param) const {
|
|
Shinya Kitaoka |
120a6e |
TOutlineUtil::makeOutline(*stroke, outline, param);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TSolidColorStyle implementation
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TSolidColorStyle::TSolidColorStyle(const TPixel32 &color)
|
|
Shinya Kitaoka |
120a6e |
: m_color(color), m_tessellator(new TglTessellator) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TSolidColorStyle::TSolidColorStyle(const TSolidColorStyle &other)
|
|
Shinya Kitaoka |
120a6e |
: TOutlineStyle(other)
|
|
Shinya Kitaoka |
120a6e |
, m_color(other.m_color)
|
|
Shinya Kitaoka |
120a6e |
, m_tessellator(new TglTessellator) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TSolidColorStyle::~TSolidColorStyle() { delete m_tessellator; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *TSolidColorStyle::clone() const {
|
|
Shinya Kitaoka |
120a6e |
return new TSolidColorStyle(*this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TSolidColorStyle::makeIcon(const TDimension &size) {
|
|
Shinya Kitaoka |
120a6e |
/*-- TSolidColorStyle, TColorCleanupStyle, TBlackCleanupStyle --*/
|
|
Shinya Kitaoka |
120a6e |
if (getTagId() != 3 && getTagId() != 2001 &&
|
|
Shinya Kitaoka |
120a6e |
getTagId() !=
|
|
Shinya Kitaoka |
120a6e |
2002) // e' un'istanza di una classe derivata da TSolidColorStyle
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
TColorStyle::makeIcon(size);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (!m_icon || m_icon->getSize() != size) {
|
|
Shinya Kitaoka |
120a6e |
TRaster32P ras(size);
|
|
Shinya Kitaoka |
120a6e |
m_icon = ras;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TPixel32 col = m_color;
|
|
Shinya Kitaoka |
120a6e |
if (col.m == 255)
|
|
Shinya Kitaoka |
120a6e |
m_icon->fill(col);
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
TRaster32P fg(size);
|
|
Shinya Kitaoka |
120a6e |
fg->fill(premultiply(col));
|
|
Shinya Kitaoka |
120a6e |
TRop::checkBoard(m_icon, TPixel32::Black, TPixel32::White,
|
|
Shinya Kitaoka |
120a6e |
TDimensionD(6, 6), TPointD());
|
|
Shinya Kitaoka |
120a6e |
TRop::over(m_icon, fg);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TSolidColorStyle::drawRegion(const TColorFunction *cf,
|
|
Shinya Kitaoka |
120a6e |
const bool antiAliasing,
|
|
Shinya Kitaoka |
120a6e |
TRegionOutline &boundary) const {
|
|
Shinya Kitaoka |
120a6e |
m_tessellator->tessellate(cf, antiAliasing, boundary, m_color);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TSolidColorStyle::drawRegion(TFlash &flash, const TRegion *r) const {
|
|
Shinya Kitaoka |
120a6e |
flash.setFillColor(getMainColor());
|
|
Shinya Kitaoka |
120a6e |
flash.setLineColor(TPixel::Transparent);
|
|
Shinya Kitaoka |
120a6e |
flash.setThickness(0);
|
|
Shinya Kitaoka |
120a6e |
flash.drawRegion(*r);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TSolidColorStyle::drawStroke(const TColorFunction *cf,
|
|
Shinya Kitaoka |
120a6e |
TStrokeOutline *outline,
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) const {
|
|
Shinya Kitaoka |
120a6e |
struct locals {
|
|
Shinya Kitaoka |
120a6e |
static inline void fillOutlinedStroke(const std::vector<toutlinepoint> &v) {</toutlinepoint>
|
|
Shinya Kitaoka |
120a6e |
static const int stride = sizeof(TOutlinePoint);
|
|
Shinya Kitaoka |
120a6e |
glEnableClientState(GL_VERTEX_ARRAY);
|
|
Shinya Kitaoka |
120a6e |
glVertexPointer(2, GL_DOUBLE, stride, &v[0]);
|
|
Shinya Kitaoka |
120a6e |
glDrawArrays(QUAD_PRIMITIVE, 0, v.size());
|
|
Shinya Kitaoka |
120a6e |
glDisableClientState(GL_VERTEX_ARRAY);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}; // locals
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPixel32 color = m_color;
|
|
Shinya Kitaoka |
120a6e |
if (cf) color = (*cf)(color);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (color.m == 0) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglColor(color);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
const std::vector<toutlinepoint> &v = outline->getArray();</toutlinepoint>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (v.empty()) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (true) // color.m != 254) // !dummyStyle)
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
if (color.m < 255) {
|
|
Shinya Kitaoka |
120a6e |
TStencilControl *stencil = TStencilControl::instance();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
// invertendo l'ordine tra disegno interno e contorno, l'antialiasing
|
|
Shinya Kitaoka |
120a6e |
// peggiora un po'. Piu che altro, il mangiucchiamento che faceva su alcune
|
|
Shinya Kitaoka |
120a6e |
macchine,
|
|
Shinya Kitaoka |
120a6e |
// ma solo in drawOnScreen, ora lo fa anche quando si renderizza offline
|
|
Shinya Kitaoka |
120a6e |
stencil->beginMask(TStencilControl::DRAW_ON_SCREEN_ONLY_ONCE);
|
|
Shinya Kitaoka |
120a6e |
// center line
|
|
Shinya Kitaoka |
120a6e |
fillOutlinedStroke(v);
|
|
Shinya Kitaoka |
120a6e |
// outline with antialiasing
|
|
Shinya Kitaoka |
120a6e |
drawAntialiasedOutline(v);
|
|
Shinya Kitaoka |
120a6e |
stencil->endMask();
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
stencil->beginMask(TStencilControl::DRAW_ON_SCREEN_ONLY_ONCE);
|
|
Shinya Kitaoka |
120a6e |
locals::fillOutlinedStroke(v);
|
|
Shinya Kitaoka |
120a6e |
stencil->endMask();
|
|
Shinya Kitaoka |
120a6e |
stencil->enableMask(TStencilControl::SHOW_OUTSIDE);
|
|
Shinya Kitaoka |
120a6e |
drawAntialiasedOutline(v, stroke);
|
|
Shinya Kitaoka |
120a6e |
stencil->disableMask();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
// outline with antialiasing
|
|
Shinya Kitaoka |
120a6e |
drawAntialiasedOutline(v, stroke);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// center line
|
|
Shinya Kitaoka |
120a6e |
locals::fillOutlinedStroke(v);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
int i = 0;
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < stroke->getControlPointCount(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TThickPoint p = stroke->getControlPoint(i);
|
|
Shinya Kitaoka |
120a6e |
if (i % 2) {
|
|
Shinya Kitaoka |
120a6e |
tglColor(TPixel32(255, 0, 0));
|
|
Shinya Kitaoka |
120a6e |
tglDrawCircle(p, p.thick);
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
tglColor(TPixel32(255, 200, 200));
|
|
Shinya Kitaoka |
120a6e |
tglDrawDisk(p, p.thick);
|
|
Shinya Kitaoka |
120a6e |
tglColor(TPixel32(0, 255, 0));
|
|
Shinya Kitaoka |
120a6e |
tglDrawCircle(p, p.thick);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
tglColor(TPixel32(127, 127, 127));
|
|
Shinya Kitaoka |
120a6e |
tglDrawDisk(p, 0.3);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
tglColor(TPixel32(127, 127, 127));
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < stroke->getControlPointCount(); i++)
|
|
Shinya Kitaoka |
120a6e |
tglVertex(stroke->getControlPoint(i));
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglColor(TPixel32(0, 0, 0));
|
|
Shinya Kitaoka |
120a6e |
drawAntialiasedOutline(v, stroke);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QString TSolidColorStyle::getDescription() const { return "SolidColorStyle"; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int TSolidColorStyle::getTagId() const { return 3; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TSolidColorStyle::setFill(TFlash &flash) const {
|
|
Shinya Kitaoka |
120a6e |
flash.setFillColor(getMainColor());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TSolidColorStyle::loadData(TInputStreamInterface &is) {
|
|
Shinya Kitaoka |
120a6e |
TPixel32 color;
|
|
Shinya Kitaoka |
120a6e |
is >> color;
|
|
Shinya Kitaoka |
120a6e |
m_color = color;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TSolidColorStyle::saveData(TOutputStreamInterface &os) const {
|
|
Shinya Kitaoka |
120a6e |
os << m_color;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TCenterLineStrokeStyle implementation
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TCenterLineStrokeStyle::TCenterLineStrokeStyle(const TPixel32 &color,
|
|
Shinya Kitaoka |
120a6e |
USHORT stipple, double width)
|
|
Shinya Kitaoka |
120a6e |
: m_color(color), m_stipple(stipple), m_width(width) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *TCenterLineStrokeStyle::clone() const {
|
|
Shinya Kitaoka |
120a6e |
return new TCenterLineStrokeStyle(*this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TCenterLineStrokeStyle::drawStroke(TFlash &flash, const TStroke *s) const {
|
|
Shinya Kitaoka |
120a6e |
if (m_width == 0) return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
flash.setThickness(m_width);
|
|
Shinya Kitaoka |
120a6e |
flash.setLineColor(getAverageColor());
|
|
Shinya Kitaoka |
120a6e |
flash.drawCenterline(s, true);
|
|
Shinya Kitaoka |
120a6e |
flash.setThickness(0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TCenterLineStrokeStyle::drawStroke(const TColorFunction *cf,
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) const {
|
|
Shinya Kitaoka |
120a6e |
if (!stroke) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// center line
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int i, n = stroke->getChunkCount();
|
|
Shinya Kitaoka |
120a6e |
if (n == 0) return;
|
|
Shinya Kitaoka |
120a6e |
TPixel32 color = m_color;
|
|
Shinya Kitaoka |
120a6e |
if (cf) color = (*cf)(m_color);
|
|
Shinya Kitaoka |
120a6e |
if (color.m == 0) return;
|
|
Shinya Kitaoka |
120a6e |
tglColor(color);
|
|
Shinya Kitaoka |
120a6e |
double pixelSize = sqrt(tglGetPixelSize2());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_stipple != 0) {
|
|
Shinya Kitaoka |
120a6e |
glEnable(GL_LINE_STIPPLE);
|
|
Shinya Kitaoka |
120a6e |
glLineStipple(1, m_stipple);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
const TThickQuadratic *q = 0;
|
|
Shinya Kitaoka |
120a6e |
q = stroke->getChunk(0);
|
|
Shinya Kitaoka |
120a6e |
GLfloat rangeValue[2];
|
|
Shinya Kitaoka |
120a6e |
glGetFloatv(GL_LINE_WIDTH_RANGE, &rangeValue[0]);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
float width = float(m_width);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (width < rangeValue[0])
|
|
Shinya Kitaoka |
120a6e |
width = rangeValue[0];
|
|
Shinya Kitaoka |
120a6e |
else if (width > rangeValue[1])
|
|
Shinya Kitaoka |
120a6e |
width = rangeValue[1];
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
width = 2 * width;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (width <= 1.0) {
|
|
Shinya Kitaoka |
120a6e |
if (m_width != 0.0) width /= pixelSize;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (width ==
|
|
Shinya Kitaoka |
120a6e |
0.F) // http://www.opengl.org/sdk/docs/man/xhtml/glLineWidth.xml
|
|
Shinya Kitaoka |
120a6e |
width = 0.00001;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glLineWidth(width);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < n; i++) {
|
|
Shinya Kitaoka |
120a6e |
q = stroke->getChunk(i);
|
|
Shinya Kitaoka |
120a6e |
double step = computeStep(*q, pixelSize);
|
|
Shinya Kitaoka |
120a6e |
for (double t = 0; t < 1; t += step) tglVertex(q->getPoint(t));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
assert(q);
|
|
Shinya Kitaoka |
120a6e |
tglVertex(q->getP2());
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
double s = 0;
|
|
Shinya Kitaoka |
120a6e |
double length = stroke->getLength();
|
|
Shinya Kitaoka |
120a6e |
TPointD pos1, pos4;
|
|
Shinya Kitaoka |
120a6e |
std::vector<tpointd> pv;</tpointd>
|
|
Shinya Kitaoka |
120a6e |
width = width / 2.;
|
|
Shinya Kitaoka |
120a6e |
while (s <= length) {
|
|
Shinya Kitaoka |
120a6e |
double step = 1.0;
|
|
Shinya Kitaoka |
120a6e |
double w = stroke->getParameterAtLength(s);
|
|
Shinya Kitaoka |
120a6e |
if (w <= 0) {
|
|
Shinya Kitaoka |
120a6e |
s += 0.01;
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
} // per tamponare il baco della getParameterAtLength()
|
|
Shinya Kitaoka |
120a6e |
TPointD u = stroke->getSpeed(w);
|
|
Shinya Kitaoka |
120a6e |
if (norm2(u) == 0) {
|
|
Shinya Kitaoka |
120a6e |
s += 0.1;
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
} // non dovrebbe succedere mai, ma per prudenza....
|
|
Shinya Kitaoka |
120a6e |
TThickPoint pos = stroke->getThickPoint(w);
|
|
Shinya Kitaoka |
120a6e |
u = normalize(u);
|
|
Shinya Kitaoka |
120a6e |
TPointD v = rotate90(u) * (width);
|
|
Shinya Kitaoka |
120a6e |
pos1 = pos + v;
|
|
Shinya Kitaoka |
120a6e |
pos4 = pos - v;
|
|
Shinya Kitaoka |
120a6e |
pv.push_back(pos1);
|
|
Shinya Kitaoka |
120a6e |
pv.push_back(pos4);
|
|
Shinya Kitaoka |
120a6e |
s += step;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
double w = stroke->getParameterAtLength(length);
|
|
Shinya Kitaoka |
120a6e |
if (w > 0) {
|
|
Shinya Kitaoka |
120a6e |
TPointD u = stroke->getSpeed(w);
|
|
Shinya Kitaoka |
120a6e |
if (norm2(u) != 0) {
|
|
Shinya Kitaoka |
120a6e |
TThickPoint pos = stroke->getThickPoint(w);
|
|
Shinya Kitaoka |
120a6e |
u = normalize(u);
|
|
Shinya Kitaoka |
120a6e |
TPointD v = rotate90(u) * (width);
|
|
Shinya Kitaoka |
120a6e |
pos1 = pos + v;
|
|
Shinya Kitaoka |
120a6e |
pos4 = pos - v;
|
|
Shinya Kitaoka |
120a6e |
pv.push_back(pos1);
|
|
Shinya Kitaoka |
120a6e |
pv.push_back(pos4);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (pv.size() > 2) {
|
|
Shinya Kitaoka |
120a6e |
glColor4ub(color.r, color.g, color.b, color.m);
|
|
Shinya Kitaoka |
120a6e |
glBegin(QUAD_PRIMITIVE);
|
|
Shinya Kitaoka |
120a6e |
std::vector<tpointd>::iterator it = pv.begin();</tpointd>
|
|
Shinya Kitaoka |
120a6e |
for (; it != pv.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
tglVertex(*it);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::vector<tpointd>::iterator it1 = pv.begin();</tpointd>
|
|
Shinya Kitaoka |
120a6e |
for (; it1 != pv.end(); ++it1) {
|
|
Shinya Kitaoka |
120a6e |
++it1;
|
|
Shinya Kitaoka |
120a6e |
tglVertex(*it1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
std::vector<tpointd>::iterator it2 = pv.begin();</tpointd>
|
|
Shinya Kitaoka |
120a6e |
if (it2 != pv.end()) ++it2;
|
|
Shinya Kitaoka |
120a6e |
for (; it2 != pv.end() - 1; ++it2) {
|
|
Shinya Kitaoka |
120a6e |
++it2;
|
|
Shinya Kitaoka |
120a6e |
tglVertex(*it2);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_stipple != 0) glDisable(GL_LINE_STIPPLE);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glLineWidth(1.0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QString TCenterLineStrokeStyle::getDescription() const {
|
|
Shinya Kitaoka |
120a6e |
return QCoreApplication::translate("TCenterLineStrokeStyle", "Constant");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int TCenterLineStrokeStyle::getTagId() const { return 2; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TCenterLineStrokeStyle::loadData(TInputStreamInterface &is) {
|
|
Shinya Kitaoka |
120a6e |
is >> m_color >> m_stipple >> m_width;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TCenterLineStrokeStyle::saveData(TOutputStreamInterface &os) const {
|
|
Shinya Kitaoka |
120a6e |
os << m_color << m_stipple << m_width;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int TCenterLineStrokeStyle::getParamCount() const { return 1; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TColorStyle::ParamType TCenterLineStrokeStyle::getParamType(int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return TColorStyle::DOUBLE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QString TCenterLineStrokeStyle::getParamNames(int index) const {
|
|
Shinya Kitaoka |
120a6e |
return QCoreApplication::translate("TCenterLineStrokeStyle", "Thickness");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TCenterLineStrokeStyle::getParamRange(int index, double &min,
|
|
Shinya Kitaoka |
120a6e |
double &max) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
min = 0.0, max = 10.0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
double TCenterLineStrokeStyle::getParamValue(TColorStyle::double_tag,
|
|
Shinya Kitaoka |
120a6e |
int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return m_width;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TCenterLineStrokeStyle::setParamValue(int index, double value) {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
m_width = value;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Shinya Kitaoka |
120a6e |
TPixel32 TTextureStyle::getMainColor() const
|
|
Toshihiro Shimizu |
890ddd |
{return m_averageColor; }*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TRasterImagePatternStrokeStyle implementation
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TRasterImagePatternStrokeStyle::TRasterImagePatternStrokeStyle()
|
|
Shinya Kitaoka |
120a6e |
: m_level(), m_name(""), m_space(0), m_rotation(0) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TRasterImagePatternStrokeStyle::TRasterImagePatternStrokeStyle(
|
|
Shinya Kitaoka |
120a6e |
const std::string &patternName)
|
|
Shinya Kitaoka |
120a6e |
: m_level(), m_name(patternName), m_space(20), m_rotation(0) {
|
|
Shinya Kitaoka |
120a6e |
if (m_name != "") loadLevel(m_name);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *TRasterImagePatternStrokeStyle::clone() const {
|
|
Shinya Kitaoka |
120a6e |
return new TRasterImagePatternStrokeStyle(*this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::makeIcon(const TDimension &size) {
|
|
Shinya Kitaoka |
120a6e |
if (!m_level) loadLevel(m_name);
|
|
Shinya Kitaoka |
120a6e |
m_icon = TRaster32P();
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator frameIt = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (frameIt != m_level->end()) {
|
|
Shinya Kitaoka |
120a6e |
TRasterImageP img = frameIt->second;
|
|
Shinya Kitaoka |
120a6e |
TRaster32P src;
|
|
Shinya Kitaoka |
120a6e |
if (img) src = img->getRaster();
|
|
Shinya Kitaoka |
120a6e |
if (src && src->getLx() > 1 && src->getLy() > 1) {
|
|
Shinya Kitaoka |
120a6e |
TRaster32P icon(size);
|
|
Shinya Kitaoka |
120a6e |
icon->fill(TPixel32::White);
|
|
Shinya Kitaoka |
120a6e |
double sx = (double)icon->getLx() / (double)src->getLx();
|
|
Shinya Kitaoka |
120a6e |
double sy = (double)icon->getLy() / (double)src->getLy();
|
|
Shinya Kitaoka |
120a6e |
double sc = 0.8 * std::min(sx, sy);
|
|
Shinya Kitaoka |
120a6e |
TRop::resample(icon, src,
|
|
Shinya Kitaoka |
120a6e |
TScale(sc).place(src->getCenterD(), icon->getCenterD()));
|
|
Shinya Kitaoka |
120a6e |
TRop::addBackground(icon, TPixel32::White);
|
|
Shinya Kitaoka |
120a6e |
m_icon = icon;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (!m_icon) {
|
|
Shinya Kitaoka |
120a6e |
TRaster32P icon(size);
|
|
Shinya Kitaoka |
120a6e |
icon->fill(TPixel32::Black);
|
|
Shinya Kitaoka |
120a6e |
int lx = icon->getLx();
|
|
Shinya Kitaoka |
120a6e |
int ly = icon->getLy();
|
|
Shinya Kitaoka |
120a6e |
for (int y = 0; y < ly; y++) {
|
|
Shinya Kitaoka |
120a6e |
int x = ((lx - 1 - 10) * y / ly);
|
|
Shinya Kitaoka |
120a6e |
icon->extractT(x, y, x + 5, y)->fill(TPixel32::Red);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_icon = icon;
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int TRasterImagePatternStrokeStyle::getParamCount() const { return 2; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TColorStyle::ParamType TRasterImagePatternStrokeStyle::getParamType(
|
|
Shinya Kitaoka |
120a6e |
int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return TColorStyle::DOUBLE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QString TRasterImagePatternStrokeStyle::getParamNames(int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return (index == 0) ? QCoreApplication::translate(
|
|
Shinya Kitaoka |
120a6e |
"TRasterImagePatternStrokeStyle", "Distance")
|
|
Shinya Kitaoka |
120a6e |
: QCoreApplication::translate(
|
|
Shinya Kitaoka |
120a6e |
"TRasterImagePatternStrokeStyle", "Rotation");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::getParamRange(int index, double &min,
|
|
Shinya Kitaoka |
120a6e |
double &max) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (index == 0) {
|
|
Shinya Kitaoka |
120a6e |
min = -50;
|
|
Shinya Kitaoka |
120a6e |
max = 50;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
min = -180;
|
|
Shinya Kitaoka |
120a6e |
max = 180;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
double TRasterImagePatternStrokeStyle::getParamValue(TColorStyle::double_tag,
|
|
Shinya Kitaoka |
120a6e |
int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return (index == 0) ? m_space : m_rotation;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::setParamValue(int index, double value) {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (index == 0) {
|
|
Shinya Kitaoka |
120a6e |
if (m_space != value) {
|
|
Shinya Kitaoka |
120a6e |
updateVersionNumber(); // aggiorna il vettore di affini
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_space = value;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (m_rotation != value) {
|
|
Shinya Kitaoka |
120a6e |
updateVersionNumber(); // aggiorna il vettore di affini
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_rotation = value;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// carico il pattern 'patternName' dalla directory dei custom styles
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::loadLevel(const std::string &patternName) {
|
|
Shinya Kitaoka |
120a6e |
struct locals {
|
|
Shinya Kitaoka |
120a6e |
static TAffine getAffine(const TDimension &srcSize,
|
|
Shinya Kitaoka |
120a6e |
const TDimension &dstSize) {
|
|
Shinya Kitaoka |
120a6e |
double scx = 1 * dstSize.lx / (double)srcSize.lx;
|
|
Shinya Kitaoka |
120a6e |
double scy = 1 * dstSize.ly / (double)srcSize.ly;
|
|
Shinya Kitaoka |
120a6e |
double sc = std::min(scx, scy);
|
|
Shinya Kitaoka |
120a6e |
double dx = (dstSize.lx - srcSize.lx * sc) * 0.5;
|
|
Shinya Kitaoka |
120a6e |
double dy = (dstSize.ly - srcSize.ly * sc) * 0.5;
|
|
Shinya Kitaoka |
120a6e |
return TScale(sc) * TTranslation(0.5 * TPointD(srcSize.lx, srcSize.ly) +
|
|
Shinya Kitaoka |
120a6e |
TPointD(dx, dy));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}; // locals
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// button l'eventuale livello
|
|
Shinya Kitaoka |
120a6e |
m_level = TLevelP();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// aggiorno il nome
|
|
Shinya Kitaoka |
120a6e |
m_name = patternName;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// getRootDir() e' nulla se non si e' chiamata la setRoot(..)
|
|
Shinya Kitaoka |
120a6e |
assert(!getRootDir().isEmpty());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// leggo tutti i livelli contenuti
|
|
Shinya Kitaoka |
120a6e |
TFilePathSet fps;
|
|
Shinya Kitaoka |
120a6e |
TSystem::readDirectory(fps, getRootDir());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// prendo il primo livello il cui nome sia patternName
|
|
Shinya Kitaoka |
120a6e |
// (puo' essere un pli, ma anche un png, ecc.)
|
|
Shinya Kitaoka |
120a6e |
TFilePath fp;
|
|
Shinya Kitaoka |
120a6e |
TFilePathSet::iterator fpIt;
|
|
Shinya Kitaoka |
120a6e |
for (fpIt = fps.begin(); fpIt != fps.end(); ++fpIt) {
|
|
Shinya Kitaoka |
120a6e |
if (fpIt->getName() == patternName) {
|
|
Shinya Kitaoka |
120a6e |
fp = *fpIt;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// se non ho trovato nulla esco
|
|
Shinya Kitaoka |
120a6e |
if (fp == TFilePath() || !TSystem::doesExistFileOrLevel(fp)) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Leggo i frames del livello e ne ricavo delle textures
|
|
Shinya Kitaoka |
120a6e |
// che memorizzo in m_level come TRasterImage
|
|
Shinya Kitaoka |
120a6e |
TLevelReaderP lr(fp);
|
|
Shinya Kitaoka |
120a6e |
TLevelP level = lr->loadInfo();
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator frameIt;
|
|
Shinya Kitaoka |
120a6e |
TOfflineGL *glContext = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (frameIt = level->begin(); frameIt != level->end(); ++frameIt) {
|
|
Shinya Kitaoka |
120a6e |
TImageP img = lr->getFrameReader(frameIt->first)->load();
|
|
Shinya Kitaoka |
120a6e |
if (TRasterImageP ri = img) {
|
|
Shinya Kitaoka |
120a6e |
// se il frame e' raster...
|
|
Shinya Kitaoka |
120a6e |
TRaster32P ras = ri->getRaster();
|
|
Shinya Kitaoka |
120a6e |
if (!ras) continue;
|
|
Shinya Kitaoka |
120a6e |
// aggiusta le dimensioni
|
|
Shinya Kitaoka |
120a6e |
ras = makeTexture(ras);
|
|
Shinya Kitaoka |
120a6e |
if (!ras) continue;
|
|
Shinya Kitaoka |
120a6e |
m_level->setFrame(frameIt->first, new TRasterImage(ras));
|
|
Shinya Kitaoka |
120a6e |
} else if (TVectorImageP vi = img) {
|
|
Shinya Kitaoka |
120a6e |
// se il frame e' vettoriale
|
|
Shinya Kitaoka |
120a6e |
// lo rasterizzo creando una texture 256x256 (N.B. le dimensioni
|
|
Shinya Kitaoka |
120a6e |
// delle textures openGL devono essere potenze di due)
|
|
Shinya Kitaoka |
120a6e |
TRaster32P ras(256, 256);
|
|
Shinya Kitaoka |
120a6e |
// se serve creo il contesto OpenGL offline (l'idea e' di crearne
|
|
Shinya Kitaoka |
120a6e |
// uno solo per tutto il livello
|
|
Shinya Kitaoka |
120a6e |
if (!glContext) glContext = new TOfflineGL(ras->getSize());
|
|
Shinya Kitaoka |
120a6e |
// camera di default 640x480. probabilmente non e' la scelta
|
|
Shinya Kitaoka |
120a6e |
// migliore.
|
|
Shinya Kitaoka |
120a6e |
// TDimension cameraSize(768, 576);
|
|
Shinya Kitaoka |
120a6e |
TDimension cameraSize(1920, 1080);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// definisco i renderdata
|
|
Shinya Kitaoka |
120a6e |
const TVectorRenderData rd(locals::getAffine(cameraSize, ras->getSize()),
|
|
Shinya Kitaoka |
120a6e |
TRect(), level->getPalette(), 0, true, true);
|
|
Shinya Kitaoka |
120a6e |
// rasterizzo
|
|
Shinya Kitaoka |
120a6e |
glContext->draw(vi, rd);
|
|
Shinya Kitaoka |
120a6e |
ras->copy(glContext->getRaster());
|
|
Shinya Kitaoka |
120a6e |
m_level->setFrame(frameIt->first, new TRasterImage(ras));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
// cancello il contesto offline (se e' stato creato)
|
|
Shinya Kitaoka |
120a6e |
delete glContext;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::computeTransformations(
|
|
Shinya Kitaoka |
120a6e |
std::vector<taffine> &transformations, const TStroke *stroke) const {</taffine>
|
|
Shinya Kitaoka |
120a6e |
const int frameCount = m_level->getFrameCount();
|
|
Shinya Kitaoka |
120a6e |
if (frameCount == 0) return;
|
|
Shinya Kitaoka |
120a6e |
transformations.clear();
|
|
Shinya Kitaoka |
120a6e |
const double length = stroke->getLength();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::vector<tdimensiond> images;</tdimensiond>
|
|
Shinya Kitaoka |
120a6e |
assert(m_level->begin() != m_level->end());
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator lit;
|
|
Shinya Kitaoka |
120a6e |
for (lit = m_level->begin(); lit != m_level->end(); ++lit) {
|
|
Shinya Kitaoka |
120a6e |
TRasterImageP ri = lit->second;
|
|
Shinya Kitaoka |
120a6e |
if (!ri) continue;
|
|
Shinya Kitaoka |
120a6e |
TDimension d = ri->getRaster()->getSize();
|
|
Shinya Kitaoka |
120a6e |
images.push_back(TDimensionD(d.lx, d.ly));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
assert(!images.empty());
|
|
Shinya Kitaoka |
120a6e |
if (images.empty()) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double s = 0;
|
|
Shinya Kitaoka |
120a6e |
int index = 0;
|
|
Shinya Kitaoka |
120a6e |
int m = images.size();
|
|
Shinya Kitaoka |
120a6e |
while (s < length) {
|
|
Shinya Kitaoka |
120a6e |
double t = stroke->getParameterAtLength(s);
|
|
Shinya Kitaoka |
120a6e |
TThickPoint p = stroke->getThickPoint(t);
|
|
Shinya Kitaoka |
120a6e |
TPointD v = stroke->getSpeed(t);
|
|
Shinya Kitaoka |
120a6e |
double ang = rad2degree(atan(v)) + m_rotation;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int ly = std::max(1.0, images[index].ly);
|
|
Shinya Kitaoka |
120a6e |
double sc = p.thick / ly;
|
|
Shinya Kitaoka |
120a6e |
transformations.push_back(TTranslation(p) * TRotation(ang) * TScale(sc));
|
|
Shinya Kitaoka |
120a6e |
double ds = std::max(2.0, sc * images[index].lx * 2 + m_space);
|
|
Shinya Kitaoka |
120a6e |
s += ds;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TRasterImagePatternStrokeStyle::drawStroke(
|
|
Shinya Kitaoka |
120a6e |
const TVectorRenderData &rd, const std::vector<taffine> &transformations,</taffine>
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) const {
|
|
Shinya Kitaoka |
120a6e |
TStopWatch sw;
|
|
Shinya Kitaoka |
120a6e |
sw.start();
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
const int frameCount = m_level->getFrameCount();
|
|
Shinya Kitaoka |
120a6e |
if (frameCount == 0) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// lo stroke viene disegnato ripetendo size volte le frameCount immagini
|
|
Shinya Kitaoka |
120a6e |
// contenute in level, posizionando ognuna secondo transformations[i]
|
|
Shinya Kitaoka |
120a6e |
UINT size = transformations.size();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glEnable(GL_TEXTURE_2D);
|
|
Shinya Kitaoka |
120a6e |
glEnable(GL_BLEND);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
GLuint texId;
|
|
Shinya Kitaoka |
120a6e |
glGenTextures(1, &texId);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glBindTexture(GL_TEXTURE_2D, texId);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
Shinya Kitaoka |
120a6e |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
Shinya Kitaoka |
120a6e |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
Shinya Kitaoka |
120a6e |
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// l'utilizzo di modulate, con un colore di 1,1,1,1 permette di
|
|
Shinya Kitaoka |
120a6e |
// tenere in conto il canale alfa delle texture
|
|
Shinya Kitaoka |
120a6e |
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// visto che cambiare texture costa tempo il ciclo esterno e' sulle textures
|
|
Shinya Kitaoka |
120a6e |
// piuttosto che sulle trasformazioni
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator frameIt = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < (int)size && frameIt != m_level->end(); ++i, ++frameIt) {
|
|
Shinya Kitaoka |
120a6e |
TRasterImageP ri = frameIt->second;
|
|
Shinya Kitaoka |
120a6e |
TRasterP ras;
|
|
Shinya Kitaoka |
120a6e |
if (ri) ras = ri->getRaster();
|
|
Shinya Kitaoka |
120a6e |
if (!ras) continue;
|
|
Shinya Kitaoka |
120a6e |
TextureInfoForGL texInfo;
|
|
Shinya Kitaoka |
120a6e |
TRasterP texImage = prepareTexture(ras, texInfo);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glTexImage2D(GL_TEXTURE_2D,
|
|
Shinya Kitaoka |
120a6e |
0, // one level only
|
|
Shinya Kitaoka |
120a6e |
texInfo.internalformat, // pixel channels count
|
|
Shinya Kitaoka |
120a6e |
texInfo.width, // width
|
|
Shinya Kitaoka |
120a6e |
texInfo.height, // height
|
|
Shinya Kitaoka |
120a6e |
0, // border size
|
|
Shinya Kitaoka |
120a6e |
texInfo.type, // pixel format // crappy names
|
|
Shinya Kitaoka |
120a6e |
texInfo.format, // pixel data type // oh, SO much
|
|
Shinya Kitaoka |
120a6e |
texImage->getRawData());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (int j = i; j < (int)size; j += frameCount) {
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = rd.m_aff * transformations[j];
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(aff);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double rx = ras->getLx();
|
|
Shinya Kitaoka |
120a6e |
double ry = ras->getLy();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glColor4d(1, 1, 1, 1);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glBegin(QUAD_PRIMITIVE);
|
|
Shinya Kitaoka |
120a6e |
glTexCoord2d(0, 0);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(-rx, -ry);
|
|
Shinya Kitaoka |
120a6e |
glTexCoord2d(1, 0);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(rx, -ry);
|
|
Shinya Kitaoka |
120a6e |
glTexCoord2d(0, 1);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(-rx, ry);
|
|
Shinya Kitaoka |
120a6e |
glTexCoord2d(1, 1);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(rx, ry);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glDeleteTextures(1, &texId);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glDisable(GL_TEXTURE_2D);
|
|
Shinya Kitaoka |
120a6e |
glDisable(GL_BLEND);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::drawStroke(TFlash &flash,
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) const {
|
|
Shinya Kitaoka |
120a6e |
flash.drawHangedObjects();
|
|
Shinya Kitaoka |
120a6e |
if (m_level->getFrameCount() == 0) {
|
|
Shinya Kitaoka |
120a6e |
// if( rd.m_clippingRect!=TRect() && !
|
|
Shinya Kitaoka |
120a6e |
// convert(rd.m_aff*stroke->getBBox()).overlaps( rd.m_clippingRect ) )
|
|
Shinya Kitaoka |
120a6e |
// return;
|
|
Shinya Kitaoka |
120a6e |
TCenterLineStrokeStyle *appStyle =
|
|
Shinya Kitaoka |
120a6e |
new TCenterLineStrokeStyle(TPixel32(255, 0, 0, 255), 0x0, 2.0);
|
|
Shinya Kitaoka |
120a6e |
// flash.pushMatrix();
|
|
Shinya Kitaoka |
120a6e |
// flash.multMatrix(rd.m_aff);
|
|
Shinya Kitaoka |
120a6e |
appStyle->drawStroke(flash, stroke);
|
|
Shinya Kitaoka |
120a6e |
// glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::vector<taffine> transformations;</taffine>
|
|
Shinya Kitaoka |
120a6e |
computeTransformations(transformations, stroke);
|
|
Shinya Kitaoka |
120a6e |
assert(m_level->begin() != m_level->end());
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (UINT i = 0; i < transformations.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
TRasterImageP img = m_level->frame(lit->first);
|
|
Shinya Kitaoka |
120a6e |
if (++lit == m_level->end()) lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
assert(img);
|
|
Shinya Kitaoka |
120a6e |
flash.pushMatrix();
|
|
Shinya Kitaoka |
120a6e |
flash.multMatrix(transformations[i] * TScale(2.0));
|
|
Shinya Kitaoka |
120a6e |
flash.buildImage(img.getPointer(), false);
|
|
Shinya Kitaoka |
120a6e |
flash.popMatrix();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::loadData(TInputStreamInterface &is) {
|
|
Shinya Kitaoka |
120a6e |
m_level = TLevelP();
|
|
Shinya Kitaoka |
120a6e |
m_name = "";
|
|
Shinya Kitaoka |
120a6e |
std::string name;
|
|
Shinya Kitaoka |
120a6e |
is >> name >> m_space >> m_rotation;
|
|
Shinya Kitaoka |
120a6e |
if (name != "") {
|
|
Shinya Kitaoka |
120a6e |
try {
|
|
Shinya Kitaoka |
120a6e |
loadLevel(name);
|
|
Shinya Kitaoka |
120a6e |
} catch (...) {
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::loadData(int ids,
|
|
Shinya Kitaoka |
120a6e |
TInputStreamInterface &is) {
|
|
Shinya Kitaoka |
120a6e |
if (ids != 100)
|
|
Shinya Kitaoka |
120a6e |
throw TException("image pattern stroke style: unknown obsolete format");
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_level = TLevelP();
|
|
Shinya Kitaoka |
120a6e |
m_name = "";
|
|
Shinya Kitaoka |
120a6e |
std::string name;
|
|
Shinya Kitaoka |
120a6e |
is >> name;
|
|
Shinya Kitaoka |
120a6e |
if (name != "") {
|
|
Shinya Kitaoka |
120a6e |
try {
|
|
Shinya Kitaoka |
120a6e |
loadLevel(name);
|
|
Shinya Kitaoka |
120a6e |
} catch (...) {
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::saveData(
|
|
Shinya Kitaoka |
120a6e |
TOutputStreamInterface &os) const {
|
|
Shinya Kitaoka |
120a6e |
os << m_name << m_space << m_rotation;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFilePath TRasterImagePatternStrokeStyle::getRootDir() { return m_rootDir; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStrokeProp *TRasterImagePatternStrokeStyle::makeStrokeProp(
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) {
|
|
Shinya Kitaoka |
120a6e |
return new TRasterImagePatternStrokeProp(stroke, this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TRasterImagePatternStrokeStyle::getObsoleteTagIds(
|
|
Shinya Kitaoka |
120a6e |
std::vector<int> &ids) const {</int>
|
|
Shinya Kitaoka |
120a6e |
ids.push_back(100);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TVectorImagePatternStrokeStyle implementation
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TVectorImagePatternStrokeStyle::TVectorImagePatternStrokeStyle()
|
|
Shinya Kitaoka |
120a6e |
: m_level(), m_name(""), m_space(0), m_rotation(0) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TVectorImagePatternStrokeStyle::TVectorImagePatternStrokeStyle(
|
|
Shinya Kitaoka |
120a6e |
const std::string &patternName)
|
|
Shinya Kitaoka |
120a6e |
: m_level(), m_name(patternName), m_space(20), m_rotation(0) {
|
|
Shinya Kitaoka |
120a6e |
loadLevel(patternName);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *TVectorImagePatternStrokeStyle::clone() const {
|
|
Shinya Kitaoka |
120a6e |
return new TVectorImagePatternStrokeStyle(*this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::makeIcon(const TDimension &size) {
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator frameIt = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
if (frameIt == m_level->end()) {
|
|
Shinya Kitaoka |
120a6e |
TRaster32P icon(size);
|
|
Shinya Kitaoka |
120a6e |
icon->fill(TPixel32::Black);
|
|
Shinya Kitaoka |
120a6e |
int lx = icon->getLx();
|
|
Shinya Kitaoka |
120a6e |
int ly = icon->getLy();
|
|
Shinya Kitaoka |
120a6e |
for (int y = 0; y < ly; y++) {
|
|
Shinya Kitaoka |
120a6e |
int x = ((lx - 1 - 10) * y / ly);
|
|
Shinya Kitaoka |
120a6e |
icon->extractT(x, y, x + 5, y)->fill(TPixel32::Red);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_icon = icon;
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TFrameId fid = frameIt->first;
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP img = m_level->frame(fid);
|
|
Shinya Kitaoka |
120a6e |
if (!img) {
|
|
Shinya Kitaoka |
120a6e |
TRaster32P icon(size);
|
|
Shinya Kitaoka |
120a6e |
icon->fill(TPixel32::Black);
|
|
Shinya Kitaoka |
120a6e |
int lx = icon->getLx();
|
|
Shinya Kitaoka |
120a6e |
int ly = icon->getLy();
|
|
Shinya Kitaoka |
120a6e |
for (int y = 0; y < ly; y++) {
|
|
Shinya Kitaoka |
120a6e |
int x = ((lx - 1 - 10) * y / ly);
|
|
Shinya Kitaoka |
120a6e |
icon->extractT(x, y, x + 5, y)->fill(TPixel32::Red);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_icon = icon;
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
// img->setPalette(m_level->getPalette());
|
|
Shinya Kitaoka |
120a6e |
TPalette *vPalette = m_level->getPalette();
|
|
Shinya Kitaoka |
120a6e |
assert(vPalette);
|
|
Shinya Kitaoka |
120a6e |
img->setPalette(vPalette);
|
|
Shinya Kitaoka |
120a6e |
TOfflineGL *glContext = TOfflineGL::getStock(size);
|
|
Shinya Kitaoka |
120a6e |
glContext->clear(TPixel32::White);
|
|
Shinya Kitaoka |
120a6e |
TRectD bbox = img->getBBox();
|
|
Shinya Kitaoka |
120a6e |
double scx = 0.8 * size.lx / bbox.getLx();
|
|
Shinya Kitaoka |
120a6e |
double scy = 0.8 * size.ly / bbox.getLy();
|
|
Shinya Kitaoka |
120a6e |
double sc = std::min(scx, scy);
|
|
Shinya Kitaoka |
120a6e |
double dx = (size.lx - bbox.getLx() * sc) * 0.5;
|
|
Shinya Kitaoka |
120a6e |
double dy = (size.ly - bbox.getLy() * sc) * 0.5;
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = TScale(sc) * TTranslation(-bbox.getP00() + TPointD(dx, dy));
|
|
Shinya Kitaoka |
120a6e |
TVectorRenderData rd(aff, size, vPalette, 0, true);
|
|
Shinya Kitaoka |
120a6e |
glContext->draw(img, rd);
|
|
Shinya Kitaoka |
120a6e |
if (!m_icon || m_icon->getSize() != size)
|
|
Shinya Kitaoka |
120a6e |
m_icon = glContext->getRaster()->clone();
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
m_icon->copy(glContext->getRaster());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int TVectorImagePatternStrokeStyle::getParamCount() const { return 2; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TColorStyle::ParamType TVectorImagePatternStrokeStyle::getParamType(
|
|
Shinya Kitaoka |
120a6e |
int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return TColorStyle::DOUBLE;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
QString TVectorImagePatternStrokeStyle::getParamNames(int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return (index == 0) ? QCoreApplication::translate(
|
|
Shinya Kitaoka |
120a6e |
"TVectorImagePatternStrokeStyle", "Distance")
|
|
Shinya Kitaoka |
120a6e |
: QCoreApplication::translate(
|
|
Shinya Kitaoka |
120a6e |
"TVectorImagePatternStrokeStyle", "Rotation");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::getParamRange(int index, double &min,
|
|
Shinya Kitaoka |
120a6e |
double &max) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (index == 0) {
|
|
Shinya Kitaoka |
120a6e |
min = -50;
|
|
Shinya Kitaoka |
120a6e |
max = 50;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
min = -180;
|
|
Shinya Kitaoka |
120a6e |
max = 180;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
double TVectorImagePatternStrokeStyle::getParamValue(TColorStyle::double_tag,
|
|
Shinya Kitaoka |
120a6e |
int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
return index == 0 ? m_space : m_rotation;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::setParamValue(int index, double value) {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getParamCount());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (index == 0) {
|
|
Shinya Kitaoka |
120a6e |
if (m_space != value) {
|
|
Shinya Kitaoka |
120a6e |
updateVersionNumber(); // aggiorna il vettore di affini
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_space = value;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
if (m_rotation != value) {
|
|
Shinya Kitaoka |
120a6e |
updateVersionNumber(); // aggiorna il vettore di affini
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_rotation = value;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::loadLevel(const std::string &patternName) {
|
|
Shinya Kitaoka |
120a6e |
m_level = TLevelP();
|
|
Shinya Kitaoka |
120a6e |
m_name = patternName;
|
|
Shinya Kitaoka |
120a6e |
assert(!getRootDir()
|
|
Shinya Kitaoka |
120a6e |
.isEmpty()); // se e' vuota, non si e' chiamata la setRoot(..)
|
|
Shinya Kitaoka |
120a6e |
TFilePath fp = getRootDir() + (patternName + ".pli");
|
|
Shinya Kitaoka |
120a6e |
TLevelReaderP lr(fp);
|
|
Shinya Kitaoka |
120a6e |
m_level = lr->loadInfo();
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator frameIt;
|
|
Shinya Kitaoka |
120a6e |
std::map<tpixel32, int=""> colors;</tpixel32,>
|
|
Shinya Kitaoka |
120a6e |
for (frameIt = m_level->begin(); frameIt != m_level->end(); ++frameIt) {
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP img = lr->getFrameReader(frameIt->first)->load();
|
|
Shinya Kitaoka |
120a6e |
if (img) m_level->setFrame(frameIt->first, img);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::computeTransformations(
|
|
Shinya Kitaoka |
120a6e |
std::vector<taffine> &transformations, const TStroke *stroke) const {</taffine>
|
|
Shinya Kitaoka |
120a6e |
const int frameCount = m_level->getFrameCount();
|
|
Shinya Kitaoka |
120a6e |
if (frameCount == 0) return;
|
|
Shinya Kitaoka |
120a6e |
transformations.clear();
|
|
Shinya Kitaoka |
120a6e |
const double length = stroke->getLength();
|
|
Shinya Kitaoka |
120a6e |
assert(m_level->begin() != m_level->end());
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
double s = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
while (s < length) {
|
|
Shinya Kitaoka |
120a6e |
TFrameId fid = lit->first;
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP img = m_level->frame(fid);
|
|
Shinya Kitaoka |
120a6e |
if (++lit == m_level->end()) lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
assert(img);
|
|
Shinya Kitaoka |
120a6e |
if (img->getType() != TImage::VECTOR) return;
|
|
Shinya Kitaoka |
120a6e |
double t = stroke->getParameterAtLength(s);
|
|
Shinya Kitaoka |
120a6e |
TThickPoint p = stroke->getThickPoint(t);
|
|
Shinya Kitaoka |
120a6e |
TPointD v = stroke->getSpeed(t);
|
|
Shinya Kitaoka |
120a6e |
double ang = rad2degree(atan(v)) + m_rotation;
|
|
Shinya Kitaoka |
120a6e |
TRectD bbox = img->getBBox();
|
|
Shinya Kitaoka |
120a6e |
TPointD center = 0.5 * (bbox.getP00() + bbox.getP11());
|
|
Shinya Kitaoka |
120a6e |
double ry = bbox.getLy() * 0.5;
|
|
Shinya Kitaoka |
120a6e |
if (ry * ry < 1e-5) ry = p.thick;
|
|
Shinya Kitaoka |
120a6e |
double sc = p.thick / ry;
|
|
Shinya Kitaoka |
120a6e |
if (sc < 0.0001) sc = 0.0001;
|
|
Shinya Kitaoka |
120a6e |
TAffine aff =
|
|
Shinya Kitaoka |
120a6e |
TTranslation(p) * TRotation(ang) * TScale(sc) * TTranslation(-center);
|
|
Shinya Kitaoka |
120a6e |
transformations.push_back(aff);
|
|
Shinya Kitaoka |
120a6e |
double ds = std::max(2.0, sc * bbox.getLx() + m_space);
|
|
Shinya Kitaoka |
120a6e |
s += ds;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::clearGlDisplayLists() {
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Shinya Kitaoka |
120a6e |
DisplayListManager *pmgr = DisplayListManager::instance();
|
|
Shinya Kitaoka |
120a6e |
assert(pmgr);
|
|
Shinya Kitaoka |
120a6e |
pmgr->clearLists();
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::drawStroke(
|
|
Shinya Kitaoka |
120a6e |
const TVectorRenderData &rd, const std::vector<taffine> &transformations,</taffine>
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) const {
|
|
Shinya Kitaoka |
120a6e |
const int frameCount = m_level->getFrameCount();
|
|
Shinya Kitaoka |
120a6e |
if (frameCount == 0) return;
|
|
Shinya Kitaoka |
120a6e |
//------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
// if the average thickness of the stroke, with the current pixelSize,
|
|
Shinya Kitaoka |
120a6e |
// is less than 2, do not drow anything
|
|
Shinya Kitaoka |
120a6e |
UINT cpCount = stroke->getControlPointCount();
|
|
Shinya Kitaoka |
120a6e |
UINT sampleStep = (cpCount < 10) ? 1 : (UINT)((double)cpCount / 10.0);
|
|
Shinya Kitaoka |
120a6e |
double thickSum = 0;
|
|
Shinya Kitaoka |
120a6e |
UINT count = 0;
|
|
Shinya Kitaoka |
120a6e |
for (UINT cp = 0; cp < cpCount; cp += sampleStep) {
|
|
Shinya Kitaoka |
120a6e |
thickSum += stroke->getControlPoint(cp).thick;
|
|
Shinya Kitaoka |
120a6e |
count++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
double averageThick = thickSum / (double)count;
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(rd.m_aff);
|
|
Shinya Kitaoka |
120a6e |
double pixelSize2 = tglGetPixelSize2();
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
if (averageThick * averageThick < 4 * pixelSize2) {
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(rd.m_aff);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TFrameId fid = lit->first;
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP img = m_level->frame(fid);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::set<int> styles;</int>
|
|
Shinya Kitaoka |
120a6e |
img->getUsedStyles(styles);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::set<int>::iterator si = styles.begin();</int>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Calcolo media dei colori utilizzati
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int numStyles = 0, styleID;
|
|
Shinya Kitaoka |
120a6e |
int averageRed = 0, averageBlue = 0, averageGreen = 0;
|
|
Shinya Kitaoka |
120a6e |
TPixel32 color, averageColor;
|
|
Shinya Kitaoka |
120a6e |
TColorStyle *colorStyle;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (; si != styles.end(); si++) {
|
|
Shinya Kitaoka |
120a6e |
styleID = (int)*si;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (styleID != 0) {
|
|
Shinya Kitaoka |
120a6e |
colorStyle = m_level->getPalette()->getStyle(styleID);
|
|
Shinya Kitaoka |
120a6e |
color = colorStyle->getAverageColor();
|
|
Shinya Kitaoka |
120a6e |
if (color.m != 0) {
|
|
Shinya Kitaoka |
120a6e |
numStyles++;
|
|
Shinya Kitaoka |
120a6e |
averageRed += color.r;
|
|
Shinya Kitaoka |
120a6e |
averageGreen += color.g;
|
|
Shinya Kitaoka |
120a6e |
averageBlue += color.b;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (numStyles != 0) {
|
|
Shinya Kitaoka |
120a6e |
averageColor.r = averageRed / numStyles;
|
|
Shinya Kitaoka |
120a6e |
averageColor.g = averageGreen / numStyles;
|
|
Shinya Kitaoka |
120a6e |
averageColor.b = averageBlue / numStyles;
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
averageColor = TPixel32::Black;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglColor(averageColor);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glLineStipple(2, 0xAAAA);
|
|
Shinya Kitaoka |
120a6e |
glEnable(GL_LINE_STIPPLE);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
UINT n = stroke->getLength() *
|
|
Shinya Kitaoka |
120a6e |
0.05; // TODO: funzione di stroke length e pixelsize
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
for (UINT i = 0; i < n; i++) {
|
|
Shinya Kitaoka |
120a6e |
if (n != 1) {
|
|
Shinya Kitaoka |
120a6e |
TThickPoint p = stroke->getPoint(i / (double)(n - 1));
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(p.x, p.y);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glDisable(GL_LINE_STIPPLE);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
//--------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
assert(m_level->begin() != m_level->end());
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
UINT i, size = transformations.size();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (i = 0; i < size; i++) {
|
|
Shinya Kitaoka |
120a6e |
TFrameId fid = lit->first;
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP img = m_level->frame(fid);
|
|
Shinya Kitaoka |
120a6e |
if (++lit == m_level->end()) lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
assert(img);
|
|
Shinya Kitaoka |
120a6e |
if (!img) continue;
|
|
Shinya Kitaoka |
120a6e |
if (img->getType() != TImage::VECTOR) return;
|
|
Shinya Kitaoka |
120a6e |
TVectorImage *imgPointer = img.getPointer();
|
|
Shinya Kitaoka |
120a6e |
TAffine totalTransformation = rd.m_aff * transformations[i];
|
|
Shinya Kitaoka |
120a6e |
if (rd.m_clippingRect != TRect() && !rd.m_is3dView &&
|
|
Shinya Kitaoka |
120a6e |
!(convert(totalTransformation * imgPointer->getBBox())
|
|
Shinya Kitaoka |
120a6e |
.overlaps(rd.m_clippingRect)))
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
// drawing
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(totalTransformation);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
GLuint listId = DisplayListManager::instance()->getDisplayListId(
|
|
Shinya Kitaoka |
120a6e |
imgPointer, m_name, fid, rd);
|
|
Shinya Kitaoka |
120a6e |
if (listId != 0) {
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
glCallList(listId);
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
TAffine identity;
|
|
Shinya Kitaoka |
120a6e |
TRect rect;
|
|
Shinya Kitaoka |
120a6e |
TPalette *vPalette = imgPointer->getPalette();
|
|
Shinya Kitaoka |
120a6e |
assert(vPalette);
|
|
Shinya Kitaoka |
120a6e |
TVectorRenderData rd2(identity, rect, vPalette, rd.m_cf, true, true);
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglDraw(rd2, imgPointer);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
CHECK_GL_ERROR
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::drawStroke(TFlash &flash,
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) const {
|
|
Shinya Kitaoka |
120a6e |
flash.drawHangedObjects();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
const int frameCount = m_level->getFrameCount();
|
|
Shinya Kitaoka |
120a6e |
if (frameCount == 0) {
|
|
Shinya Kitaoka |
120a6e |
// if( rd.m_clippingRect!=TRect() && !
|
|
Shinya Kitaoka |
120a6e |
// convert(rd.m_aff*stroke->getBBox()).overlaps( rd.m_clippingRect ) )
|
|
Shinya Kitaoka |
120a6e |
// return;
|
|
Shinya Kitaoka |
120a6e |
TCenterLineStrokeStyle *appStyle =
|
|
Shinya Kitaoka |
120a6e |
new TCenterLineStrokeStyle(TPixel32(255, 0, 0, 255), 0x0, 2.0);
|
|
Shinya Kitaoka |
120a6e |
// flash.pushMatrix();
|
|
Shinya Kitaoka |
120a6e |
// flash.multMatrix(rd.m_aff);
|
|
Shinya Kitaoka |
120a6e |
appStyle->drawStroke(flash, stroke);
|
|
Shinya Kitaoka |
120a6e |
// glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
UINT cpCount = stroke->getControlPointCount();
|
|
Shinya Kitaoka |
120a6e |
UINT sampleStep = (cpCount < 10) ? 1 : (UINT)((double)cpCount / 10.0);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double thickSum = 0;
|
|
Shinya Kitaoka |
120a6e |
UINT count = 0;
|
|
Shinya Kitaoka |
120a6e |
for (UINT cp = 0; cp < cpCount; cp += sampleStep) {
|
|
Shinya Kitaoka |
120a6e |
thickSum += stroke->getControlPoint(cp).thick;
|
|
Shinya Kitaoka |
120a6e |
count++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
double averageThick = thickSum / (double)count;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (averageThick < 2.0) return;
|
|
Shinya Kitaoka |
120a6e |
const double length = stroke->getLength();
|
|
Shinya Kitaoka |
120a6e |
assert(m_level->begin() != m_level->end());
|
|
Shinya Kitaoka |
120a6e |
TLevel::Iterator lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
double s = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
while (s < length) {
|
|
Shinya Kitaoka |
120a6e |
TFrameId fid = lit->first;
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP img = m_level->frame(fid);
|
|
Shinya Kitaoka |
120a6e |
if (++lit == m_level->end()) lit = m_level->begin();
|
|
Shinya Kitaoka |
120a6e |
assert(img);
|
|
Shinya Kitaoka |
120a6e |
if (img->getType() != TImage::VECTOR) return;
|
|
Shinya Kitaoka |
120a6e |
double t = stroke->getParameterAtLength(s);
|
|
Shinya Kitaoka |
120a6e |
TThickPoint p = stroke->getThickPoint(t);
|
|
Shinya Kitaoka |
120a6e |
TPointD v = stroke->getSpeed(t);
|
|
Shinya Kitaoka |
120a6e |
double ang = rad2degree(atan(v)) + m_rotation;
|
|
Shinya Kitaoka |
120a6e |
TRectD bbox = img->getBBox();
|
|
Shinya Kitaoka |
120a6e |
TPointD center = 0.5 * (bbox.getP00() + bbox.getP11());
|
|
Shinya Kitaoka |
120a6e |
// double rx = bbox.getLx() * 0.5;
|
|
Shinya Kitaoka |
120a6e |
double ry = bbox.getLy() * 0.5;
|
|
Shinya Kitaoka |
120a6e |
if (ry * ry < 1e-5) ry = p.thick;
|
|
Shinya Kitaoka |
120a6e |
double sc = p.thick / ry;
|
|
Shinya Kitaoka |
120a6e |
if (sc < 0.0001) sc = 0.0001;
|
|
Shinya Kitaoka |
120a6e |
TAffine aff =
|
|
Shinya Kitaoka |
120a6e |
TTranslation(p) * TRotation(ang) * TScale(sc) * TTranslation(-center);
|
|
Shinya Kitaoka |
120a6e |
// TVectorRenderData rd2(rd, rd.m_aff * aff);
|
|
Shinya Kitaoka |
120a6e |
// c'era un crash se, dopo aver fatto new color, si selezionava un pattern
|
|
Shinya Kitaoka |
120a6e |
// e si disegnava (stack overflow). Ora r2 prende la palette
|
|
Shinya Kitaoka |
120a6e |
// dell'immagine caricata
|
|
Shinya Kitaoka |
120a6e |
TVectorImage *imgPointer = img.getPointer();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// TVectorRenderData rd2(rd.m_aff * aff,rd.m_clippingRect,
|
|
Shinya Kitaoka |
120a6e |
// img->getPalette(),rd.m_cf,rd.m_antiAliasing);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
flash.pushMatrix();
|
|
Shinya Kitaoka |
120a6e |
flash.multMatrix(aff);
|
|
Shinya Kitaoka |
120a6e |
flash.buildImage(imgPointer, false);
|
|
Shinya Kitaoka |
120a6e |
// flash.draw(imgPointer, 0);
|
|
Shinya Kitaoka |
120a6e |
flash.popMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double ds = std::max(2.0, sc * bbox.getLx() + m_space);
|
|
Shinya Kitaoka |
120a6e |
s += ds;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::loadData(TInputStreamInterface &is) {
|
|
Shinya Kitaoka |
120a6e |
m_level = TLevelP();
|
|
Shinya Kitaoka |
120a6e |
m_name = "";
|
|
Shinya Kitaoka |
120a6e |
std::string name;
|
|
Shinya Kitaoka |
120a6e |
is >> name >> m_space >> m_rotation;
|
|
Shinya Kitaoka |
120a6e |
if (name != "") {
|
|
Shinya Kitaoka |
120a6e |
try {
|
|
Shinya Kitaoka |
120a6e |
loadLevel(name);
|
|
Shinya Kitaoka |
120a6e |
} catch (...) {
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::loadData(int ids,
|
|
Shinya Kitaoka |
120a6e |
TInputStreamInterface &is) {
|
|
Shinya Kitaoka |
120a6e |
if (ids != 100)
|
|
Shinya Kitaoka |
120a6e |
throw TException("image pattern stroke style: unknown obsolete format");
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_level = TLevelP();
|
|
Shinya Kitaoka |
120a6e |
m_name = "";
|
|
Shinya Kitaoka |
120a6e |
std::string name;
|
|
Shinya Kitaoka |
120a6e |
is >> name;
|
|
Shinya Kitaoka |
120a6e |
if (name != "") {
|
|
Shinya Kitaoka |
120a6e |
try {
|
|
Shinya Kitaoka |
120a6e |
loadLevel(name);
|
|
Shinya Kitaoka |
120a6e |
} catch (...) {
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::saveData(
|
|
Shinya Kitaoka |
120a6e |
TOutputStreamInterface &os) const {
|
|
Shinya Kitaoka |
120a6e |
os << m_name << m_space << m_rotation;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFilePath TVectorImagePatternStrokeStyle::getRootDir() { return m_rootDir; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStrokeProp *TVectorImagePatternStrokeStyle::makeStrokeProp(
|
|
Shinya Kitaoka |
120a6e |
const TStroke *stroke) {
|
|
Shinya Kitaoka |
120a6e |
return new TVectorImagePatternStrokeProp(stroke, this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TVectorImagePatternStrokeStyle::getObsoleteTagIds(
|
|
Shinya Kitaoka |
120a6e |
std::vector<int> &ids) const {</int>
|
|
Shinya Kitaoka |
120a6e |
// ids.push_back(100);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Style declarations instances
|
|
Toshihiro Shimizu |
890ddd |
//*************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TColorStyle::Declaration s0(new TCenterLineStrokeStyle());
|
|
Toshihiro Shimizu |
890ddd |
TColorStyle::Declaration s1(new TSolidColorStyle());
|
|
Toshihiro Shimizu |
890ddd |
TColorStyle::Declaration s3(new TRasterImagePatternStrokeStyle());
|
|
Toshihiro Shimizu |
890ddd |
TColorStyle::Declaration s4(new TVectorImagePatternStrokeStyle());
|
|
Toshihiro Shimizu |
890ddd |
}
|