/* -*- 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::setPentaxBodyFeatures(unsigned long long id)
{

  ilm.CamID = id;

  switch (id) {
  case PentaxID_staristD:
  case PentaxID_staristDS:
  case PentaxID_staristDL:
  case PentaxID_staristDS2:
  case PentaxID_GX_1S:
  case PentaxID_staristDL2:
  case PentaxID_GX_1L:
  case PentaxID_K100D:
  case PentaxID_K110D:
  case PentaxID_K100D_Super:
  case PentaxID_K10D:
  case PentaxID_GX10:
  case PentaxID_K20D:
  case PentaxID_GX20:
  case PentaxID_K200D:
  case PentaxID_K2000:
  case PentaxID_K_m:
  case PentaxID_K_x:
  case PentaxID_K_r:
  case PentaxID_K_01:
  case PentaxID_K_3:
  case PentaxID_K_3_II:
  case PentaxID_K_3_III:
  case PentaxID_K_3_III_Mono:
  case PentaxID_K_5:
  case PentaxID_K_5_II:
  case PentaxID_K_5_II_s:
  case PentaxID_K_7:
  case PentaxID_K_30:
  case PentaxID_K_50:
  case PentaxID_K_70:
  case PentaxID_K_500:
  case PentaxID_K_S1:
  case PentaxID_K_S2:
  case PentaxID_KF:
  case PentaxID_KP:
    ilm.CameraMount = LIBRAW_MOUNT_Pentax_K;
    ilm.CameraFormat = LIBRAW_FORMAT_APSC;
    break;
  case PentaxID_K_1:
  case PentaxID_K_1_Mark_II:
    ilm.CameraMount = LIBRAW_MOUNT_Pentax_K;
    ilm.CameraFormat = LIBRAW_FORMAT_FF;
    break;
  case PentaxID_645D:
  case PentaxID_645Z:
    ilm.CameraMount = LIBRAW_MOUNT_Pentax_645;
    ilm.CameraFormat = LIBRAW_FORMAT_CROP645;
    break;
  case PentaxID_Q:
  case PentaxID_Q10:
    ilm.CameraMount = LIBRAW_MOUNT_Pentax_Q;
    ilm.CameraFormat = LIBRAW_FORMAT_1div2p3INCH;
    break;
  case PentaxID_Q7:
  case PentaxID_Q_S1:
    ilm.CameraMount = LIBRAW_MOUNT_Pentax_Q;
    ilm.CameraFormat = LIBRAW_FORMAT_1div1p7INCH;
    break;
  case PentaxID_MX_1:
    ilm.LensMount = LIBRAW_MOUNT_FixedLens;
    ilm.CameraMount = LIBRAW_MOUNT_FixedLens;
    ilm.CameraFormat = LIBRAW_FORMAT_1div1p7INCH;
    ilm.FocalType = LIBRAW_FT_ZOOM_LENS;
    break;
  case PentaxID_GR_III:
  case PentaxID_GR_IIIx:
    ilm.CameraMount = LIBRAW_MOUNT_FixedLens;
    ilm.LensMount = LIBRAW_MOUNT_FixedLens;
    ilm.CameraFormat = LIBRAW_FORMAT_APSC;
    ilm.LensFormat = LIBRAW_FORMAT_APSC;
    ilm.FocalType = LIBRAW_FT_PRIME_LENS;
    break;
  default:
    ilm.LensMount = LIBRAW_MOUNT_FixedLens;
    ilm.CameraMount = LIBRAW_MOUNT_FixedLens;
  }
  return;
}

void LibRaw::PentaxISO(ushort c)
{
  int code[] = {3,    4,    5,   6,   7,   8,   9,   10,  11,  12,  13,  14,
                15,   16,   17,  18,  19,  20,  21,  22,  23,  24,  25,  26,
                27,   28,   29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
                39,   40,   41,  42,  43,  44,  45,  50,  100, 200, 400, 800,
                1600, 3200, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
                268,  269,  270, 271, 272, 273, 274, 275, 276, 277, 278};
  double value[] = {
      50,     64,     80,     100,    125,    160,    200,    250,    320,
      400,    500,    640,    800,    1000,   1250,   1600,   2000,   2500,
      3200,   4000,   5000,   6400,   8000,   10000,  12800,  16000,  20000,
      25600,  32000,  40000,  51200,  64000,  80000,  102400, 128000, 160000,
      204800, 258000, 325000, 409600, 516000, 650000, 819200, 50,     100,
      200,    400,    800,    1600,   3200,   50,     70,     100,    140,
      200,    280,    400,    560,    800,    1100,   1600,   2200,   3200,
      4500,   6400,   9000,   12800,  18000,  25600,  36000,  51200};
#define numel (sizeof(code) / sizeof(code[0]))
  int i;
  for (i = 0; i < (int)numel; i++)
  {
    if (code[i] == c)
    {
      iso_speed = float(value[i]);
      return;
    }
  }
  if (i == numel)
    iso_speed = 65535.0f;
}
#undef numel

void LibRaw::PentaxLensInfo(unsigned long long id, unsigned len) // tag 0x0207
{
  ushort iLensData = 0;
  uchar *table_buf;
  table_buf = (uchar *)calloc(MAX(len, 128)+1,1);
  fread(table_buf, len, 1, ifp);
  if ((id < PentaxID_K100D) ||
      (((id == PentaxID_K100D) ||
        (id == PentaxID_K110D) ||
        (id == PentaxID_K100D_Super)) &&
       ((!table_buf[20] ||
        (table_buf[20] == 0xff)))))
  {
    iLensData = 3;
    if (ilm.LensID == LIBRAW_LENS_NOT_SET)
      ilm.LensID = (((unsigned)table_buf[0]) << 8) + table_buf[1];
  }
  else
    switch (len)
    {
    case 90: // LensInfo3
      iLensData = 13;
      if (ilm.LensID == LIBRAW_LENS_NOT_SET)
        ilm.LensID = ((unsigned)((table_buf[1] & 0x0f) + table_buf[3]) << 8) +
                     table_buf[4];
      break;
    case 91: // LensInfo4
      iLensData = 12;
      if (ilm.LensID == LIBRAW_LENS_NOT_SET)
        ilm.LensID = ((unsigned)((table_buf[1] & 0x0f) + table_buf[3]) << 8) +
                     table_buf[4];
      break;
    case 80: // LensInfo5
    case 128:
      iLensData = 15;
      if (ilm.LensID == LIBRAW_LENS_NOT_SET)
        ilm.LensID = ((unsigned)((table_buf[1] & 0x0f) + table_buf[4]) << 8) +
                     table_buf[5];
      break;
    case 168: // Ricoh GR III, id 0x1320e
      break;
    default:
      if (id >= 0x12b9cULL) // LensInfo2
      {
        iLensData = 4;
        if (ilm.LensID == LIBRAW_LENS_NOT_SET)
          ilm.LensID = ((unsigned)((table_buf[0] & 0x0f) + table_buf[2]) << 8) +
                       table_buf[3];
      }
    }
  if (iLensData)
  {
    if (table_buf[iLensData + 9] && (fabs(ilm.CurFocal) < 0.1f))
      ilm.CurFocal = 10.f * (table_buf[iLensData + 9] >> 2) *
                     libraw_powf64l(4.f, float((table_buf[iLensData + 9] & 0x03) - 2.f));
    if (table_buf[iLensData + 10] & 0xf0)
      ilm.MaxAp4CurFocal = libraw_powf64l(
          2.0f, (float)((table_buf[iLensData + 10] & 0xf0) >> 4) / 4.0f);
    if (table_buf[iLensData + 10] & 0x0f)
      ilm.MinAp4CurFocal = libraw_powf64l(
          2.0f, (float)((table_buf[iLensData + 10] & 0x0f) + 10) / 4.0f);

    if (iLensData != 12)
    {
      switch (table_buf[iLensData] & 0x06)
      {
      case 0:
        ilm.MinAp4MinFocal = 22.0f;
        break;
      case 2:
        ilm.MinAp4MinFocal = 32.0f;
        break;
      case 4:
        ilm.MinAp4MinFocal = 45.0f;
        break;
      case 6:
        ilm.MinAp4MinFocal = 16.0f;
        break;
      }
      if (table_buf[iLensData] & 0x70)
        ilm.LensFStops =
            ((float)(((table_buf[iLensData] & 0x70) >> 4) ^ 0x07)) / 2.0f +
            5.0f;

      ilm.MinFocusDistance = (float)(table_buf[iLensData + 3] & 0xf8);
      ilm.FocusRangeIndex = (float)(table_buf[iLensData + 3] & 0x07);

      if ((table_buf[iLensData + 14] > 1) && (fabs(ilm.MaxAp4CurFocal) < 0.7f))
        ilm.MaxAp4CurFocal = libraw_powf64l(
            2.0f, (float)((table_buf[iLensData + 14] & 0x7f) - 1) / 32.0f);
    }
    else if ((id != 0x12e76ULL) && // K-5
             (table_buf[iLensData + 15] > 1) &&
             (fabs(ilm.MaxAp4CurFocal) < 0.7f))
    {
      ilm.MaxAp4CurFocal = libraw_powf64l(
          2.0f, (float)((table_buf[iLensData + 15] & 0x7f) - 1) / 32.0f);
    }
  }
  free(table_buf);
  return;
}

void LibRaw::parsePentaxMakernotes(INT64 /*base*/, unsigned tag, unsigned type,
                                   unsigned len, unsigned dng_writer)
{

  int c;
// printf ("==>> =%s= tag:0x%x, type: %d, len:%d\n", model, tag, type, len);

  if (tag == 0x0005)
  {
    unique_id = get4();
    setPentaxBodyFeatures(unique_id);
  }
  else if (tag == 0x0008)
  { /* 4 is raw, 7 is raw w/ pixel shift, 8 is raw w/ dynamic pixel shift */
    imPentax.Quality = get2();
  }
  else if (tag == 0x000d)
  {
    imgdata.shootinginfo.FocusMode = imPentax.FocusMode[0] = get2();
  }
  else if (tag == 0x000e)
  {
    imgdata.shootinginfo.AFPoint = imPentax.AFPointSelected[0] = get2();
    if (len == 2)
      imPentax.AFPointSelected_Area = get2();
  }
  else if (tag == 0x000f)
  {
    if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG))
    {
      imPentax.AFPointsInFocus = get4();
      if (!imPentax.AFPointsInFocus) imPentax.AFPointsInFocus = 0xffffffff;
      else imPentax.AFPointsInFocus_version = 3;
    }
    else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT))
    {
      imPentax.AFPointsInFocus = (unsigned) get2();
      if (imPentax.AFPointsInFocus == 0x0000ffff)
        imPentax.AFPointsInFocus = 0xffffffff;
      else imPentax.AFPointsInFocus_version = 2;
    }
  }
  else if (tag == 0x0010)
  {
    imPentax.FocusPosition = get2();
  }
  else if (tag == 0x0013)
  {
    ilm.CurAp = (float)get2() / 10.0f;
  }
  else if (tag == 0x0014)
  {
    PentaxISO(get2());
  }
  else if (tag == 0x0017)
  {
    imgdata.shootinginfo.MeteringMode = get2();
  }
  else if (tag == 0x001b) {
    cam_mul[2] = float(get2()) / 256.f;
  }
  else if (tag == 0x001c) {
	  cam_mul[0] = float(get2()) / 256.f;
  }
  else if (tag == 0x001d)
  {
    ilm.CurFocal = (float)get4() / 100.0f;
  }
  else if (tag == 0x0034)
  {
    uchar uc;
    FORC4
    {
      fread(&uc, 1, 1, ifp);
      imPentax.DriveMode[c] = uc;
    }
    imgdata.shootinginfo.DriveMode = imPentax.DriveMode[0];
  }
  else if (tag == 0x0037) {
    switch (get2()) {
    case 0:
      imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB;
      break;
    case 1:
      imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB;
      break;
    default:
      imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown;
      break;
    }
  }
  else if (tag == 0x0038)
  {
    imgdata.sizes.raw_inset_crops[0].cleft = get2();
    imgdata.sizes.raw_inset_crops[0].ctop = get2();
  }
  else if (tag == 0x0039)
  {
    imgdata.sizes.raw_inset_crops[0].cwidth = get2();
    imgdata.sizes.raw_inset_crops[0].cheight = get2();
  }
  else if (tag == 0x003c)
  {
    if ((len == 4) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED)) {
      imPentax.AFPointsInFocus = get4() & 0x7ff;
      if (!imPentax.AFPointsInFocus) {
        imPentax.AFPointsInFocus = 0xffffffff;
      }
      else {
        imPentax.AFPointsInFocus_version = 1;
      }
    }
  }
  else if (tag == 0x003f)
  {
    unsigned a = unsigned(fgetc(ifp)) << 8;
    ilm.LensID = a | fgetc(ifp);
  }
  else if (tag == 0x0047)
  {
    imCommon.CameraTemperature = (float)fgetc(ifp);
  }
  else if (tag == 0x004d)
  {
    if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SLONG))
      imCommon.FlashEC = getrealf(type) / 256.0f;
    else
      imCommon.FlashEC = (float)((signed short)fgetc(ifp)) / 6.0f;
  }
  else if (tag == 0x005c)
  {
    fgetc(ifp);
    imgdata.shootinginfo.ImageStabilization = (short)fgetc(ifp);
  }
  else if (tag == 0x0069)
  {
    uchar uc;
    FORC4
    {
      fread(&uc, 1, 1, ifp);
      imPentax.DynamicRangeExpansion[c] = uc;
    }
  }
  else if (tag == 0x0072)
  {
    imPentax.AFAdjustment = get2();
  }
  else if ((tag == 0x007e) && (dng_writer == nonDNG))
  {
    imgdata.color.linear_max[0] = imgdata.color.linear_max[1] =
        imgdata.color.linear_max[2] = imgdata.color.linear_max[3] =
            get4();
  }
  else if (tag == 0x0080)
  {
    short a = (short)fgetc(ifp);
    switch (a)
    {
    case 0:
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_4to3;
      break;
    case 1:
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2;
      break;
    case 2:
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9;
      break;
    case 3:
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1;
      break;
    }
  }

  else if ((tag == 0x0200) && (dng_writer == nonDNG)) { // Pentax black level
    FORC4 cblack[RGGB_2_RGBG(c)] = get2();
  }

  else if ((tag == 0x0201) && (dng_writer == nonDNG)) { // Pentax As Shot WB
    FORC4 cam_mul[RGGB_2_RGBG(c)] = get2();
  }

  else if ((tag == 0x0203) && (dng_writer == nonDNG))
  {
    for (int i = 0; i < 3; i++)
      FORC3 cmatrix[i][c] = float((short)get2()) / 8192.f;
  }
  else if (tag == 0x0205)
  {
    if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT)
    {
      imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag;
      imCommon.afdata[imCommon.afcount].AFInfoData_order = order;
      imCommon.afdata[imCommon.afcount].AFInfoData_length = len;
      imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)calloc(imCommon.afdata[imCommon.afcount].AFInfoData_length+1,1);
      fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp);
      if ((len < 25) && (len >= 11))
      {
        imPentax.AFPointMode = (imCommon.afdata[imCommon.afcount].AFInfoData[3] >>4) & 0x0f;
        imPentax.FocusMode[1] = imCommon.afdata[imCommon.afcount].AFInfoData[3] & 0x0f;
        imPentax.AFPointSelected[1] = sget2(imCommon.afdata[imCommon.afcount].AFInfoData+4);
// Pentax K-m has multiexposure set to 8 when no multi-exposure is in effect
        imPentax.MultiExposure = imCommon.afdata[imCommon.afcount].AFInfoData[10] & 0x0f;
      }
      imCommon.afcount++;
    }
  }
  else if (tag == 0x0207)
  {
    if (len < 65535) // Safety belt
      PentaxLensInfo(ilm.CamID, len);
  }
  else if ((tag >= 0x020d) && (tag <= 0x0214))
  {
    FORC4 icWBC[Pentax_wb_list1[tag - 0x020d]][RGGB_2_RGBG(c)] = get2();
  }
  else if ((tag == 0x021d) && (len == 18) &&
           tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED) && (dng_writer == nonDNG))
  {
    for (int i = 0; i < 3; i++)
      FORC3 cmatrix[i][c] = float((short)get2()) / 8192.f;
  }
  else if (tag == 0x021f)
  {
    if ((unique_id != PentaxID_K_1)    &&
        (unique_id != PentaxID_K_3)    &&
        (unique_id != PentaxID_K_3_II) &&
        (unique_id != PentaxID_K_1_Mark_II))
    {
      fseek (ifp, 0x0b, SEEK_CUR);
      imPentax.AFPointsInFocus = (unsigned) fgetc(ifp);
      if (!imPentax.AFPointsInFocus) imPentax.AFPointsInFocus = 0xffffffff;
      else imPentax.AFPointsInFocus_version = 4;
    }
  }
  else if ((tag == 0x0220) && (dng_writer == nonDNG)) {
    meta_offset = ftell(ifp);
  }
  else if (tag == 0x0221)
  {
    int nWB = get2();
    if (nWB > 0 && nWB <= int(sizeof(icWBCCTC) / sizeof(icWBCCTC[0])))
      FORC(nWB)
      {
        icWBCCTC[c][0] = float((unsigned)0xcfc6 - get2());
        fseek(ifp, 2, SEEK_CUR);
        icWBCCTC[c][1] = get2();
        icWBCCTC[c][2] = icWBCCTC[c][4] = 0x2000;
        icWBCCTC[c][3] = get2();
      }
  }
  else if (tag == 0x0215)
  {
    fseek(ifp, 16, SEEK_CUR);
    sprintf(imgdata.shootinginfo.InternalBodySerial, "%d", get4());
  }
  else if (tag == 0x0229)
  {
    stmread(imgdata.shootinginfo.BodySerial, len, ifp);
  }
  else if (tag == 0x022d)
  {
    int wb_ind;
    getc(ifp);
    for (int wb_cnt = 0; wb_cnt < (int)Pentax_wb_list2.size(); wb_cnt++)
    {
      wb_ind = getc(ifp);
      if (wb_ind >= 0 && wb_ind < (int)Pentax_wb_list2.size() )
        FORC4 icWBC[Pentax_wb_list2[wb_ind]][RGGB_2_RGBG(c)] = get2();
    }
  }
  else if (tag == 0x0239) // Q-series lens info (LensInfoQ)
  {
    char LensInfo[20];
    fseek(ifp, 12, SEEK_CUR);
    stread(ilm.Lens, 30, ifp);
    strcat(ilm.Lens, " ");
    stread(LensInfo, 20, ifp);
    strcat(ilm.Lens, LensInfo);
  }
  else if (tag == 0x0245)
  {
    if (imCommon.afcount < LIBRAW_AFDATA_MAXCOUNT) {
      imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag;
      imCommon.afdata[imCommon.afcount].AFInfoData_order = order;
      imCommon.afdata[imCommon.afcount].AFInfoData_length = len;
      imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)calloc(imCommon.afdata[imCommon.afcount].AFInfoData_length+1,1);
      fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp);
      imCommon.afcount++;
    }
  }
}

