void ofxGuido::draw(int x, int y){ GuidoPageFormat gpf; GuidoGetPageFormat(mGRHandler, 1, &gpf); ofLogNotice("ofxGuido") << gpf.width << "x" << gpf.height << " (" << gpf.margintop << "," << gpf.marginbottom << "," << gpf.marginleft << "," << gpf.marginright << ")"; float scaleX = mW / gpf.width; float scaleY = mH / gpf.height; int offsetX = 0, offsetY = 0; if(scaleX < scaleY){ offsetY = (mH - (int)(gpf.height * scaleX)) / 2 - 1; ofLogNotice("ofxGuido") << "Scale: " << scaleX << " offsetY: " << offsetY; } else{ offsetX = (mW - (int)(gpf.width * scaleY)) / 2 - 1; ofLogNotice("ofxGuido") << "Scale: " << scaleY << " offsetX: " << offsetX; } mGuidoOnDrawDesc.page = 1; mGuidoOnDrawDesc.scrollx = 0; mGuidoOnDrawDesc.scrolly = 0; mGuidoOnDrawDesc.updateRegion.erase = true; mGuidoOnDrawDesc.sizex = mW; mGuidoOnDrawDesc.sizey = mH; ofPushMatrix(); ofPushStyle(); ofFill(); ofSetColor(mBackground); ofRect(x, y, mW, mH); ofTranslate(x + offsetX, y + offsetY); GuidoOnDraw(&mGuidoOnDrawDesc); ofPopStyle(); ofPopMatrix(); }
//------------------------------------------------------------------------- void QGuidoPainter::draw( QPainter * painter , int page , const QRect& drawRectangle , const QRect& redrawRectangle) { if ( !hasValidGR() ) return; painter->save(); painter->setClipRect( drawRectangle ); painter->translate( drawRectangle.x() , drawRectangle.y() ); //Creation of temporaries Qt implementations of VGSystem & VGDevice. VGSystem * sys = new GSystemQt( painter ); VGDevice * dev = sys->CreateDisplayDevice(); //Update the mDesc with the specified page and draw dimensions. mDesc.hdc = dev; page = MAX(1 , page); page = MIN(pageCount() , page); mDesc.page = page; mDesc.sizex = drawRectangle.width(); mDesc.sizey = drawRectangle.height(); //mDesc.scrollx = -drawRectangle.x(); //mDesc.scrolly = -drawRectangle.y(); if ( redrawRectangle.isNull() ) { //Redraw everything mDesc.updateRegion.erase = true; } else { //1. Computes the actual drawing rectangle //(because the Guido Score won't strech and will keep its height/width ratio, //the drawing rectangle is different from the QPainter's QPaintDevice rectangle.). float ratio = heightForWidth(1000,page) / 1000.0f; //This ratio means that: height = ratio * width. bool drawRectTooHigh = ( mDesc.sizey >= (mDesc.sizex * ratio) ); int actualWidth, actualHeight; if ( drawRectTooHigh ) { actualWidth = mDesc.sizex; actualHeight = actualWidth * ratio; } else { actualHeight = mDesc.sizey; actualWidth = actualHeight / ratio; } //2. Conversion of the redrawRectangle from QPaintDevice coordinate space to GuidoVirtualUnit. GuidoPageFormat format; GuidoGetPageFormat( mDesc.handle , page , &format ); float widthConversionFactor = actualWidth / format.width; float heightConversionFactor = actualHeight / format.height; // pixel / conversionFactor = GuidoVirtualUnit mDesc.updateRegion.left = (redrawRectangle.x() - drawRectangle.x()) / widthConversionFactor; mDesc.updateRegion.top = (redrawRectangle.y() - drawRectangle.y()) / heightConversionFactor; mDesc.updateRegion.right = ( (redrawRectangle.x() - drawRectangle.x()) + redrawRectangle.width() ) / widthConversionFactor; mDesc.updateRegion.bottom = ( (redrawRectangle.y() - drawRectangle.y()) + redrawRectangle.height() ) / heightConversionFactor; mDesc.updateRegion.erase = false; } // QTime time; // time.start(); //Actual draw of the Guido Score. VGColor color(fCurrentColor.red(), fCurrentColor.green(), fCurrentColor.blue(), fCurrentColor.alpha()); dev->SelectPenColor (color); dev->SelectFillColor(color); dev->SetFontColor (color); #if absoluteTransform1 || absoluteTransform2 // DF Apr. 28 2011 // rescaling introduced to take account of the QTDevice::SetScale change // the QTDevice::SetScale change corresponds to the common VGDevice demantic and implementation // actually commented out due to unresolved problems with rotations qreal xs, ys; QPainter * p = (QPainter*)dev->GetNativeContext(); p->worldTransform().map(qreal(mDesc.sizex), qreal(mDesc.sizey), &xs, &ys); mDesc.sizex = xs; mDesc.sizey = ys; #endif GuidoOnDraw (&mDesc); // qDebug("Score : width = %d , height = %d" , mDesc.sizex , mDesc.sizey ); // qDebug("QGuidoPainter: Draw time : %d ms" , time.elapsed() ); delete dev; delete sys; painter->restore(); }
// ---------------------------------------------------------------------------- // * DoDraw // ---------------------------------------------------------------------------- void GuidoCarbonControl::DoDraw() { const GRHandler guidoRef = GetGuidoGR(); if( guidoRef == 0 ) return; ControlRef theControl = GetControlRef(); if( theControl == 0 ) return; // - Get our local size int localWidth; int localHeight; GetSize( &localWidth, &localHeight ); CGRect deviceRect = ::CGRectMake( 0, 0, localWidth, localHeight ); // VGDevice * device = GetGDevice(); // <- was const int kScrollBarHeight = 15; // - Create the graphic context. It must be initialized with the actual size of the window, // otherwise the y-origin is not calculated properly. WindowRef winRef = ::GetControlOwner( theControl ); GrafPtr port = ::GetWindowPort( winRef ); CGContextRef contextRef = 0; OSStatus status = ::CreateCGContextForPort( port, &contextRef ); if( status != noErr ) return; GSystemOSX system(contextRef, NULL); VGDevice* device = system.CreateDisplayDevice(); device->NotifySize(localWidth, localHeight + kScrollBarHeight ); ::CGContextRelease(contextRef); // because the device now owns the context. // - Draw the background device->BeginDraw(); device->PushPen( VGColor( 0, 0, 0, ALPHA_OPAQUE ), 1 ); device->PushFillColor( VGColor( 255, 255, 255, ALPHA_TRANSPARENT )); device->Rectangle( 0, 0, localWidth, localHeight ); device->PopFillColor(); device->PopPen(); // - Setup the clipping rectangle, to avoid drawing on scrollbars. ::CGContextClipToRect( contextRef, deviceRect ); // - Draw the music score int virtualScrollX = (int)((float)mScrollX * 10 / GetZoom()); int virtualScrollY = (int)((float)mScrollY * 10 / GetZoom()); float virtualVisibleWidth = localWidth * 10 / GetZoom(); float virtualVisibleHeight = localHeight * 10 / GetZoom(); float fullScoreWidth; float fullScoreHeight; GetFullScoreSize( &fullScoreWidth, &fullScoreHeight ); GuidoOnDrawDesc desc; desc.handle = guidoRef; desc.hdc = device; desc.updateRegion.erase = false; desc.updateRegion.left = virtualScrollX; // absolute virtual coordinates clip rect desc.updateRegion.top = virtualScrollY; desc.updateRegion.right = (int)(virtualScrollX + virtualVisibleWidth); desc.updateRegion.bottom = (int)(virtualScrollY + virtualVisibleHeight); desc.scrollx = (int)virtualScrollX; desc.scrolly = (int)virtualScrollY; desc.page = GetPageNum(); desc.sizex = (int)fullScoreWidth; desc.sizey = (int)fullScoreHeight; MClock clock; GuidoOnDraw( &desc ); // debug #if 0 std::cout << "Score : sizex = " << desc.sizex << " ; sizey = " << desc.sizey << std::endl; std::cout << "Guido: time do draw the score: " << clock.Milliseconds() << " ms" << std::endl; // std::cout << "Guido: graphical objects: " << GuidoGRObjectCount() << std::endl; #endif if( GetParam( kDrawSymbolMap ) == 1 ) DrawSymbolMap(); // drawMap (guidoRef, device, GetPageNum()); device->EndDraw(); delete device; }