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; }
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(); }