134 lines
3.8 KiB
C++
134 lines
3.8 KiB
C++
/******************************************************************************
|
|
* QSkinny - Copyright (C) 2016 Uwe Rathmann
|
|
* This file may be used under the terms of the QSkinny License, Version 1.0
|
|
*****************************************************************************/
|
|
|
|
#include "QskGraphicImageProvider.h"
|
|
#include "QskGraphic.h"
|
|
#include "QskGraphicProvider.h"
|
|
#include "QskGraphicTextureFactory.h"
|
|
|
|
QskGraphicImageProvider::QskGraphicImageProvider(
|
|
const QString& providerId, ImageType type )
|
|
: QQuickImageProvider( type )
|
|
, m_providerId( providerId )
|
|
{
|
|
}
|
|
|
|
QskGraphicImageProvider::~QskGraphicImageProvider()
|
|
{
|
|
}
|
|
|
|
QString QskGraphicImageProvider::graphicProviderId() const
|
|
{
|
|
return m_providerId;
|
|
}
|
|
|
|
QImage QskGraphicImageProvider::requestImage(
|
|
const QString& id, QSize* size, const QSize& requestedSize )
|
|
{
|
|
// mutex ???
|
|
|
|
if ( requestedSize.width() == 0 || requestedSize.height() == 0 )
|
|
{
|
|
// during startup QML layouts need some time to find its
|
|
// sizes. To avoid warnings from returning empty images
|
|
// we return something.
|
|
|
|
static QImage dummy( 1, 1, QImage::Format_ARGB32_Premultiplied );
|
|
return dummy;
|
|
}
|
|
|
|
const QskGraphic* graphic = requestGraphic( id );
|
|
if ( graphic == nullptr )
|
|
return QImage();
|
|
|
|
const QSize sz = effectiveSize( requestedSize, graphic->defaultSize() );
|
|
|
|
if ( size )
|
|
*size = sz;
|
|
|
|
return graphic->toImage( sz, Qt::KeepAspectRatio );
|
|
}
|
|
|
|
QPixmap QskGraphicImageProvider::requestPixmap(
|
|
const QString& id, QSize* size, const QSize& requestedSize )
|
|
{
|
|
if ( requestedSize.width() == 0 || requestedSize.height() == 0 )
|
|
{
|
|
// during startup QML layouts need some time to find its
|
|
// sizes. To avoid warnings from returning empty pixmaps
|
|
// we return something.
|
|
|
|
static QPixmap dummy( 1, 1 );
|
|
return dummy;
|
|
}
|
|
|
|
const QskGraphic* graphic = requestGraphic( id );
|
|
if ( graphic == nullptr )
|
|
return QPixmap();
|
|
|
|
const QSize sz = effectiveSize( requestedSize, graphic->defaultSize() );
|
|
|
|
if ( size )
|
|
*size = sz;
|
|
|
|
return graphic->toPixmap( sz, Qt::KeepAspectRatio );
|
|
}
|
|
|
|
QQuickTextureFactory* QskGraphicImageProvider::requestTexture(
|
|
const QString& id, QSize* size, const QSize& requestedSize )
|
|
{
|
|
if ( requestedSize.width() == 0 || requestedSize.height() == 0 )
|
|
return nullptr;
|
|
|
|
const QskGraphic* graphic = requestGraphic( id );
|
|
if ( graphic == nullptr )
|
|
return nullptr;
|
|
|
|
const QSize sz = effectiveSize( requestedSize, graphic->defaultSize() );
|
|
|
|
if ( size )
|
|
*size = sz;
|
|
|
|
return new QskGraphicTextureFactory( *graphic, sz );
|
|
}
|
|
|
|
const QskGraphic* QskGraphicImageProvider::requestGraphic( const QString& id ) const
|
|
{
|
|
const QskGraphicProvider* graphicProvider = Qsk::graphicProvider( m_providerId );
|
|
if ( graphicProvider )
|
|
return graphicProvider->requestGraphic( id );
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
QSize QskGraphicImageProvider::effectiveSize(
|
|
const QSize& requestedSize, const QSizeF& defaultSize ) const
|
|
{
|
|
if ( requestedSize.width() == 0 || requestedSize.height() == 0 )
|
|
return QSize( 0, 0 );
|
|
|
|
if ( requestedSize.width() > 0 && requestedSize.height() > 0 )
|
|
return requestedSize;
|
|
|
|
if ( defaultSize.isEmpty() )
|
|
return requestedSize;
|
|
|
|
if ( requestedSize.height() < 0 )
|
|
{
|
|
const auto f = requestedSize.width() / defaultSize.width();
|
|
return QSize( requestedSize.width(),
|
|
static_cast< int >( f * defaultSize.height() ) );
|
|
}
|
|
|
|
if ( requestedSize.width() < 0 )
|
|
{
|
|
const auto f = requestedSize.height() / defaultSize.height();
|
|
return QSize( f * defaultSize.width(),
|
|
static_cast< int >( requestedSize.height() ) );
|
|
}
|
|
|
|
return defaultSize.toSize();
|
|
}
|