Пример #1
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;
}
Пример #2
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();
}