Ejemplo n.º 1
0
void
CaptionObject::createImage()
{
  m_recreate = false;
  QStringList regExprs;
  regExprs << "\\$[0-9]*[f|F]";
  regExprs << "\\$[0-9]*[v|V][0-3]*";
  regExprs << "\\$[n|N]\\(\\d*\\.*\\d*\\)";
  regExprs << "\\$[d|D]\\(\\d*\\.*\\d*\\)";

  QString finalText = m_text;

  bool drawPi = false;
  float drawPiAngle = 0;
  for (int nr=0; nr<regExprs.count(); nr++)
    {
      QRegExp rx(regExprs[nr]);
      if (rx.indexIn(finalText) > -1)
	{
	  m_recreate = true;

	  QString txt = rx.cap();
	  QChar fillChar = '0';
	  int fieldWidth = 0;
	  if (txt.length() > 2)
	    {
	      txt.remove(0,1);
	      txt.chop(1);
	      if (txt.endsWith("v", Qt::CaseInsensitive))
		txt.chop(1);
	      fieldWidth = txt.toInt();
	    }

	  QString ftxt;
	  if (nr == 0)
	    ftxt = QString("%1").arg((int)Global::frameNumber(),
				     fieldWidth, 10, fillChar);
	  else if (nr == 1)
	    {
	      QString txt = rx.cap();
	      QStringList rem = txt.split("v",
					  QString::SkipEmptyParts,
					  Qt::CaseInsensitive);
	      int vol = 0;
	      if (rem.count() > 1)
		vol = rem[1].toInt();

	      ftxt = QString("%1").arg((int)Global::actualVolumeNumber(vol),
				       fieldWidth, 10, fillChar);
	    }
	  else if (nr == 2)
	    {
	      QStringList rem = txt.split("(");
	      if (rem.count() > 1)
		ftxt = rem[1];
	    }
	  else if (nr == 3)
	    {
	      drawPi = true;
	      QStringList rem = txt.split("(");
	      if (rem.count() > 1)
		drawPiAngle = rem[1].toDouble();
	    }
	    
	  finalText.replace(rx, ftxt);
	}
    }


  QFontMetrics metric(m_font);
  m_width = metric.width(finalText);

  int mde = metric.descent();
  int fwd = m_width;
  int fht = m_height;
  if (drawPi > 0)
    fwd += fht;

  QImage bImage = QImage(fwd, fht, QImage::Format_ARGB32);
  bImage.fill(0);
  {
    QPainter bpainter(&bImage);
    // we have image as ARGB, but we want RGBA
    // so switch red and blue colors here itself
    QColor penColor(m_haloColor.blue(),
		    m_haloColor.green(),
		    m_haloColor.red());
    bpainter.setPen(penColor);
    bpainter.setFont(m_font);
    if (drawPi)
      bpainter.drawText(fht+1, fht-mde, finalText);
    else
      bpainter.drawText(1, fht-mde, finalText);

    if (drawPi)
      {
	bpainter.setBrush(penColor);
	bpainter.setPen(Qt::NoPen);
	bpainter.drawPie(3,3, fht-6, fht-6,
			 90*16, -360*16);
      }

    uchar *dbits = new uchar[4*fht*fwd];
    uchar *bits = bImage.bits();
    for(int nt=0; nt < 3; nt++)
      {
	memcpy(dbits, bits, 4*fht*fwd);

	for(int i=2; i<fht-2; i++)
	  for(int j=2; j<fwd-2; j++)
	    {
	      for (int k=0; k<4; k++)
		{
		  int sum = 0;
		  
		  for(int i0=-2; i0<=2; i0++)
		    for(int j0=-2; j0<=2; j0++)
		      sum += dbits[4*((i+i0)*fwd+(j+j0)) + k];
		  
		  bits[4*(i*fwd+j) + k] = sum/25;
		}
	    }
      }
    delete [] dbits;
  }


  QImage cImage = QImage(fwd, fht, QImage::Format_ARGB32);
  cImage.fill(0);
  {
    QPainter cpainter(&cImage);
    // first draw the halo image
    cpainter.drawImage(0, 0, bImage);

    // we have image as ARGB, but we want RGBA
    // so switch red and blue colors here itself
    QColor penColor(m_color.blue(),
		    m_color.green(),
		    m_color.red());
    cpainter.setPen(penColor);
    cpainter.setFont(m_font);
    if (drawPi)
      cpainter.drawText(fht+1, fht-mde, finalText);
    else
      cpainter.drawText(1, fht-mde, finalText);

    if (drawPi)
      {
	QColor bgColor(m_haloColor.blue(),
		       m_haloColor.green(),
		       m_haloColor.red());
	cpainter.setPen(Qt::NoPen);
	int nturns = drawPiAngle/360;
	if (qAbs(nturns)%2 == 0)
	  {
	    cpainter.setBrush(bgColor);
	    cpainter.drawPie(3,3, fht-6, fht-6,
			     90*16, -360*16);
	    if(fabs(drawPiAngle-nturns*360) > 0)
	      {		
		cpainter.setBrush(penColor);
		cpainter.drawPie(3,3, fht-6, fht-6,
				 90*16, -(drawPiAngle-nturns*360)*16);
	      }
	  }
	else
	  {
	    cpainter.setBrush(penColor);
	    cpainter.drawPie(3,3, fht-6, fht-6,
			     90*16, -360*16);
	    if(fabs(drawPiAngle-nturns*360) > 0)
	      {		
		cpainter.setBrush(bgColor);
		cpainter.drawPie(3,3, fht-6, fht-6,
				 90*16, -(drawPiAngle-nturns*360)*16);
	      }
	  }

	cpainter.setBrush(Qt::NoBrush);
	cpainter.setPen(penColor);
	cpainter.drawPie(3,3, fht-6, fht-6,
			 90*16, -drawPiAngle*16);

      }

    float alpha = m_color.alpha()/255.0;
    uchar *bits = cImage.bits();
    for(int i=0; i<fht*fwd; i++)
      {
	bits[4*i+0] *= alpha;
	bits[4*i+1] *= alpha;
	bits[4*i+2] *= alpha;
	bits[4*i+3] *= alpha;
      }
  }
  
  m_image = cImage.mirrored();
}
Ejemplo n.º 2
0
void
ClipObject::loadCaption(QString ct, QFont cf,
			QColor cc, QColor chc)
{
  m_captionText = ct;
  m_captionFont = cf;
  m_captionColor = cc;
  m_captionHaloColor = chc;

  if (m_captionText.isEmpty())
    {
      m_captionPresent = false;
      return;
    }

  QFontMetrics metric(m_captionFont);
  int mde = metric.descent();
  int fht = metric.height();
  int fwd = metric.width(m_captionText)+2;

  //-------------------
  QImage bImage = QImage(fwd, fht, QImage::Format_ARGB32);
  bImage.fill(0);
  {
    QPainter bpainter(&bImage);
    // we have image as ARGB, but we want RGBA
    // so switch red and blue colors here itself
    QColor penColor(m_captionHaloColor.blue(),
		    m_captionHaloColor.green(),
		    m_captionHaloColor.red());
    // do not use alpha(),
    // opacity will be modulated using clip-plane's opacity parameter  
    bpainter.setPen(penColor);
    bpainter.setFont(m_captionFont);
    bpainter.drawText(1, fht-mde, m_captionText);

    uchar *dbits = new uchar[4*fht*fwd];
    uchar *bits = bImage.bits();
    memcpy(dbits, bits, 4*fht*fwd);

    for(int i=2; i<fht-2; i++)
      for(int j=2; j<fwd-2; j++)
	{
	  for (int k=0; k<4; k++)
	    {
	      int sum = 0;
	      
	      for(int i0=-2; i0<=2; i0++)
		for(int j0=-2; j0<=2; j0++)
		  sum += dbits[4*((i+i0)*fwd+(j+j0)) + k];
	      
	      bits[4*(i*fwd+j) + k] = sum/25;
	    }
	}
    delete [] dbits;
  }
  //-------------------

  QImage cImage = QImage(fwd, fht, QImage::Format_ARGB32);
  cImage.fill(0);
  QPainter cpainter(&cImage);

  // first draw the halo image
  cpainter.drawImage(0, 0, bImage);


  // we have image as ARGB, but we want RGBA
  // so switch red and blue colors here itself
  QColor penColor(m_captionColor.blue(),
		  m_captionColor.green(),
		  m_captionColor.red());
  // do not use alpha(),
  // opacity will be modulated using clip-plane's opacity parameter  
  cpainter.setPen(penColor);
  cpainter.setFont(m_captionFont);
  cpainter.drawText(1, fht-mde, m_captionText);
  m_textureWidth = fwd;
  m_textureHeight = fht;
      
  unsigned char *image = new unsigned char[4*m_textureWidth*m_textureHeight];
  memcpy(image, cImage.bits(), 4*m_textureWidth*m_textureHeight); 

  if (m_imageTex)
    glDeleteTextures(1, &m_imageTex);
  glGenTextures(1, &m_imageTex);

  glActiveTexture(GL_TEXTURE0);
  glBindTexture(GL_TEXTURE_RECTANGLE_ARB, m_imageTex);
  glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
  glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
  glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_RECTANGLE_ARB,
	       0,
	       4,
	       m_textureWidth,
	       m_textureHeight,
	       0,
	       GL_RGBA,
	       GL_UNSIGNED_BYTE,
	       image);
  glDisable(GL_TEXTURE_RECTANGLE_ARB);

  delete [] image;

  clearImage();

  m_captionPresent = true;
}
Ejemplo n.º 3
0
void
ScaleBarObject::draw(float pixelGLRatio,
		     int screenWidth, int screenHeight,
		     int viewWidth, int viewHeight,
		     bool grabsMouse)
{
  VolumeInformation pvlInfo = VolumeInformation::volumeInformation();

  QString str;
  bool horizontal = m_type;
  float slen = voxels();
  if (pvlInfo.voxelUnit > 0)
    {
      float avg = (pvlInfo.voxelSize[0] +
		   pvlInfo.voxelSize[1] +
		   pvlInfo.voxelSize[2])/3.0f;
      
      str = QString("%1 %2").			     \
	arg(slen, 0, 'f', Global::floatPrecision()).	\
	arg(pvlInfo.voxelUnitStringShort());     
      
      slen /= avg;
    }
  else
    str = QString("%1 voxels").arg(slen);

  slen = slen/pixelGLRatio;

  Vec s0 = Vec(m_pos.x()*viewWidth,
	       m_pos.y()*viewHeight,
	       1);
  
  Vec s1 = s0;
  if (horizontal)
    {
      slen *= (float)viewWidth/(float)screenWidth;
      s0 -= Vec(slen/2, 0, 0);
      s1 += Vec(slen/2, 0, 0);
    }
  else
    {
      slen *= (float)viewHeight/(float)screenHeight;
      s0 -= Vec(0, slen/2, 0);
      s1 += Vec(0, slen/2, 0);
    }
  
  glEnable(GL_BLEND);
  glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // back to front
  glColor4f(0, 0, 0, 0.8f);
  if (grabsMouse)
    {
      glColor4f(0.5f, 0, 0, 0.8f);
      glBegin(GL_QUADS);
      if (horizontal)
	{
	  glVertex2f(s0.x-5, s0.y-10);
	  glVertex2f(s1.x+5, s0.y-10);
	  glVertex2f(s1.x+5, s0.y+10);
	  glVertex2f(s0.x-5, s0.y+10);
	}
      else
	{
	  glVertex2f(s0.x-10, s0.y-5);
	  glVertex2f(s0.x-10, s1.y+5);
	  glVertex2f(s0.x+10, s1.y+5);
	  glVertex2f(s0.x+10, s0.y-5);
	}
      glEnd();
    }
  
  
  glDisable(GL_BLEND);
  glColor3f(1,1,1);
  glLineWidth(10);
  glBegin(GL_LINES);
  glVertex3fv(s0);
  glVertex3fv(s1);
  glEnd();
  
  glColor3f(0.5,0.5,0.5);
  glLineWidth(2);
  glBegin(GL_LINES);
  if (horizontal)
    {
      glVertex2f(s0.x+slen/2, s0.y-3);
      glVertex2f(s0.x+slen/2, s1.y+3);
    }
  else
    {
      glVertex2f(s1.x-3, (s1.y+s0.y)/2);
      glVertex2f(s0.x+3, (s1.y+s0.y)/2);
    }
  glEnd();
  glColor3f(0,0,0);
  glLineWidth(2);
  glBegin(GL_LINES);
  if (horizontal)
    {
      glVertex2f(s0.x+1, s0.y);
      glVertex2f(s1.x-1, s1.y);
    }
  else
    {
      glVertex2f(s0.x, s0.y+1);
      glVertex2f(s1.x, s1.y-1);
    }
  glEnd();
  glLineWidth(1);
  glColor3f(1,1,1);
  
  {
    Vec w0 = Vec(m_pos.x()*screenWidth, (1-m_pos.y())*screenHeight,1);
    Vec w1 = w0;
    if (horizontal)
      {
	w0 -= Vec(slen/2, 0, 0);
	w1 += Vec(slen/2, 0, 0);
      }
    else
      {
	w0 -= Vec(0, slen/2, 0);
	w1 += Vec(0, slen/2, 0);
      }
    
    QFont tfont = QFont("Helvetica", 12);
    tfont.setStyleStrategy(QFont::PreferAntialias);
    QFontMetrics metric(tfont);
    int mde = metric.descent();
    int fht = metric.height()+2;

    int fwd = metric.width(str)+2;
    QImage bImage = QImage(fwd, fht, QImage::Format_ARGB32);
    bImage.fill(0);
    QPainter bpainter(&bImage);
    Vec bgcolor = Global::backgroundColor();
    bpainter.setBackgroundMode(Qt::OpaqueMode);
    bpainter.setBackground(QColor(bgcolor.z*255,
				  bgcolor.y*255,
				  bgcolor.x*255));
    float bgintensity = (0.3*bgcolor.x +
			 0.5*bgcolor.y +
			 0.2*bgcolor.z);
    QColor penColor(Qt::white);
    if (bgintensity > 0.5) penColor = Qt::black;
    bpainter.setPen(penColor);
    bpainter.setFont(tfont);
    bpainter.drawText(1, fht-mde, str);
    
    QImage cImage = bImage.mirrored();
    if (!horizontal)
      {	    
	QMatrix matrix;
	matrix.rotate(90);
	cImage = cImage.transformed(matrix);
      }
    int x,y;
    if (horizontal)
      {
	x = (w0.x+w1.x)/2 - cImage.width()/2;
	y = w0.y-3-cImage.height();
	if (!m_textpos)
	  y = w0.y+6;
      }
    else
      {
	x = w1.x+3;
	if (!m_textpos)
	  x = w1.x-5-cImage.width();
	y = (w0.y+w1.y)/2 - cImage.height()/2;
      }
    glWindowPos2i(x,y);
    const uchar *bits = cImage.bits();
    glDrawPixels(cImage.width(), cImage.height(),
		 GL_RGBA,
		 GL_UNSIGNED_BYTE,
		 bits);
  }
}