Changeset 651 for trunk/src/openvg


Ignore:
Timestamp:
Mar 8, 2010, 12:52:58 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.2 sources.

Location:
trunk
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/openvg/qpaintengine_vg.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    189189    bool maskValid;         // True if vgMask() contains valid data.
    190190    bool maskIsSet;         // True if mask would be fully set if it was valid.
     191    bool scissorMask;       // True if scissor is used in place of the mask.
    191192    bool rawVG;             // True if processing a raw VG escape.
    192193
     
    356357    maskValid = false;
    357358    maskIsSet = false;
     359    scissorMask = false;
    358360    rawVG = false;
    359361
     
    15431545{
    15441546    QTransform::TransformationType type = transform.type();
    1545     return (type == QTransform::TxNone || type == QTransform::TxTranslate);
     1547    if (type == QTransform::TxNone || type == QTransform::TxTranslate)
     1548        return true;
     1549    if (type == QTransform::TxRotate) {
     1550        // Check for 0, 90, 180, and 270 degree rotations.
     1551        // (0 might happen after 4 rotations of 90 degrees).
     1552        qreal m11 = transform.m11();
     1553        qreal m12 = transform.m12();
     1554        qreal m21 = transform.m21();
     1555        qreal m22 = transform.m22();
     1556        if (m11 == 0.0f && m22 == 0.0f) {
     1557            if (m12 == 1.0f && m21 == -1.0f)
     1558                return true;    // 90 degrees.
     1559            else if (m12 == -1.0f && m21 == 1.0f)
     1560                return true;    // 270 degrees.
     1561        } else if (m12 == 0.0f && m21 == 0.0f) {
     1562            if (m11 == -1.0f && m22 == -1.0f)
     1563                return true;    // 180 degrees.
     1564            else if (m11 == 1.0f && m22 == 1.0f)
     1565                return true;    // 0 degrees.
     1566        }
     1567    }
     1568    return false;
    15461569}
    15471570
     
    16651688        d->maskValid = false;
    16661689        d->maskIsSet = true;
     1690        d->scissorMask = false;
    16671691        d->maskRect = QRect();
    16681692        vgSeti(VG_MASKING, VG_FALSE);
     
    16701694    }
    16711695
    1672 #if defined(QVG_NO_RENDER_TO_MASK)
    16731696    // We don't have vgRenderToMask(), so handle simple QRectF's only.
    16741697    if (path.shape() == QVectorPath::RectangleHint &&
     
    16801703                    points[5] - points[1]);
    16811704        clip(rect.toRect(), op);
    1682     }
    1683 #else
     1705        return;
     1706    }
     1707
     1708#if !defined(QVG_NO_RENDER_TO_MASK)
    16841709    QPaintDevice *pdev = paintDevice();
    16851710    int width = pdev->width();
     
    17121737    d->maskValid = true;
    17131738    d->maskIsSet = false;
     1739    d->scissorMask = false;
    17141740#endif
    17151741}
     
    17321758            d->maskValid = false;
    17331759            d->maskIsSet = true;
     1760            d->scissorMask = false;
    17341761            d->maskRect = QRect();
    17351762            vgSeti(VG_MASKING, VG_FALSE);
     
    17471774                d->maskValid = false;
    17481775                d->maskIsSet = true;
     1776                d->scissorMask = false;
    17491777                d->maskRect = QRect();
    17501778            } else {
     
    17641792                        d->maskValid = false;
    17651793                        d->maskIsSet = false;
     1794                        d->scissorMask = false;
    17661795                        d->maskRect = QRect();
    17671796                        d->modifyMask(this, VG_FILL_MASK, r);
     
    17721801                d->maskValid = false;
    17731802                d->maskIsSet = false;
     1803                d->scissorMask = true;
    17741804                d->maskRect = clipRect;
    17751805                vgSeti(VG_MASKING, VG_FALSE);
     
    17821812        {
    17831813            QRect r = d->transform.mapRect(rect);
    1784             if (d->maskIsSet && isDefaultClipRect(r)) {
     1814            if (!d->maskValid) {
     1815                // Mask has not been used yet, so intersect with
     1816                // the previous scissor-based region in maskRect.
     1817                if (d->scissorMask)
     1818                    r = r.intersect(d->maskRect);
     1819                if (isDefaultClipRect(r)) {
     1820                    // The clip is the full window, so turn off clipping.
     1821                    d->maskIsSet = true;
     1822                    d->maskRect = QRect();
     1823                } else {
     1824                    // Activate the scissor on a smaller maskRect.
     1825                    d->maskIsSet = false;
     1826                    d->maskRect = r;
     1827                }
     1828                d->scissorMask = true;
     1829                updateScissor();
     1830            } else if (d->maskIsSet && isDefaultClipRect(r)) {
    17851831                // Intersecting a full-window clip with a full-window
    17861832                // region is the same as turning off clipping.
     
    17891835                d->maskValid = false;
    17901836                d->maskIsSet = true;
     1837                d->scissorMask = false;
    17911838                d->maskRect = QRect();
    17921839            } else {
     
    18301877            d->maskValid = false;
    18311878            d->maskIsSet = true;
     1879            d->scissorMask = false;
    18321880            d->maskRect = QRect();
    18331881            vgSeti(VG_MASKING, VG_FALSE);
     
    18451893                d->maskValid = false;
    18461894                d->maskIsSet = true;
     1895                d->scissorMask = false;
    18471896                d->maskRect = QRect();
    18481897            } else {
     
    18581907                    d->maskValid = false;
    18591908                    d->maskIsSet = false;
     1909                    d->scissorMask = true;
    18601910                    d->maskRect = clip.boundingRect();
    18611911                    vgSeti(VG_MASKING, VG_FALSE);
     
    18641914                    d->maskValid = false;
    18651915                    d->maskIsSet = false;
     1916                    d->scissorMask = false;
    18661917                    d->maskRect = QRect();
    18671918                    d->modifyMask(this, VG_FILL_MASK, r);
     
    18881939                d->maskValid = false;
    18891940                d->maskIsSet = true;
     1941                d->scissorMask = false;
    18901942                d->maskRect = QRect();
    18911943            } else {
     
    19662018        d->maskValid = false;
    19672019        d->maskIsSet = true;
     2020        d->scissorMask = false;
    19682021        d->maskRect = QRect();
    19692022        vgSeti(VG_MASKING, VG_FALSE);
     
    20012054    d->maskValid = true;
    20022055    d->maskIsSet = false;
     2056    d->scissorMask = false;
    20032057#else
    20042058    QPaintEngineEx::clip(path, op);
     
    20442098    maskValid = true;
    20452099    maskIsSet = false;
     2100    scissorMask = false;
    20462101}
    20472102
     
    20652120    maskValid = true;
    20662121    maskIsSet = false;
     2122    scissorMask = false;
    20672123}
    20682124
     
    20972153#if !defined(QVG_SCISSOR_CLIP)
    20982154        // Combine the system clip with the simple mask rectangle.
    2099         if (!d->maskRect.isNull()) {
     2155        if (d->scissorMask) {
    21002156            if (region.isEmpty())
    21012157                region = d->maskRect;
     
    21882244        d->maskValid = false;
    21892245        d->maskIsSet = true;
     2246        d->scissorMask = false;
    21902247        d->maskRect = QRect();
    21912248        s->clipRegion = defaultClipRegion();
     
    21972254        d->maskValid = false;
    21982255        d->maskIsSet = false;
     2256        d->scissorMask = false;
    21992257        d->maskRect = QRect();
    22002258    }
     
    23152373    QVGPainterState *s = state();
    23162374    if (!s->clipEnabled || s->clipOperation == Qt::NoClip) {
    2317         // The transform will either be identity or a simple translation,
    2318         // so do a simpler version of "r = d->transform.map(rect).toRect()".
    2319         QRect r = QRect(qRound(rect.x() + d->transform.dx()),
    2320                         qRound(rect.y() + d->transform.dy()),
    2321                         qRound(rect.width()),
    2322                         qRound(rect.height()));
     2375        QRect r = d->transform.mapRect(rect).toRect();
    23232376        int height = paintDevice()->height();
    23242377        if (d->clearColor != color || d->clearOpacity != s->opacity) {
     
    33993452        d->maskValid = false;
    34003453        d->maskIsSet = false;
     3454        d->scissorMask = false;
    34013455        d->maskRect = QRect();
    34023456        clipEnabledChanged();
  • trunk/src/openvg/qpaintengine_vg_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qpixmapdata_vg.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    4747
    4848#ifdef QT_SYMBIAN_SUPPORTS_SGIMAGE
     49#include <private/qt_s60_p.h>
     50#include <fbs.h>
    4951#include <graphics/sgimage.h>
    5052typedef EGLImageKHR (*pfnEglCreateImageKHR)(EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, EGLint*);
    5153typedef EGLBoolean (*pfnEglDestroyImageKHR)(EGLDisplay, EGLImageKHR);
    5254typedef VGImage (*pfnVgCreateEGLImageTargetKHR)(VGeglImageKHR);
    53 #endif
     55#endif // QT_SYMBIAN_SUPPORTS_SGIMAGE
    5456
    5557QT_BEGIN_NAMESPACE
     
    426428
    427429#if defined(Q_OS_SYMBIAN)
     430
     431static CFbsBitmap* createBlitCopy(CFbsBitmap* bitmap)
     432{
     433      CFbsBitmap *copy = q_check_ptr(new CFbsBitmap);
     434      if(!copy)
     435        return 0;
     436
     437      if (copy->Create(bitmap->SizeInPixels(), bitmap->DisplayMode()) != KErrNone) {
     438          delete copy;
     439          copy = 0;
     440
     441          return 0;
     442      }
     443
     444      CFbsBitmapDevice* bitmapDevice = 0;
     445      CFbsBitGc *bitmapGc = 0;
     446      QT_TRAP_THROWING(bitmapDevice = CFbsBitmapDevice::NewL(copy));
     447      QT_TRAP_THROWING(bitmapGc = CFbsBitGc::NewL());
     448      bitmapGc->Activate(bitmapDevice);
     449
     450      bitmapGc->BitBlt(TPoint(), bitmap);
     451
     452      delete bitmapGc;
     453      delete bitmapDevice;
     454
     455      return copy;
     456}
     457
    428458void QVGPixmapData::cleanup()
    429459{
     
    511541        SgDriver::Close();
    512542    } else if (type == QPixmapData::FbsBitmap) {
    513 
     543        CFbsBitmap *bitmap = reinterpret_cast<CFbsBitmap*>(pixmap);
     544
     545        bool deleteSourceBitmap = false;
     546
     547#ifdef Q_SYMBIAN_HAS_EXTENDED_BITMAP_TYPE
     548
     549        // Rasterize extended bitmaps
     550
     551        TUid extendedBitmapType = bitmap->ExtendedBitmapType();
     552        if (extendedBitmapType != KNullUid) {
     553            bitmap = createBlitCopy(bitmap);
     554            deleteSourceBitmap = true;
     555        }
     556#endif
     557
     558        if (bitmap->IsCompressedInRAM()) {
     559            bitmap = createBlitCopy(bitmap);
     560            deleteSourceBitmap = true;
     561        }
     562
     563        TDisplayMode displayMode = bitmap->DisplayMode();
     564        QImage::Format format = qt_TDisplayMode2Format(displayMode);
     565
     566        TSize size = bitmap->SizeInPixels();
     567
     568        bitmap->BeginDataAccess();
     569        uchar *bytes = (uchar*)bitmap->DataAddress();
     570        QImage img = QImage(bytes, size.iWidth, size.iHeight, format);
     571        img = img.copy();
     572        bitmap->EndDataAccess();
     573
     574        if(displayMode == EGray2) {
     575            //Symbian thinks set pixels are white/transparent, Qt thinks they are foreground/solid
     576            //So invert mono bitmaps so that masks work correctly.
     577            img.invertPixels();
     578        } else if(displayMode == EColor16M) {
     579            img = img.rgbSwapped(); // EColor16M is BGR
     580        }
     581
     582        fromImage(img, Qt::AutoColor);
     583
     584        if(deleteSourceBitmap)
     585            delete bitmap;
    514586    }
    515587#else
     
    594666        return reinterpret_cast<void*>(sgImage);
    595667    } else if (type == QPixmapData::FbsBitmap) {
    596         return 0;
     668        CFbsBitmap *bitmap = q_check_ptr(new CFbsBitmap);
     669
     670        if (bitmap) {
     671            if (bitmap->Create(TSize(source.width(), source.height()),
     672                              EColor16MAP) == KErrNone) {
     673                const uchar *sptr = qt_vg_imageBits(source);
     674                bitmap->BeginDataAccess();
     675
     676                uchar *dptr = (uchar*)bitmap->DataAddress();
     677                Mem::Copy(dptr, sptr, source.byteCount());
     678
     679                bitmap->EndDataAccess();
     680            } else {
     681                delete bitmap;
     682                bitmap = 0;
     683            }
     684        }
     685
     686        return reinterpret_cast<void*>(bitmap);
    597687    }
    598688#else
  • trunk/src/openvg/qpixmapdata_vg_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qpixmapfilter_vg.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qpixmapfilter_vg_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qvg.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qvg_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qvgcompositionhelper_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qvgimagepool.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qvgimagepool_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qwindowsurface_vg.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qwindowsurface_vg_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qwindowsurface_vgegl.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
  • trunk/src/openvg/qwindowsurface_vgegl_p.h

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
Note: See TracChangeset for help on using the changeset viewer.