xref: /aosp_15_r20/external/image_io/src/base/data_line_map.cc (revision ca0779eb572efbbfda2e47f806647c3c7eeea8c3)
1 #include "image_io/base/data_line_map.h"
2 
3 #include <algorithm>
4 
5 namespace photos_editing_formats {
6 namespace image_io {
7 
GetDataLine(size_t location) const8 DataLine DataLineMap::GetDataLine(size_t location) const {
9   if (data_lines_.empty()) {
10     return DataLine();
11   }
12   DataLine key(0, DataRange(location, location));
13   auto not_less_pos =
14       std::lower_bound(data_lines_.begin(), data_lines_.end(), key,
15                        [](const DataLine& lhs, const DataLine& rhs) {
16                          return lhs.range.GetBegin() < rhs.range.GetBegin();
17                        });
18   if (not_less_pos == data_lines_.end()) {
19     --not_less_pos;
20   } else if (not_less_pos != data_lines_.begin()) {
21     auto prev_pos = not_less_pos - 1;
22     if (location < prev_pos->range.GetEnd()) {
23       not_less_pos = prev_pos;
24     }
25   }
26   if (not_less_pos->range.Contains(location)) {
27     return *not_less_pos;
28   }
29   return DataLine();
30 }
31 
FindDataLines(const DataRange & range,const DataSegment & segment)32 void DataLineMap::FindDataLines(const DataRange& range,
33                                 const DataSegment& segment) {
34   size_t line_end;
35   size_t range_end = range.GetEnd();
36   size_t line_begin = range.GetBegin();
37   size_t next_number = GetDataLineCount() + 1;
38   while (line_begin < range_end) {
39     line_end = std::min(range_end, segment.Find(line_begin, '\n'));
40     if (last_line_incomplete_ && !data_lines_.empty()) {
41       line_begin = data_lines_.back().range.GetBegin();
42       data_lines_.back().range = DataRange(line_begin, line_end);
43       if (line_end < range_end &&
44           segment.GetValidatedByte(line_end).value == '\n') {
45         last_line_incomplete_ = false;
46       }
47     } else {
48       data_lines_.emplace_back(next_number++, DataRange(line_begin, line_end));
49     }
50     line_begin = line_end + 1;
51   }
52   last_line_incomplete_ =
53       line_end == range_end || segment.GetValidatedByte(line_end).value != '\n';
54 }
55 
Clear()56 void DataLineMap::Clear() {
57   data_lines_.clear();
58   last_line_incomplete_ = false;
59 }
60 
61 }  // namespace image_io
62 }  // namespace photos_editing_formats
63