| /* -*- C++ -*- | |
| * Copyright 2019-2025 LibRaw LLC (info@libraw.org) | |
| * | |
| LibRaw is free software; you can redistribute it and/or modify | |
| it under the terms of the one of two licenses as you choose: | |
| 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 | |
| (See file LICENSE.LGPL provided in LibRaw distribution archive for details). | |
| 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 | |
| (See file LICENSE.CDDL provided in LibRaw distribution archive for details). | |
| */ | |
| #include "third_party/libraw/internal/dcraw_defs.h" | |
| #include "third_party/libraw/internal/libraw_cameraids.h" | |
| static const struct { | |
| const int idx; | |
| const char *FormatName; | |
| } HassyRawFormat[] = { | |
| { LIBRAW_HF_Unknown, "Unknown"}, | |
| { LIBRAW_HF_3FR, "-3FR"}, | |
| { LIBRAW_HF_FFF, "-FFF"}, | |
| { LIBRAW_HF_Imacon, "Imacon"}, | |
| { LIBRAW_HF_HasselbladDNG, "hDNG"}, | |
| { LIBRAW_HF_AdobeDNG, "aDNG"}, | |
| { LIBRAW_HF_AdobeDNG_fromPhocusDNG, "a(hDNG)"}, | |
| }; | |
| const char* LibRaw::HassyRawFormat_idx2HR(unsigned idx) // HR means "human-readable" | |
| { | |
| for (int i = 0; i < int(sizeof HassyRawFormat / sizeof *HassyRawFormat); i++) | |
| if((unsigned)HassyRawFormat[i].idx == idx) | |
| return HassyRawFormat[i].FormatName; | |
| return 0; | |
| } | |
| void LibRaw::process_Hassy_Lens (int LensMount) { | |
| // long long unsigned id = | |
| // mount*100000000ULL + series*10000000ULL + | |
| // focal1*10000ULL + focal2*10 + version; | |
| char *ps; | |
| int c; | |
| char *q = strchr(imgdata.lens.Lens, ' '); | |
| if (!q) | |
| return; | |
| c = atoi(q +1); | |
| if (!c) | |
| return; | |
| if (LensMount == LIBRAW_MOUNT_Hasselblad_H) { | |
| if (imgdata.lens.Lens[2] == ' ') // HC lens | |
| ilm.LensID = LensMount*100000000ULL + 10000000ULL; | |
| else // HCD lens | |
| ilm.LensID = LensMount*100000000ULL + 20000000ULL; | |
| ilm.LensFormat = LIBRAW_FORMAT_645; | |
| } else if (LensMount == LIBRAW_MOUNT_Hasselblad_XCD) { | |
| ilm.LensFormat = LIBRAW_FORMAT_CROP645; | |
| ilm.LensID = LensMount*100000000ULL; | |
| } else | |
| return; | |
| ilm.LensMount = LensMount; | |
| ilm.LensID += c*10000ULL; | |
| if ((ps=strchr(imgdata.lens.Lens, '-'))) { | |
| ilm.FocalType = LIBRAW_FT_ZOOM_LENS; | |
| ilm.LensID += atoi(ps+1)*10ULL; | |
| } else { | |
| ilm.FocalType = LIBRAW_FT_PRIME_LENS; | |
| ilm.LensID += c*10ULL; | |
| } | |
| if (strstr(imgdata.lens.Lens, "III")) | |
| ilm.LensID += 3ULL; | |
| else if (strstr(imgdata.lens.Lens, "II")) | |
| ilm.LensID += 2ULL; | |
| } | |
| static void limited_strcat(char * src, const char *append, size_t maxsize) | |
| { | |
| if (strlen(src) + strlen(append) < maxsize) // Silently ignore on overflow | |
| strcat(src, append); | |
| } | |
| void LibRaw::parseHassyModel() { | |
| static const char *Hasselblad_Ctrl[] = { // manually selectable options only | |
| "ELD", "ELX", "Winder CW", "CW", "Pinhole", "Flash Sync", | |
| "SWC", "200 (Mod)", "200", "500 Mech.", "500", "H Series", | |
| "H-Series", "H1", "H2", "Black Box", "LENSCONTROL S", "LENSCTRL S", "Generic", | |
| }; | |
| static const char *Hasselblad_SensorEnclosures[] = { | |
| "CFH", "CFV", "CFV", "CFII", "CF", "Ixpress", | |
| }; | |
| char tmp_model[64]; | |
| const char *ps; | |
| char *eos; | |
| int c; | |
| int nPix = raw_width*raw_height; | |
| int add_MP_toName = 1; | |
| int norm_model_isSet = 0; | |
| if (model[0] == ' ') | |
| memmove(model, model+1, MIN(sizeof(model)-1,strlen(model))); | |
| imHassy.HostBody[0] = 0; | |
| if ((ps = strrchr(model, '/'))) | |
| strcpy(imHassy.HostBody, ps+1); | |
| else if ((ps = strrchr(imgdata.color.LocalizedCameraModel, '/'))) | |
| strcpy(imHassy.HostBody, ps+1); | |
| else if ((ps = strrchr(imgdata.color.UniqueCameraModel, '/'))) | |
| strcpy(imHassy.HostBody, ps+1); | |
| else if ((ps = strrchr(imHassy.SensorUnitConnector, '/'))) | |
| strcpy(imHassy.HostBody, ps+1); | |
| if (imHassy.HostBody[0]) { | |
| if ((eos = strrchr(imHassy.HostBody, '-'))) | |
| *eos = 0; | |
| } | |
| if (!imHassy.format) { | |
| if (dng_version) { | |
| if (!strncmp(software, "Adobe", 5)) { | |
| if (!imgdata.color.OriginalRawFileName[0] || | |
| !imgdata.color.LocalizedCameraModel[0] || | |
| !strcasestr(imgdata.color.UniqueCameraModel, "coated")) | |
| imHassy.format = LIBRAW_HF_AdobeDNG_fromPhocusDNG; | |
| else | |
| imHassy.format = LIBRAW_HF_AdobeDNG; | |
| } else imHassy.format = LIBRAW_HF_HasselbladDNG; | |
| } else if ((imHassy.nIFD_CM[0] != -1) && | |
| (imHassy.nIFD_CM[1] == -1) && | |
| !imHassy.mnColorMatrix[0][0]) { | |
| imHassy.format = LIBRAW_HF_3FR; | |
| } else imHassy.format = LIBRAW_HF_FFF; | |
| } | |
| if (imHassy.SensorUnitConnector[0]) { | |
| char buf[64]; | |
| if (!strncmp(imHassy.SensorUnitConnector, "Hasselblad ", 11)) | |
| memmove(imHassy.SensorUnitConnector, imHassy.SensorUnitConnector+11, 64-11); | |
| strcpy(buf, imHassy.SensorUnitConnector); | |
| if ((eos = strrchr(buf, '/'))) { | |
| *eos = 0; | |
| if ((eos = strrchr(buf, ' '))) { | |
| *eos = 0; | |
| strcpy (imHassy.SensorUnitConnector, buf); | |
| } | |
| } | |
| } | |
| if (imHassy.format == LIBRAW_HF_AdobeDNG) { // Adobe DNG, use LocalizedCameraModel | |
| imgdata.color.LocalizedCameraModel[63] = 0; // make sure it's 0-terminated | |
| if ((ps = strrchr(imgdata.color.LocalizedCameraModel, '-'))) | |
| c = int(ps-imgdata.color.LocalizedCameraModel); | |
| else c = int(strlen(imgdata.color.LocalizedCameraModel)); | |
| int cc = MIN(c, (int)sizeof(tmp_model)-1); | |
| memcpy(tmp_model, imgdata.color.LocalizedCameraModel,cc); | |
| tmp_model[cc] = 0; | |
| if (strcasestr(imgdata.color.UniqueCameraModel, "coated")) { | |
| strncpy(normalized_model, imgdata.color.UniqueCameraModel,sizeof(imgdata.color.UniqueCameraModel)-1); | |
| normalized_model[sizeof(imgdata.color.UniqueCameraModel) - 1] = 0; | |
| norm_model_isSet = 1; | |
| } | |
| if (!strncmp(normalized_model, "Hasselblad ", 11)) | |
| memmove(normalized_model, normalized_model+11, 64-11); | |
| } else { | |
| if ((ps = strrchr(imgdata.color.UniqueCameraModel, '/'))) { | |
| c = int(ps-imgdata.color.UniqueCameraModel); | |
| } | |
| else c = int(strlen(imgdata.color.UniqueCameraModel)); | |
| int cc = MIN(c, (int)sizeof(tmp_model)-1); | |
| memcpy(tmp_model, imgdata.color.UniqueCameraModel,cc); | |
| tmp_model[cc] = 0; | |
| } | |
| if (!strncasecmp(tmp_model, "Hasselblad ", 11)) | |
| memmove(tmp_model, tmp_model+11, 64-11); | |
| strncpy(imHassy.CaptureSequenceInitiator, model,31); | |
| imHassy.CaptureSequenceInitiator[31] = 0; | |
| if ((eos = strrchr(imHassy.CaptureSequenceInitiator, '/'))) { | |
| *eos = 0; | |
| } | |
| // check if model tag contains manual CaptureSequenceInitiator info: | |
| FORC(int(sizeof Hasselblad_Ctrl / sizeof *Hasselblad_Ctrl)) { | |
| if (strcasestr(model, Hasselblad_Ctrl[c])) { | |
| // yes, fill 'model' with sensor unit data | |
| strncpy(model, tmp_model,63); | |
| model[63] = 0; | |
| break; | |
| } | |
| } | |
| if (!imHassy.HostBody[0]) { | |
| ps = strchr(model, '-'); | |
| if (ps) { // check if model contains both host body and sensor version, resolution, MS info | |
| strncpy(imHassy.SensorUnit, model,63); | |
| memcpy(imHassy.HostBody, model, ps-model); | |
| imHassy.HostBody[ps-model] = 0; | |
| if (!strncmp(ps-2, "II-", 3)) | |
| ps -=2; | |
| strncpy(imHassy.Sensor, ps,7); | |
| imHassy.Sensor[7] = 0; | |
| add_MP_toName = 0; | |
| } else { // model contains host body only | |
| strncpy(imHassy.HostBody, model,63); | |
| imHassy.HostBody[63] = 0; | |
| // fill 'model' with sensor unit data | |
| strncpy(model, tmp_model,63); | |
| model[63] = 0; | |
| } | |
| } | |
| if (strstr(model, "503CWD")) { | |
| strncpy(imHassy.HostBody, model,63); | |
| imHassy.HostBody[63] = 0; | |
| ilm.CameraFormat = LIBRAW_FORMAT_66; | |
| ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_V; | |
| if (model[6] == 'I' && model[7] == 'I') | |
| strcpy(model, "CFVII"); | |
| else strcpy(model, "CFV"); | |
| } else if (strstr(model, "Hasselblad") && | |
| (model[10] != ' ')) { | |
| strcpy(model, "CFV"); | |
| ilm.CameraMount = LIBRAW_MOUNT_DigitalBack; | |
| } else { | |
| FORC(int(sizeof Hasselblad_SensorEnclosures / sizeof *Hasselblad_SensorEnclosures)) { | |
| if (strcasestr(model, Hasselblad_SensorEnclosures[c])) { | |
| if (add_MP_toName) strcpy(model, Hasselblad_SensorEnclosures[c]); | |
| ilm.CameraMount = LIBRAW_MOUNT_DigitalBack; | |
| break; | |
| } | |
| } | |
| } | |
| #define cpynorm(str) \ | |
| if (!norm_model_isSet) { \ | |
| strcpy(normalized_model, str); \ | |
| norm_model_isSet = 1; \ | |
| } | |
| if ((imHassy.SensorCode == 4) && | |
| (imHassy.CoatingCode < 2)) { | |
| strcpy(imHassy.Sensor, "-16"); | |
| cpynorm("16-Uncoated"); | |
| } else if ((imHassy.SensorCode == 6) && | |
| (imHassy.CoatingCode < 2)) { | |
| strcpy(imHassy.Sensor, "-22"); | |
| cpynorm("22-Uncoated"); | |
| } else if ((imHassy.SensorCode == 8) && | |
| (imHassy.CoatingCode == 1)) { | |
| strcpy(imHassy.Sensor, "-31"); | |
| cpynorm("31-Uncoated"); | |
| } else if ((imHassy.SensorCode == 9) && | |
| (imHassy.CoatingCode < 2)) { | |
| strcpy(imHassy.Sensor, "-39"); | |
| cpynorm("39-Uncoated"); | |
| } else if ((imHassy.SensorCode == 9) && | |
| (imHassy.CoatingCode == 4)) { | |
| strcpy(imHassy.Sensor, "-39"); | |
| strcpy(model, "H3DII"); | |
| add_MP_toName = 1; | |
| cpynorm("39-Coated"); | |
| } else if ((imHassy.SensorCode == 13) && | |
| (imHassy.CoatingCode == 4)) { | |
| strcpy(imHassy.Sensor, "-40"); | |
| cpynorm("40-Coated"); | |
| } else if ((imHassy.SensorCode == 13) && | |
| (imHassy.CoatingCode == 5)) { | |
| strcpy(imHassy.Sensor, "-40"); | |
| cpynorm("40-Coated5"); | |
| } else if ((imHassy.SensorCode == 11) && | |
| (imHassy.CoatingCode == 4)) { | |
| if (!strncmp(model, "H3D", 3)) | |
| strcpy(model, "H3DII-50"); | |
| else strcpy(imHassy.Sensor, "-50"); | |
| cpynorm("50-Coated"); | |
| } else if ((imHassy.SensorCode == 11) && | |
| (imHassy.CoatingCode == 5)) { | |
| strcpy(imHassy.Sensor, "-50"); | |
| cpynorm("50-Coated5"); | |
| } else if ((imHassy.SensorCode == 15) && | |
| (imHassy.CoatingCode == 5)) { | |
| strcpy(imHassy.Sensor, "-50c"); | |
| cpynorm("50-15-Coated5"); | |
| if (!strncmp(imHassy.CaptureSequenceInitiator, "CFV II 50C", 10)) { | |
| imHassy.SensorSubCode = 2; | |
| add_MP_toName = 0; | |
| limited_strcat(imHassy.Sensor, " II", sizeof(imHassy.Sensor)); | |
| strcpy(model, "CFV II 50C"); | |
| limited_strcat(normalized_model, "-II",sizeof(normalized_model)); | |
| } else if (!strncmp(imHassy.CaptureSequenceInitiator, "X1D", 3)) { | |
| imHassy.SensorSubCode = 2; | |
| add_MP_toName = 0; | |
| limited_strcat(imHassy.Sensor, " II", sizeof(imHassy.Sensor)); | |
| if (!strncasecmp(imHassy.CaptureSequenceInitiator, "X1D II 50C", 10)) { | |
| strcpy(model, "X1D II 50C"); | |
| limited_strcat(normalized_model, "-II", sizeof(normalized_model)); | |
| } else { | |
| strcpy(model, "X1D-50c"); | |
| } | |
| } | |
| } else if ((imHassy.SensorCode == 12) && | |
| (imHassy.CoatingCode == 4)) { | |
| strcpy(imHassy.Sensor, "-60"); | |
| cpynorm("60-Coated"); | |
| } else if ((imHassy.SensorCode == 17) && | |
| (imHassy.CoatingCode == 5)) { | |
| strcpy(imHassy.Sensor, "-100c"); | |
| cpynorm("100-17-Coated5"); | |
| } else if ((imHassy.SensorCode == 20) && | |
| (imHassy.CoatingCode == 6)) { | |
| strcpy(imHassy.Sensor, "-100c"); | |
| cpynorm("100-20-Coated6"); | |
| } else if ((raw_width == 4090) || // V96C | |
| ((raw_width == 4096) && (raw_height == 4096)) || | |
| ((raw_width == 4088) && (raw_height == 4088)) || // Adobe crop | |
| ((raw_width == 4080) && (raw_height == 4080))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-16"); | |
| cpynorm("16-Uncoated"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 4; | |
| } else if ((raw_width == 5568) && (raw_height == 3648)) { | |
| strcpy(imHassy.Sensor, "-20c"); | |
| } else if (((raw_width == 4096) && (raw_height == 5456)) || | |
| ((raw_width == 4088) && (raw_height == 5448)) || // Adobe crop | |
| ((raw_width == 4080) && (raw_height == 5440))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-22"); | |
| cpynorm("22-Uncoated"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 6; | |
| } else if (((raw_width == 6542) && (raw_height == 4916)) || | |
| ((raw_width == 6504) && (raw_height == 4880)) || // Adobe crop | |
| ((raw_width == 6496) && (raw_height == 4872))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-31"); | |
| cpynorm("31-Uncoated"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 8; | |
| } else if (((raw_width == 7262) && (raw_height == 5456)) || // | |
| ((raw_width == 7224) && (raw_height == 5420)) || // Adobe crop | |
| ((raw_width == 7216) && (raw_height == 5412)) || // Phocus crop | |
| ((raw_width == 7212) && (raw_height == 5412)) || // CF-39, CFV-39, possibly v.II; Phocus crop | |
| // uncropped, when the exact size is unknown, should be: | |
| // - greater or equal to the smallest Phocus crop for the current size | |
| // - smaller than the smallest Phocus crop for the next size | |
| ((nPix >= 7212*5412) && (nPix < 7304*5478))) { | |
| strcpy(imHassy.Sensor, "-39"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 9; | |
| if (!strncmp(model, "H3D", 3)) { | |
| if (((imHassy.format == LIBRAW_HF_Imacon) || | |
| strstr(imgdata.color.UniqueCameraModel, "H3D-39") || | |
| strstr(imgdata.color.LocalizedCameraModel, "H3D-39") || | |
| strstr(model, "H3D-39")) && | |
| !strstr(imgdata.color.UniqueCameraModel, "II") && | |
| !strstr(imgdata.color.LocalizedCameraModel, "II") && | |
| !strstr(model, "II")) { | |
| strcpy(model, "H3D-39"); | |
| add_MP_toName = 0; | |
| cpynorm("39-Uncoated"); | |
| } else { | |
| strcpy(model, "H3DII-39"); | |
| add_MP_toName = 0; | |
| cpynorm("39-Coated"); | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; | |
| } | |
| } else | |
| cpynorm("39-Uncoated"); | |
| } else if (((raw_width == 7410) && (raw_height == 5586)) || // (H4D-40, H5D-40) | |
| ((raw_width == 7312) && (raw_height == 5486)) || // Adobe crop | |
| ((raw_width == 7304) && (raw_height == 5478))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-40"); | |
| if (!strncmp(model, "H4D", 3)) { | |
| cpynorm("40-Coated"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 13; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; | |
| } else { | |
| cpynorm("40-Coated5"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 13; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; | |
| } | |
| } else if (((raw_width == 8282) && (raw_height == 6240)) || // (CFV-50, H3DII-50, H5D-50) | |
| ((raw_width == 8184) && (raw_height == 6140)) || // Adobe crop | |
| ((raw_width == 8176) && (raw_height == 6132))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-50"); | |
| if (!strncmp(model, "H5D", 3)) { | |
| cpynorm("50-Coated5"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 11; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; | |
| } else { | |
| cpynorm("50-Coated"); // CFV-50, H3DII-50, | |
| if (!strncmp(model, "H3D", 3)) { | |
| strcpy(model, "H3DII-50"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 11; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; | |
| add_MP_toName = 0; | |
| } | |
| } | |
| } else if (((raw_width == 8374) && (raw_height == 6304)) || // (H5D-50c, CFV-50c) | |
| ((raw_width == 8384) && (raw_height == 6304)) || // (X1D-50c, "X1D II 50C", "CFV II 50C") | |
| ((raw_width == 8280) && (raw_height == 6208)) || // Adobe crop | |
| ((raw_width == 8272) && (raw_height == 6200))) { // Phocus crop | |
| cpynorm("50-15-Coated5"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 15; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; | |
| strcpy(imHassy.Sensor, "-50c"); | |
| if ((raw_width == 8384) || | |
| !strncmp(imHassy.CaptureSequenceInitiator, "X1D", 3) || | |
| !strncmp(imHassy.CaptureSequenceInitiator, "CFV II", 6)) { | |
| imHassy.SensorSubCode = 2; | |
| add_MP_toName = 0; | |
| limited_strcat(imHassy.Sensor, " II", sizeof(imHassy.Sensor)); | |
| if (strstr(imHassy.CaptureSequenceInitiator, " II ")) { | |
| limited_strcat(normalized_model, "-II", sizeof(normalized_model)); | |
| if (!strncasecmp(imHassy.CaptureSequenceInitiator, "X1D II 50C", 10)) { | |
| strcpy(model, "X1D II 50C"); | |
| } else if (!strncasecmp(imHassy.CaptureSequenceInitiator, "CFV II 50C", 10)) { | |
| strcpy(model, "CFV II 50C"); | |
| } | |
| } else { | |
| strcpy(model, "X1D-50c"); | |
| } | |
| } | |
| } else if (((raw_width == 9044) && (raw_height == 6732)) || | |
| ((raw_width == 8964) && (raw_height == 6716)) || // Adobe crop | |
| ((raw_width == 8956) && (raw_height == 6708))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-60"); | |
| cpynorm("60-Coated"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 12; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 4; | |
| } else if (((raw_width == 10320) && (raw_height == 7752)) || // Phocus crop, A5D-80 | |
| ((nPix >= 10320*7752) && (nPix < 10520*8000))) { | |
| strcpy(imHassy.Sensor, "-80"); | |
| cpynorm("80-Coated"); | |
| } else if (((raw_width == 12000) && (raw_height == 8816)) || | |
| ((raw_width == 11608) && (raw_height == 8708)) || // Adobe crop | |
| ((raw_width == 11600) && (raw_height == 8700))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-100c"); | |
| cpynorm("100-17-Coated5"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 17; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 5; | |
| } else if (((raw_width == 11904) && (raw_height == 8842)) || // X2D 100C, CFV 100C | |
| ((raw_width == 11664) && (raw_height == 8750)) || // Adobe crop | |
| ((raw_width == 11656) && (raw_height == 8742))) { // Phocus crop | |
| strcpy(imHassy.Sensor, "-100c"); | |
| cpynorm("100-20-Coated6"); | |
| if (!imHassy.SensorCode) imHassy.SensorCode = 20; | |
| if (!imHassy.CoatingCode) imHassy.CoatingCode = 6; | |
| } | |
| if (raw_width == 4090) | |
| strcpy(model, "V96C"); | |
| if ( | |
| (raw_width == 4090) || | |
| ((raw_width == 4096) && (raw_height == 4096)) || | |
| ((raw_width == 5568) && (raw_height == 3648)) || | |
| ((raw_width == 4096) && (raw_height == 5456)) || | |
| ((raw_width == 6542) && (raw_height == 4916)) || | |
| ((raw_width == 7262) && (raw_height == 5456)) || | |
| ((raw_width == 7410) && (raw_height == 5586)) || | |
| ((raw_width == 8282) && (raw_height == 6240)) || | |
| ((raw_width == 8374) && (raw_height == 6304)) || | |
| ((raw_width == 8384) && (raw_height == 6304)) || | |
| ((raw_width == 9044) && (raw_height == 6732)) || | |
| ((raw_width == 10320) && (raw_height == 7752)) || | |
| ((raw_width == 12000) && (raw_height == 8816)) || | |
| ((raw_width == 11904) && (raw_height == 8842)) | |
| ) | |
| imHassy.uncropped = 1; | |
| if (model[0] && add_MP_toName) | |
| limited_strcat(model, imHassy.Sensor,sizeof(model)); | |
| if (imHassy.Sensor[0] == '-') | |
| memmove(imHassy.Sensor, imHassy.Sensor+1, strlen(imHassy.Sensor)); | |
| if (dng_version && | |
| (imHassy.SensorCode == 13) && | |
| (imHassy.CoatingCode == 4)) { | |
| c = LIBRAW_HF_AdobeDNG; | |
| } else if ((imHassy.format == LIBRAW_HF_HasselbladDNG) || | |
| (imHassy.format == LIBRAW_HF_AdobeDNG_fromPhocusDNG)) { | |
| c = LIBRAW_HF_FFF; | |
| } else if (imHassy.format == LIBRAW_HF_Imacon) { | |
| c = LIBRAW_HF_3FR; | |
| } else { | |
| c = imHassy.format; | |
| } | |
| ps = HassyRawFormat_idx2HR(c); | |
| if ((c == LIBRAW_HF_3FR) || | |
| (c == LIBRAW_HF_FFF)) | |
| limited_strcat(normalized_model, ps,sizeof(normalized_model)); | |
| if (((imHassy.CaptureSequenceInitiator[0] == 'H') && | |
| (imHassy.CaptureSequenceInitiator[1] != 'a')) || | |
| ((imHassy.CaptureSequenceInitiator[0] == 'A') && | |
| isdigit(imHassy.CaptureSequenceInitiator[1]))) { | |
| ilm.CameraFormat = LIBRAW_FORMAT_645; | |
| ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_H; | |
| if (imgdata.lens.Lens[0] == 'H') | |
| process_Hassy_Lens(LIBRAW_MOUNT_Hasselblad_H); | |
| } else if (((imHassy.CaptureSequenceInitiator[0] == 'X') && | |
| isdigit(imHassy.CaptureSequenceInitiator[1])) || | |
| !strncmp(imHassy.HostBody, "907", 3)) { | |
| ilm.CameraFormat = LIBRAW_FORMAT_CROP645; | |
| ilm.CameraMount = LIBRAW_MOUNT_Hasselblad_XCD; | |
| if (imgdata.lens.Lens[0] == 'H') { | |
| process_Hassy_Lens(LIBRAW_MOUNT_Hasselblad_H); | |
| strcpy(ilm.Adapter, "XH"); | |
| } else { | |
| if (imgdata.lens.Lens[0] == 'X') { | |
| process_Hassy_Lens(LIBRAW_MOUNT_Hasselblad_XCD); | |
| } else if (!imgdata.lens.Lens[0] && | |
| (aperture > 1.0f) && | |
| (focal_len > 10.0f)) { | |
| ilm.LensID = uint64_t(focal_len); | |
| if (ilm.LensID == 35) { | |
| ilm.FocalType = LIBRAW_FT_ZOOM_LENS; | |
| ilm.LensID = LIBRAW_MOUNT_Hasselblad_XCD*100000000ULL + | |
| 35*10000ULL + 75*10; | |
| } | |
| else { | |
| ilm.FocalType = LIBRAW_FT_PRIME_LENS; | |
| ilm.LensID = LIBRAW_MOUNT_Hasselblad_XCD*100000000ULL + | |
| ilm.LensID*10000ULL + ilm.LensID*10; | |
| } | |
| } | |
| } | |
| } | |
| // printf (">>Host Body: =%s= CaptureSequenceInitiator: =%s=\n", imHassy.HostBody, imHassy.CaptureSequenceInitiator); | |
| // printf (">> SensorCode: %d, CoatingCode: %d, Sensor: =%s=\n", imHassy.SensorCode, imHassy.CoatingCode, imHassy.Sensor); | |
| // printf (">> raw_width: %d, raw_height: %d\n", raw_width, raw_height); | |
| if (normalized_model[0] && !CM_found) | |
| CM_found = adobe_coeff(maker_index, normalized_model); | |
| } |