Compare commits

...

16 Commits

Author SHA1 Message Date
1d2aed54fa Upgrade ECM and KF5 version requirements for 5.24.0 release. 2016-07-02 08:48:36 +00:00
b019a2a57e Promote Android support 2016-06-18 00:04:19 +02:00
a4de98aa4f Silence CMake policy CMP0063 warning
...by adding the NO_POLICY_SCOPE flag as recommended by ECM's
documentation.

REVIEW: 128139
2016-06-09 17:57:09 +02:00
172c494cff remove extra ';' 2016-06-09 10:57:48 +02:00
e8da107189 Upgrade ECM and KF5 version requirements for 5.23.0 release. 2016-06-06 09:31:22 +00:00
0ae43f7d35 update metainfo.yaml for new kapidox version 2016-05-22 12:10:06 +02:00
36b67d38bb Upgrade ECM and KF5 version requirements for 5.22.0 release. 2016-05-06 19:37:55 +00:00
c1164e4eda Upgrade Qt version requirement. 2016-04-03 20:33:17 +00:00
8630653eff Upgrade ECM and KF5 version requirements for 5.21.0 release. 2016-04-02 15:30:22 +00:00
d4009490c5 Upgrade ECM and KF5 version requirements for 5.20.0 release. 2016-03-04 22:17:55 +00:00
baf894ba19 Move to tier2
6934d54417 added an optional dependency
on karchive. This also means that it doesn't merely depend on Qt and a
small number of third-party libs anymore and needs to moved to tier 2.

REVIEW: 127015
2016-02-08 21:41:20 +01:00
5168d097b5 Upgrade ECM and KF5 version requirements for 5.19.0 release. 2016-02-06 09:37:42 +00:00
6934d54417 Add kra and ora imageio plugins (read-only)
kra is the native format for Krita and ora the interchange format
for krita, gimp and mypaint (it's also mypaint's native format).
Both formats are simply zip containers with an embedded png.

REVIEW:126675
2016-01-31 15:01:32 +01:00
5d7ef7c38e fix loading of RLE compressed PSD files
decodeRLEData() expects a quint16 as length, but the PSD loader calls it
 with a quint32.
We do need quint32 for PSD, otherwise it would overflow for images
bigger than 256x256 pixels (it's the pixel count there, i.e. width x
 height).

BUG: 354413
FIXED-IN: 5.19.0
REVIEW: 126684
2016-01-10 13:24:35 +01:00
a68bfe27ff Upgrade ECM and KF5 version requirements for 5.18.0 release. 2016-01-01 19:58:09 +00:00
9304510ee3 Upgrade ECM and KF5 version requirements for 5.17.0 release. 2015-12-06 14:06:19 +00:00
18 changed files with 322 additions and 10 deletions

View File

@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 2.8.12)
project(KImageFormats)
include(FeatureSummary)
find_package(ECM 5.16.0 NO_MODULE)
find_package(ECM 5.24.0 NO_MODULE)
set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://projects.kde.org/projects/kdesupport/extra-cmake-modules")
feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES)
@ -11,15 +11,21 @@ feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKA
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
include(KDEInstallDirs)
include(KDEFrameworkCompilerSettings)
include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE)
include(KDECMakeSettings)
include(CheckIncludeFiles)
set(REQUIRED_QT_VERSION 5.3.0)
set(REQUIRED_QT_VERSION 5.4.0)
find_package(Qt5Gui ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE)
find_package(KF5Archive)
set_package_properties(KF5Archive PROPERTIES
TYPE OPTIONAL
PURPOSE "Required for the QImage plugin for Krita and OpenRaster images"
)
# EPS support depends on the gs utility; non-UNIX systems are unlikely to have
# this available in PATH
set(BUILD_EPS_PLUGIN FALSE)

View File

