void View::DrawLigatureNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff) { assert(dc); assert(element); assert(layer); assert(staff); LogDebug("DrawLigatureNote"); Note *note = dynamic_cast<Note *>(element); assert(note); int xn, x1, x2, y, y1, y2, y3, y4; // int yy2, y5; // unused int verticalCenter, up, epaisseur; epaisseur = std::max(2, m_doc->GetDrawingBeamWidth(staff->m_drawingStaffSize, false) / 2); xn = element->GetDrawingX(); y = 99; // LogDebug("DrawLigatureNote: _ligObliqua=%d drawingX=%d y=%d", note->m_ligObliqua, xn, y); LogDebug("DrawLigatureNote: drawingX=%d y=%d", xn, y); /* if ((note->m_lig==LIG_MEDIAL) || (note->m_lig==LIG_TERMINAL)) { CalculateLigaturePosX(element, layer, staff); } else */ { xn = element->GetDrawingX(); } // Compute the dimensions of the rectangle x1 = xn - m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); x2 = xn + m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); y1 = y + m_doc->GetDrawingUnit(staff->m_drawingStaffSize); y2 = y - m_doc->GetDrawingUnit(staff->m_drawingStaffSize); y3 = (int)(y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize) / 2); // part of the frame that overflows y4 = (int)(y2 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize) / 2); // if (!note->m_ligObliqua && (!View::s_drawingLigObliqua)) // rectangular notes, incl. ligature { if (note->GetColored() != BOOLEAN_true) { // double the bases of rectangles DrawObliquePolygon(dc, x1, y1, x2, y1, -epaisseur); DrawObliquePolygon(dc, x1, y2, x2, y2, epaisseur); } else DrawFilledRectangle(dc, x1, y1, x2, y2); // // ENZ correction of x2 DrawVerticalLine(dc, y3, y4, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); // lateral brace DrawVerticalLine(dc, y3, y4, x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); } /* else // handle obliques { if (!View::s_drawingLigObliqua) // 1st pass: Initial flagStemHeight { DrawVerticalLine (dc,y3,y4,x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); View::s_drawingLigObliqua = true; //oblique = false; // if (val == DUR_1) // left tail up if DUR_1 // queue_lig = true; } else // 2nd pass: oblique lines and final flagStemHeighte { x1 -= m_doc->m_drawingBrevisWidth[staff->m_drawingStaffSize] * 2; // auto advance y1 = *View::s_drawingLigY - m_doc->GetDrawingUnit(staff->m_drawingStaffSize); // ligat_y contains original y yy2 = y2; y5 = y1+ m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); y2 += m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); // go up a INTERL if (note->GetColored()==BOOLEAN_true) DrawObliquePolygon (dc, x1, y1, x2, yy2, m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize)); else { DrawObliquePolygon (dc, x1, y1, x2, yy2, 5); DrawObliquePolygon (dc, x1, y5, x2, y2, -5); } DrawVerticalLine (dc,y3,y4,x2,m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); // enclosure flagStemHeighte View::s_drawingLigObliqua = false; // queue_lig = false; // ??defuses alg.queue DUR_BR?? } } if (note->m_lig) // remember positions from one note to another; connect notes by bars { *(View::s_drawingLigX+1) = x2; *(View::s_drawingLigY+1) = y; // connect ligature beamed notes by bar flagStemHeightes //if (in(x1,(*View::s_drawingLigX)-2,(*View::s_drawingLigX)+2) || (this->fligat && this->lat && !Note1::marq_obl)) // the latest conditions to allow previous ligature flagStemHeighte // DrawVerticalLine (dc, *ligat_y, y1, (this->fligat && this->lat) ? x2: x1, m_doc->m_parameters.m_stemWidth); // ax2 - drawing flagStemHeight lines missing *View::s_drawingLigX = *(View::s_drawingLigX + 1); *View::s_drawingLigY = *(View::s_drawingLigY + 1); } y3 = y2 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*6; if (note->m_lig) { if (note->m_dur == DUR_BR) // && this->queue_lig) // tail left bottom: initial downward DUR_BR // ax2 - no support for queue_lig (see WG corrigeLigature) { DrawVerticalLine (dc, y2, y3, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); } else if (note->m_dur == DUR_LG) // && !this->queue_lig) // DUR_LG ligature, tail right down // ax2 - no support for queue_lig { DrawVerticalLine (dc, y2, y3, x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); } else if (note->m_dur == DUR_1) // && this->queue_lig) // queue gauche haut // ax2 - no support for queue_lig { y2 = y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*6; DrawVerticalLine (dc, y1, y2, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); } } else if (note->m_dur == DUR_LG) // isolated DUR_LG: tail like normal notes */ if (note->GetActualDur() == DUR_LG) { verticalCenter = staff->GetDrawingY() - m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) * 2; // ENZ up = (y < verticalCenter) ? true : false; // ENZ if (note->GetDrawingStemDir() != STEMDIRECTION_NONE) { if (note->GetDrawingStemDir() == STEMDIRECTION_up) { up = true; } else { up = false; } } if (!up) { y3 = y1 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * 8; y2 = y1; } else { y3 = y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * 6; y2 = y1; } DrawVerticalLine(dc, y2, y3, x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); } return; }
void View::DrawMaximaToBrevis(DeviceContext *dc, int y, LayerElement *element, Layer *layer, Staff *staff) { assert(dc); assert(element); assert(layer); assert(staff); Note *note = dynamic_cast<Note *>(element); assert(note); int xn, xLeft, xRight, yTop, yBottom, y3, y4; // int yy2, y5; // unused int verticalCenter, up, height; bool mensural_black = (staff->m_drawingNotationType == NOTATIONTYPE_mensural_black); bool fillNotehead = (mensural_black || note->GetColored()) && !(mensural_black && note->GetColored()); height = m_doc->GetDrawingBeamWidth(staff->m_drawingStaffSize, false) / 2; xn = element->GetDrawingX(); // Calculate size of the rectangle xLeft = xn - m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); xRight = xn + m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); if (note->GetActualDur() == DUR_MX) { // Maxima is twice the width of brevis xLeft -= m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); xRight += m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); } yTop = y + m_doc->GetDrawingUnit(staff->m_drawingStaffSize); yBottom = y - m_doc->GetDrawingUnit(staff->m_drawingStaffSize); y3 = yTop; y4 = yBottom; if (!mensural_black) { y3 += (int)m_doc->GetDrawingUnit(staff->m_drawingStaffSize) / 2; // partie d'encadrement qui depasse y4 -= (int)m_doc->GetDrawingUnit(staff->m_drawingStaffSize) / 2; } if (!fillNotehead) { // double the bases of rectangles DrawObliquePolygon(dc, xLeft, yTop, xRight, yTop, -height); DrawObliquePolygon(dc, xLeft, yBottom, xRight, yBottom, height); } else { DrawFilledRectangle(dc, xLeft, yTop, xRight, yBottom); } DrawVerticalLine(dc, y3, y4, xLeft, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); // corset lateral DrawVerticalLine(dc, y3, y4, xRight, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); // stem if (note->GetActualDur() < DUR_BR) { verticalCenter = staff->GetDrawingY() - m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) * 2; up = (y < verticalCenter) ? true : false; if (note->GetDrawingStemDir() != STEMDIRECTION_NONE) { if (note->GetDrawingStemDir() == STEMDIRECTION_up) { up = true; } else { up = false; } } if (!up) { y3 = yTop - m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * 8; yBottom = yTop; } else { y3 = yTop + m_doc->GetDrawingUnit(staff->m_drawingStaffSize) * 6; yBottom = yTop; } DrawVerticalLine(dc, yBottom, y3, xRight, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); } return; }
void View::DrawMensuralNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure) { assert(dc); assert(element); assert(layer); assert(staff); assert(measure); Note *note = dynamic_cast<Note *>(element); assert(note); int noteY = element->GetDrawingY(); int xNote, xStem; int drawingDur; int staffY = staff->GetDrawingY(); wchar_t charCode; int verticalCenter = 0; bool mensural_black = (staff->m_drawingNotationType == NOTATIONTYPE_mensural_black); xStem = element->GetDrawingX(); drawingDur = note->GetDrawingDur(); int radius = m_doc->GetGlyphWidth(SMUFL_E93C_mensuralNoteheadMinimaWhite, staff->m_drawingStaffSize, false) / 2; if (drawingDur > DUR_1) { if (mensural_black) radius *= TEMP_MINIMA_WIDTH_FACTOR; } else { radius += radius / 3; } /************** Stem/notehead direction: **************/ data_STEMDIRECTION stemDir = STEMDIRECTION_NONE; verticalCenter = staffY - m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize) * 2; if (note->HasStemDir()) { stemDir = note->GetStemDir(); } else if (layer->GetDrawingStemDir() != STEMDIRECTION_NONE) { stemDir = layer->GetDrawingStemDir(); } else { if (drawingDur < DUR_1) stemDir = STEMDIRECTION_down; else stemDir = (noteY > verticalCenter) ? STEMDIRECTION_down : STEMDIRECTION_up; } xNote = xStem - radius; /************** Noteheads: **************/ // Ligature, maxima,longa, and brevis if ((note->GetLig() != noteLogMensural_LIG_NONE) && (drawingDur <= DUR_1)) { DrawLigatureNote(dc, element, layer, staff); } else if (drawingDur < DUR_1) { DrawMaximaToBrevis(dc, noteY, element, layer, staff); } // Semibrevis else if (drawingDur == DUR_1) { if (mensural_black) { int sbStaffSize = 0.8 * staff->m_drawingStaffSize; DrawDiamond(dc, xNote, noteY, 2 * sbStaffSize, (int)(1.2 * sbStaffSize), !note->GetColored(), 20); } else { // Maybe we can add this to Note::GetMensuralSmuflNoteHead? if (note->GetColored()) charCode = SMUFL_E938_mensuralNoteheadSemibrevisBlack; else charCode = SMUFL_E939_mensuralNoteheadSemibrevisVoid; DrawSmuflCode(dc, xNote, noteY, charCode, staff->m_drawingStaffSize, false); } } // Shorter values else { if (mensural_black) { // SMuFL 1.20 doesn't have a codepoint for the "colored" semibrevis and minima head in black // mensural notation. But an unfilled (void) narrow diamond is fine, so we draw one. int sbStaffSize = 0.8 * staff->m_drawingStaffSize; DrawDiamond(dc, xNote, noteY, 2 * sbStaffSize, (int)(TEMP_MINIMA_WIDTH_FACTOR * 2 * sbStaffSize), !note->GetColored(), 20); } else { DrawSmuflCode(dc, xNote, noteY, note->GetMensuralSmuflNoteHead(), staff->m_drawingStaffSize, false); } DrawMensuralStem(dc, note, staff, stemDir, radius, xStem, noteY); } /************ Draw children (verse / syl) ************/ DrawLayerChildren(dc, note, layer, staff, measure); }
void View::DrawLigature ( DeviceContext *dc, int y, LayerElement *element, Layer *layer, Staff *staff ) { assert( dc ); assert( element ); assert( layer ); assert( staff ); Note *note = dynamic_cast<Note*>(element); assert( note ); int xn, x1, x2, y1, y2, y3, y4; // int yy2, y5; // unused int verticalCenter, up, epaisseur; epaisseur = std::max (2, m_doc->GetDrawingBeamWidth(staff->m_drawingStaffSize, false) / 2); xn = element->GetDrawingX(); /* if ((note->m_lig==LIG_MEDIAL) || (note->m_lig==LIG_TERMINAL)) { CalculateLigaturePosX ( element, layer, staff ); } else */{ xn = element->GetDrawingX(); } // calcul des dimensions du rectangle x1 = xn - m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); x2 = xn + m_doc->GetDrawingBrevisWidth(staff->m_drawingStaffSize); y1 = y + m_doc->GetDrawingUnit(staff->m_drawingStaffSize); y2 = y - m_doc->GetDrawingUnit(staff->m_drawingStaffSize); y3 = (int)(y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize)/2); // partie d'encadrement qui depasse y4 = (int)(y2 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)/2); //if (!note->m_ligObliqua && (!View::s_drawingLigObliqua)) // notes rectangulaires, y c. en ligature { if (note->GetColored()!=BOOLEAN_true) { // double base des carrees DrawObliquePolygon ( dc, x1, y1, x2, y1, -epaisseur ); DrawObliquePolygon ( dc, x1, y2, x2, y2, epaisseur ); } else DrawFullRectangle( dc,x1,y1,x2,y2); // dessine val carree pleine // ENZ correction de x2 DrawVerticalLine ( dc, y3, y4, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); // corset lateral DrawVerticalLine ( dc, y3, y4, x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); } /* else // traitement des obliques { if (!View::s_drawingLigObliqua) // 1e passage: ligne flagStemHeighte initiale { DrawVerticalLine (dc,y3,y4,x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); View::s_drawingLigObliqua = true; //oblique = OFF; // if (val == DUR_1) // queue gauche haut si DUR_1 // queue_lig = ON; } else // 2e passage: lignes obl. et flagStemHeighte finale { x1 -= m_doc->m_drawingBrevisWidth[staff->m_drawingStaffSize]*2; // avance auto y1 = *View::s_drawingLigY - m_doc->GetDrawingUnit(staff->m_drawingStaffSize); // ligat_y contient y original yy2 = y2; y5 = y1+ m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); y2 += m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize); // on monte d'un INTERL if (note->GetColored()==BOOLEAN_true) DrawObliquePolygon ( dc, x1, y1, x2, yy2, m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize)); else { DrawObliquePolygon ( dc, x1, y1, x2, yy2, 5); DrawObliquePolygon ( dc, x1, y5, x2, y2, -5); } DrawVerticalLine ( dc,y3,y4,x2,m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize)); //cloture flagStemHeighte View::s_drawingLigObliqua = false; // queue_lig = OFF; //desamorce alg.queue DUR_BR } } if (note->m_lig) // memoriser positions d'une note a l'autre; relier notes par barres { *(View::s_drawingLigX+1) = x2; *(View::s_drawingLigY+1) = y; // relie notes ligaturees par barres flagStemHeightes //if (in(x1,(*View::s_drawingLigX)-2,(*View::s_drawingLigX)+2) || (this->fligat && this->lat && !Note1::marq_obl)) // les dernieres conditions pour permettre ligature flagStemHeighte ancienne // DrawVerticalLine (dc, *ligat_y, y1, (this->fligat && this->lat) ? x2: x1, m_doc->m_parameters.m_stemWidth); // ax2 - drawing flagStemHeight lines missing *View::s_drawingLigX = *(View::s_drawingLigX + 1); *View::s_drawingLigY = *(View::s_drawingLigY + 1); } y3 = y2 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*6; if (note->m_lig) { if (note->m_dur == DUR_BR) // && this->queue_lig) // queue gauche bas: DUR_BR initiale descendante // ax2 - no support of queue_lig (see WG corrigeLigature) { DrawVerticalLine ( dc, y2, y3, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); } else if (note->m_dur == DUR_LG) // && !this->queue_lig) // DUR_LG en ligature, queue droite bas // ax2 - no support of queue_lig { DrawVerticalLine (dc, y2, y3, x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); } else if (note->m_dur == DUR_1) // && this->queue_lig ) // queue gauche haut // ax2 - no support of queue_lig { y2 = y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*6; DrawVerticalLine ( dc, y1, y2, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); } } else if (note->m_dur == DUR_LG) // DUR_LG isolee: queue comme notes normales */ if (note->GetActualDur() == DUR_LG) { verticalCenter = staff->GetDrawingY() - m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize)*2; // ENZ up = (y < verticalCenter) ? ON : OFF; // ENZ if ( note->GetDrawingStemDir() != STEMDIRECTION_NONE ) { if ( note->GetDrawingStemDir() == STEMDIRECTION_up) { up = ON; } else { up = OFF; } } if (!up) { y3 = y1 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*8; y2 = y1; } else { y3 = y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*6; y2 = y1; } DrawVerticalLine ( dc, y2,y3,x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); } return; }
void View::DrawMaximaToBrevis( DeviceContext *dc, int y, LayerElement *element, Layer *layer, Staff *staff ) { assert( dc ); assert( element ); assert( layer ); assert( staff ); Note *note = dynamic_cast<Note*>(element); assert( note ); int xn, x1, x2, y1, y2, y3, y4; // int yy2, y5; // unused int verticalCenter, up, height; height = m_doc->GetDrawingBeamWidth(staff->m_drawingStaffSize, false) / 2 ; xn = element->GetDrawingX(); // calcul des dimensions du rectangle x1 = xn - m_doc->GetDrawingBrevisWidth( staff->m_drawingStaffSize ); x2 = xn + m_doc->GetDrawingBrevisWidth( staff->m_drawingStaffSize ); if (note->GetActualDur() == DUR_MX) { x1 -= m_doc->GetDrawingBrevisWidth( staff->m_drawingStaffSize ); x2 += m_doc->GetDrawingBrevisWidth( staff->m_drawingStaffSize ); } y1 = y + m_doc->GetDrawingUnit(staff->m_drawingStaffSize); y2 = y - m_doc->GetDrawingUnit(staff->m_drawingStaffSize); y3 = (int)(y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize)/2); // partie d'encadrement qui depasse y4 = (int)(y2 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)/2); if (note->GetColored()!=BOOLEAN_true) { // double base des carrees DrawObliquePolygon ( dc, x1, y1, x2, y1, -height ); DrawObliquePolygon ( dc, x1, y2, x2, y2, height ); } else { DrawFullRectangle( dc,x1,y1,x2,y2); } DrawVerticalLine ( dc, y3, y4, x1, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); // corset lateral DrawVerticalLine ( dc, y3, y4, x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); // stem if (note->GetActualDur() < DUR_BR) { verticalCenter = staff->GetDrawingY() - m_doc->GetDrawingDoubleUnit(staff->m_drawingStaffSize)*2; up = (y < verticalCenter) ? true : false; if ( note->GetDrawingStemDir() != STEMDIRECTION_NONE ) { if ( note->GetDrawingStemDir() == STEMDIRECTION_up) { up = true; } else { up = false; } } if (!up) { y3 = y1 - m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*8; y2 = y1; } else { y3 = y1 + m_doc->GetDrawingUnit(staff->m_drawingStaffSize)*6; y2 = y1; } DrawVerticalLine ( dc, y2,y3,x2, m_doc->GetDrawingStemWidth(staff->m_drawingStaffSize) ); } return; }
void View::DrawMensuralNote ( DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure ) { assert( dc ); assert( element ); assert( layer ); assert( staff ); assert( measure ); Note *note = dynamic_cast<Note*>(element); assert( note ); int staffSize = staff->m_drawingStaffSize; int noteY = element->GetDrawingY(); int xLedger, xNote, xStem; int drawingDur; bool drawingCueSize; int staffY = staff->GetDrawingY(); wchar_t fontNo; int ledge; int verticalCenter = 0; xStem = element->GetDrawingX(); xLedger = xStem; drawingDur = note->GetDrawingDur(); drawingCueSize = note->HasGrace(); int radius = m_doc->GetGlyphWidth(SMUFL_E0A3_noteheadHalf, staffSize, drawingCueSize); if (drawingDur > DUR_1 || (drawingDur == DUR_1 && staff->notAnc)) { // annuler provisoirement la modif. des lignes addit. ledge = m_doc->GetDrawingLedgerLineLength(staffSize, drawingCueSize); } else { ledge = m_doc->GetDrawingLedgerLineLength(staffSize, drawingCueSize); radius += radius/3; } /************** Stem/notehead direction: **************/ verticalCenter = staffY - m_doc->GetDrawingDoubleUnit(staffSize)*2; data_STEMDIRECTION noteStemDir = note->CalcDrawingStemDir(); if ( noteStemDir != STEMDIRECTION_NONE ) { note->SetDrawingStemDir( noteStemDir ); } else if ( layer->GetDrawingStemDir() != STEMDIRECTION_NONE) { note->SetDrawingStemDir( layer->GetDrawingStemDir() ); } else { note->SetDrawingStemDir((noteY >= verticalCenter) ? STEMDIRECTION_down : STEMDIRECTION_up); } xNote = xStem - radius; /************** Noteheads: **************/ // Long, breve and ligatures if ((note->GetLig()!=LIGATURE_NONE) && (drawingDur <= DUR_1)) { DrawLigature ( dc, noteY, element, layer, staff); } else if (drawingDur < DUR_1) { DrawMaximaToBrevis( dc, noteY, element, layer, staff); } else if (drawingDur == DUR_1) { if (note->GetColored()) fontNo = SMUFL_E938_mensuralNoteheadSemibrevisBlack; else fontNo = SMUFL_E939_mensuralNoteheadSemibrevisVoid; DrawSmuflCode( dc, xNote, noteY, fontNo, staff->m_drawingStaffSize, drawingCueSize ); } // Other values ??WE WANT MENSURAL NOTEHEADS, NOT CMN!!!!!!!! else { if (note->GetColored()) { if (drawingDur == DUR_2) fontNo = SMUFL_E0A4_noteheadBlack; else fontNo = SMUFL_E0A3_noteheadHalf; } else { if (drawingDur > DUR_2) fontNo = SMUFL_E0A4_noteheadBlack; else fontNo = SMUFL_E0A3_noteheadHalf; } DrawSmuflCode( dc, xNote, noteY, fontNo, staff->m_drawingStaffSize, drawingCueSize ); DrawStem(dc, note, staff, note->GetDrawingStemDir(), radius, xStem, noteY); } /************** Ledger lines: **************/ int staffTop = staffY + m_doc->GetDrawingUnit(staffSize); int staffBot = staffY - m_doc->GetDrawingStaffSize(staffSize) - m_doc->GetDrawingUnit(staffSize); //if the note is not in the staff if (!is_in(noteY,staffTop,staffBot)) { int distance, highestNewLine, numLines; bool aboveStaff = (noteY > staffTop); distance = (aboveStaff ? (noteY - staffY) : staffY - m_doc->GetDrawingStaffSize(staffSize) - noteY); highestNewLine = ((distance % m_doc->GetDrawingDoubleUnit(staffSize) > 0) ? (distance - m_doc->GetDrawingUnit(staffSize)) : distance); numLines = highestNewLine / m_doc->GetDrawingDoubleUnit(staffSize); DrawLedgerLines(dc, note, staff, aboveStaff, false, 0, numLines); } /************** dots **************/ if (note->GetDots()) { int xDot; if (note->GetDur() < DUR_2 || (note->GetDur() > DUR_8 && (note->GetDrawingStemDir() == STEMDIRECTION_up))) xDot = xStem + m_doc->GetDrawingUnit(staffSize)*7/2; else xDot = xStem + m_doc->GetDrawingUnit(staffSize)*5/2; DrawDots( dc, xDot, noteY, note->GetDots(), staff ); } }