Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tgl.h"
Toshihiro Shimizu 890ddd
#include "tvectorgl.h"
Toshihiro Shimizu 890ddd
#include "tregion.h"
Toshihiro Shimizu 890ddd
#include "tregionprop.h"
Toshihiro Shimizu 890ddd
#include "tstrokeutil.h"
Toshihiro Shimizu 890ddd
#include "tvectorrenderdata.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
#include "tcolorfunctions.h"
Toshihiro Shimizu 890ddd
#include "tsimplecolorstyles.h"
Toshihiro Shimizu 890ddd
#include "tthreadmessage.h"
Toshihiro Shimizu 890ddd
#include "tstrokeprop.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tcurves.h"
Toshihiro Shimizu 890ddd
#include "tstrokeoutline.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifndef _WIN32
Toshihiro Shimizu 890ddd
#define CALLBACK
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef checkErrorsByGL
Shinya Kitaoka 120a6e
#define checkErrorsByGL                                                        \
Shinya Kitaoka 120a6e
  {                                                                            \
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);                                                \
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef checkErrorsByGL
Toshihiro Shimizu 890ddd
#define checkErrorsByGL
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
DV_EXPORT_API void mylog(std::string s)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  static TThread::Mutex mutex;
Toshihiro Shimizu 890ddd
  QMutexLocker sl(mutex);
Toshihiro Shimizu 890ddd
  std::ofstream os("C:\\gmt\\buttami\\bu.txt", std::ios::app);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  LARGE_INTEGER ticksPerSecond;
Shinya Kitaoka 120a6e
  LARGE_INTEGER tick;
Shinya Kitaoka 120a6e
  static LARGE_INTEGER firstTick;
Toshihiro Shimizu 890ddd
  static bool firstTime = true;
Toshihiro Shimizu 890ddd
  long dt = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  QueryPerformanceFrequency(&ticksPerSecond);
Toshihiro Shimizu 890ddd
  QueryPerformanceCounter(&tick);
Toshihiro Shimizu 890ddd
  if(firstTime) {firstTick = tick;firstTime=false;}
Toshihiro Shimizu 890ddd
  else
