1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : image data interface for image plugins
9
* Copyright (C) 2004-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
10
* Copyright (C) 2004-2010 by Gilles Caulier <caulier dot gilles at gmail dot com>
12
* This program is free software; you can redistribute it
13
* and/or modify it under the terms of the GNU General
14
* Public License as published by the Free Software Foundation;
15
* either version 2, or (at your option)
18
* This program is distributed in the hope that it will be useful,
19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
* GNU General Public License for more details.
23
* ============================================================ */
25
#include "imageiface.h"
41
#include "exposurecontainer.h"
42
#include "iccmanager.h"
43
#include "iccsettingscontainer.h"
44
#include "icctransform.h"
45
#include "dimginterface.h"
46
#include "dmetadata.h"
51
class ImageIface::ImageIfacePriv
56
usePreviewSelection(false),
59
originalBytesDepth(0),
67
bool usePreviewSelection;
71
int originalBytesDepth;
82
DImg targetPreviewImage;
85
ImageIface::ImageIface(int w, int h)
86
: d(new ImageIfacePriv)
88
d->constrainWidth = w;
89
d->constrainHeight = h;
90
d->originalWidth = DImgInterface::defaultInterface()->origWidth();
91
d->originalHeight = DImgInterface::defaultInterface()->origHeight();
92
d->originalBytesDepth = DImgInterface::defaultInterface()->bytesDepth();
94
d->qcheck = QPixmap(8, 8);
98
p.fillRect(0, 0, 4, 4, QColor(144,144,144));
99
p.fillRect(4, 4, 4, 4, QColor(144,144,144));
100
p.fillRect(0, 4, 4, 4, QColor(100,100,100));
101
p.fillRect(4, 0, 4, 4, QColor(100,100,100));
105
ImageIface::~ImageIface()
110
void ImageIface::setPreviewType(bool useSelect)
112
d->usePreviewSelection = useSelect;
115
bool ImageIface::previewType()
117
return d->usePreviewSelection;
120
DColor ImageIface::getColorInfoFromOriginalImage(const QPoint& point)
122
if ( !DImgInterface::defaultInterface()->getImage() || point.x() > originalWidth() || point.y() > originalHeight() )
124
kWarning() << "Coordinate out of range or no image data available!";
128
return DImgInterface::defaultInterface()->getImg()->getPixelColor(point.x(), point.y());
131
DColor ImageIface::getColorInfoFromPreviewImage(const QPoint& point)
133
if ( d->previewImage.isNull() || point.x() > previewWidth() || point.y() > previewHeight() )
135
kWarning() << "Coordinate out of range or no image data available!";
139
return d->previewImage.getPixelColor(point.x(), point.y());
142
DColor ImageIface::getColorInfoFromTargetPreviewImage(const QPoint& point)
144
if ( d->targetPreviewImage.isNull() || point.x() > previewWidth() || point.y() > previewHeight() )
146
kWarning() << "Coordinate out of range or no image data available!";
150
return d->targetPreviewImage.getPixelColor(point.x(), point.y());
153
uchar* ImageIface::setPreviewImageSize(int w, int h) const
155
d->previewImage.reset();
156
d->targetPreviewImage.reset();
158
d->constrainWidth = w;
159
d->constrainHeight = h;
161
return (getPreviewImage());
164
uchar* ImageIface::getPreviewImage() const
166
if (d->previewImage.isNull())
170
if (!d->usePreviewSelection)
172
im = DImgInterface::defaultInterface()->getImg();
174
if (!im || im->isNull())
182
bool s = DImgInterface::defaultInterface()->sixteenBit();
183
bool a = DImgInterface::defaultInterface()->hasAlpha();
184
uchar* data = DImgInterface::defaultInterface()->getImageSelection();
185
DImgInterface::defaultInterface()->getSelectedArea(x, y, w, h);
186
im = new DImg(w, h, s, a, data, true);
200
im->setIccProfile(DImgInterface::defaultInterface()->getEmbeddedICC());
203
QSize sz(im->width(), im->height());
204
sz.scale(d->constrainWidth, d->constrainHeight, Qt::KeepAspectRatio);
206
d->previewImage = im->smoothScale(sz.width(), sz.height());
207
d->previewWidth = d->previewImage.width();
208
d->previewHeight = d->previewImage.height();
210
// only create another copy if needed, in putPreviewImage
211
d->targetPreviewImage = d->previewImage;
213
if (d->usePreviewSelection)
219
DImg previewData = d->previewImage.copyImageData();
220
return previewData.stripImageData();
223
DImg ImageIface::getPreviewImg()
225
DImg preview(previewWidth(), previewHeight(), previewSixteenBit(), previewHasAlpha(), getPreviewImage());
229
uchar* ImageIface::getOriginalImage() const
231
DImg* im = DImgInterface::defaultInterface()->getImg();
233
if (!im || im->isNull())
238
DImg origData = im->copyImageData();
239
return origData.stripImageData();
242
DImg* ImageIface::getOriginalImg() const
244
return DImgInterface::defaultInterface()->getImg();
247
uchar* ImageIface::getImageSelection() const
249
return DImgInterface::defaultInterface()->getImageSelection();
252
void ImageIface::putPreviewImage(uchar* data)
259
d->targetPreviewImage.detach();
260
d->targetPreviewImage.putImageData(data);
263
void ImageIface::putPreviewIccProfile(const IccProfile& profile)
265
d->targetPreviewImage.detach();
266
d->targetPreviewImage.setIccProfile(profile);
269
void ImageIface::putOriginalImage(const QString& caller, uchar* data, int w, int h)
276
DImgInterface::defaultInterface()->putImage(caller, data, w, h);
279
void ImageIface::putOriginalIccProfile(const IccProfile& profile)
281
DImgInterface::defaultInterface()->putIccProfile( profile );
284
void ImageIface::putImageSelection(const QString& caller, uchar* data)
291
DImgInterface::defaultInterface()->putImageSelection(caller, data);
294
int ImageIface::previewWidth()
296
return d->previewWidth;
299
int ImageIface::previewHeight()
301
return d->previewHeight;
304
bool ImageIface::previewSixteenBit()
306
return originalSixteenBit();
309
bool ImageIface::previewHasAlpha()
311
return originalHasAlpha();
314
int ImageIface::originalWidth()
316
return DImgInterface::defaultInterface()->origWidth();
319
int ImageIface::originalHeight()
321
return DImgInterface::defaultInterface()->origHeight();
324
bool ImageIface::originalSixteenBit()
326
return DImgInterface::defaultInterface()->sixteenBit();
329
bool ImageIface::originalHasAlpha()
331
return DImgInterface::defaultInterface()->hasAlpha();
334
int ImageIface::selectedWidth()
337
DImgInterface::defaultInterface()->getSelectedArea(x, y, w, h);
341
int ImageIface::selectedHeight()
344
DImgInterface::defaultInterface()->getSelectedArea(x, y, w, h);
348
int ImageIface::selectedXOrg()
351
DImgInterface::defaultInterface()->getSelectedArea(x, y, w, h);
355
int ImageIface::selectedYOrg()
358
DImgInterface::defaultInterface()->getSelectedArea(x, y, w, h);
362
void ImageIface::convertOriginalColorDepth(int depth)
364
DImgInterface::defaultInterface()->convertDepth(depth);
367
QPixmap ImageIface::convertToPixmap(DImg& img)
369
return DImgInterface::defaultInterface()->convertToPixmap(img);
372
IccProfile ImageIface::getOriginalIccProfile()
374
return DImgInterface::defaultInterface()->getEmbeddedICC();
377
KExiv2Data ImageIface::getOriginalMetadata()
379
return DImgInterface::defaultInterface()->getImg()->getMetadata();
382
void ImageIface::setOriginalMetadata(const KExiv2Data& meta)
384
DImgInterface::defaultInterface()->getImg()->setMetadata(meta);
387
PhotoInfoContainer ImageIface::getPhotographInformation() const
389
DMetadata meta(DImgInterface::defaultInterface()->getImg()->getMetadata());
390
return meta.getPhotographInformation();
393
void ImageIface::paint(QPaintDevice* device, int x, int y, int w, int h, QPainter* painter)
395
QPainter localPainter;
408
int width = w > 0 ? qMin(d->previewWidth, w) : d->previewWidth;
409
int height = h > 0 ? qMin(d->previewHeight, h) : d->previewHeight;
411
if ( !d->targetPreviewImage.isNull() )
413
if (d->targetPreviewImage.hasAlpha())
415
p->drawTiledPixmap(x, y, width, height, d->qcheck);
419
ICCSettingsContainer* iccSettings = DImgInterface::defaultInterface()->getICCSettings();
421
if (iccSettings && iccSettings->enableCM && iccSettings->useManagedView)
423
IccManager manager(d->targetPreviewImage);
424
IccTransform monitorICCtrans = manager.displayTransform();
425
pixImage = d->targetPreviewImage.convertToPixmap(monitorICCtrans);
429
pixImage = d->targetPreviewImage.convertToPixmap();
432
p->drawPixmap(x, y, pixImage, 0, 0, width, height);
434
// Show the Over/Under exposure pixels indicators
436
ExposureSettingsContainer* expoSettings = DImgInterface::defaultInterface()->getExposureSettings();
438
if (expoSettings->underExposureIndicator || expoSettings->overExposureIndicator)
440
ExposureSettingsContainer* expoSettings = DImgInterface::defaultInterface()->getExposureSettings();
441
QImage pureColorMask = d->targetPreviewImage.pureColorMask(expoSettings);
442
QPixmap pixMask = QPixmap::fromImage(pureColorMask);
443
p->drawPixmap(x, y, pixMask, 0, 0, width, height);
453
} // namespace Digikam