| #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 |