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