Toshihiro Shimizu 890ddd
657d80
#include <cstring></cstring>
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 "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
657d80
class OutlineBuilder {
657d80
private:
657d80
  double width;
657d80
  int stage;
657d80
  double stages[3][3];
657d80
  double px, py, pz;
657d80
  double ax, ay;
Toshihiro Shimizu 890ddd
Jeremy Bullock 852210
  inline void next_stage(const double &x, const double &y, const double &z) {
Jeremy Bullock 852210
    stages[stage][0] = x;
Jeremy Bullock 852210
    stages[stage][1] = y;
Jeremy Bullock 852210
    stages[stage][2] = z;
Jeremy Bullock 852210
    ++stage;
Jeremy Bullock 852210
  }
Toshihiro Shimizu 890ddd
657d80
public:
657d80
  std::vector<double> vertices;</double>
657d80
Jeremy Bullock 852210
  explicit OutlineBuilder(double width, int count = 0)
Jeremy Bullock 852210
      : width(width), stage(0), px(), py(), pz(), ax(), ay() {
657d80
    memset(stages, 0, sizeof(stages));
Jeremy Bullock 852210
    vertices.reserve(12 * (count + 2));
657d80
  }
657d80
657d80
  void add(double x, double y, double z = 0.0) {
657d80
    const double maxl = 4.0;
657d80
Jeremy Bullock 852210
    if (stage == 0)
Jeremy Bullock 852210
      next_stage(x, y, z);
Jeremy Bullock 852210
    else {
657d80
      double bx = x - px;
657d80
      double by = y - py;
Jeremy Bullock 852210
      double lb = sqrt(bx * bx + by * by);
Jeremy Bullock 852210
      if (lb < 1e-9) return;
Jeremy Bullock 852210
      bx = width * bx / lb;
Jeremy Bullock 852210
      by = width * by / lb;
Jeremy Bullock 852210
Jeremy Bullock 852210
      if (stage == 1)
Jeremy Bullock 852210
        next_stage(x, y, z);
Jeremy Bullock 852210
      else {
657d80
        if (stage == 2) next_stage(x, y, z);
justburner 981d46
        double l = fabs(ax + bx) > 1e-9   ? -(ay - by) / (ax + bx)
justburner 981d46
                   : fabs(ay + by) > 1e-9 ? (ax - bx) / (ay + by)
justburner 981d46
                                          : 0.0;
657d80
        if (fabs(l) > maxl || fabs(l) < 1.0 || l > 0.0) {
657d80
          vertices.resize(vertices.size() + 12);
657d80
          double *p = &vertices.back() - 11;
Jeremy Bullock 852210
          p[0]      = px;
Jeremy Bullock 852210
          p[1]      = py;
Jeremy Bullock 852210
          p[2]      = pz;
Jeremy Bullock 852210
          p[3]      = px + ay;
Jeremy Bullock 852210
          p[4]      = py - ax;
Jeremy Bullock 852210
          p[5]      = pz;
Jeremy Bullock 852210
          p[6]      = px;
Jeremy Bullock 852210
          p[7]      = py;
Jeremy Bullock 852210
          p[8]      = pz;
Jeremy Bullock 852210
          p[9]      = px + by;
Jeremy Bullock 852210
          p[10]     = py - bx;
Jeremy Bullock 852210
          p[11]     = pz;
657d80
        } else {
657d80
          vertices.resize(vertices.size() + 6);
657d80
          double *p = &vertices.back() - 5;
Jeremy Bullock 852210
          p[0]      = px;
Jeremy Bullock 852210
          p[1]      = py;
Jeremy Bullock 852210
          p[2]      = pz;
Jeremy Bullock 852210
          p[3]      = px - l * bx + by;
Jeremy Bullock 852210
          p[4]      = py - l * by - bx;
Jeremy Bullock 852210
          p[5]      = pz;
657d80
        }
657d80
      }
657d80
Jeremy Bullock 852210
      ax = bx;
Jeremy Bullock 852210
      ay = by;
657d80
    }
657d80
Jeremy Bullock 852210
    px = x;
Jeremy Bullock 852210
    py = y;
Jeremy Bullock 852210
    pz = z;
657d80
  }
657d80
657d80
  void finish() {
Jeremy Bullock 852210
    for (int i = 0; i < stage; ++i)
657d80
      add(stages[i][0], stages[i][1], stages[i][2]);
657d80
    stage = 0;
657d80
  }
657d80
Jeremy Bullock 852210
  double get_width() const { return width; }
657d80
657d80
  void restart(double width) {
657d80
    this->width = width;
Jeremy Bullock 852210
    stage       = 0;
657d80
    vertices.clear();
657d80
  }
657d80
Jeremy Bullock 852210
  void invert() { restart(-width); }
657d80
};
657d80
657d80
void vector4_div(double *v) {
Jeremy Bullock 852210
  double k = fabs(v[3]) > 1e-9 ? 1.0 / v[3] : 0.0;
Jeremy Bullock 852210
  v[0] *= k, v[1] *= k, v[2] *= k;
Jeremy Bullock 852210
  v[3] = 1.0;
657d80
}
657d80
657d80
void matrix4_x_vector4(double *dv, const double *m, const double *v) {
Jeremy Bullock 852210
  dv[0] = m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12] * v[3];
