void CHuiRasterizedTextMesh::DrawPictographLines(CHuiGc& aGc, const THuiRealPoint& aOffset, THuiAlignHorizontal aLineAlignment) const { if (!iPictographInterface || iUsingPreRasterizedMesh) { return; } TInt y = 0; // Draw the built lines using THuiImages. for(TInt i = 0; i < iPictographLines.Count(); ++i) { const SRasterizedLine& line = iPictographLines[i]; if(line.iTexture) { THuiImage textImage(*line.iTexture); THuiRealPoint linePos(0.f, TReal32(y)); THuiRealSize lineSize = line.iTexture->Size(); // Choose the line-specific alignment. switch(aLineAlignment) { case EHuiAlignHRight: linePos.iX = Extents().iWidth - lineSize.iWidth; break; case EHuiAlignHCenter: linePos.iX = (Extents().iWidth - lineSize.iWidth) / 2; break; default: break; } aGc.SetPenColor(KRgbWhite); aGc.DrawImage(textImage, linePos + aOffset, lineSize); // Move one line downwards. y += TInt(lineSize.iHeight) + line.iGap; } // Move extra gap downwards. y += line.iGap; // Add line spacing. y += iLineSpacing; } }
void SLine::layout() { if (parent() == 0) { // // when used in a palette, SLine has no parent and // tick and tick2 has no meaning so no layout is // possible and needed // if (!spannerSegments().isEmpty()) { LineSegment* s = frontSegment(); s->layout(); setbbox(s->bbox()); } return; } if (startElement() == 0 || endElement() == 0) { qDebug("SLine::layout() failed: %s %s\n", parent()->name(), name()); qDebug(" start %p end %p\n", startElement(), endElement()); return; } System* s1; System* s2; QPointF p1 = linePos(GRIP_LINE_START, &s1); QPointF p2 = linePos(GRIP_LINE_END, &s2); QList<System*>* systems = score()->systems(); int sysIdx1 = systems->indexOf(s1); int sysIdx2 = systems->indexOf(s2); int segmentsNeeded = 0; for (int i = sysIdx1; i < sysIdx2+1; ++i) { if (systems->at(i)->isVbox()) continue; ++segmentsNeeded; } int segCount = spannerSegments().size(); if (segmentsNeeded != segCount) { if (segmentsNeeded > segCount) { int n = segmentsNeeded - segCount; for (int i = 0; i < n; ++i) { LineSegment* ls = createLineSegment(); add(ls); // set user offset to previous segment's offset if (segCount > 0) ls->setUserOff(QPointF(0, segmentAt(segCount+i-1)->userOff().y())); } } else { int n = segCount - segmentsNeeded; qDebug("SLine: segments %d needed %d, remove %d\n", segCount, segmentsNeeded, n); for (int i = 0; i < n; ++i) { if (spannerSegments().isEmpty()) { qDebug("SLine::layout(): no segment %d, %d expected\n", i, n); break; } else { // LineSegment* seg = takeLastSegment(); // TODO delete seg; } } } } int segIdx = 0; int si = staffIdx(); for (int i = sysIdx1; i <= sysIdx2; ++i) { System* system = systems->at(i); if (system->isVbox()) continue; LineSegment* seg = segmentAt(segIdx++); seg->setSystem(system); Measure* m = system->firstMeasure(); qreal x1 = m->first(SegChordRest)->pos().x() + m->pos().x(); qreal x2 = system->bbox().right(); qreal y = system->staff(si)->y(); if (sysIdx1 == sysIdx2) { // single segment seg->setSubtype(SEGMENT_SINGLE); seg->setPos(p1); seg->setPos2(QPointF(p2.x() - p1.x(), 0.0)); } else if (i == sysIdx1) { // start segment seg->setSubtype(SEGMENT_BEGIN); seg->setPos(p1); seg->setPos2(QPointF(x2 - p1.x(), 0.0)); } else if (i > 0 && i != sysIdx2) { // middle segment seg->setSubtype(SEGMENT_MIDDLE); seg->setPos(QPointF(x1, y)); seg->setPos2(QPointF(x2 - x1, 0.0)); } else if (i == sysIdx2) { // end segment seg->setSubtype(SEGMENT_END); seg->setPos(QPointF(x1, y)); seg->setPos2(QPointF(p2.x() - x1, 0.0)); } seg->layout(); seg->rypos() += (_yoffset * spatium()); seg->adjustReadPos(); } }
void CHuiRasterizedTextMesh::DrawLines(CHuiGc& aGc, const THuiRealPoint& aOffset, THuiAlignHorizontal aLineAlignment, TReal32 aShadowOpacity) const { TInt y = 0; // Draw the built lines using THuiImages. for(TInt i = 0; i < iLines.Count(); ++i) { const SRasterizedLine& line = iLines[i]; if(line.iTexture) { THuiImage textImage(*line.iTexture); THuiRealPoint linePos(0.f, TReal32(y)); THuiRealSize lineSize = line.iTexture->Size(); // Do a downward scaling for line texture from TV resolution to LCD resolution. if(iTextMeshScale != 1) { lineSize.iHeight = lineSize.iHeight/iTextMeshScale; lineSize.iWidth = lineSize.iWidth/iTextMeshScale; } // Choose the line-specific alignment. switch(aLineAlignment) { case EHuiAlignHRight: linePos.iX = Extents().iWidth - lineSize.iWidth; break; case EHuiAlignHCenter: linePos.iX = (Extents().iWidth - lineSize.iWidth) / 2; break; default: break; } // Is there a shadow? if ( RasterizedShadow() ) { const TInt requestedBlurredSize = HUI_ROUND_FLOAT_TO_INT( 2*iVisual->DropShadowHandler()->iRadius.Now() ); THuiTextureHandle shadow; TBool haveShadowTexture = line.iTexture->GetShadowTexture(shadow,requestedBlurredSize ); if ( haveShadowTexture ) { THuiImage shadowImage(shadow); const THuiRealRect shadowDrawingRect = iVisual->DropShadowHandler()->ShadowDrawingRealRect( linePos, lineSize, shadow.Size(), *iVisual ); const TRgb oldColor = aGc.PenColorAlpha(); aGc.SetPenColor(iVisual->DropShadowHandler()->Color()); aGc.SetPenAlpha(HUI_ROUND_FLOAT_TO_INT(aShadowOpacity * 255.0f)); const THuiQuality oldQuality = aGc.Quality(); aGc.SetQuality(EHuiQualityFast); aGc.DrawImage(shadowImage, shadowDrawingRect.iTl + aOffset, shadowDrawingRect.Size()); aGc.SetPenColorAlpha(oldColor); aGc.SetQuality(oldQuality); } } aGc.DrawImage(textImage, linePos + aOffset, lineSize); // Move one line downwards. y += TInt(lineSize.iHeight) + line.iGap; } // Move extra gap downwards. y += line.iGap; // Add line spacing. y += iLineSpacing; } }