104 {
107 if (error_message) { *error_message =
"Failed to open file: "; error_message->
append(path); }
108 FL_WARN(
"Failed to open JPEG file: " << path);
return FramePtr();
109 }
110 fl::size fileSize = file.
size();
111 if (fileSize == 0) {
112 if (error_message) { *error_message =
"File is empty: "; error_message->
append(path); }
113 file.
close();
return FramePtr();
114 }
115 fl::vector<u8> buffer;
117 fl::size bytesRead = 0;
118 while (bytesRead < fileSize && file.
available()) {
119 fl::size chunkSize =
min<fl::size>(4096, fileSize - bytesRead);
120 fl::size n = file.
read(buffer.
data() + bytesRead, chunkSize);
121 if (n == 0) break;
122 bytesRead += n;
123 }
125 if (bytesRead != fileSize) {
126 if (error_message) {
127 *error_message = "Failed to read complete file. Expected ";
128 error_message->
append(
static_cast<u32
>(fileSize));
129 error_message->
append(
" bytes, got ");
130 error_message->
append(
static_cast<u32
>(bytesRead));
131 }
132 FL_WARN(
"Failed to read complete JPEG file: " << path);
return FramePtr();
133 }
134 fl::span<const u8> jpegData(buffer.
data(), buffer.
size());
135 FramePtr frame =
Jpeg::decode(config, jpegData, error_message);
136 if (!frame && error_message && error_message->
empty()) {
137 *error_message =
"Failed to decode JPEG from file: "; error_message->
append(path);
138 }
139 return frame;
140}
fl::ifstream openRead(const char *path)
static bool decode(const JpegConfig &config, fl::span< const fl::u8 > data, Frame *frame, fl::string *error_message=nullptr)
bool empty() const FL_NOEXCEPT
ifstream & read(char *buffer, fl::size_t count)
string & append(const bitset_fixed< N > &bs) FL_NOEXCEPT
fl::size size() const FL_NOEXCEPT
void reserve(fl::size n) FL_NOEXCEPT
void resize(fl::size n) FL_NOEXCEPT
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT