| /* -*- 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" |
| |
| void LibRaw::setOlympusBodyFeatures(unsigned long long id) |
| { |
| ilm.CamID = id; |
| |
| if ((id == OlyID_E_1) || |
| (id == OlyID_E_300) || |
| (id == OlyID_AIR_A01) || |
| ((id & 0xffff000000ULL) == 0x5330000000ULL)) |
| { |
| ilm.CameraFormat = LIBRAW_FORMAT_FT; |
| |
| if ((id == OlyID_E_1) || |
| (id == OlyID_E_300) || |
| ((id >= OlyID_E_330) && (id <= OlyID_E_520)) || |
| (id == OlyID_E_620) || |
| (id == OlyID_E_450) || |
| (id == OlyID_E_600) || |
| (id == OlyID_E_5)) |
| { |
| ilm.CameraMount = LIBRAW_MOUNT_FT; |
| } |
| else |
| { |
| ilm.CameraMount = LIBRAW_MOUNT_mFT; |
| } |
| } |
| |
| else |
| { |
| if ( |
| (id == OlyID_SH_2) || |
| (id == OlyID_TG_4) || |
| (id == OlyID_TG_5) || |
| (id == OlyID_TG_6) || |
| (id == OlyID_TG_7) || |
| (id == OlyID_XZ_10) |
| ) { |
| ilm.CameraFormat = LIBRAW_FORMAT_1div2p3INCH; |
| } |
| else |
| { |
| if ( |
| (id == OlyID_STYLUS_1) || |
| (id == OlyID_XZ_2) |
| ) { |
| ilm.CameraFormat = LIBRAW_FORMAT_1div1p7INCH; |
| } |
| } |
| ilm.LensMount = ilm.CameraMount = LIBRAW_MOUNT_FixedLens; |
| } |
| return; |
| } |
| |
| void LibRaw::getOlympus_CameraType2() |
| { |
| |
| if (OlyID != 0x0ULL) |
| return; |
| |
| int i = 0; |
| fread(imOly.CameraType2, 6, 1, ifp); |
| imOly.CameraType2[5] = 0; |
| while ((i < 6) && imOly.CameraType2[i]) |
| { |
| OlyID = OlyID << 8 | imOly.CameraType2[i]; |
| if (i < 5 && isspace(imOly.CameraType2[i + 1])) { |
| imOly.CameraType2[i + 1] = '\0'; |
| break; |
| } |
| i++; |
| } |
| if (OlyID == OlyID_NORMA) { |
| if (strcmp(model, "SP510UZ")) OlyID = OlyID_SP_510UZ; |
| else OlyID = 0x0ULL; |
| } |
| unique_id = OlyID; |
| setOlympusBodyFeatures(OlyID); |
| return; |
| } |
| |
| void LibRaw::getOlympus_SensorTemperature(unsigned len) |
| { |
| if (OlyID != 0x0ULL) |
| { |
| short temp = get2(); |
| if ((OlyID == OlyID_E_1) || |
| (OlyID == OlyID_E_M5) || |
| (len != 1)) |
| imCommon.SensorTemperature = (float)temp; |
| else if ((temp != -32768) && (temp != 0)) |
| { |
| if (temp > 199) |
| imCommon.SensorTemperature = 86.474958f - 0.120228f * (float)temp; |
| else |
| imCommon.SensorTemperature = (float)temp; |
| } |
| } |
| return; |
| } |
| |
| void LibRaw::parseOlympus_Equipment(unsigned tag, unsigned /*type */, unsigned len, |
| unsigned dng_writer) |
| { |
| // uptag 2010 |
| |
| switch (tag) |
| { |
| case 0x0100: |
| getOlympus_CameraType2(); |
| break; |
| case 0x0101: |
| if ((!imgdata.shootinginfo.BodySerial[0]) && (dng_writer == nonDNG)) |
| stmread(imgdata.shootinginfo.BodySerial, len, ifp); |
| break; |
| case 0x0102: |
| stmread(imgdata.shootinginfo.InternalBodySerial, len, ifp); |
| break; |
| case 0x0201: |
| { |
| unsigned char bits[4] = { 0,0,0,0 }; |
| fread(bits, 1, 4, ifp); |
| ilm.LensID = (unsigned long long)bits[0] << 16 | |
| (unsigned long long)bits[2] << 8 | (unsigned long long)bits[3]; |
| ilm.LensMount = LIBRAW_MOUNT_FT; |
| ilm.LensFormat = LIBRAW_FORMAT_FT; |
| if (((ilm.LensID < 0x20000) || (ilm.LensID > 0x4ffff)) && |
| (ilm.LensID & 0x10)) |
| ilm.LensMount = LIBRAW_MOUNT_mFT; |
| } |
| break; |
| case 0x0202: |
| if ((!imgdata.lens.LensSerial[0])) |
| stmread(imgdata.lens.LensSerial, len, ifp); |
| break; |
| case 0x0203: |
| stmread(ilm.Lens, len, ifp); |
| break; |
| case 0x0205: |
| ilm.MaxAp4MinFocal = libraw_powf64l(sqrt(2.0f), get2() / 256.0f); |
| break; |
| case 0x0206: |
| ilm.MaxAp4MaxFocal = libraw_powf64l(sqrt(2.0f), get2() / 256.0f); |
| break; |
| case 0x0207: |
| ilm.MinFocal = (float)get2(); |
| break; |
| case 0x0208: |
| ilm.MaxFocal = (float)get2(); |
| if (ilm.MaxFocal > 1000.0f) |
| ilm.MaxFocal = ilm.MinFocal; |
| break; |
| case 0x020a: |
| ilm.MaxAp4CurFocal = libraw_powf64l(sqrt(2.0f), get2() / 256.0f); |
| break; |
| case 0x0301: |
| ilm.TeleconverterID = fgetc(ifp) << 8; |
| fgetc(ifp); |
| ilm.TeleconverterID = ilm.TeleconverterID | fgetc(ifp); |
| break; |
| case 0x0303: |
| stmread(ilm.Teleconverter, len, ifp); |
| if (!strlen(ilm.Teleconverter) && strchr(ilm.Lens, '+')) { |
| if (strstr(ilm.Lens, "MC-20")) |
| strcpy(ilm.Teleconverter, "MC-20"); |
| else if (strstr(ilm.Lens, "MC-14")) |
| strcpy(ilm.Teleconverter, "MC-14"); |
| else if (strstr(ilm.Lens, "EC-20")) |
| strcpy(ilm.Teleconverter, "EC-20"); |
| else if (strstr(ilm.Lens, "EC-14")) |
| strcpy(ilm.Teleconverter, "EC-14"); } |
| break; |
| case 0x0403: |
| stmread(ilm.Attachment, len, ifp); |
| break; |
| } |
| |
| return; |
| } |
| void LibRaw::parseOlympus_CameraSettings(INT64 base, unsigned tag, unsigned type, |
| unsigned len, unsigned dng_writer) |
| { |
| // uptag 0x2020 |
| |
| int c; |
| switch (tag) |
| { |
| case 0x0101: |
| if (dng_writer == nonDNG) |
| { |
| thumb_offset = get4() + base; |
| } |
| break; |
| case 0x0102: |
| if (dng_writer == nonDNG) |
| { |
| thumb_length = get4(); |
| } |
| break; |
| case 0x0200: |
| imgdata.shootinginfo.ExposureMode = get2(); |
| break; |
| case 0x0202: |
| imgdata.shootinginfo.MeteringMode = get2(); |
| break; |
| case 0x0301: |
| imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = get2(); |
| if (len == 2) |
| { |
| imOly.FocusMode[1] = get2(); |
| } |
| break; |
| case 0x0304: |
| for (c = 0; c < 64; c++) |
| { |
| imOly.AFAreas[c] = get4(); |
| } |
| break; |
| case 0x0305: |
| for (c = 0; c < 5; c++) |
| { |
| imOly.AFPointSelected[c] = getreal(type); |
| } |
| break; |
| case 0x0306: |
| imOly.AFFineTune = fgetc(ifp); |
| break; |
| case 0x0307: |
| FORC3 imOly.AFFineTuneAdj[c] = get2(); |
| break; |
| case 0x0401: |
| imCommon.FlashEC = getrealf(type); |
| break; |
| case 0x0507: |
| imOly.ColorSpace = get2(); |
| switch (imOly.ColorSpace) { |
| case 0: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; |
| break; |
| case 1: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; |
| break; |
| case 2: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_ProPhotoRGB; |
| break; |
| default: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; |
| break; |
| } |
| break; |
| case 0x0600: |
| imgdata.shootinginfo.DriveMode = imOly.DriveMode[0] = get2(); |
| for (c = 1; c < (int)len && c < 5; c++) |
| { |
| imOly.DriveMode[c] = get2(); |
| } |
| break; |
| case 0x0601: |
| imOly.Panorama_mode = get2(); |
| imOly.Panorama_frameNum = get2(); |
| break; |
| case 0x0604: |
| imgdata.shootinginfo.ImageStabilization = get4(); |
| break; |
| case 0x0804: |
| imOly.StackedImage[0] = get4(); |
| imOly.StackedImage[1] = get4(); |
| if (imOly.StackedImage[0] == 3) { |
| imOly.isLiveND = 1; |
| imOly.LiveNDfactor = imOly.StackedImage[1]; |
| } else { |
| imOly.isLiveND = 0; |
| } |
| break; |
| } |
| |
| return; |
| } |
| |
| void LibRaw::parseOlympus_ImageProcessing(unsigned tag, unsigned type, |
| unsigned len, unsigned dng_writer) |
| { |
| // uptag 0x2040 |
| |
| int i, c, wb[4], nWB, tWB, wbG; |
| ushort CT; |
| short sorder; |
| |
| if ((tag == 0x0100) && (dng_writer == nonDNG)) |
| { |
| cam_mul[0] = float(get2()) / 256.f; |
| cam_mul[2] = float(get2()) / 256.f; |
| } |
| else if ((tag == 0x0101) && (len == 2) && |
| ((OlyID == OlyID_E_410) || (OlyID == OlyID_E_510))) |
| { |
| for (i = 0; i < 64; i++) |
| { |
| icWBCCTC[i][2] = icWBCCTC[i][4] = 256.f; |
| icWBC[i][1] = icWBC[i][3] = 0x100; |
| } |
| for (i = 64; i < 256; i++) |
| { |
| icWBC[i][1] = icWBC[i][3] = 0x100; |
| } |
| } |
| else if ((tag > 0x0101) && (tag <= 0x0111)) |
| { |
| nWB = tag - 0x0101; |
| tWB = Oly_wb_list2[nWB << 1]; |
| CT = Oly_wb_list2[(nWB << 1) | 1]; |
| wb[0] = get2(); |
| wb[2] = get2(); |
| if (tWB != 0x100) |
| { |
| icWBC[tWB][0] = wb[0]; |
| icWBC[tWB][2] = wb[2]; |
| } |
| if (CT) |
| { |
| icWBCCTC[nWB - 1][0] = CT; |
| icWBCCTC[nWB - 1][1] = float(wb[0]); |
| icWBCCTC[nWB - 1][3] = float(wb[2]); |
| } |
| if (len == 4) |
| { |
| wb[1] = get2(); |
| wb[3] = get2(); |
| if (tWB != 0x100) |
| { |
| icWBC[tWB][1] = wb[1]; |
| icWBC[tWB][3] = wb[3]; |
| } |
| if (CT) |
| { |
| icWBCCTC[nWB - 1][2] = float(wb[1]); |
| icWBCCTC[nWB - 1][4] = float(wb[3]); |
| } |
| } |
| } |
| else if ((tag >= 0x0112) && (tag <= 0x011e)) |
| { |
| nWB = tag - 0x0112; |
| wbG = get2(); |
| tWB = Oly_wb_list2[nWB << 1]; |
| if (nWB) |
| icWBCCTC[nWB - 1][2] = icWBCCTC[nWB - 1][4] = float(wbG); |
| if (tWB != 0x100) |
| icWBC[tWB][1] = icWBC[tWB][3] = wbG; |
| } |
| else if (tag == 0x011f) |
| { |
| wbG = get2(); |
| if (icWBC[LIBRAW_WBI_Flash][0]) |
| icWBC[LIBRAW_WBI_Flash][1] = |
| icWBC[LIBRAW_WBI_Flash][3] = wbG; |
| FORC4 if (icWBC[LIBRAW_WBI_Custom1 + c][0]) |
| icWBC[LIBRAW_WBI_Custom1 + c][1] = |
| icWBC[LIBRAW_WBI_Custom1 + c][3] = wbG; |
| } |
| else if (tag == 0x0121) |
| { |
| icWBC[LIBRAW_WBI_Flash][0] = get2(); |
| icWBC[LIBRAW_WBI_Flash][2] = get2(); |
| if (len == 4) |
| { |
| icWBC[LIBRAW_WBI_Flash][1] = get2(); |
| icWBC[LIBRAW_WBI_Flash][3] = get2(); |
| } |
| } |
| else if ((tag == 0x0200) && (dng_writer == nonDNG) && |
| strcmp(software, "v757-71")) |
| { |
| for (i = 0; i < 3; i++) |
| { |
| if (!imOly.ColorSpace) |
| { |
| FORC3 cmatrix[i][c] = float((short)get2()) / 256.f; |
| } |
| else |
| { |
| FORC3 imgdata.color.ccm[i][c] = float((short)get2()) / 256.f; |
| } |
| } |
| } |
| else if ((tag == 0x0600) && (dng_writer == nonDNG)) |
| { |
| FORC4 cblack[RGGB_2_RGBG(c)] = get2(); |
| } |
| else if ((tag == 0x0611) && (dng_writer == nonDNG)) |
| { |
| imOly.ValidBits = get2(); |
| } |
| else if ((tag == 0x0612) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].cleft = get2(); |
| } |
| else if ((tag == 0x0613) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].ctop = get2(); |
| } |
| else if ((tag == 0x0614) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].cwidth = get2(); |
| } |
| else if ((tag == 0x0615) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].cheight = get2(); |
| } |
| else if ((tag == 0x0640) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX640 = get2(); |
| } |
| else if ((tag == 0x0641) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX641 = get2(); |
| } |
| else if ((tag == 0x0642) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX642 = get2(); |
| } |
| else if ((tag == 0x0643) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX643 = get2(); |
| } |
| else if ((tag == 0x0644) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX644 = get2(); |
| } |
| else if ((tag == 0x0645) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX645 = get2(); |
| } |
| else if ((tag == 0x0646) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX646 = get2(); |
| } |
| else if ((tag == 0x0647) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX647 = get2(); |
| } |
| else if ((tag == 0x0648) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX648 = get2(); |
| } |
| else if ((tag == 0x0649) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX649 = get2(); |
| } |
| else if ((tag == 0x0650) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX650 = get2(); |
| } |
| else if ((tag == 0x0651) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX651 = get2(); |
| } |
| else if ((tag == 0x0652) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX652 = get2(); |
| } |
| else if ((tag == 0x0653) && (dng_writer == nonDNG)) |
| { |
| imOly.tagX653 = get2(); |
| } |
| else if ((tag == 0x0805) && (len == 2)) |
| { |
| imOly.SensorCalibration[0] = int(getreal(type)); |
| imOly.SensorCalibration[1] = int(getreal(type)); |
| if ((dng_writer == nonDNG) && (OlyID != OlyID_XZ_1)) |
| FORC4 imgdata.color.linear_max[c] = imOly.SensorCalibration[0]; |
| } |
| else if (tag == 0x1112) |
| { |
| sorder = order; |
| order = 0x4d4d; |
| c = get2(); |
| order = sorder; |
| switch (c) { |
| case 0x0101: |
| case 0x0901: |
| case 0x0909: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_4to3; |
| break; |
| case 0x0104: |
| case 0x0401: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; |
| break; |
| case 0x0201: |
| case 0x0202: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2; |
| break; |
| case 0x0301: |
| case 0x0303: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9; |
| break; |
| case 0x0404: |
| // imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_6to6; |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1; |
| break; |
| case 0x0505: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_5to4; |
| break; |
| case 0x0606: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_7to6; |
| break; |
| case 0x0707: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_6to5; |
| break; |
| case 0x0808: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_7to5; |
| break; |
| default: |
| imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_OTHER; |
| break; |
| } |
| } |
| else if (tag == 0x1113) |
| { |
| imOly.AspectFrame[0] = get2(); |
| imOly.AspectFrame[1] = get2(); |
| imOly.AspectFrame[2] = get2(); |
| imOly.AspectFrame[3] = get2(); |
| } |
| else if (tag == 0x1306) |
| { |
| c = get2(); |
| if ((c != 0) && (c != 100)) |
| { |
| if (c < 61) |
| imCommon.CameraTemperature = (float)c; |
| else |
| imCommon.CameraTemperature = (float)(c - 32) / 1.8f; |
| if ((imCommon.exifAmbientTemperature > -273.15f) && |
| ((OlyID == OlyID_TG_5) || |
| (OlyID == OlyID_TG_6) || |
| (OlyID == OlyID_TG_7)) |
| ) |
| imCommon.CameraTemperature += imCommon.exifAmbientTemperature; |
| } |
| } |
| |
| return; |
| } |
| |
| void LibRaw::parseOlympus_RawInfo(unsigned tag, unsigned /*type */, unsigned len, |
| unsigned dng_writer) |
| { |
| // uptag 0x3000 |
| |
| int wb_ind, c, i; |
| |
| if ((tag == 0x0110) && strcmp(software, "v757-71")) |
| { |
| icWBC[LIBRAW_WBI_Auto][0] = get2(); |
| icWBC[LIBRAW_WBI_Auto][2] = get2(); |
| if (len == 2) |
| { |
| for (i = 0; i < 256; i++) |
| icWBC[i][1] = icWBC[i][3] = 0x100; |
| } |
| } |
| else if ((((tag >= 0x0120) && (tag <= 0x0124)) || |
| ((tag >= 0x0130) && (tag <= 0x0133))) && |
| strcmp(software, "v757-71")) |
| { |
| if (tag <= 0x0124) |
| wb_ind = tag - 0x0120; |
| else |
| wb_ind = tag - 0x0130 + 5; |
| |
| icWBC[Oly_wb_list1[wb_ind]][0] = get2(); |
| icWBC[Oly_wb_list1[wb_ind]][2] = get2(); |
| } |
| else if ((tag == 0x0200) && (dng_writer == nonDNG)) |
| { |
| for (i = 0; i < 3; i++) |
| { |
| if (!imOly.ColorSpace) |
| { |
| FORC3 cmatrix[i][c] = float((short)get2()) / 256.f; |
| } |
| else |
| { |
| FORC3 imgdata.color.ccm[i][c] = float((short)get2()) / 256.f; |
| } |
| } |
| } |
| else if ((tag == 0x0600) && (dng_writer == nonDNG)) |
| { |
| FORC4 cblack[RGGB_2_RGBG(c)] = get2(); |
| } |
| else if ((tag == 0x0612) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].cleft = get2(); |
| } |
| else if ((tag == 0x0613) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].ctop = get2(); |
| } |
| else if ((tag == 0x0614) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].cwidth = get2(); |
| } |
| else if ((tag == 0x0615) && (dng_writer == nonDNG)) |
| { |
| imgdata.sizes.raw_inset_crops[0].cheight = get2(); |
| } |
| return; |
| } |
| |
| |
| void LibRaw::parseOlympusMakernotes (INT64 base, unsigned tag, unsigned type, unsigned len, unsigned dng_writer) { |
| |
| int c; |
| unsigned a; |
| if ((tag >= 0x20100000) && (tag <= 0x2010ffff)) { |
| parseOlympus_Equipment((tag & 0x0000ffff), type, len, dng_writer); |
| |
| } else if ((tag >= 0x20200000) && (tag <= 0x2020ffff)) { |
| parseOlympus_CameraSettings(base, (tag & 0x0000ffff), type, len, dng_writer); |
| |
| } else if ((tag >= 0x20400000) && (tag <= 0x2040ffff)) { |
| parseOlympus_ImageProcessing((tag & 0x0000ffff), type, len, dng_writer); |
| |
| } else if ((tag >= 0x30000000) && (tag <= 0x3000ffff)) { |
| parseOlympus_RawInfo((tag & 0x0000ffff), type, len, dng_writer); |
| |
| } else { |
| switch (tag) { |
| case 0x0200: |
| FORC3 if ((imOly.SpecialMode[c] = get4()) >= 0xff) imOly.SpecialMode[c] = 0xffffffff; |
| break; |
| case 0x0207: |
| getOlympus_CameraType2(); |
| break; |
| case 0x0404: |
| case 0x101a: |
| if (!imgdata.shootinginfo.BodySerial[0] && (dng_writer == nonDNG)) |
| stmread(imgdata.shootinginfo.BodySerial, len, ifp); |
| break; |
| case 0x1002: |
| ilm.CurAp = float(libraw_powf64l(2.0f, getrealf(type) / 2.f)); |
| break; |
| case 0x1007: |
| imCommon.SensorTemperature = (float)get2(); |
| break; |
| case 0x1008: |
| imCommon.LensTemperature = (float)get2(); |
| break; |
| case 0x100b: |
| if (imOly.FocusMode[0] == 0xffff) { |
| imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = get2(); |
| if (imgdata.shootinginfo.FocusMode == 1) |
| imgdata.shootinginfo.FocusMode = imOly.FocusMode[0] = 10; |
| } |
| break; |
| case 0x100d: |
| if (imOly.ZoomStepCount == 0xffff) imOly.ZoomStepCount = get2(); |
| break; |
| case 0x100e: |
| if (imOly.FocusStepCount == 0xffff) imOly.FocusStepCount = get2(); |
| break; |
| case 0x1011: |
| if (strcmp(software, "v757-71") && (dng_writer == nonDNG)) { |
| for (int i = 0; i < 3; i++) { |
| if (!imOly.ColorSpace) { |
| FORC3 cmatrix[i][c] = float((short)get2()) / 256.f; |
| } else { |
| FORC3 imgdata.color.ccm[i][c] = float((short)get2()) / 256.f; |
| } |
| } |
| } |
| break; |
| case 0x1012: |
| if (dng_writer == nonDNG) |
| FORC4 cblack[RGGB_2_RGBG(c)] = get2(); |
| break; |
| case 0x1017: |
| if (dng_writer == nonDNG) |
| cam_mul[0] = float(get2()) / 256.f; |
| break; |
| case 0x1018: |
| if (dng_writer == nonDNG) |
| cam_mul[2] = float(get2()) / 256.f; |
| break; |
| case 0x102c: |
| if (dng_writer == nonDNG) |
| imOly.ValidBits = get2(); |
| break; |
| case 0x1038: |
| imOly.AFResult = get2(); |
| break; |
| case 0x103b: |
| if (imOly.FocusStepInfinity == 0xffff) imOly.FocusStepInfinity = get2(); |
| break; |
| case 0x103c: |
| if (imOly.FocusStepNear == 0xffff) imOly.FocusStepNear = get2(); |
| break; |
| case 0x20300108: |
| case 0x20310109: |
| if (dng_writer == nonDNG) { |
| imOly.ColorSpace = get2(); |
| switch (imOly.ColorSpace) { |
| case 0: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB; |
| break; |
| case 1: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB; |
| break; |
| case 2: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_ProPhotoRGB; |
| break; |
| default: |
| imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown; |
| break; |
| } |
| } |
| case 0x20500209: |
| imOly.AutoFocus = get2(); |
| break; |
| case 0x20500300: |
| imOly.ZoomStepCount = get2(); |
| break; |
| case 0x20500301: |
| imOly.FocusStepCount = get2(); |
| break; |
| case 0x20500303: |
| imOly.FocusStepInfinity = get2(); |
| break; |
| case 0x20500304: |
| imOly.FocusStepNear = get2(); |
| break; |
| case 0x20500305: |
| a = get4(); |
| /*b = */ get4(); // b is not used, so removed |
| if (a >= 0x7f000000) imOly.FocusDistance = -1.0; // infinity |
| else imOly.FocusDistance = (double) a / 1000.0; // convert to meters |
| break; |
| case 0x20500308: |
| imOly.AFPoint = get2(); |
| break; |
| case 0x20501500: |
| getOlympus_SensorTemperature(len); |
| break; |
| } |
| } |
| } |