You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
digikam/digikam/libs/dimg/loaders/qimageloader.cpp

127 lines
3.3 KiB

/* ============================================================
*
* This file is a part of digiKam project
* http://www.digikam.org
*
* Date : 2005-06-14
* Description : A TQImage loader for DImg framework.
*
* Copyright (C) 2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
* Copyright (C) 2006-2007 by Caulier Gilles <caulier dot gilles at gmail dot com>
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
* Public License as published by the Free Software Foundation;
* either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* ============================================================ */
// TQt includes.
#include <tqimage.h>
// Local includes.
#include "ddebug.h"
#include "dimg.h"
#include "dimgloaderobserver.h"
#include "qimageloader.h"
namespace Digikam
{
TQImageLoader::TQImageLoader(DImg* image)
: DImgLoader(image)
{
}
bool TQImageLoader::load(const TQString& filePath, DImgLoaderObserver *observer)
{
// Loading is opaque to us. No support for stopping from observer,
// progress info are only pseudo values
TQImage image(filePath);
if (observer)
observer->progressInfo(m_image, 0.9);
if (image.isNull())
{
DDebug() << "Cannot loading \"" << filePath << "\" using DImg::TQImageLoader!" << endl;
return false;
}
m_hasAlpha = image.hasAlphaBuffer();
TQImage target = image.convertDepth(32);
uint w = target.width();
uint h = target.height();
uchar* data = new uchar[w*h*4];
uint* sptr = (uint*)target.bits();
uchar* dptr = data;
for (uint i = 0 ; i < w*h ; i++)
{
dptr[0] = tqBlue(*sptr);
dptr[1] = tqGreen(*sptr);
dptr[2] = tqRed(*sptr);
dptr[3] = tqAlpha(*sptr);
dptr += 4;
sptr++;
}
if (observer)
observer->progressInfo(m_image, 1.0);
imageWidth() = w;
imageHeight() = h;
imageData() = data;
// We considering that PNG is the most representative format of an image loaded by TQt
imageSetAttribute("format", "PNG");
return true;
}
bool TQImageLoader::save(const TQString& filePath, DImgLoaderObserver *observer)
{
TQVariant qualityAttr = imageGetAttribute("quality");
int quality = qualityAttr.isValid() ? qualityAttr.toInt() : 90;
if (quality < 0)
quality = 90;
if (quality > 100)
quality = 100;
TQVariant formatAttr = imageGetAttribute("format");
TQCString format = formatAttr.toCString();
TQImage image = m_image->copyTQImage();
if (observer)
observer->progressInfo(m_image, 0.1);
// Saving is opaque to us. No support for stopping from observer,
// progress info are only pseudo values
bool success = image.save(filePath, format.upper(), quality);
if (observer && success)
observer->progressInfo(m_image, 1.0);
imageSetAttribute("format", format.upper());
return success;
}
bool TQImageLoader::hasAlpha() const
{
return m_hasAlpha;
}
} // NameSpace Digikam