Ticket #10193: mythui_rotate_zoom.patch

File mythui_rotate_zoom.patch, 8.3 KB (added by trebor_s@…, 9 years ago)

Patch against revision 033bc31f (3 dec 2011)

  • mythtv/libs/libmythui/mythuiimage.cpp

    old new  
    321321
    322322    m_isGreyscale = false;
    323323
     324    m_isRotated = false;
     325    m_rotationAngle = 0;
     326    m_isZoomed = false;
     327    m_zoomPercent = 0;
     328
    324329    m_preserveAspect = false;
    325330
    326331    m_animationCycle = kCycleStart;
     
    425430    if (m_isGreyscale && !img->isGrayscale())
    426431        img->ToGreyscale();
    427432
     433    if (m_isRotated && !img->IsRotated() && m_rotationAngle != 0)
     434        img->Rotate(m_rotationAngle, m_ForceSize);
     435
     436    if (m_isZoomed && !img->IsZoomed() && m_zoomPercent != 0)
     437        img->Zoom(m_zoomPercent);
     438
    428439    if (m_ForceSize.isNull())
    429440        SetSize(img->size());
    430441
     
    481492        if (m_isGreyscale && !im->isGrayscale())
    482493            im->ToGreyscale();
    483494
     495        if (m_isRotated && !im->IsRotated() && m_rotationAngle != 0)
     496            im->Rotate(m_rotationAngle, m_ForceSize);
     497
     498        if (m_isZoomed && !im->IsZoomed() && m_zoomPercent != 0)
     499            im->Zoom(m_zoomPercent);
     500
    484501        m_ImagesLock.lock();
    485502        m_Images[m_Images.size()] = im;
    486503        m_ImagesLock.unlock();
     
    520537}
    521538
    522539/**
     540 *  \brief Rotates the first image in the widget
     541 */
     542void MythUIImage::SetRotation(int rotationAngle)
     543{
     544    LOG(VB_GENERAL, LOG_INFO,
     545        QString("Rotating image %1 by %2")
     546        .arg(m_Filename)
     547        .arg(rotationAngle));
     548
     549    m_isRotated = true;
     550    m_rotationAngle = rotationAngle;
     551}
     552
     553/**
     554 *  \brief Zooms the first image in the widget
     555 */
     556void MythUIImage::SetZoom(int zoomPercent)
     557{
     558    LOG(VB_GENERAL, LOG_INFO,
     559        QString("Zooming image %1 by %2")
     560        .arg(m_Filename)
     561        .arg(zoomPercent));
     562
     563    m_isZoomed = true;
     564    m_zoomPercent = zoomPercent;
     565}
     566
     567/**
    523568 *  \brief Set the size of the widget
    524569 */
    525570void MythUIImage::SetSize(int width, int height)
     
    576621    if (m_isGreyscale)
    577622        s_Attrib += "greyscale";
    578623
     624    if (m_isRotated)
     625    {
     626        s_Attrib += "rotated";
     627        s_Attrib += QString("%1").arg(m_rotationAngle);
     628    }
     629
     630    if (m_isZoomed)
     631    {
     632        s_Attrib += "zoomed";
     633        s_Attrib += QString("%1").arg(m_zoomPercent);
     634    }
     635
    579636    imagelabel  = QString("%1-%2-%3x%4.png")
    580637                  .arg(filename)
    581638                  .arg(s_Attrib)
     
    814871        if (m_isReflected)
    815872            image->setIsReflected(true);
    816873
     874        if (m_isRotated)
     875            image->setIsRotated(true);
     876
     877        if (m_isZoomed)
     878            image->setIsZoomed(true);
     879
    817880        QRect rect(GetFullArea());
    818881        rect.setSize(image->size());
    819882        SetMinArea(rect);
     
    892955        if (m_isGreyscale)
    893956            image->ToGreyscale();
    894957
     958        if (m_isRotated)
     959            image->Rotate(m_rotationAngle, m_ForceSize);
     960
     961        if (m_isZoomed)
     962            image->Zoom(m_zoomPercent);
     963
    895964        if (!imageReader.supportsAnimation())
    896965            GetMythUI()->CacheImage(imagelabel, image);
    897966    }
     
    11461215        if (x > 0 || y > 0)
    11471216            area.translate(x, y);
    11481217
     1218        // The image is already centered on the screen. But if the
     1219        // image is zoomed its size could be larger than the screen. In
     1220        // this case the area needs to be centered within the screen area.
     1221        if (m_isZoomed && m_zoomPercent > 0)
     1222        {
     1223            // Get the dimensions (x- and y-resolution) of the screen.
     1224            int screenWidth, screenHeight;
     1225            float screenWidthMult, screenHeightMult;
     1226            GetMythUI()->GetScreenSettings(screenWidth, screenWidthMult,
     1227                                           screenHeight, screenHeightMult);
     1228
     1229            if (area.width() > screenWidth)
     1230                x = (screenWidth - area.width()) / 2;
     1231
     1232            if (area.height() > screenHeight)
     1233                y = (screenHeight - area.height()) / 2;
     1234
     1235            area.translate(x, y);
     1236        }
     1237
    11491238        QRect srcRect;
    11501239        m_cropRect.CalculateArea(GetFullArea());
    11511240
     
    13291418    {
    13301419        m_isGreyscale = parseBool(element);
    13311420    }
     1421    else if (element.tagName() == "rotate")
     1422    {
     1423        m_isRotated = true;
     1424        QString tmp = element.attribute("angle");
     1425
     1426        if (!tmp.isEmpty())
     1427            m_rotationAngle = tmp.toInt();
     1428    }
     1429    else if (element.tagName() == "zoom")
     1430    {
     1431        m_isZoomed = true;
     1432        QString tmp = element.attribute("percent");
     1433
     1434        if (!tmp.isEmpty())
     1435            m_zoomPercent = tmp.toInt();
     1436    }
    13321437    else
    13331438    {
    13341439        return MythUIType::ParseElement(filename, element, showWarnings);
     
    13871492
    13881493    m_isGreyscale = im->m_isGreyscale;
    13891494
     1495    m_isRotated = im->m_isRotated;
     1496    m_isZoomed = im->m_isZoomed;
     1497
     1498    m_rotationAngle = im->m_rotationAngle;
     1499    m_zoomPercent = im->m_zoomPercent;
     1500
    13901501    m_animationCycle = im->m_animationCycle;
    13911502    m_animatedImage = im->m_animatedImage;
    13921503
  • mythtv/libs/libmythui/mythuiimage.h

    old new  
    5959
    6060    virtual void LoadNow(void);
    6161
     62    void SetZoom(int zoomPercent);
     63    void SetRotation(int rotationAngle);
     64
    6265  protected:
    6366    virtual void DrawSelf(MythPainter *p, int xoffset, int yoffset,
    6467                          int alphaMod, QRect clipRect);
     
    119122    int  m_reflectLength;
    120123    int  m_reflectSpacing;
    121124
     125    bool m_isRotated;
     126    int m_rotationAngle;
     127    bool m_isZoomed;
     128    int m_zoomPercent;
     129
    122130    MythImage *m_maskImage;
    123131    bool m_isMasked;
    124132
  • mythtv/libs/libmythui/mythimage.cpp

    old new  
    4141    m_gradAlpha = 255;
    4242    m_gradDirection = FillTopToBottom;
    4343
     44    m_isZoomed = false;
     45    m_isRotated = false;
    4446    m_isReflected = false;
    4547    m_isYUV = false;
    4648
     
    124126    Assign(pix.toImage());
    125127}
    126128
     129void MythImage::Rotate(int rotationAngle, QSize size)
     130{
     131    if (m_isRotated)
     132        return;
     133
     134    QMatrix matrix;
     135    matrix.rotate(rotationAngle);
     136    Assign(transformed(matrix, Qt::SmoothTransformation));
     137
     138    // The rotated image is higher than the parent area
     139    // the image needs to be resized to be with the areas dimensions
     140
     141    // TODO: If the image is rotated not by multiple of 90 degrees
     142    //       calculate the new dimensions by using the pythagoras
     143    if (!size.isNull())
     144    {
     145        Resize(size, true);
     146    }
     147
     148    m_isRotated = true;
     149}
     150
     151void MythImage::Zoom(int zoomPercent)
     152{
     153    if (m_isZoomed)
     154        return;
     155
     156    float factor = (100.0 + zoomPercent) / 100.0;
     157    int newWidth = (int)(width() * factor);
     158    int newHeight = (int)(height() * factor);
     159
     160    Assign(scaled(QSize(newWidth, newHeight),
     161                  Qt::KeepAspectRatio, Qt::SmoothTransformation));
     162
     163    m_isZoomed = true;
     164}
     165
    127166void MythImage::Resize(const QSize &newSize, bool preserveAspect)
    128167{
    129168    if ((size() == newSize) && !isNull())
  • mythtv/libs/libmythui/mythimage.h

    old new  
    4444
    4545    bool IsGradient() const { return m_isGradient; }
    4646    bool IsReflected() const { return m_isReflected; }
     47    bool IsRotated() const { return m_isRotated; }
     48    bool IsZoomed() const { return m_isZoomed; }
    4749
    4850    void SetToYUV(void) { m_isYUV = true; }
    4951    void ConvertToYUV(void);
     
    5456    bool Load(MythImageReader &reader);
    5557    bool Load(const QString &filename, bool scale = true);
    5658
     59    void Rotate(int rotationAngle, QSize size);
     60    void Zoom(int zoomPercent);
    5761    void Resize(const QSize &newSize, bool preserveAspect = false);
    5862    void Reflect(ReflectAxis axis, int shear, int scale, int length,
    5963                 int spacing = 0);
     
    7882    QString GetFileName(void) const { return m_FileName; }
    7983
    8084    void setIsReflected(bool reflected) { m_isReflected = reflected; }
     85    void setIsRotated(bool rotated) { m_isRotated = rotated; }
     86    void setIsZoomed(bool zoomed) { m_isZoomed = zoomed; }
    8187
    8288    void SetIsInCache(bool bCached);
    8389
     
    100106    int m_gradAlpha;
    101107    FillDirection m_gradDirection;
    102108
     109    bool m_isRotated;
     110    bool m_isZoomed;
    103111    bool m_isReflected;
    104112    bool m_isYUV;
    105113