Jeremy Bullock 852210
  dv[1] = m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13] * v[3];
Jeremy Bullock 852210
  dv[2] = m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14] * v[3];
Jeremy Bullock 852210
  dv[3] = m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3];
657d80
}
657d80
657d80
void matrix4_x_matrix4(double *dm, const double *ma, const double *mb) {
Jeremy Bullock 852210
  matrix4_x_vector4(dm + 0, ma, mb + 0);
Jeremy Bullock 852210
  matrix4_x_vector4(dm + 4, ma, mb + 4);
Jeremy Bullock 852210
  matrix4_x_vector4(dm + 8, ma, mb + 8);
657d80
  matrix4_x_vector4(dm + 12, ma, mb + 12);
657d80
}
657d80
Jeremy Bullock 852210
class AntialiasingOutlinePainter : public OutlineBuilder {
657d80
private:
657d80
  double matrix[16];
657d80
  double projection_matrix[16];
657d80
  double modelview_matrix[16];
657d80
  double anti_viewport_matrix[16];
657d80
657d80
public:
Jeremy Bullock 852210
  explicit AntialiasingOutlinePainter(int count = 0) : OutlineBuilder(1.0, 0) {
657d80
    memset(matrix, 0, sizeof(matrix));
657d80
    memset(projection_matrix, 0, sizeof(projection_matrix));
657d80
    memset(modelview_matrix, 0, sizeof(modelview_matrix));
657d80
    memset(anti_viewport_matrix, 0, sizeof(anti_viewport_matrix));
657d80
657d80
    // read transformations
657d80
    double viewport[4] = {};
657d80
    glGetDoublev(GL_VIEWPORT, viewport);
657d80
    glGetDoublev(GL_PROJECTION_MATRIX, projection_matrix);
657d80
    glGetDoublev(GL_MODELVIEW_MATRIX, modelview_matrix);
657d80
657d80
    double viewport_matrix[16] = {};
Jeremy Bullock 852210
    viewport_matrix[0]         = 0.5 * viewport[2];
Jeremy Bullock 852210
    viewport_matrix[5]         = 0.5 * viewport[3];
Jeremy Bullock 852210
    viewport_matrix[10]        = 1.0;
Jeremy Bullock 852210
    viewport_matrix[12]        = 0.5 * viewport[2];
Jeremy Bullock 852210
    viewport_matrix[13]        = 0.5 * viewport[3];
Jeremy Bullock 852210
    viewport_matrix[15]        = 1.0;
Jeremy Bullock 852210
Jeremy Bullock 852210
    anti_viewport_matrix[0]  = 2.0 / viewport[2];
Jeremy Bullock 852210
    anti_viewport_matrix[5]  = 2.0 / viewport[3];
657d80
    anti_viewport_matrix[10] = 1.0;
657d80
    anti_viewport_matrix[12] = -1.0;
657d80
    anti_viewport_matrix[13] = -1.0;
657d80
    anti_viewport_matrix[15] = 1.0;
657d80
Jeremy Bullock 852210
    {
Jeremy Bullock 852210
      double tmp[16] = {};
657d80
      matrix4_x_matrix4(tmp, projection_matrix, modelview_matrix);
Jeremy Bullock 852210
      matrix4_x_matrix4(matrix, viewport_matrix, tmp);
Jeremy Bullock 852210
    }
657d80
  }
657d80
657d80
  void add(double x, double y, double z = 0.0) {
657d80
    double dest[4], src[4] = {x, y, z, 1.0};
657d80
    matrix4_x_vector4(dest, matrix, src);
657d80
    vector4_div(dest);
657d80
    OutlineBuilder::add(dest[0], dest[1], dest[2]);
657d80
  }
657d80
657d80
  void finish() {
657d80
    OutlineBuilder::finish();
Jeremy Bullock 852210
    if (vertices.empty()) return;
Jeremy Bullock 852210
    int count = (int)vertices.size() / 6;
657d80
657d80
    // prepare colors
657d80
    float color[8] = {};
657d80
    glGetFloatv(GL_CURRENT_COLOR, color);
Jeremy Bullock 852210
    memcpy(color + 4, color, 3 * sizeof(float));
Jeremy Bullock 852210
    std::vector<float> colors(8 * count);</float>
Jeremy Bullock 852210
    for (float *c = &colors[0], *ce = &colors.back(); c < ce; c += 8)
657d80
      memcpy(c, color, sizeof(color));
657d80
657d80
    // draw
657d80
    glMatrixMode(GL_MODELVIEW);
657d80
    glLoadMatrixd(anti_viewport_matrix);
657d80
    glMatrixMode(GL_PROJECTION);
657d80
    glLoadIdentity();
657d80
    glEnableClientState(GL_VERTEX_ARRAY);
657d80
    glEnableClientState(GL_COLOR_ARRAY);
657d80
657d80
    glVertexPointer(3, GL_DOUBLE, 0, &vertices.front());
657d80
    glColorPointer(4, GL_FLOAT, 0, &colors.front());
Jeremy Bullock 852210
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 2 * count);
657d80
657d80
    glDisableClientState(GL_VERTEX_ARRAY);
657d80
    glDisableClientState(GL_COLOR_ARRAY);
657d80
    glLoadMatrixd(projection_matrix);
657d80
    glMatrixMode(GL_MODELVIEW);
657d80
    glLoadMatrixd(modelview_matrix);
657d80
657d80
    glColor4fv(color);
657d80
    restart(get_width());
657d80
  }