Toshihiro Shimizu 890ddd
  {
Shinya Kitaoka 120a6e
    dt =
Shinya Kitaoka 120a6e
(long)(1000000*(tick.QuadPart-firstTick.QuadPart)/ticksPerSecond.QuadPart);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  os << dt << ":" << s << std::endl;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
#ifdef _DEBUG
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool checkQuadraticDistance(TStroke *stroke, bool checkThickness) {
Shinya Kitaoka 120a6e
  UINT i, qCount = stroke->getChunkCount();
Shinya Kitaoka 120a6e
  const TThickQuadratic *q;
Shinya Kitaoka 120a6e
  TThickPoint p1, p2, p3;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // se i punti coincidono e' una stroke puntiforme ed e' ammessa
Shinya Kitaoka 120a6e
  if (qCount == 1) return true;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (i = 0; i != qCount; i++) {
Shinya Kitaoka 120a6e
    q  = stroke->getChunk(i);
Shinya Kitaoka 120a6e
    p1 = q->getThickP0();
Shinya Kitaoka 120a6e
    p2 = q->getThickP1();
Shinya Kitaoka 120a6e
    p3 = q->getThickP2();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (areAlmostEqual(p1.x, p2.x) && areAlmostEqual(p2.x, p3.x) &&
Shinya Kitaoka 120a6e
        areAlmostEqual(p1.y, p2.y) && areAlmostEqual(p2.y, p3.y) &&
Shinya Kitaoka 120a6e
        (!checkThickness || (areAlmostEqual(p1.thick, p2.thick) &&
Shinya Kitaoka 120a6e
                             areAlmostEqual(p2.thick, p3.thick))))
Shinya Kitaoka 120a6e
      return false;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void drawControlPoints(const TVectorRenderData &rd, TStroke *stroke,
Shinya Kitaoka 120a6e
                       double pixelSize, bool allPoints = true) {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  TPointD p;
Shinya Kitaoka 120a6e
  glPushMatrix();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  tglMultMatrix(rd.m_aff);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glPointSize(2.0);
Shinya Kitaoka 120a6e
  glBegin(GL_POINTS);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (allPoints) {
Shinya Kitaoka 120a6e
    int n = stroke->getControlPointCount();
Shinya Kitaoka 120a6e
    for (i = 0; i < n; ++i) {
Shinya Kitaoka 120a6e
      p = stroke->getControlPoint(i);
Shinya Kitaoka 120a6e
      glColor3d((i + 1) & 1, i & 1, 0.0);
Shinya Kitaoka 120a6e
      glVertex2d(p.x, p.y);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    int n = stroke->getChunkCount();
Shinya Kitaoka 120a6e
    for (i = 0; i < n; ++i) {
Shinya Kitaoka 120a6e
      const TThickQuadratic *chunk = stroke->getChunk(i);
Shinya Kitaoka 120a6e
      p                            = chunk->getP0();
Shinya Kitaoka 120a6e
      glColor3d(1.0, 0.0, 0.0);
Shinya Kitaoka 120a6e
      glVertex2d(p.x, p.y);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    const TThickQuadratic *chunk = stroke->getChunk(n - 1);
Shinya Kitaoka 120a6e
    glColor3d(1.0, 0.0, 0.0);
Shinya Kitaoka 120a6e
    p = chunk->getP2();
Shinya Kitaoka 120a6e
    glVertex2d(p.x, p.y);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glEnd();
Shinya Kitaoka 120a6e
  glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*TPixel TransparencyCheckBlackBgInk = TPixel(255,255,255);
Toshihiro Shimizu 890ddd
TPixel TransparencyCheckWhiteBgInk = TPixel(0,0,0);
Toshihiro Shimizu 890ddd
TPixel TransparencyCheckPaint = TPixel(127,127,127);*/
Toshihiro Shimizu 890ddd
static int Index = 0;
Shinya Kitaoka 120a6e
void tglDraw(const TVectorRenderData &rd, TRegion *r, bool pushAttribs) {
Shinya Kitaoka 120a6e
  checkErrorsByGL;
Shinya Kitaoka 120a6e
  assert(r);
Shinya Kitaoka 120a6e
  checkErrorsByGL;
Shinya Kitaoka 120a6e
  if (!r) return;
Shinya Kitaoka 120a6e
  bool alphaChannel = rd.m_alphaChannel;
Shinya Kitaoka 120a6e
  checkErrorsByGL;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int j          = 0;
Shinya Kitaoka 120a6e
  bool visible   = false;
Shinya Kitaoka 120a6e
  int colorCount = 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TColorStyleP style;
Shinya Kitaoka 120a6e
  if (rd.m_paintCheckEnabled && r->getStyle() == rd.m_colorCheckIndex) {
Shinya Kitaoka 120a6e
    static TSolidColorStyle *redColor = new TSolidColorStyle();
Shinya Kitaoka 120a6e
    redColor->addRef();
Shinya Kitaoka 120a6e
    redColor->setMainColor(TPixel::Red);
Shinya Kitaoka 120a6e
    style = redColor;
Shinya Kitaoka 120a6e
  } else if (rd.m_tcheckEnabled) {
Shinya Kitaoka 120a6e
    static TSolidColorStyle *color = new TSolidColorStyle();
Shinya Kitaoka 120a6e
    color->addRef();
Shinya Kitaoka 120a6e
    color->setMainColor(rd.m_tCheckPaint);
Shinya Kitaoka 120a6e
    style = color;
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    style = rd.m_palette->getStyle(r->getStyle());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  colorCount = style->getColorParamCount();
Shinya Kitaoka 120a6e
  if (colorCount == 0) {  // for example texture
Shinya Kitaoka 120a6e
    visible = true;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    visible = false;
Shinya Kitaoka 120a6e
    for (j = 0; j < colorCount && !visible; j++) {
Shinya Kitaoka 120a6e
      TPixel32 color            = style->getColorParamValue(j);
Shinya Kitaoka 120a6e
      if (rd.m_cf) color        = (*(rd.m_cf))(color);
Shinya Kitaoka 120a6e
      if (color.m != 0) visible = true;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (visible) {
Shinya Kitaoka 120a6e
    TRegionProp *prop = r->getProp(/*rd.m_palette*/);
Shinya Kitaoka 120a6e
    /// questo codice satva dentro tregion::getprop/////
Shinya Kitaoka 120a6e
    int styleId = r->getStyle();
Shinya Kitaoka 120a6e
    if (styleId) {
Shinya Kitaoka 120a6e
      // TColorStyle * style = rd.m_palette->getStyle(styleId);
Shinya Kitaoka 120a6e
      if (!style->isRegionStyle() || style->isEnabled() == false) {
Shinya Kitaoka 120a6e
        prop = 0;
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        // Warning: The same remark of stroke props holds here.
Shinya Kitaoka 120a6e
        if (!prop || style.getPointer() != prop->getColorStyle()) {
Shinya Kitaoka 120a6e
          r->setProp(style->makeRegionProp(r));
Shinya Kitaoka 120a6e
          prop = r->getProp();
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ////// draw
Shinya Kitaoka 120a6e
    if (prop) {
Shinya Kitaoka 120a6e
      if (pushAttribs) glPushAttrib(GL_ALL_ATTRIB_BITS);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      tglEnableLineSmooth(true);
Toshihiro Shimizu 890ddd
//#define DRAW_EDGE_NUMBERS
Toshihiro Shimizu 890ddd
#ifdef DRAW_EDGE_NUMBERS
Shinya Kitaoka 120a6e
      glPushMatrix();
Shinya Kitaoka 120a6e
      tglMultMatrix(rd.m_aff);
Shinya Kitaoka 120a6e
      switch (Index % 7) {
Shinya Kitaoka 120a6e
      case 0:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Red);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case 1:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Green);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case 2:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Blue);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case 3:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Cyan);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case 4:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Magenta);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case 5:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Yellow);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      case 6:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Black);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      default:
Shinya Kitaoka 120a6e
        tglColor(TPixel::Red);
Shinya Kitaoka 120a6e
        break;
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      Index++;
Shinya Kitaoka 120a6e
      if (rIndex == 2) {
Shinya Kitaoka 120a6e
        double y = r->getEdge(0)
Shinya Kitaoka 120a6e
                       ->m_s
Shinya Kitaoka 120a6e
                       ->getThickPoint(
Shinya Kitaoka 120a6e
                           (r->getEdge(0)->m_w0 + r->getEdge(0)->m_w1) / 2.0)
Shinya Kitaoka 120a6e
                       .y;
Shinya Kitaoka 120a6e
        tglDrawSegment(TPointD(-1000, y), TPointD(1000, y));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      for (int i = 0; i < (int)r->getEdgeCount(); i++) {
Shinya Kitaoka 120a6e
        TEdge *e  = r->getEdge(i);
Shinya Kitaoka 120a6e
        TPointD p = e->m_s->getPoint(0.8 * e->m_w0 + 0.2 * e->m_w1);
Shinya Kitaoka 120a6e
        if (i == 0)
Shinya Kitaoka 120a6e
          tglDrawText(p,
Shinya Kitaoka 120a6e
                      (QString::number(rIndex) + QString("-0")).toStdString());
Shinya Kitaoka 120a6e
        else
Shinya Kitaoka 120a6e
          tglDrawText(p, QString::number(i).toStdString());
Shinya Kitaoka 120a6e
        if (e->m_index == 3) {
Shinya Kitaoka 120a6e
          tglColor(TPixel::Black);
Shinya Kitaoka 120a6e
          TStroke *s = e->m_s;
Shinya Kitaoka 120a6e
          drawPoint(s->getChunk(0)->getP0(), .3);
Shinya Kitaoka 120a6e
          tglColor(TPixel::Red);
Shinya Kitaoka 120a6e
          tglDrawText(s->getChunk(0)->getP0(),
Shinya Kitaoka 120a6e
                      QString::number(0).toStdString());
Shinya Kitaoka 120a6e
          for (int ii = 0; ii < s->getChunkCount(); ii++) {
Shinya Kitaoka 120a6e
            drawPoint(s->getChunk(ii)->getP2(), .3);
Shinya Kitaoka 120a6e
            if (ii < s->getChunkCount() - 1) {
Shinya Kitaoka 120a6e
              tglColor(TPixel::Red);
Shinya Kitaoka 120a6e
              tglDrawText(s->getChunk(ii)->getP2(),
Shinya Kitaoka 120a6e
                          QString::number(ii + 1).toStdString());
Shinya Kitaoka 120a6e
            }
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      glPopMatrix();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (alphaChannel) {
Shinya Kitaoka 120a6e
        GLboolean red, green, blue, alpha;
Shinya Kitaoka 120a6e
        tglGetColorMask(red, green, blue, alpha);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Draw RGB channels
Shinya Kitaoka 120a6e
        tglEnableBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Shinya Kitaoka 120a6e
        glColorMask(red, green, blue, GL_FALSE);
Shinya Kitaoka 120a6e
        prop->draw(rd);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Draw Matte channel
Shinya Kitaoka 120a6e
        tglEnableBlending(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Shinya Kitaoka 120a6e
        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, alpha);
Shinya Kitaoka 120a6e
        prop->draw(rd);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        glColorMask(red, green, blue, alpha);
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        // pezza: in render, le aree fillate dei custom styles sparivano.
Shinya Kitaoka 120a6e
        if (!rd.m_isOfflineRender || !rd.m_isImagePattern)
Shinya Kitaoka 120a6e
          tglRgbOnlyColorMask();  // RGB components only
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        prop->draw(rd);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (pushAttribs) glPopAttrib();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  for (UINT i = 0; i < r->getSubregionCount(); i++)
Shinya Kitaoka 120a6e
    tglDraw(rd, r->getSubregion(i), pushAttribs);
Shinya Kitaoka 120a6e
  checkErrorsByGL;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void tglDrawMask(const TVectorRenderData &rd1, const TVectorImage *vim) {
Shinya Kitaoka 120a6e
  UINT i;
Shinya Kitaoka 120a6e
  assert(vim);
Shinya Kitaoka 120a6e
  if (!vim) return;
Shinya Kitaoka 120a6e
  TVectorRenderData rd(rd1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glPushAttrib(GL_ALL_ATTRIB_BITS);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!rd.m_palette) {
Shinya Kitaoka 120a6e
    TPalette *vPalette = vim->getPalette();
Shinya Kitaoka 120a6e
    assert(vPalette);
Shinya Kitaoka 120a6e
    rd.m_palette = vPalette;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  for (i = 0; i < vim->getRegionCount(); i++)
Shinya Kitaoka 120a6e
    tglDraw(rd, vim->getRegion(i), false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  glPopAttrib();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
bool isOThick(const TStroke *s) {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < s->getControlPointCount(); i++)
Shinya Kitaoka 120a6e
    if (s->getControlPoint(i).thick != 0) return false;
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void tglDraw(const TVectorRenderData &rd, const TStroke *s, bool pushAttribs) {
Shinya Kitaoka 120a6e
  assert(s);
Shinya Kitaoka 120a6e
  if (!s) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TStrokeProp *prop  = 0;
Shinya Kitaoka 120a6e
  bool pushedAttribs = false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  try {
Shinya Kitaoka 120a6e
    TColorStyleP style;
Shinya Kitaoka 120a6e
    TStroke *stroke = const_cast<tstroke *="">(s);</tstroke>
Shinya Kitaoka 120a6e
    if (rd.m_inkCheckEnabled && s->getStyle() == rd.m_colorCheckIndex) {
Shinya Kitaoka 120a6e
      static TSolidColorStyle *redColor = new TSolidColorStyle();
Shinya Kitaoka 120a6e
      redColor->addRef();
Shinya Kitaoka 120a6e
      redColor->setMainColor(TPixel::Red);
Shinya Kitaoka 120a6e
      style = redColor;
Shinya Kitaoka 120a6e
    } else if (rd.m_tcheckEnabled) {
Shinya Kitaoka 120a6e
      static TSolidColorStyle *color = new TSolidColorStyle();
Shinya Kitaoka 120a6e
      color->addRef();
Shinya Kitaoka 120a6e
      color->setMainColor(rd.m_tCheckInk);
Shinya Kitaoka 120a6e
      style = color;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      style = rd.m_palette->getStyle(stroke->getStyle());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (!rd.m_show0ThickStrokes && isOThick(s) &&
Shinya Kitaoka 120a6e
        dynamic_cast<tsolidcolorstyle *="">(</tsolidcolorstyle>
Shinya Kitaoka 120a6e
            style.getPointer())  // This is probably to exclude
Shinya Kitaoka 120a6e
                                 // TCenterlineStrokeStyle-like styles
Shinya Kitaoka 120a6e
        && !rd.m_tcheckEnabled)  // I wonder why this?
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // const TStroke& stroke = *s;  //serve???
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    assert(rd.m_palette);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    prop = s->getProp(/*rd.m_palette*/);
Shinya Kitaoka 120a6e
    /////questo codice stava dentro tstroke::getprop/////////
Shinya Kitaoka 120a6e
    if (prop) prop->getMutex()->lock();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (!style->isStrokeStyle() || style->isEnabled() == false) {
Shinya Kitaoka 120a6e
      if (prop) prop->getMutex()->unlock();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      prop = 0;
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      // Warning: the following pointers check is conceptually wrong - we
Shinya Kitaoka 120a6e
      // keep it because the props maintain SMART POINTER-like reference to
Shinya Kitaoka 120a6e
      // the associated style. This prevents the style from being destroyed
Shinya Kitaoka 120a6e
      // while still referenced by the prop.
Shinya Kitaoka 120a6e
      if (!prop || style.getPointer() != prop->getColorStyle()) {
Shinya Kitaoka 120a6e
        if (prop) prop->getMutex()->unlock();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        stroke->setProp(style->makeStrokeProp(stroke));
Shinya Kitaoka 120a6e
        prop = stroke->getProp();
Shinya Kitaoka 120a6e
        if (prop) prop->getMutex()->lock();
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    //--------- draw ------------
Shinya Kitaoka 120a6e
    if (!prop) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (pushAttribs) glPushAttrib(GL_ALL_ATTRIB_BITS), pushedAttribs = true;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    bool alphaChannel = rd.m_alphaChannel, antialias = rd.m_antiAliasing;
Shinya Kitaoka 120a6e
    TVectorImagePatternStrokeProp *aux =
Shinya Kitaoka 120a6e
        dynamic_cast<tvectorimagepatternstrokeprop *="">(prop);</tvectorimagepatternstrokeprop>
Shinya Kitaoka 120a6e
    if (aux)  // gli image pattern vettoriali tornano in questa funzione....non
Shinya Kitaoka 120a6e
              // facendo il corpo dell'else'si evita di disegnarli due volte!
Shinya Kitaoka 120a6e
      prop->draw(rd);
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      if (antialias)
Shinya Kitaoka 120a6e
        tglEnableLineSmooth(true);
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        tglEnableLineSmooth(false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (alphaChannel) {
Shinya Kitaoka 120a6e
        GLboolean red, green, blue, alpha;
Shinya Kitaoka 120a6e
        tglGetColorMask(red, green, blue, alpha);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Draw RGB channels
Shinya Kitaoka 120a6e
        tglEnableBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Shinya Kitaoka 120a6e
        glColorMask(red, green, blue, GL_FALSE);
Shinya Kitaoka 120a6e
        prop->draw(rd);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Draw Matte channel
Shinya Kitaoka 120a6e
        tglEnableBlending(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Shinya Kitaoka 120a6e
        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, alpha);
Shinya Kitaoka 120a6e
        prop->draw(rd);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        glColorMask(red, green, blue, alpha);
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        tglEnableBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Shinya Kitaoka 120a6e
        prop->draw(rd);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (pushAttribs) glPopAttrib(), pushedAttribs = false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    prop->getMutex()->unlock();
Shinya Kitaoka 120a6e
    //---------------------
Shinya Kitaoka 120a6e
  } catch (...) {
Shinya Kitaoka 120a6e
    if (prop) prop->getMutex()->unlock();
Shinya Kitaoka 120a6e
    if (pushedAttribs) glPopAttrib();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void tglDoDraw(const TVectorRenderData &rd, TRegion *r) {
Shinya Kitaoka 120a6e
  bool visible   = false;
Shinya Kitaoka 120a6e
  int colorCount = 0;
Shinya Kitaoka 120a6e
  if (!r) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TColorStyleP style = rd.m_palette->getStyle(r->getStyle());
Shinya Kitaoka 120a6e
  colorCount         = style->getColorParamCount();
Shinya Kitaoka 120a6e
  if (colorCount == 0)  // for example texture
Shinya Kitaoka 120a6e
    visible = true;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    visible = false;
Shinya Kitaoka 120a6e
    for (int j = 0; j < colorCount && !visible; j++) {
Shinya Kitaoka 120a6e
      TPixel32 color            = style->getColorParamValue(j);
Shinya Kitaoka 120a6e
      if (rd.m_cf) color        = (*(rd.m_cf))(color);
Shinya Kitaoka 120a6e
      if (color.m != 0) visible = true;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (visible)
Shinya Kitaoka 120a6e
    tglDraw(rd, r, false);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    for (UINT j = 0; j < r->getSubregionCount(); j++)
Shinya Kitaoka 120a6e
      tglDraw(rd, r->getSubregion(j), false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void tglDoDraw(const TVectorRenderData &rd, const TStroke *s) {
Shinya Kitaoka 120a6e
  bool visible   = false;
Shinya Kitaoka 120a6e
  int colorCount = 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  const TPalette *palette = rd.m_palette;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int styleId = s->getStyle();
Shinya Kitaoka 120a6e
  // assert(0<=styleId && styleId
Shinya Kitaoka 120a6e
  TColorStyleP style = palette->getStyle(styleId);
Shinya Kitaoka 120a6e
  assert(style);
Shinya Kitaoka 120a6e
  colorCount = style->getColorParamCount();
Shinya Kitaoka 120a6e
  if (colorCount == 0)
Shinya Kitaoka 120a6e
    visible = true;
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    visible = false;
Shinya Kitaoka 120a6e
    for (int j = 0; j < style->getColorParamCount() && !visible; j++) {
Shinya Kitaoka 120a6e
      TPixel32 color            = style->getColorParamValue(j);
Shinya Kitaoka 120a6e
      if (rd.m_cf) color        = (*(rd.m_cf))(color);
Shinya Kitaoka 120a6e
      if (color.m != 0) visible = true;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
#if DISEGNO_OUTLINE == 0
Shinya Kitaoka 120a6e
  if (visible)
Toshihiro Shimizu 890ddd
#endif
Shinya Kitaoka 120a6e
    tglDraw(rd, s, false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef _DEBUG
Shinya Kitaoka 120a6e
// drawControlPoints(rd, vim->getStroke(i), sqrt(tglGetPixelSize2()), true);
Shinya Kitaoka 120a6e
// assert(checkQuadraticDistance(vim->getStroke(i),true));
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void doDraw(const TVectorImage *vim, const TVectorRenderData &_rd,
Shinya Kitaoka 120a6e
            bool drawEnteredGroup) {
Shinya Kitaoka 120a6e
  static TOnionFader *fade = new TOnionFader(TPixel::White, 0.5);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TVectorRenderData rd(_rd);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!rd.m_palette) {
Shinya Kitaoka 120a6e
    TPalette *vPalette = vim->getPalette();
Shinya Kitaoka 120a6e
    rd.m_palette       = vPalette;
Shinya Kitaoka 120a6e
    if (!vPalette) return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!drawEnteredGroup && !rd.m_isIcon && vim->isInsideGroup() > 0)
Shinya Kitaoka 120a6e
    rd.m_cf = fade;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TVectorRenderData rdRegions = rd;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*if (rd.m_drawRegions && rd.m_isImagePattern)//gli image pattern hanno
Shinya Kitaoka 120a6e
bisogno dell'antialiasig per le linee, ma sulle aree ci sarebbero un sacco di
Shinya Kitaoka 120a6e
assert
Shinya Kitaoka 120a6e
rdRegions.m_alphaChannel = rdRegions.m_antiAliasing = false;*/
Shinya Kitaoka 120a6e
  UINT strokeIndex = 0;
Shinya Kitaoka 120a6e
  Index            = 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  while (strokeIndex <
Shinya Kitaoka 120a6e
         vim->getStrokeCount())  // ogni ciclo di while disegna un gruppo
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    int currStrokeIndex = strokeIndex;
Shinya Kitaoka 120a6e
    if (!rd.m_isIcon && vim->isInsideGroup() > 0 &&
Shinya Kitaoka 120a6e
        ((drawEnteredGroup && !vim->isEnteredGroupStroke(strokeIndex)) ||
Shinya Kitaoka 120a6e
         !drawEnteredGroup && vim->isEnteredGroupStroke(strokeIndex))) {
Shinya Kitaoka 120a6e
      while (strokeIndex < vim->getStrokeCount() &&
Shinya Kitaoka 120a6e
             vim->sameGroup(strokeIndex, currStrokeIndex))
Shinya Kitaoka 120a6e
        strokeIndex++;
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (rd.m_drawRegions)
Shinya Kitaoka 120a6e
      for (UINT regionIndex = 0; regionIndex < vim->getRegionCount();
Shinya Kitaoka 120a6e
           regionIndex++)
Shinya Kitaoka 120a6e
        if (vim->sameGroupStrokeAndRegion(currStrokeIndex, regionIndex))
Shinya Kitaoka 120a6e
          tglDoDraw(rdRegions, vim->getRegion(regionIndex));
Shinya Kitaoka 120a6e
    while (strokeIndex < vim->getStrokeCount() &&
Shinya Kitaoka 120a6e
           vim->sameGroup(strokeIndex, currStrokeIndex)) {
Toshihiro Shimizu 890ddd
#if DISEGNO_OUTLINE == 1
Shinya Kitaoka 120a6e
      CurrStrokeIndex = strokeIndex;
Shinya Kitaoka 120a6e
      CurrVimg        = vim;
Toshihiro Shimizu 890ddd
#endif
Shinya Kitaoka 120a6e
      tglDoDraw(rd, vim->getStroke(strokeIndex));
Shinya Kitaoka 120a6e
      strokeIndex++;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void tglDraw(const TVectorRenderData &rd, const TVectorImage *vim) {
Shinya Kitaoka 120a6e
  assert(vim);
Shinya Kitaoka 120a6e
  if (!vim) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QMutexLocker sl(vim->getMutex());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  checkErrorsByGL;
Shinya Kitaoka 120a6e
  checkErrorsByGL;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  glPushAttrib(GL_ALL_ATTRIB_BITS);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // if(!rd.m_palette) rd.m_palette = vim->getPalette();
Shinya Kitaoka 120a6e
  // mylog("tglDraw start; mutex=" + toString((unsigned long)&vim->getMutex()));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  glEnable(GL_ALPHA_TEST);
Shinya Kitaoka 120a6e
  glAlphaFunc(GL_GREATER, 0);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  doDraw(vim, rd, false);
Shinya Kitaoka 120a6e
  if (!rd.m_isIcon && vim->isInsideGroup() > 0) doDraw(vim, rd, true);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  glDisable(GL_ALPHA_TEST);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  glPopAttrib();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef _DEBUG
Shinya Kitaoka 120a6e
  vim->drawAutocloses(rd);
Toshihiro Shimizu 890ddd
#endif
Shinya Kitaoka 120a6e
  checkErrorsByGL;
Shinya Kitaoka 120a6e
  // mylog("tglDraw stop");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------