void LibRaw::parseRicohMakernotes(INT64 /*base*/, unsigned tag, unsigned type,
                                  unsigned /*len*/, unsigned /*dng_writer */)
{
  char buffer[17];
  if (tag == 0x0005)
  {
    int c;
    int count = 0;
    fread(buffer, 16, 1, ifp);
    buffer[16] = 0;
    FORC(16)
    {
      if ((isspace(buffer[c])) || (buffer[c] == 0x2D) || (isalnum(buffer[c])))
        count++;
      else
        break;
    }
    if (count == 16)
    {
      if (strncmp(model, "GXR", 3))
      {
        sprintf(imgdata.shootinginfo.BodySerial, "%8s", buffer + 8);
      }
      buffer[8] = 0;
      sprintf(imgdata.shootinginfo.InternalBodySerial, "%8s", buffer);
    }
    else
    {
      sprintf(imgdata.shootinginfo.BodySerial, "%02x%02x%02x%02x", buffer[4],
              buffer[5], buffer[6], buffer[7]);
      sprintf(imgdata.shootinginfo.InternalBodySerial, "%02x%02x%02x%02x",
              buffer[8], buffer[9], buffer[10], buffer[11]);
    }
  }
  else if ((tag == 0x1001) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT))
  {
    ilm.CameraMount = LIBRAW_MOUNT_FixedLens;
    ilm.LensMount = LIBRAW_MOUNT_FixedLens;
    ilm.CameraFormat = LIBRAW_FORMAT_APSC;
    ilm.LensID = LIBRAW_LENS_NOT_SET;
    ilm.FocalType = LIBRAW_FT_PRIME_LENS;
    imgdata.shootinginfo.ExposureProgram = get2();
  }
  else if ((tag == 0x1002) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT))
  {
    imgdata.shootinginfo.DriveMode = get2();
  }
  else if (tag == 0x1006)
  {
    imgdata.shootinginfo.FocusMode = get2();
  }
  else if (tag == 0x1007)
  {
    imRicoh.AutoBracketing = get2();
  }
  else if (tag == 0x1009)
  {
    imRicoh.MacroMode = get2();
  }
  else if (tag == 0x100a)
  {
    imRicoh.FlashMode = get2();
  }
  else if (tag == 0x100b)
  {
    imRicoh.FlashExposureComp = getreal(type);
  }
  else if (tag == 0x100c)
  {
    imRicoh.ManualFlashOutput = getreal(type);
  }
  else if ((tag == 0x100b) && tagtypeIs(LIBRAW_EXIFTAG_TYPE_SRATIONAL))
  {
    imCommon.FlashEC = getrealf(type);
  }
  else if ((tag == 0x1017) && ((imRicoh.WideAdapter = get2()) == 2))
  {
    strcpy(ilm.Attachment, "Wide-Angle Adapter");
  }
  else if (tag == 0x1018)
  {
    imRicoh.CropMode = get2();
  }
  else if (tag == 0x1019)
  {
    imRicoh.NDFilter = get2();
  }
  else if (tag == 0x1200)
  {
    imRicoh.AFStatus = get2();
  }
  else if (tag == 0x1201)
  {
    imRicoh.AFAreaXPosition[1] = get4();
  }
  else if (tag == 0x1202)
  {
    imRicoh.AFAreaYPosition[1] = get4();
  }
  else if (tag == 0x1203)
  {
    imRicoh.AFAreaXPosition[0] = get4();
  }
  else if (tag == 0x1204)
  {
    imRicoh.AFAreaYPosition[0] = get4();
  }
  else if (tag == 0x1205)
  {
    imRicoh.AFAreaMode = get2();
  }
  else if (tag == 0x1500)
  {
    ilm.CurFocal = getrealf(type);
  }
  else if (tag == 0x1601)
  {
    imRicoh.SensorWidth = get4();
  }
  else if (tag == 0x1602)
  {
    imRicoh.SensorHeight = get4();
  }
  else if (tag == 0x1603)
  {
    imRicoh.CroppedImageWidth = get4();
  }
  else if (tag == 0x1604)
  {
    imRicoh.CroppedImageHeight= get4();
  }
  else if ((tag == 0x2001) && !strncmp(model, "GXR", 3))
  {
    short cur_tag;
    fseek(ifp, 20, SEEK_CUR);
    /*ntags =*/ get2();
    cur_tag = get2();
    while (cur_tag != 0x002c)
    {
      fseek(ifp, 10, SEEK_CUR);
	  if (feof(ifp))
		  return;
      cur_tag = get2();
    }
    fseek(ifp, 6, SEEK_CUR);
    fseek(ifp, get4(), SEEK_SET);
    for (int i=0; i<4; i++) {
      stread(buffer, 16, ifp);
      if ((buffer[0] == 'S') && (buffer[1] == 'I') && (buffer[2] == 'D'))
        memcpy(imgdata.shootinginfo.BodySerial, buffer+4, 12);
      else if ((buffer[0] == 'R') && (buffer[1] == 'L'))
        ilm.LensID = buffer[2] - '0';
      else if ((buffer[0] == 'L') && (buffer[1] == 'I') && (buffer[2] == 'D'))
        memcpy(imgdata.lens.LensSerial, buffer+4, 12);
    }
  }
}
