~ubuntu-branches/ubuntu/wily/kipi-plugins/wily

« back to all changes in this revision

Viewing changes to dngconverter/dngwriter/dngwriter.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2010-12-13 12:14:45 UTC
  • mfrom: (1.1.15 upstream)
  • Revision ID: james.westby@ubuntu.com-20101213121445-ukbi37gdnr50yzzi
Tags: 1.6.0-0ubuntu1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
71
71
 
72
72
#include "dngwriter_p.h"
73
73
#include "dngwriterhost.h"
74
 
#include "dngwriter.h"
75
74
 
76
75
using namespace KExiv2Iface;
77
76
 
88
87
 
89
88
dng_date_time dngDateTime(QDateTime qDT)
90
89
{
91
 
    dng_date_time dngDT;    
 
90
    dng_date_time dngDT;
92
91
    dngDT.fYear   = qDT.date().year();
93
92
    dngDT.fMonth  = qDT.date().month();
94
93
    dngDT.fDay    = qDT.date().day();
717
716
            dng_date_time_info dti;
718
717
            dti.SetDateTime(dngDateTime(meta.getImageDateTime()));
719
718
            exif->fDateTimeOriginal = dti;
720
 
            
 
719
 
721
720
            dti.SetDateTime(dngDateTime(meta.getDigitizationDateTime(true)));
722
721
            exif->fDateTimeDigitized = dti;
723
722
 
878
877
            if (meta.getExifTagLong("Exif.NikonLd3.LensIDNumber", val))                exif->fLensID.Set_ASCII((QString("%1").arg(val)).toAscii());
879
878
            if (meta.getExifTagLong("Exif.NikonLd2.FocusDistance", val))               exif->fSubjectDistance          = dng_urational((uint32)pow(10.0, val/40.0), 100);
880
879
            if (meta.getExifTagLong("Exif.NikonLd3.FocusDistance", val))               exif->fSubjectDistance          = dng_urational((uint32)pow(10.0, val/40.0), 100);
 
880
            str = meta.getExifTagString("NikonLd1.LensIDNumber");
 
881
            if (!str.isEmpty()) exif->fLensName.Set_ASCII(str.toAscii());
 
882
            str = meta.getExifTagString("NikonLd2.LensIDNumber");
 
883
            if (!str.isEmpty()) exif->fLensName.Set_ASCII(str.toAscii());
 
884
            str = meta.getExifTagString("NikonLd3.LensIDNumber");
 
885
            if (!str.isEmpty()) exif->fLensName.Set_ASCII(str.toAscii());
881
886
 
882
887
            // Canon Markernotes
883
888
 
884
889
            if (meta.getExifTagLong("Exif.Canon.SerialNumber", val))                   exif->fCameraSerialNumber.Set_ASCII((QString("%1").arg(val)).toAscii());
885
 
            if (meta.getExifTagLong("Exif.CanonCs.LensType", val))                     exif->fLensID.Set_ASCII((QString("%1").arg(val)).toAscii());
886
 
            if (meta.getExifTagLong("Exif.CanonCs.FlashActivity", val))                exif->fFlash                    = (uint32)val;
 
890
            //if (meta.getExifTagLong("Exif.CanonCs.LensType", val))                     exif->fLensID.Set_ASCII((QString("%1").arg(val)).toAscii());
 
891
            //if (meta.getExifTagLong("Exif.CanonCs.FlashActivity", val))                exif->fFlash                    = (uint32)val;
887
892
            //if (meta.getExifTagLong("Exif.CanonFi.FileNumber", val))                   exif->fImageNumber              = (uint32)val;
888
893
            //if (meta.getExifTagLong("Exif.CanonCs.MaxAperture", val))                  exif->fMaxApertureValue         = dng_urational(val, 100000);
889
894
            if (meta.getExifTagLong("Exif.CanonCs.ExposureProgram", val))
935
940
            if (meta.getExifTagRational("Exif.CanonCs.Lens", num, den, 0))             exif->fLensInfo[1]              = dng_urational(num, canonLensUnits);
936
941
            if (meta.getExifTagRational("Exif.CanonCs.Lens", num, den, 1))             exif->fLensInfo[0]              = dng_urational(num, canonLensUnits);
937
942
            if (meta.getExifTagRational("Exif.Canon.FocalLength", num, den, 1))        exif->fFocalLength              = dng_urational(num, canonLensUnits);
 
943
            long canonLensType = 65535;
 
944
            if (meta.getExifTagLong("Exif.CanonCs.LensType", canonLensType))           exif->fLensID.Set_ASCII((QString("%1").arg(canonLensType)).toAscii());
 
945
            str = meta.getExifTagString("Exif.Canon.LensModel");
 
946
            if (!str.isEmpty())
 
947
                exif->fLensName.Set_ASCII(str.toAscii());
 
948
            else if (canonLensType != 65535)
 
949
            {
 
950
                str = meta.getExifTagString("Exif.CanonCs.LensType");
 
951
                if (!str.isEmpty()) exif->fLensName.Set_ASCII(str.toAscii());
 
952
            }
 
953
            else if ((exif->fLensInfo[0].n > 0) && (exif->fLensInfo[1].n > 0))
 
954
            {
 
955
                double focalLenght = (double)exif->fLensInfo[0].n / (double)exif->fLensInfo[0].d;
 
956
                QString lensName = QString("%1").arg(focalLenght, 0, 'f', 1);
 
957
                if (exif->fLensInfo[0].n != exif->fLensInfo[1].n)
 
958
                {
 
959
                    focalLenght = (double)exif->fLensInfo[1].n / (double)exif->fLensInfo[1].d;
 
960
                    lensName.append(QString("-%1").arg(focalLenght, 0, 'f', 1));
 
961
                }
 
962
                lensName.append(" mm");
 
963
                exif->fLensName.Set_ASCII(lensName.toAscii());
 
964
            }
938
965
 
939
966
            str = meta.getExifTagString("Exif.Canon.OwnerName");
940
967
            if (!str.isEmpty()) exif->fOwnerName.Set_ASCII(str.toAscii());
972
999
                AutoPtr<dng_memory_block> block(host.Allocate(mkrnts.size()));
973
1000
                stream.SetReadPosition(0);
974
1001
                stream.Get(block->Buffer(), mkrnts.size());
975
 
                negative->SetMakerNote(block);
976
 
                negative->SetMakerNoteSafety(true);
 
1002
 
 
1003
                if (identifyMake.make != "Canon")
 
1004
                {
 
1005
                    negative->SetMakerNote(block);
 
1006
                    negative->SetMakerNoteSafety(true);
 
1007
                }
 
1008
 
 
1009
                long mknOffset       = 0;
 
1010
                QString mknByteOrder = meta.getExifTagString("Exif.MakerNote.ByteOrder");
 
1011
 
 
1012
                if ((meta.getExifTagLong("Exif.MakerNote.Offset", mknOffset)) && !mknByteOrder.isEmpty())
 
1013
                {
 
1014
                    dng_memory_stream streamPriv(memalloc);
 
1015
                    QByteArray identPriv;
 
1016
 
 
1017
                    identPriv.append(QString("Adobe").toAscii());
 
1018
                    identPriv.append((char)0x00);
 
1019
                    identPriv.append(QString("MakN").toAscii());
 
1020
 
 
1021
                    // next four byte are makernote size
 
1022
                    int mknSize = mkrnts.size();
 
1023
                    int size    = mknSize + 6;
 
1024
                    identPriv.append((char)((size >> 24) & 0xFF));
 
1025
                    identPriv.append((char)((size >> 16) & 0xFF));
 
1026
                    identPriv.append((char)((size >> 8 ) & 0xFF));
 
1027
                    identPriv.append((char)((size      ) & 0xFF));
 
1028
 
 
1029
                    kDebug() << mknSize << " " << mknOffset << " " << mknByteOrder;
 
1030
 
 
1031
                    // byte order
 
1032
                    identPriv.append(mknByteOrder.toAscii());
 
1033
 
 
1034
                    // next four byte are original offset
 
1035
                    identPriv.append((char)((mknOffset >> 24) & 0xFF));
 
1036
                    identPriv.append((char)((mknOffset >> 16) & 0xFF));
 
1037
                    identPriv.append((char)((mknOffset >> 8 ) & 0xFF));
 
1038
                    identPriv.append((char)((mknOffset      ) & 0xFF));
 
1039
 
 
1040
 
 
1041
                    streamPriv.Put(identPriv, identPriv.size());
 
1042
                    streamPriv.Put(mkrnts.data(), mkrnts.size());
 
1043
                    AutoPtr<dng_memory_block> blockPriv(host.Allocate(identPriv.size() + mkrnts.size()));
 
1044
                    streamPriv.SetReadPosition(0);
 
1045
                    streamPriv.Get(blockPriv->Buffer(), identPriv.size() + mkrnts.size());
 
1046
                    negative->SetPrivateData(blockPriv);
 
1047
                }
977
1048
            }
978
1049
        }
979
1050
 
1192
1263
    return dng_error_none;
1193
1264
}
1194
1265
 
1195
 
bool DNGWriter::fujiRotate(QByteArray &rawData, KDcrawIface::DcrawInfoContainer &identify)
 
1266
bool DNGWriter::fujiRotate(QByteArray& rawData, KDcrawIface::DcrawInfoContainer& identify)
1196
1267
{
1197
1268
    QByteArray tmpData(rawData);
1198
1269
    int height = identify.outputSize.height();
1199
1270
    int width  = identify.outputSize.width();
1200
1271
 
1201
 
    unsigned short *tmp = (unsigned short *)tmpData.data();
1202
 
    unsigned short *output = (unsigned short *)rawData.data();
 
1272
    unsigned short* tmp    = (unsigned short*)tmpData.data();
 
1273
    unsigned short* output = (unsigned short*)rawData.data();
 
1274
 
1203
1275
    for (int row=0; row < height; row++)
1204
1276
    {
1205
1277
        for (int col=0; col < width; col++)