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;
        }
    }
Exemple #2
0
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;
        }
    }