@ -61,6 +61,14 @@ kimageformats_read_tests(
rgb
tga
)
if (KF5Archive_FOUND)
kimageformats_read_tests(
kra
ora
)
endif()
# Allow some fuzziness when reading this formats, to allow for
# rounding errors (eg: in alpha blending).
kimageformats_read_tests(FUZZ 1

BIN
autotests/read/kra/src.kra Normal file

Binary file not shown.

BIN
autotests/read/kra/src.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
autotests/read/ora/src.ora Normal file

Binary file not shown.

BIN
autotests/read/ora/src.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,12 +1,17 @@
maintainer: alexmerry
description: Image format plugins for Qt
tier: 1
tier: 2
type: functional
platforms:
- name: Linux
- name: MacOSX
- name: Windows
note: No EPS support on Windows
- name: Android
portingAid: false
deprecated: false
release: true
public_lib: true
group: Frameworks
subgroup: Tier 2

View File

@ -89,3 +89,20 @@ target_link_libraries(kimg_xcf Qt5::Gui)
install(TARGETS kimg_xcf DESTINATION ${KDE_INSTALL_QTPLUGINDIR}/imageformats/)
install(FILES xcf.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}/qimageioplugins/)
##################################
if (KF5Archive_FOUND)
add_library(kimg_kra MODULE kra.cpp)
target_link_libraries(kimg_kra Qt5::Gui KF5::Archive)
install(TARGETS kimg_kra DESTINATION ${KDE_INSTALL_QTPLUGINDIR}/imageformats/)
install(FILES kra.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}/qimageioplugins/)
add_library(kimg_ora MODULE ora.cpp)
target_link_libraries(kimg_ora Qt5::Gui KF5::Archive)
install(TARGETS kimg_ora DESTINATION ${KDE_INSTALL_QTPLUGINDIR}/imageformats/)
install(FILES ora.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR}/qimageioplugins/)
endif()

88
src/imageformats/kra.cpp Normal file
View File

@ -0,0 +1,88 @@
/* This file is part of the KDE project
Copyright (C) 2013 Boudewijn Rempt <boud@valdyas.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the Lesser GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This code is based on Thacher Ulrich PSD loading code released
on public domain. See: http://tulrich.com/geekstuff/
*/
#include "kra.h"
#include <kzip.h>
#include <QImage>
#include <QIODevice>
#include <QFile>
KraHandler::KraHandler()
{
}
bool KraHandler::canRead() const
{
if (canRead(device())) {
setFormat("kra");
return true;
}
return false;
}
bool KraHandler::read(QImage *image)
{
KZip zip(device());
if (!zip.open(QIODevice::ReadOnly)) return false;
const KArchiveEntry *entry = zip.directory()->entry(QLatin1String("mergedimage.png"));
if (!entry || !entry->isFile()) return false;
const KZipFileEntry* fileZipEntry = static_cast<const KZipFileEntry*>(entry);
image->loadFromData(fileZipEntry->data(), "PNG");
return true;
}
bool KraHandler::canRead(QIODevice *device)
{
if (!device) {
qWarning("KraHandler::canRead() called with no device");
return false;
}
char buff[57];
if (device->peek(buff, sizeof(buff)) == sizeof(buff))
return qstrcmp(buff + 0x26, "application/x-krita") == 0;
return false;
}
QImageIOPlugin::Capabilities KraPlugin::capabilities(QIODevice *device, const QByteArray &format) const
{
if (format == "kra" || format == "KRA") {
return Capabilities(CanRead);
}
if (!format.isEmpty()) {
return 0;
}
if (!device->isOpen()) {
return 0;
}
Capabilities cap;
if (device->isReadable() && KraHandler::canRead(device)) {
cap |= CanRead;
}
return cap;
}
QImageIOHandler *KraPlugin::create(QIODevice *device, const QByteArray &format) const
{
QImageIOHandler *handler = new KraHandler;
handler->setDevice(device);
handler->setFormat(format);
return handler;
}

View File

@ -0,0 +1,7 @@
[Desktop Entry]
Type=Service
X-KDE-ServiceTypes=QImageIOPlugins
X-KDE-ImageFormat=kra
X-KDE-MimeType=application/x-krita
X-KDE-Read=true
X-KDE-Write=false

39
src/imageformats/kra.h Normal file
View File

@ -0,0 +1,39 @@
/* This file is part of the KDE project
Copyright (c) 2013 Boudewijn Rempt <boud@valdyas.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the Lesser GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
*/
#ifndef KIMG_KRA_H
#define KIMG_KRA_H
#include <QImageIOPlugin>
class KraHandler : public QImageIOHandler
{
public:
KraHandler();
bool canRead() const Q_DECL_OVERRIDE;
bool read(QImage *image) Q_DECL_OVERRIDE;
static bool canRead(QIODevice *device);
};
class KraPlugin : public QImageIOPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "kra.json")
public:
Capabilities capabilities(QIODevice *device, const QByteArray &format) const;
QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const;
};
#endif

View File

@ -0,0 +1,5 @@
{
"Keys": [ "kra" ],
"MimeTypes": [ "application/x-krita", "application/x-krita" ]
}

87
src/imageformats/ora.cpp Normal file
View File