657d80
};
657d80
Jeremy Bullock 852210
void drawAntialiasedOutline(const std::vector<toutlinepoint> &_v,</toutlinepoint>
Jeremy Bullock 852210
                            const TStroke *stroke) {
Jeremy Bullock 852210
  if (_v.empty()) return;
657d80
657d80
  const TOutlinePoint *begin = &_v.front(), *end = &_v.back();
657d80
  assert(_v.size() % 2 == 0);
Toshihiro Shimizu 890ddd
657d80
  AntialiasingOutlinePainter outline(_v.size());
Jeremy Bullock 852210
  for (const TOutlinePoint *i = begin; i < end; i += 2) outline.add(i->x, i->y);
Jeremy Bullock 852210
  for (const TOutlinePoint *i = end; i > begin; i -= 2) outline.add(i->x, i->y);
657d80
  outline.finish();
Toshihiro Shimizu 890ddd
657d80
  outline.invert();
Jeremy Bullock 852210
  for (const TOutlinePoint *i = begin; i < end; i += 2) outline.add(i->x, i->y);
Jeremy Bullock 852210
  for (const TOutlinePoint *i = end; i > begin; i -= 2) outline.add(i->x, i->y);
657d80
  outline.finish();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
shun-iwasawa 288b97
void drawAliasedOutline(const std::vector<toutlinepoint> &_v,</toutlinepoint>
shun-iwasawa 288b97
                        const TStroke *stroke) {
shun-iwasawa 288b97
  static const int stride = 2 * sizeof(TOutlinePoint);
shun-iwasawa 288b97
shun-iwasawa 288b97
  glEnableClientState(GL_VERTEX_ARRAY);
shun-iwasawa 288b97
shun-iwasawa 288b97
  glVertexPointer(2, GL_DOUBLE, stride, &_v[0]);
shun-iwasawa 288b97
  glDrawArrays(GL_LINE_STRIP, 0, _v.size() / 2);
shun-iwasawa 288b97
shun-iwasawa 288b97
  glVertexPointer(2, GL_DOUBLE, stride, &_v[1]);
shun-iwasawa 288b97
  glDrawArrays(GL_LINE_STRIP, 0, _v.size() / 2);
shun-iwasawa 288b97
shun-iwasawa 288b97
  glDisableClientState(GL_VERTEX_ARRAY);
shun-iwasawa 288b97
}
shun-iwasawa 288b97
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);
shun-iwasawa 26c116
    TRectD bbox = image->getBBox();
