lin
2025-08-14 dae8bad597b6607a449b32bf76c523423f7720ed
1
2
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
#include "image_io/jpeg/jpeg_xmp_info_builder.h"
 
#include <string>
 
namespace photos_editing_formats {
namespace image_io {
 
void JpegXmpInfoBuilder::ProcessSegment(const JpegSegment& segment) {
  // If the property has not yet been found, look for it, and if found, add the
  // segment's range to the vector of ranges.
  size_t extended_xmp_data_begin =
      segment.GetPayloadDataLocation() + kXmpExtendedHeaderSize;
  size_t property_value_begin = extended_xmp_data_begin;
  if (property_segment_ranges_.empty()) {
    std::string property_name =
        JpegXmpInfo::GetDataPropertyName(xmp_info_type_);
    property_value_begin = segment.FindXmpPropertyValueBegin(
        extended_xmp_data_begin, property_name.c_str());
    if (property_value_begin != segment.GetEnd()) {
      property_segment_ranges_.push_back(segment.GetDataRange());
    }
  } else if (!property_end_segment_range_.IsValid()) {
    // The start of the property value was encountered in a previous segment -
    // if the closing quote has not yet been found, then add the segment's range
    // to the vector or ranges.
    property_segment_ranges_.push_back(segment.GetDataRange());
  }
 
  // If the start of the property value has been found but the end has not, look
  // for the end in this segment.
  if (!property_segment_ranges_.empty() &&
      !property_end_segment_range_.IsValid()) {
    size_t property_value_end =
        segment.FindXmpPropertyValueEnd(property_value_begin);
    if (property_value_end != segment.GetEnd()) {
      property_end_segment_range_ = segment.GetDataRange();
    }
  }
}
 
}  // namespace image_io
}  // namespace photos_editing_formats