317 {
318
320
322 return 0;
323 }
324
326
327 if (!decoder->current_frame_) {
328 return 0;
329 }
330
331 fl::u16 frame_width = decoder->current_frame_->getWidth();
332 fl::u16 frame_height = decoder->current_frame_->getHeight();
333
334
335 fl::u16
x = rect->left;
336 fl::u16
y = rect->top;
337 fl::u16 w = rect->right - rect->left + 1;
338 fl::u16 h = rect->bottom - rect->top + 1;
339
340
341
342 if (w == 0 && h == 0 && frame_width <= 8 && frame_height <= 8) {
345 w = frame_width;
346 h = frame_height;
347 }
348
349
350 if (
x >= frame_width ||
y >= frame_height ||
351 x + w > frame_width ||
y + h > frame_height) {
352 return 0;
353 }
354
355
356 CRGB* frame_pixels = decoder->current_frame_->rgb().data();
357 if (!frame_pixels) {
358 return 0;
359 }
360
361
363
364 for (fl::u16 row = 0; row < h; ++row) {
365 for (fl::u16 col = 0; col < w; ++col) {
366 fl::u16 src_idx = (row * w + col) * 3;
367
368
369 int pixel_x =
x + col;
370 int pixel_y =
y + row;
371 int frame_idx = pixel_y * frame_width + pixel_x;
372
373
374 fl::u8 r = rgb_data[src_idx + 0];
375 fl::u8 g = rgb_data[src_idx + 1];
376 fl::u8 b = rgb_data[src_idx + 2];
377
378
379 frame_pixels[frame_idx] =
CRGB(r, g, b);
380 }
381 }
382
383 return 1;
384}
TJpgInstanceDecoder() FL_NOEXCEPT