@ -0,0 +1,87 @@
/* This file is part of the KDE project
Copyright (C) 2013 Boudewijn Rempt <boud@valdyas.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the Lesser GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This code is based on Thacher Ulrich PSD loading code released
on public domain. See: http://tulrich.com/geekstuff/
*/
#include "ora.h"
#include <QImage>
#include <QScopedPointer>
#include <kzip.h>
OraHandler::OraHandler()
{
}
bool OraHandler::canRead() const
{
if (canRead(device())) {
setFormat("ora");
return true;
}
return false;
}
bool OraHandler::read(QImage *image)
{
KZip zip(device());
if (!zip.open(QIODevice::ReadOnly)) return false;
const KArchiveEntry *entry = zip.directory()->entry(QLatin1String("mergedimage.png"));
if (!entry || !entry->isFile()) return false;
const KZipFileEntry* fileZipEntry = static_cast<const KZipFileEntry*>(entry);
image->loadFromData(fileZipEntry->data(), "PNG");
return true;
}
bool OraHandler::canRead(QIODevice *device)
{
if (!device) {
qWarning("OraHandler::canRead() called with no device");
return false;
}
char buff[54];
if (device->peek(buff, sizeof(buff)) == sizeof(buff))
return qstrcmp(buff + 0x26, "image/openraster") == 0;
return false;
}
QImageIOPlugin::Capabilities OraPlugin::capabilities(QIODevice *device, const QByteArray &format) const
{
if (format == "ora" || format == "ORA") {
return Capabilities(CanRead);
}
if (!format.isEmpty()) {
return 0;
}
if (!device->isOpen()) {
return 0;
}
Capabilities cap;
if (device->isReadable() && OraHandler::canRead(device)) {
cap |= CanRead;
}
return cap;
}
QImageIOHandler *OraPlugin::create(QIODevice *device, const QByteArray &format) const
{
QImageIOHandler *handler = new OraHandler;
handler->setDevice(device);
handler->setFormat(format);
return handler;
}

View File

@ -0,0 +1,7 @@
[Desktop Entry]
Type=Service
X-KDE-ServiceTypes=QImageIOPlugins
X-KDE-ImageFormat=ora
X-KDE-MimeType=image/openraster
X-KDE-Read=true
X-KDE-Write=false

38
src/imageformats/ora.h Normal file
View File

@ -0,0 +1,38 @@
/* This file is part of the KDE project
Copyright (c) 2013 Boudewijn Rempt <boud@valdyas.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the Lesser GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
*/
#ifndef KIMG_ORA_H
#define KIMG_ORA_H
#include <QImageIOPlugin>
class OraHandler : public QImageIOHandler
{
public:
OraHandler();
bool canRead() const Q_DECL_OVERRIDE;
bool read(QImage *image) Q_DECL_OVERRIDE;
static bool canRead(QIODevice *device);
};
class OraPlugin : public QImageIOPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "ora.json")
public:
Capabilities capabilities(QIODevice *device, const QByteArray &format) const Q_DECL_OVERRIDE;
QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const Q_DECL_OVERRIDE;
};
#endif

View File

@ -0,0 +1,5 @@
{
"Keys": [ "ora" ],
"MimeTypes": [ "image/openraster", "image/openraster" ]
}

View File

@ -120,19 +120,19 @@ static quint8 readPixel(QDataStream &stream) {
quint8 pixel;
stream >> pixel;
return pixel;
};
}
static QRgb updateRed(QRgb oldPixel, quint8 redPixel) {
return qRgba(redPixel, qGreen(oldPixel), qBlue(oldPixel), qAlpha(oldPixel));
};
}
static QRgb updateGreen(QRgb oldPixel, quint8 greenPixel) {
return qRgba(qRed(oldPixel), greenPixel, qBlue(oldPixel), qAlpha(oldPixel));
};
}
static QRgb updateBlue(QRgb oldPixel, quint8 bluePixel) {
return qRgba(qRed(oldPixel), qGreen(oldPixel), bluePixel, qAlpha(oldPixel));
};
}
static QRgb updateAlpha(QRgb oldPixel, quint8 alphaPixel) {
return qRgba(qRed(oldPixel), qGreen(oldPixel), qBlue(oldPixel), alphaPixel);
};
}
typedef QRgb(*channelUpdater)(QRgb,quint8);
// Load the PSD image.

View File

@ -75,7 +75,7 @@ template<typename Item, typename Func1, typename Func2>
static inline bool decodeRLEData(RLEVariant variant,
QDataStream &stream,
Item *dest,
quint16 length,
quint32 length,
Func1 readData,
Func2 updateItem)
{