int View::mapx(int x) const { if (xmag < 0) { return (x-xmag/2)/(-xmag) - (xpos + rmapx(xorg)); // round } else { return (x * xmag) - (xpos + rmapx(xorg)); } }
int View::mapxDev(int x) const { int val; if (xmag <= 0) val = (x + xpos + rmapx(xorg)) * (-xmag); else val = (x + xpos + rmapx(xorg) + xmag / 2) / xmag; if (val < 0) // DEBUG val = 0; return val; }
QPoint View::map(const QPoint& p) const { int x, y; if (xmag < 0) { x = p.x()/(-xmag) - (xpos + rmapx(xorg)); // round down } else { x = p.x()*xmag - (xpos + rmapx(xorg)); } if (ymag < 0) { y = p.y()/-ymag - (ypos + rmapy(yorg)); } else { y = p.y() * ymag - (ypos + rmapy(yorg)); } return QPoint(x, y); }
QRect View::map(const QRect& r) const { int x, y, w, h; //printf("View::map xmag:%d xpos:%d xorg:%d\n", xmag, xpos, xorg); if (xmag < 0) { x = r.x()/(-xmag) - (xpos + rmapx(xorg)); // round down w = (r.width()-xmag-1) / (-xmag); // round up } else { x = r.x()*xmag - (xpos + rmapx(xorg)); w = r.width() * xmag; } if (ymag < 0) { y = r.y()/-ymag - (ypos + rmapy(yorg)); h = (r.height()-ymag-1) / (-ymag); } else { y = r.y() * ymag - (ypos + rmapy(yorg)); h = r.height() * ymag; } return QRect(x, y, w, h); }
void View::paint(const QRect& r) { #ifdef VIEW_USE_DOUBLE_BUFFERING if (pm.isNull()) return; #endif QRect rr(r); //printf("View::paint x:%d width:%d y:%d height:%d\n", r.x(), r.width(), r.y(), r.height()); #ifdef VIEW_USE_DOUBLE_BUFFERING if (!pmValid) { pmValid = true; rr = QRect(0, 0, pm.width(), pm.height()); } QPainter p(&pm); #else QPainter p(this); #endif p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::HighQualityAntialiasing, false); if (bgPixmap.isNull()) p.fillRect(rr, brush); else p.drawTiledPixmap(rr, bgPixmap, QPoint(xpos + rmapx(xorg) + rr.x(), ypos + rmapy(yorg) + rr.y())); p.setClipRegion(rr); //printf("View::paint r.x:%d w:%d\n", rr.x(), rr.width()); pdraw(p, rr); // draw into pixmap p.resetMatrix(); // Q3 support says use resetMatrix instead, but resetMatrix advises resetTransform instead... //p.resetTransform(); drawOverlay(p); }
void View::drawTickRaster(QPainter& p, int x, int y, int w, int h, int raster) { // Changed to draw in device coordinate space instead of virtual, transformed space. Tim. p4.0.30 //int mx = mapx(x); int my = mapy(y); //int mw = mapx(x + w) - mx; //int mw = mapx(x + w) - mx - 1; //int mh = mapy(y + h) - my; //int mh = mapy(y + h) - my - 1; //p.save(); bool wmtxen = p.worldMatrixEnabled(); p.setWorldMatrixEnabled(false); int xx,bar1, bar2, beat; unsigned tick; AL::sigmap.tickValues(x, &bar1, &beat, &tick); AL::sigmap.tickValues(x+w, &bar2, &beat, &tick); ++bar2; ///int y2 = y + h; //int y2 = my + mh; int y2 = mapy(y + h) - 1; //printf("View::drawTickRaster x:%d y:%d w:%d h:%d mx:%d my:%d mw:%d mh:%d y2:%d bar1:%d bar2:%d\n", x, y, w, h, mx, my, mw, mh, y2, bar1, bar2); //printf("View::drawTickRaster x:%d y:%d w:%d h:%d my:%d mh:%d y2:%d bar1:%d bar2:%d\n", x, y, w, h, my, mh, y2, bar1, bar2); for (int bar = bar1; bar < bar2; ++bar) { ///unsigned x = AL::sigmap.bar2tick(bar, 0, 0); unsigned xb = AL::sigmap.bar2tick(bar, 0, 0); int xt = mapx(xb); p.setPen(Qt::black); ///p.drawLine(x, y, x, y2); p.drawLine(xt, my, xt, y2); int z, n; ///AL::sigmap.timesig(x, z, n); AL::sigmap.timesig(xb, z, n); ///int q = p.xForm(QPoint(raster, 0)).x() - p.xForm(QPoint(0, 0)).x(); ///int q = p.combinedTransform().map(QPoint(raster, 0)).x() - p.combinedTransform().map(QPoint(0, 0)).x(); //int q = rmapx(raster); int qq = raster; //if (q < 8) // grid too dense if (rmapx(raster) < 8) // grid too dense qq *= 2; p.setPen(Qt::lightGray); if (raster>=4) { ///int xx = x + qq; //int xx = mapx(xb + qq); xx = xb + qq; int xxx = AL::sigmap.bar2tick(bar, z, 0); //int xxx = mapx(AL::sigmap.bar2tick(bar, z, 0)); while (xx <= xxx) { ///p.drawLine(xx, y, xx, y2); int x = mapx(xx); p.drawLine(x, my, x, y2); xx += qq; //xx += rmapx(qq); } //xx = xxx; } p.setPen(Qt::darkGray); for (int beat = 1; beat < z; beat++) { ///int xx = AL::sigmap.bar2tick(bar, beat, 0); xx = mapx(AL::sigmap.bar2tick(bar, beat, 0)); //printf(" bar:%d z:%d beat:%d xx:%d\n", bar, z, beat, xx); ///p.drawLine(xx, y, xx, y2); p.drawLine(xx, my, xx, y2); } } //p.setWorldMatrixEnabled(true); p.setWorldMatrixEnabled(wmtxen); //p.restore(); }
void MTScale::pdraw(QPainter& p, const QRect& r) { QColor colTimeLine = QColor(172,181,176); int x = r.x(); int w = r.width(); //printf("MTScale::pdraw x:%d w:%d\n", x, w); x -= 20; w += 40; // wg. Text //--------------------------------------------------- // draw Marker //--------------------------------------------------- int y = 12; p.setPen(colTimeLine); p.setFont(QFont("fixed-width", 9, QFont::Bold)); p.drawLine(r.x(), y + 1, r.x() + r.width(), y + 1); QRect tr(r); tr.setHeight(12); MarkerList* marker = song->marker(); for (iMarker m = marker->begin(); m != marker->end(); ++m) { int xp; if (waveMode) xp = mapx(m->second.frame()); else xp = mapx(m->second.tick()); if (xp > x + w) break; int xe = r.x() + r.width(); iMarker mm = m; ++mm; if (mm != marker->end()) { if (waveMode) xe = mapx(tempomap.tick2frame(mm->first)); else xe = mapx(mm->first); } QRect tr(xp, 0, xe - xp, 13); QRect wr = r.intersect(tr); if (!wr.isEmpty()) { if (m->second.current()) { p.fillRect(wr, QColor(89, 89, 102)); } int x2; if (mm != marker->end()) { if (waveMode) x2 = mapx(tempomap.tick2frame(mm->first)); else x2 = mapx(mm->first); } else x2 = xp + 200; //printf("MTScale::pdraw marker %s xp:%d y:%d h:%d r.x:%d r.w:%d\n", m->second.name().toLatin1(), xp, height(), y, r.x(), r.width()); // Must be reasonable about very low negative x values! With long songs > 15min // and with high horizontal magnification, 'ghost' drawings appeared, // apparently the result of truncation later (xp = -65006 caused ghosting // at bar 245 with magnification at max.), even with correct clipping region // applied to painter in View::paint(). Tim. Apr 5 2009 // Quote: "Warning: Note that QPainter does not attempt to work around // coordinate limitations in the underlying window system. Some platforms may // behave incorrectly with coordinates as small as +/-4000." if (xp >= -32) p.drawPixmap(xp, 0, *flagIconS); if (xp >= -1023) { QRect r = QRect(xp + 10, 0, x2 - xp, 12); p.setPen(colTimeLine); p.drawText(r, Qt::AlignLeft | Qt::AlignVCenter, m->second.name()); } if (xp >= 0) { p.setPen(colTimeLine); p.drawLine(xp, y, xp, height()); } } } unsigned ctick; int bar1, bar2, beat; unsigned tick; if (waveMode) { ctick = tempomap.frame2tick(mapxDev(x)); AL::sigmap.tickValues(ctick, &bar1, &beat, &tick); AL::sigmap.tickValues(tempomap.frame2tick(mapxDev(x + w)), &bar2, &beat, &tick); } else { ctick = mapxDev(x); AL::sigmap.tickValues(ctick, &bar1, &beat, &tick); AL::sigmap.tickValues(mapxDev(x + w), &bar2, &beat, &tick); } //printf("bar %d %d-%d=%d\n", bar, ntick, stick, ntick-stick); int h = height() - 12; int stick = AL::sigmap.bar2tick(bar1, 0, 0); int ntick; for (int bar = bar1; bar <= bar2; bar++, stick = ntick) { ntick = AL::sigmap.bar2tick(bar + 1, 0, 0); int tpix, a, b = 0; if (waveMode) { a = tempomap.tick2frame(ntick); b = tempomap.tick2frame(stick); tpix = rmapx(a - b); } else { tpix = rmapx(ntick - stick); } if (tpix < 64) { // don�t show beats if measure is this small int n = 1; if (tpix < 32) n = 2; if (tpix <= 16) n = 4; if (tpix < 8) n = 8; if (tpix <= 4) n = 16; if (tpix <= 2) n = 32; if (bar % n) continue; int x = mapx(waveMode ? b : stick); QString s; s.setNum(bar + 1); p.drawLine(x, y + 1, x, y + 1 + h); QRect r = QRect(x + 2, y, 1000, h); p.setFont(QFont("fixed-width", 9, QFont::Bold)); p.drawText(r, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextDontClip, s); } else { int z, n; AL::sigmap.timesig(stick, z, n); for (int beat = 0; beat < z; beat++) { int xx = AL::sigmap.bar2tick(bar, beat, 0); if (waveMode) xx = tempomap.tick2frame(xx); int xp = mapx(xx); QString s; QRect r(xp + 2, y, 1000, h); int y1; int num; if (beat == 0) { num = bar + 1; y1 = y + 1; p.setFont(QFont("fixed-width", 9, QFont::Bold)); } else { num = beat + 1; y1 = y + 7; p.setFont(QFont("fixed-width", 7, QFont::Normal)); r.setY(y + 3); } s.setNum(num); p.drawLine(xp, y1, xp, y + 1 + h); p.drawText(r, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextDontClip, s); } } } //--------------------------------------------------- // draw location marker //--------------------------------------------------- //Christopher here is your color p.setPen(QColor(156,75,219)); if (pos[3] != MAXINT) { int xp = mapx(pos[3]); if (xp >= x && xp < x + w) p.drawLine(xp, 0, xp, height()); } p.setPen(colTimeLine); if (barLocator) { p.setPen(QColor(0, 186, 255)); int xp = mapx(pos[0]); if (xp >= x && xp < x + w) p.drawLine(xp, 0, xp, height()); p.setPen(QColor(139, 225, 69)); xp = mapx(pos[1]); if (xp >= x && xp < x + w) p.drawLine(xp, 0, xp, height()); xp = mapx(pos[2]); if (xp >= x && xp < x + w) p.drawLine(xp, 0, xp, height()); } else { for (int i = 0; i < 3; ++i) { int xp = mapx(pos[i]); if (xp >= x && xp < x + w) { QPixmap* pm = markIcon[i]; p.drawPixmap(xp - pm->width() / 2, y - 1, *pm); } } } }