void gXGrid::paint(gGraph & w,int left,int top, int width, int height) { int x,y; gVertexBuffer * stippled, * lines; EventDataType miny,maxy; if (w.zoomY()==0 && PROFILE.appearance->allowYAxisScaling()) { miny=w.physMinY(); maxy=w.physMaxY(); } else { miny=w.min_y; maxy=w.max_y; if (miny<0) { // even it up if it's starts negative miny=-MAX(fabs(miny),fabs(maxy)); } } w.roundY(miny,maxy); //EventDataType dy=maxy-miny; if (height<0) return; static QString fd="0"; GetTextExtent(fd,x,y); double max_yticks=round(height / (y+14.0)); // plus spacing between lines //double yt=1/max_yticks; double mxy=MAX(fabs(maxy),fabs(miny)); double mny=miny; if (miny<0) { mny=-mxy; } double rxy=mxy-mny; int myt; bool fnd=false; for (myt=max_yticks;myt>=1;myt--) { float v=rxy/float(myt); if (float(v)==int(v)) { fnd=true; break; } } if (fnd) max_yticks=myt; else { max_yticks=2; } double yt=1/max_yticks; double ymult=height/rxy; double min_ytick=rxy*yt; float ty,h; if (min_ytick<=0) { qDebug() << "min_ytick error in gXGrid::paint() in" << w.title(); return; } if (min_ytick>=1000000) { min_ytick=100; } stippled=w.backlines(); lines=w.backlines(); for (double i=miny; i<=maxy+min_ytick-0.00001; i+=min_ytick) { ty=(i - miny) * ymult; h=top+height-ty; if (m_show_major_lines && (i > miny)) { stippled->add(left,h,left+width,h,m_major_color.rgba()); } double z=(min_ytick/4)*ymult; double g=h; for (int i=0;i<3;i++) { g+=z; if (g>top+height) break; //if (vertcnt>=maxverts) { // qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" <<miny << "MaxY =" << maxy << "min_ytick=" <<min_ytick; // break; // } if (m_show_minor_lines) {// && (i > miny)) { stippled->add(left,g,left+width,g,m_minor_color.rgba()); } if (stippled->full()) { break; } } if (lines->full() || stippled->full()) { qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" <<miny << "MaxY =" << maxy << "min_ytick=" <<min_ytick; break; } } }
void gYAxis::paint(gGraph & w,int left,int top, int width, int height) { int x,y;//,yh=0; //Todo: clean this up as there is a lot of duplicate code between the sections if (0) {//w.graphView()->usePixmapCache()) { /* if (w.invalidate_yAxisImage) { if (!m_image.isNull()) { w.graphView()->deleteTexture(m_textureID); m_image=QImage(); } if (height<0) return; if (height>2000) return; int labelW=0; EventDataType miny=w.min_y; EventDataType maxy=w.max_y; if (miny<0) { // even it up if it's starts negative miny=-MAX(fabs(miny),fabs(maxy)); } w.roundY(miny,maxy); EventDataType dy=maxy-miny; static QString fd="0"; GetTextExtent(fd,x,y); yh=y; m_image=QImage(width,height+y+4,QImage::Format_ARGB32_Premultiplied); m_image.fill(Qt::transparent); QPainter paint(&m_image); double max_yticks=round(height / (y+14.0)); // plus spacing between lines double mxy=MAX(fabs(maxy),fabs(miny)); double mny=miny; if (miny<0) { mny=-mxy; } double rxy=mxy-mny; int myt; bool fnd=false; for (myt=max_yticks;myt>2;myt--) { float v=rxy/float(myt); if (v==int(v)) { fnd=true; break; } } if (fnd) max_yticks=myt; double yt=1/max_yticks; double ymult=height/rxy; double min_ytick=rxy*yt; float ty,h; if (min_ytick<=0) { qDebug() << "min_ytick error in gYAxis::paint() in" << w.title(); return; } if (min_ytick>=1000000) { min_ytick=100; } //lines=w.backlines(); for (double i=miny; i<=maxy+min_ytick-0.00001; i+=min_ytick) { ty=(i - miny) * ymult; if (dy<5) { fd=Format(i*m_yaxis_scale,2); } else { fd=Format(i*m_yaxis_scale,1); } GetTextExtent(fd,x,y); if (x>labelW) labelW=x; h=(height-2)-ty; h+=yh; #ifndef Q_OS_MAC // stupid pixel alignment rubbish, I really should be using floats.. h+=1; #endif if (h<0) continue; paint.setBrush(Qt::black); paint.drawText(width-8-x,h+y/2,fd); paint.setPen(m_line_color); paint.drawLine(width-4,h,width,h); double z=(min_ytick/4)*ymult; double g=h; for (int i=0;i<3;i++) { g+=z; if (g>height+yh) break; paint.drawLine(width-3,g,width,g); } } paint.end(); m_image=QGLWidget::convertToGLFormat(m_image); m_textureID=w.graphView()->bindTexture(m_image,GL_TEXTURE_2D,GL_RGBA,QGLContext::NoBindOption); w.invalidate_yAxisImage=false; } if (!m_image.isNull()) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); w.graphView()->drawTexture(QPoint(left,(top+height)-m_image.height()+5),m_textureID); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); } */ } else { if (height<0) return; if (height>2000) return; int labelW=0; EventDataType miny; EventDataType maxy; if (w.zoomY()==0 && PROFILE.appearance->allowYAxisScaling()) { miny=w.physMinY(); maxy=w.physMaxY(); } else { miny=w.min_y; maxy=w.max_y; if (miny<0) { // even it up if it's starts negative miny=-MAX(fabs(miny),fabs(maxy)); } } w.roundY(miny,maxy); EventDataType dy=maxy-miny; static QString fd="0"; GetTextExtent(fd,x,y); double max_yticks=round(height / (y+14.0)); // plus spacing between lines double mxy=MAX(fabs(maxy),fabs(miny)); double mny=miny; if (miny<0) { mny=-mxy; } double rxy=mxy-mny; int myt; bool fnd=false; for (myt=max_yticks;myt>2;myt--) { float v=rxy/float(myt); if (v==int(v)) { fnd=true; break; } } if (fnd) max_yticks=myt; double yt=1/max_yticks; double ymult=height/rxy; double min_ytick=rxy*yt; //if (dy>5) { // min_ytick=round(min_ytick); //} else { //} float ty,h; if (min_ytick<=0) { qDebug() << "min_ytick error in gYAxis::paint() in" << w.title(); return; } if (min_ytick>=1000000) { min_ytick=100; } lines=w.backlines(); GLuint line_color=m_line_color.rgba(); for (double i=miny; i<=maxy+min_ytick-0.00001; i+=min_ytick) { ty=(i - miny) * ymult; if (dy<5) { fd=Format(i*m_yaxis_scale,2); } else { fd=Format(i*m_yaxis_scale,1); } GetTextExtent(fd,x,y); // performance bottleneck.. if (x>labelW) labelW=x; h=top+height-ty; if (h<top) continue; w.renderText(fd,left+width-8-x,(h+(y/2.0)),0,m_text_color,defaultfont); lines->add(left+width-4,h,left+width,h,line_color); double z=(min_ytick/4)*ymult; double g=h; for (int i=0;i<3;i++) { g+=z; if (g>top+height) break; lines->add(left+width-3,g,left+width,g,line_color); if (lines->full()) { qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" <<miny << "MaxY =" << maxy << "min_ytick=" <<min_ytick; break; } } if (lines->full()) { qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" <<miny << "MaxY =" << maxy << "min_ytick=" <<min_ytick; break; } } } }