summaryrefslogtreecommitdiffstats
path: root/kfile-plugins/jpeg/kfile_jpeg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kfile-plugins/jpeg/kfile_jpeg.cpp')
-rw-r--r--kfile-plugins/jpeg/kfile_jpeg.cpp531
1 files changed, 0 insertions, 531 deletions
diff --git a/kfile-plugins/jpeg/kfile_jpeg.cpp b/kfile-plugins/jpeg/kfile_jpeg.cpp
deleted file mode 100644
index 6f187c8e..00000000
--- a/kfile-plugins/jpeg/kfile_jpeg.cpp
+++ /dev/null
@@ -1,531 +0,0 @@
-/* This file is part of the KDE project
- * Copyright (C) 2002 Frank Pieczynski <[email protected]>,
- * 2002 Carsten Pfeiffer <[email protected]>
- * based on the jhead tool of Matthias Wandel (see below)
- *
- * 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 version 2.
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-
-#include <stdlib.h>
-#include "kfile_jpeg.h"
-
-#include <kurl.h>
-#include <kprocess.h>
-#include <klocale.h>
-#include <kgenericfactory.h>
-#include <kdebug.h>
-
-#include <tqcstring.h>
-#include <tqfile.h>
-#include <tqdatetime.h>
-#include <tqdict.h>
-#include <tqvalidator.h>
-#include <tqimage.h>
-
-#include "exif.h"
-
-#define EXIFGROUP "Jpeg EXIF Data"
-
-typedef KGenericFactory<KJpegPlugin> JpegFactory;
-
-K_EXPORT_COMPONENT_FACTORY(kfile_jpeg, JpegFactory("kfile_jpeg"))
-
-KJpegPlugin::KJpegPlugin(TQObject *parent, const char *name,
- const TQStringList &args )
- : KFilePlugin(parent, name, args)
-{
- kdDebug(7034) << "jpeg plugin\n";
-
- //
- // define all possible meta info items
- //
- KFileMimeTypeInfo *info = addMimeTypeInfo("image/jpeg");
- KFileMimeTypeInfo::GroupInfo *exifGroup = addGroupInfo( info, EXIFGROUP,
- i18n("JPEG Exif") );
- KFileMimeTypeInfo::ItemInfo* item;
-
- item = addItemInfo( exifGroup, "Comment", i18n("Comment"), TQVariant::String);
- setAttributes( item,
- KFileMimeTypeInfo::Modifiable |
- KFileMimeTypeInfo::Addable |
- KFileMimeTypeInfo::MultiLine );
-
- item = addItemInfo( exifGroup, "Manufacturer", i18n("Camera Manufacturer"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Model", i18n("Camera Model"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Date/time", i18n("Date/Time"),
- TQVariant::DateTime );
-
- item = addItemInfo( exifGroup, "CreationDate", i18n("Creation Date"),
- TQVariant::Date );
-
- item = addItemInfo( exifGroup, "CreationTime", i18n("Creation Time"),
- TQVariant::Time );
-
- item = addItemInfo( exifGroup, "Dimensions", i18n("Dimensions"),
- TQVariant::Size );
- setHint( item, KFileMimeTypeInfo::Size );
- setUnit( item, KFileMimeTypeInfo::Pixels );
-
- item = addItemInfo( exifGroup, "Orientation", i18n("Orientation"),
- TQVariant::Int );
-
- item = addItemInfo( exifGroup, "ColorMode", i18n("Color Mode"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Flash used", i18n("Flash Used"),
- TQVariant::String );
- item = addItemInfo( exifGroup, "Focal length", i18n("Focal Length"),
- TQVariant::String );
- setUnit( item, KFileMimeTypeInfo::Millimeters );
-
- item = addItemInfo( exifGroup, "35mm equivalent", i18n("35mm Equivalent"),
- TQVariant::Int );
- setUnit( item, KFileMimeTypeInfo::Millimeters );
-
- item = addItemInfo( exifGroup, "CCD width", i18n("CCD Width"),
- TQVariant::String );
- setUnit( item, KFileMimeTypeInfo::Millimeters );
-
- item = addItemInfo( exifGroup, "Exposure time", i18n("Exposure Time"),
- TQVariant::String );
- setHint( item, KFileMimeTypeInfo::Seconds );
-
- item = addItemInfo( exifGroup, "Aperture", i18n("Aperture"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Focus dist.", i18n("Focus Dist."),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Exposure bias", i18n("Exposure Bias"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Whitebalance", i18n("Whitebalance"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Metering mode", i18n("Metering Mode"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Exposure", i18n("Exposure"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "ISO equiv.", i18n("ISO Equiv."),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "JPEG quality", i18n("JPEG Quality"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "User comment", i18n("User Comment"),
- TQVariant::String );
- setHint(item, KFileMimeTypeInfo::Description);
-
- item = addItemInfo( exifGroup, "JPEG process", i18n("JPEG Process"),
- TQVariant::String );
-
- item = addItemInfo( exifGroup, "Thumbnail", i18n("Thumbnail"),
- TQVariant::Image );
- setHint( item, KFileMimeTypeInfo::Thumbnail );
-
-// ###
-// exifGroup.setSupportsVariableKeys(true);
-}
-
-TQValidator* KJpegPlugin::createValidator(const KFileMetaInfoItem& /*item*/,
- TQObject */*parent*/,
- const char */*name*/ ) const
-{
- // no need to return a validator that validates everything as OK :)
-// if (item.isEditable())
-// return new TQRegExpValidator(TQRegExp(".*"), parent, name);
-// else
- return 0L;
-}
-
-bool KJpegPlugin::writeInfo( const KFileMetaInfo& info ) const
-{
- TQString comment = info[EXIFGROUP].value("Comment").toString();
- TQString path = info.path();
-
- kdDebug(7034) << "exif writeInfo: " << info.path() << " \"" << comment << "\"\n";
-
- /*
- Do a strictly safe insertion of the comment:
-
- Scan original to verify it's a proper jpeg
- Open a unique temporary file in this directory
- Write temporary, replacing all COM blocks with this one.
- Scan temporary, to verify it's a proper jpeg
- Rename original to another unique name
- Rename temporary to original
- Unlink original
- */
- /*
- The jpeg standard does not regulate the contents of the COM block.
- I'm assuming the best thing to do here is write as unicode utf-8,
- which is fully backwards compatible with readers expecting ascii.
- Readers expecting a national character set are out of luck...
- */
- if( safe_copy_and_modify( TQFile::encodeName( path ), comment.utf8() ) ) {
- return false;
- }
- return true;
-}
-
-bool KJpegPlugin::readInfo( KFileMetaInfo& info, uint what )
-{
- const TQString path( info.path() );
- if ( path.isEmpty() ) // remote file
- return false;
-
- TQString tag;
- ExifData ImageInfo;
-
- // parse the jpeg file now
- try {
- if ( !ImageInfo.scan(info.path()) ) {
- kdDebug(7034) << "Not a JPEG file!\n";
- return false;
- }
- }
- catch (FatalError& e) { // malformed exif data?
- kdDebug(7034) << "Exception caught while parsing Exif data of: " << info.path() << endl;
- e.debug_print();
- return false;
- }
-
- KFileMetaInfoGroup exifGroup = appendGroup( info, EXIFGROUP );
-
- tag = ImageInfo.getComment();
- if ( tag.length() ) {
- kdDebug(7034) << "exif inserting Comment: " << tag << "\n";
- appendItem( exifGroup, "Comment", tag );
- } else {
- appendItem( exifGroup, "Comment", tag ); // So user can add new comment
- }
-
- tag = ImageInfo.getCameraMake();
- if (tag.length())
- appendItem( exifGroup, "Manufacturer", tag );
-
- tag = ImageInfo.getCameraModel();
- if (tag.length())
- appendItem( exifGroup, "Model", tag );
-
- tag = ImageInfo.getDateTime();
- if (tag.length()){
- TQDateTime dt = parseDateTime( tag.stripWhiteSpace() );
- if ( dt.isValid() ) {
- appendItem( exifGroup, "Date/time", dt );
- appendItem( exifGroup, "CreationDate", dt.date() );
- appendItem( exifGroup, "CreationTime", dt.time() );
- }
- }
-
- appendItem( exifGroup,"Dimensions", TQSize( ImageInfo.getWidth(),
- ImageInfo.getHeight() ) );
-
- if ( ImageInfo.getOrientation() )
- appendItem( exifGroup, "Orientation", ImageInfo.getOrientation() );
-
- appendItem( exifGroup, "ColorMode", ImageInfo.getIsColor() ?
- i18n("Color") : i18n("Black and white") );
-
- int flashUsed = ImageInfo.getFlashUsed(); // -1, <set>
- if ( flashUsed >= 0 ) {
- TQString flash = i18n("Flash", "(unknown)");
- switch ( flashUsed ) {
- case 0: flash = i18n("Flash", "No");
- break;
- case 1:
- case 5:
- case 7:
- flash = i18n("Flash", "Fired");
- break;
- case 9:
- case 13:
- case 15:
- flash = i18n( "Flash", "Fill Fired" );
- break;
- case 16:
- flash = i18n( "Flash", "Off" );
- break;
- case 24:
- flash = i18n( "Flash", "Auto Off" );
- break;
- case 25:
- case 29:
- case 31:
- flash = i18n( "Flash", "Auto Fired" );
- break;
- case 32:
- flash = i18n( "Flash", "Not Available" );
- break;
- default:
- break;
- }
- appendItem( exifGroup, "Flash used",
- flash );
- }
-
- if (ImageInfo.getFocalLength()){
- appendItem( exifGroup, "Focal length",
- TQString(TQString().sprintf("%4.1f", ImageInfo.getFocalLength()) ));
-
- if (ImageInfo.getCCDWidth()){
- appendItem( exifGroup, "35mm equivalent",
- (int)(ImageInfo.getFocalLength()/ImageInfo.getCCDWidth()*35 + 0.5) );
- }
- }
-
- if (ImageInfo.getCCDWidth()){
- appendItem( exifGroup, "CCD width",
- TQString(TQString().sprintf("%4.2f", ImageInfo.getCCDWidth()) ));
- }
-
- if (ImageInfo.getExposureTime()){
- tag=TQString().sprintf("%6.3f", ImageInfo.getExposureTime());
- float exposureTime = ImageInfo.getExposureTime();
- if (exposureTime > 0 && exposureTime <= 0.5){
- tag+=TQString().sprintf(" (1/%d)", (int)(0.5 + 1/exposureTime) );
- }
- appendItem( exifGroup, "Exposure time", tag );
- }
-
- if (ImageInfo.getApertureFNumber()){
- appendItem( exifGroup, "Aperture",
- TQString(TQString().sprintf("f/%3.1f",
- (double)ImageInfo.getApertureFNumber())));
- }
-
- if (ImageInfo.getDistance()){
- if (ImageInfo.getDistance() < 0){
- tag=i18n("Infinite");
- }else{
- tag=TQString().sprintf("%5.2fm",(double)ImageInfo.getDistance());
- }
- appendItem( exifGroup, "Focus dist.", tag );
- }
-
- if (ImageInfo.getExposureBias()){
- appendItem( exifGroup, "Exposure bias",
- TQString(TQString().sprintf("%4.2f",
- (double)ImageInfo.getExposureBias()) ));
- }
-
- if (ImageInfo.getWhitebalance() != -1){
- switch(ImageInfo.getWhitebalance()) {
- case 0:
- tag=i18n("Unknown");
- break;
- case 1:
- tag=i18n("Daylight");
- break;
- case 2:
- tag=i18n("Fluorescent");
- break;
- case 3:
- //tag=i18n("incandescent");
- tag=i18n("Tungsten");
- break;
- case 17:
- tag=i18n("Standard light A");
- break;
- case 18:
- tag=i18n("Standard light B");
- break;
- case 19:
- tag=i18n("Standard light C");
- break;
- case 20:
- tag=i18n("D55");
- break;
- case 21:
- tag=i18n("D65");
- break;
- case 22:
- tag=i18n("D75");
- break;
- case 255:
- tag=i18n("Other");
- break;
- default:
- //23 to 254 = reserved
- tag=i18n("Unknown");
- }
- appendItem( exifGroup, "Whitebalance", tag );
- }
-
- if (ImageInfo.getMeteringMode() != -1){
- switch(ImageInfo.getMeteringMode()) {
- case 0:
- tag=i18n("Unknown");
- break;
- case 1:
- tag=i18n("Average");
- break;
- case 2:
- tag=i18n("Center weighted average");
- break;
- case 3:
- tag=i18n("Spot");
- break;
- case 4:
- tag=i18n("MultiSpot");
- break;
- case 5:
- tag=i18n("Pattern");
- break;
- case 6:
- tag=i18n("Partial");
- break;
- case 255:
- tag=i18n("Other");
- break;
- default:
- // 7 to 254 = reserved
- tag=i18n("Unknown");
- }
- appendItem( exifGroup, "Metering mode", tag );
- }
-
- if (ImageInfo.getExposureProgram()){
- switch(ImageInfo.getExposureProgram()) {
- case 0:
- tag=i18n("Not defined");
- break;
- case 1:
- tag=i18n("Manual");
- break;
- case 2:
- tag=i18n("Normal program");
- break;
- case 3:
- tag=i18n("Aperture priority");
- break;
- case 4:
- tag=i18n("Shutter priority");
- break;
- case 5:
- tag=i18n("Creative program\n(biased toward fast shutter speed)");
- break;
- case 6:
- tag=i18n("Action program\n(biased toward fast shutter speed)");
- break;
- case 7:
- tag=i18n("Portrait mode\n(for closeup photos with the background out of focus)");
- break;
- case 8:
- tag=i18n("Landscape mode\n(for landscape photos with the background in focus)");
- break;
- default:
- // 9 to 255 = reserved
- tag=i18n("Unknown");
- }
- appendItem( exifGroup, "Exposure", tag );
- }
-
- if (ImageInfo.getISOequivalent()){
- appendItem( exifGroup, "ISO equiv.",
- TQString(TQString().sprintf("%2d",
- (int)ImageInfo.getISOequivalent()) ));
- }
-
- if (ImageInfo.getCompressionLevel()){
- switch(ImageInfo.getCompressionLevel()) {
- case 1:
- tag=i18n("Basic");
- break;
- case 2:
- tag=i18n("Normal");
- break;
- case 4:
- tag=i18n("Fine");
- break;
- default:
- tag=i18n("Unknown");
- }
- appendItem( exifGroup, "JPEG quality", tag );
- }
-
- tag = ImageInfo.getUserComment();
- if (tag.length()){
- appendItem( exifGroup, "EXIF comment", tag );
- }
-
- int a;
- for (a=0;;a++){
- if (ProcessTable[a].Tag == ImageInfo.getProcess() || ProcessTable[a].Tag == 0){
- appendItem( exifGroup, "JPEG process",
- TQString::fromUtf8( ProcessTable[a].Desc) );
- break;
- }
- }
-
- if ( what & KFileMetaInfo::Thumbnail && !ImageInfo.isNullThumbnail() ){
- appendItem( exifGroup, "Thumbnail", ImageInfo.getThumbnail() );
- }
-
- return true;
-}
-
-// format of the string is:
-// YYYY:MM:DD HH:MM:SS
-TQDateTime KJpegPlugin::parseDateTime( const TQString& string )
-{
- TQDateTime dt;
- if ( string.length() != 19 )
- return dt;
-
- TQString year = string.left( 4 );
- TQString month = string.mid( 5, 2 );
- TQString day = string.mid( 8, 2 );
- TQString hour = string.mid( 11, 2 );
- TQString minute = string.mid( 14, 2 );
- TQString seconds = string.mid( 17, 2 );
-
- bool ok;
- bool allOk = true;
- int y = year.toInt( &ok );
- allOk &= ok;
-
- int mo = month.toInt( &ok );
- allOk &= ok;
-
- int d = day.toInt( &ok );
- allOk &= ok;
-
- int h = hour.toInt( &ok );
- allOk &= ok;
-
- int mi = minute.toInt( &ok );
- allOk &= ok;
-
- int s = seconds.toInt( &ok );
- allOk &= ok;
-
- if ( allOk ) {
- dt.setDate( TQDate( y, mo, d ) );
- dt.setTime( TQTime( h, mi, s ) );
- }
-
- return dt;
-}
-
-#include "kfile_jpeg.moc"