/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtOpenVG module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef QPIXMAPDATA_VG_P_H
#define QPIXMAPDATA_VG_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists for the convenience
// of other Qt classes.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include <QtGui/private/qpixmap_raster_p.h>
#include <QtGui/private/qvolatileimage_p.h>
#include "qvg_p.h"

#if defined(Q_OS_SYMBIAN)
class RSGImage;
#endif

QT_BEGIN_NAMESPACE

class QEglContext;
class QVGImagePool;
class QImageReader;

#if !defined(QT_NO_EGL)
class QVGPixmapData;
class QVGSharedContext;

void qt_vg_register_pixmap(QVGPixmapData *pd);
void qt_vg_unregister_pixmap(QVGPixmapData *pd);
void qt_vg_hibernate_pixmaps(QVGSharedContext *context);
#endif

class QNativeImageHandleProvider;

class Q_OPENVG_EXPORT QVGPixmapData : public QPixmapData
{
public:
    QVGPixmapData(PixelType type);
    ~QVGPixmapData();

    QPixmapData *createCompatiblePixmapData() const;

    // Is this pixmap valid (i.e. non-zero in size)?
    bool isValid() const;

    void resize(int width, int height);
    void fromImage(const QImage &image, Qt::ImageConversionFlags flags);
    void fromImageReader(QImageReader *imageReader,
                          Qt::ImageConversionFlags flags);
    bool fromFile(const QString &filename, const char *format,
                          Qt::ImageConversionFlags flags);
    bool fromData(const uchar *buffer, uint len, const char *format,
                          Qt::ImageConversionFlags flags);

    void fill(const QColor &color);
    bool hasAlphaChannel() const;
    void setAlphaChannel(const QPixmap &alphaChannel);
    QImage toImage() const;
    void copy(const QPixmapData *data, const QRect &rect);
    QImage *buffer();
    QPaintEngine* paintEngine() const;

    // Return the VGImage form of this pixmap, creating it if necessary.
    // This assumes that there is a VG context current.
    virtual VGImage toVGImage();

    // Return the VGImage form for a specific opacity setting.
    virtual VGImage toVGImage(qreal opacity);

    // Detach this image from the image pool.
    virtual void detachImageFromPool();

    // Release the VG resources associated with this pixmap and copy
    // the pixmap's contents out of the GPU back into main memory.
    // The VG resource will be automatically recreated the next time
    // toVGImage() is called.  Does nothing if the pixmap cannot be
    // hibernated for some reason (e.g. VGImage is shared with another
    // process via a SgImage).
    virtual void hibernate();

    // Called when the QVGImagePool wants to reclaim this pixmap's
    // VGImage objects to reuse storage.
    virtual void reclaimImages();

    // If vgImage is valid but source is null, copies pixel data from GPU back
    // into main memory and destroys vgImage. For a normal pixmap this function
    // does nothing, however if the pixmap was created directly from a VGImage
    // (e.g. via SgImage on Symbian) then by doing the readback this ensures
    // that QImage-based functions can operate too.
    virtual void ensureReadback(bool readOnly) const;

    QSize size() const { return QSize(w, h); }

#if defined(Q_OS_SYMBIAN)
    QVolatileImage toVolatileImage() const;
    void* toNativeType(NativeType type);
    void fromNativeType(void* pixmap, NativeType type);
    bool initFromNativeImageHandle(void *handle, const QString &type);
    void createFromNativeImageHandleProvider();
    void releaseNativeImageHandle();
#endif

protected:
    int metric(QPaintDevice::PaintDeviceMetric metric) const;
    void createPixmapForImage(QImage &image, Qt::ImageConversionFlags flags, bool inPlace);

#if defined(Q_OS_SYMBIAN)
    void cleanup();
#endif

private:
    QVGPixmapData *nextLRU;
    QVGPixmapData *prevLRU;
    bool inLRU;
    bool failedToAlloc;
    friend class QVGImagePool;
    friend class QVGPaintEngine;

#if !defined(QT_NO_EGL)
    QVGPixmapData *next;
    QVGPixmapData *prev;

    friend void qt_vg_register_pixmap(QVGPixmapData *pd);
    friend void qt_vg_unregister_pixmap(QVGPixmapData *pd);
    friend void qt_vg_hibernate_pixmaps(QVGSharedContext *context);
#endif

protected:
    QSize prevSize;
    VGImage vgImage;
    VGImage vgImageOpacity;
    qreal cachedOpacity;
    mutable QVolatileImage source;
    mutable bool recreate;
    bool inImagePool;
#if !defined(QT_NO_EGL)
    mutable QEglContext *context;
#endif

#if defined(Q_OS_SYMBIAN)
    mutable QNativeImageHandleProvider *nativeImageHandleProvider;
    void *nativeImageHandle;
    QString nativeImageType;
#endif

    void forceToImage(bool allowReadback = true);
    QImage::Format sourceFormat() const;
    QImage::Format idealFormat(QImage *image, Qt::ImageConversionFlags flags) const;
    void updateSerial();

    void destroyImageAndContext();
    void destroyImages();
};

QT_END_NAMESPACE

#endif
