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