1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/* ============================================================
*
* 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 <[email protected]>
* 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
|