shun-iwasawa 26c116
    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
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
shun-iwasawa 288b97
void TSolidColorStyle::doDrawStroke(const TColorFunction *cf,
shun-iwasawa 288b97
                                    TStrokeOutline *outline,
shun-iwasawa 288b97
                                    const TStroke *stroke,
shun-iwasawa 288b97
                                    bool antialias) 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;
shun-iwasawa 26c116
  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);
shun-iwasawa 288b97
shun-iwasawa 288b97
      if (antialias)
shun-iwasawa 288b97
        drawAntialiasedOutline(v, stroke);
shun-iwasawa 288b97
      else
shun-iwasawa 288b97
        drawAliasedOutline(v, stroke);
shun-iwasawa 288b97
Shinya Kitaoka 120a6e
      stencil->disableMask();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      // outline with antialiasing
shun-iwasawa 288b97
      if (antialias)
shun-iwasawa 288b97
        drawAntialiasedOutline(v, stroke);
shun-iwasawa 288b97
      else
shun-iwasawa 288b97
        drawAliasedOutline(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
justburner 981d46
std::string TSolidColorStyle::getBrushIdName() const {
justburner 981d46
  return "SolidColorStyle";
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
justburner 981d46
std::size_t TSolidColorStyle::staticBrushIdHash() {
justburner 981d46
  static std::size_t bidHash = TColorStyle::generateHash("SolidColorStyle");
justburner 981d46
  return bidHash;
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
Shinya Kitaoka 120a6e
int TSolidColorStyle::getTagId() const { return 3; }
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(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;
shun-iwasawa 26c116
  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
justburner 981d46
std::string TCenterLineStrokeStyle::getBrushIdName() const {
justburner 981d46
  return "CenterLineStrokeStyle";
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
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
justburner 981d46
TColorStyle *TRasterImagePatternStrokeStyle::clone(
justburner 981d46
    std::string brushIdName) const {
justburner 981d46
  TRasterImagePatternStrokeStyle *style =
justburner 981d46
      new TRasterImagePatternStrokeStyle(*this);
justburner 981d46
  std::string patternName = getBrushIdNameParam(brushIdName);
justburner 981d46
  if (patternName != "") style->loadLevel(patternName);
justburner 981d46
  return style;
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
justburner 981d46
QString TRasterImagePatternStrokeStyle::getDescription() const {
justburner 981d46
  return "TRasterImagePatternStrokeStyle";
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
justburner 981d46
std::string TRasterImagePatternStrokeStyle::getBrushIdName() const {
justburner 981d46
  return "RasterImagePatternStrokeStyle:" + m_name;
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
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::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
shun-iwasawa 13c4cf
//-----------------------------------------------------------------------------
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
TRectD TRasterImagePatternStrokeStyle::getStrokeBBox(
shun-iwasawa 13c4cf
    const TStroke *stroke) const {
shun-iwasawa 13c4cf
  TRectD rect = TColorStyle::getStrokeBBox(stroke);
shun-iwasawa 13c4cf
  return rect.enlarge(std::max(rect.getLx() * 0.25, rect.getLy() * 0.25));
shun-iwasawa 13c4cf
}
shun-iwasawa 13c4cf
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
justburner 981d46
TColorStyle *TVectorImagePatternStrokeStyle::clone(
justburner 981d46
    std::string brushIdName) const {
justburner 981d46
  TVectorImagePatternStrokeStyle *style =
justburner 981d46
      new TVectorImagePatternStrokeStyle(*this);
justburner 981d46
  std::string patternName = getBrushIdNameParam(brushIdName);
justburner 981d46
  if (patternName != "") style->loadLevel(patternName);
justburner 981d46
  return style;
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
justburner 981d46
QString TVectorImagePatternStrokeStyle::getDescription() const {
justburner 981d46
  return "TVectorImagePatternStrokeStyle";
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
justburner 981d46
std::string TVectorImagePatternStrokeStyle::getBrushIdName() const {
justburner 981d46
  return "VectorImagePatternStrokeStyle:" + m_name;
justburner 981d46
}
justburner 981d46
justburner 981d46
//-----------------------------------------------------------------------------
justburner 981d46
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) {
shun-iwasawa 26c116
    TFrameId fid      = lit->first;
shun-iwasawa 26c116
    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;
shun-iwasawa 26c116
    double t       = stroke->getParameterAtLength(s);
shun-iwasawa 26c116
    TThickPoint p  = stroke->getThickPoint(t);
shun-iwasawa 26c116
    TPointD v      = stroke->getSpeed(t);
shun-iwasawa 26c116
    double ang     = rad2degree(atan(v)) + m_rotation;
shun-iwasawa 26c116
    TRectD bbox    = img->getBBox();
shun-iwasawa 26c116
    TPointD center = 0.5 * (bbox.getP00() + bbox.getP11());
shun-iwasawa 26c116
    double ry      = bbox.getLy() * 0.5;
Shinya Kitaoka 120a6e
    if (ry * ry < 1e-5) ry = p.thick;
shun-iwasawa 26c116
    double sc = p.thick / ry;
shun-iwasawa 26c116
    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++) {
shun-iwasawa 26c116
      TFrameId fid      = lit->first;
shun-iwasawa 26c116
      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
shun-iwasawa 26c116
      // currently drawing with the display list doesn't work properly
shun-iwasawa 26c116
shun-iwasawa 26c116
      // GLuint listId = DisplayListManager::instance()->getDisplayListId(
shun-iwasawa 26c116
      //    imgPointer, m_name, fid, rd);
shun-iwasawa 26c116
      // if (listId != 0) {
shun-iwasawa 26c116
      //  CHECK_GL_ERROR
shun-iwasawa 26c116
      //  glCallList(listId);
shun-iwasawa 26c116
      //  CHECK_GL_ERROR
shun-iwasawa 26c116
      //} 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::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
shun-iwasawa 13c4cf
//-----------------------------------------------------------------------------
shun-iwasawa 13c4cf
shun-iwasawa 13c4cf
TRectD TVectorImagePatternStrokeStyle::getStrokeBBox(
shun-iwasawa 13c4cf
    const TStroke *stroke) const {
shun-iwasawa 13c4cf
  TRectD rect = TColorStyle::getStrokeBBox(stroke);
shun-iwasawa 13c4cf
  return rect.enlarge(std::max(rect.getLx() * 0.25, rect.getLy() * 0.25));
shun-iwasawa 13c4cf
}
shun-iwasawa 13c4cf
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());
shun-iwasawa 26c116
}  // namespace