11#include <exiv2/exiv2.hpp>
13#include <kpluginfactory.h>
44 : updater(
std::move(updater))
51 updater->setProgress(
static_cast<int>(
value * 100.0));
68 m_dialog->setMainWidget(m_rawWidget);
72 m_dialog->enableButtonApply(true);
83#if KDCRAW_VERSION < 0x000400
84 return ((
v & 0x00FF) << 8) | ((
v & 0xFF00 >> 8));
93#if KDCRAW_VERSION < 0x010200
99 int r = QDialog::Accepted;
104 if (r == QDialog::Accepted) {
105 KisCursorOverrideLock cursorLock(Qt::WaitCursor);
108 QByteArray imageData;
110 settings.sixteenBitsImage =
true;
115 if (!dcraw.decodeRAWImage(
filename(), settings, imageData, width, height, rgbmax))
120 switch (settings.outputColorSpace) {
121 case RawDecodingSettings::RAWCOLOR:
122 case RawDecodingSettings::SRGB:
125 case RawDecodingSettings::ADOBERGB:
128 case RawDecodingSettings::WIDEGAMMUT:
131 case RawDecodingSettings::PROPHOTO:
134 case RawDecodingSettings::CUSTOMOUTPUTCS:
135 QFileInfo info(settings.outputProfile);
137 if (!info.exists()) {
138 qWarning() <<
"WARNING: couldn't find custom profile" << settings.outputProfile;
141 QFile profileFile(settings.outputProfile);
143 if (profileFile.open(QFile::ReadOnly)) {
146 profileFile.readAll());
148 qWarning() <<
"WARNING: couldn't open custom profile file" << settings.outputProfile;
153 qWarning() <<
"WARNING: reset profile to sRGB";
174 const QByteArray &imageData,
178 const float original =
static_cast<float>(
updater->progress());
180 const float step = (
static_cast<float>(
updater->maximum() * 0.9) - original) / (float)height;
184 for (
int y = 0; y < height;) {
186 for (
int x = 0; x < width;) {
191 const int rowStride = it->
rowStride(x, y);
195 for (
int i = 0; i < numContiguousRows; i++) {
198 +
static_cast<ptrdiff_t
>(((y + i) * width + x) * 3);
200 for (
int j = 0; j < numContiguousColumns; j++) {
201 auto *pixel =
reinterpret_cast<typename KoBgrU16Traits::Pixel *
>(
d) + j;
202#if KDCRAW_VERSION < 0x000400
206 pixel->alpha = 0xFFFF;
216 x += numContiguousColumns;
219 y += numContiguousRows;
220 updater->setProgress(
static_cast<int>(original + step *
float(y)));
224 readLayer(layer, imageData, width, height,
updater());
232#if EXIV2_TEST_VERSION(0,28,0)
233 const std::unique_ptr<Exiv2::Image> readImg = Exiv2::ImageFactory::open(std::move(basicIoDevice));
235 const std::unique_ptr<Exiv2::Image> readImg(Exiv2::ImageFactory::open(basicIoDevice).release());
238 readImg->readMetadata();
249 Exiv2::ExifData tempData;
250 Exiv2::Blob tempBlob;
253 for (
const Exiv2::Exifdatum &i : readImg->exifData()) {
254 const uint16_t tag = i.tag();
266 dbgMetaData <<
"Ignoring TIFF-specific" << i.key().c_str();
274 Exiv2::ExifParser::encode(tempBlob, Exiv2::littleEndian, tempData);
277 ioDevice.setData(
reinterpret_cast<char *
>(tempBlob.data()),
static_cast<int>(tempBlob.size()));
281 KisLayer *layer = qobject_cast<KisLayer *>(node.
data());
284 errFile <<
"Attempted to import metadata on an empty document";
290#if EXIV2_TEST_VERSION(0,28,0)
291 }
catch (Exiv2::Error &e) {
292 errFile <<
"Failed injecting TIFF metadata:" << Exiv2::Error(e.code()).what();
294 }
catch (Exiv2::AnyError &e) {
295 errFile <<
"Failed metadata import:" << e.code() << e.what();
300 document->setCurrentImage(image);
310 QByteArray imageData;
312 settings.sixteenBitsImage =
false;
317 if (dcraw.decodeHalfRAWImage(
filename(), settings, imageData, width, height, rgbmax)) {
318 QImage image(width, height, QImage::Format_RGB32);
319 quint8 *ptr =
reinterpret_cast<quint8 *
>(imageData.data());
320 for (
int y = 0; y < height; ++y) {
321 QRgb *pixel =
reinterpret_cast<QRgb *
>(image.scanLine(y));
322 for (
int x = 0; x < width; ++x) {
323 pixel[x] = qRgb(ptr[0], ptr[1], ptr[2]);
328 QPixmap img = QPixmap::fromImage(image).scaled(previewSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
329 img.setDevicePixelRatio(
m_rawWidget->preview->devicePixelRatioF());
338#if KDCRAW_VERSION < 0x010200
339 RawDecodingSettings settings;
340 settings.sixteenBitsImage =
true;
341 settings.brightness =
m_rawWidget->rawSettings->brightness();
342 settings.RAWQuality =
m_rawWidget->rawSettings->quality();
343 settings.outputColorSpace =
m_rawWidget->rawSettings->outputColorSpace();
344 settings.RGBInterpolate4Colors =
m_rawWidget->rawSettings->useFourColor();
345 settings.DontStretchPixels =
m_rawWidget->rawSettings->useDontStretchPixels();
346 settings.unclipColors =
m_rawWidget->rawSettings->unclipColor();
347 settings.whiteBalance =
m_rawWidget->rawSettings->whiteBalance();
348 settings.customWhiteBalance =
m_rawWidget->rawSettings->customWhiteBalance();
349 settings.customWhiteBalanceGreen =
m_rawWidget->rawSettings->customWhiteBalanceGreen();
351 settings.enableBlackPoint =
m_rawWidget->rawSettings->useBlackPoint();
352 settings.blackPoint =
m_rawWidget->rawSettings->blackPoint();
354 settings.enableNoiseReduction =
m_rawWidget->rawSettings->useNoiseReduction();
355 settings.NRThreshold =
m_rawWidget->rawSettings->NRThreshold();
357 settings.enableCACorrection =
m_rawWidget->rawSettings->useCACorrection();
358 settings.caMultiplier[0] =
m_rawWidget->rawSettings->caRedMultiplier();
359 settings.caMultiplier[1] =
m_rawWidget->rawSettings->caBlueMultiplier();
367#include "kis_raw_import.moc"
float value(const T *src, size_t ch)
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
virtual quint8 * rawData()=0
Exiv2::BasicIo::AutoPtr ptr_type
KisGroupLayerSP rootLayer() const
QString nextLayerName(const QString &baseName="") const
The base class for import and export filters.
QPointer< KoUpdater > updater
KisRandomAccessorSP createRandomAccessorNG()
virtual qint32 rowStride(qint32 x, qint32 y) const =0
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
KisImportExportErrorCode convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration=0) override
KDcrawIface::RawDecodingSettings rawDecodingSettings()
KisRawImport(QObject *parent, const QVariantList &)
WdgRawImport * m_rawWidget
A dialog base class with standard buttons and predefined layouts.
void enableButtonApply(bool state)
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
@ Apply
Show Apply button.
@ Cancel
Show Cancel-button. (this button reject()s the dialog; result set to QDialog::Rejected)
const T value(const QString &id) const
QPointer< KoUpdater > updater
MyKDcraw(QPointer< KoUpdater > updater)
void setWaitingDataProgress(double value) override
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_ASSERT_RECOVER(cond)
quint16 correctIndian(quint16 v)
const uint16_t ImageLength
const uint16_t PrimaryChromaticities
const uint16_t ReferenceBlackWhite
const uint16_t ImageWidth
const uint16_t PlanarConfiguration
const uint16_t YResolution
const uint16_t XResolution
const uint16_t TransferFunction
const uint16_t Orientation
const uint16_t ResolutionUnit
const uint16_t YCbCrSubSampling
const uint16_t SamplesPerPixel
const uint16_t BitsPerSample
const uint16_t Compression
const uint16_t InterColorProfile
const uint16_t YCbCrCoefficients
const uint16_t YCbCrPositioning
const uint16_t WhitePoint
const uint16_t PhotometricInterpretation
KisMetaData::Store * metaData()
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisNodeSP firstChild() const
KisPaintDeviceSP paintDevice
const KoColorProfile * profileByName(const QString &name) const
static KoColorSpaceRegistry * instance()
const KoColorProfile * p709SRGBProfile() const
const KoColorSpace * rgb16(const QString &profileName=QString())
const KoColorProfile * createColorProfile(const QString &colorModelId, const QString &colorDepthId, const QByteArray &rawData)
_channels_type_ channels_type
the type of the value of the channels of this color space