mirror of
https://github.com/esphome/esphome.git
synced 2026-11-03 19:57:35 +00:00
Co-authored-by: clydebarrow <2366188+clydebarrow@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
36 lines
1.2 KiB
C++
36 lines
1.2 KiB
C++
#include "image_decoder.h"
|
|
#include "runtime_image.h"
|
|
#include "esphome/core/log.h"
|
|
#include <algorithm>
|
|
#include <cmath>
|
|
|
|
namespace esphome::runtime_image {
|
|
|
|
ESPHOME_LOG_TAG(TAG, "image_decoder");
|
|
|
|
bool ImageDecoder::set_size(int width, int height) {
|
|
bool success = this->image_->resize(width, height) > 0;
|
|
this->size_valid_ = success;
|
|
this->x_scale_ = static_cast<double>(this->image_->get_buffer_width()) / width;
|
|
this->y_scale_ = static_cast<double>(this->image_->get_buffer_height()) / height;
|
|
return success;
|
|
}
|
|
|
|
void ImageDecoder::draw(int x, int y, int w, int h, const Color &color) {
|
|
if (!this->size_valid_) {
|
|
return;
|
|
}
|
|
auto width = std::min(this->image_->get_buffer_width(), static_cast<int>(std::ceil((x + w) * this->x_scale_)));
|
|
auto height = std::min(this->image_->get_buffer_height(), static_cast<int>(std::ceil((y + h) * this->y_scale_)));
|
|
for (int i = x * this->x_scale_; i < width; i++) {
|
|
for (int j = y * this->y_scale_; j < height; j++) {
|
|
this->image_->draw_pixel(i, j, color);
|
|
}
|
|
}
|
|
}
|
|
|
|
uint8_t *ImageDecoder::image_buffer_() const { return this->image_->buffer_; }
|
|
bool ImageDecoder::image_is_big_endian_() const { return this->image_->big_endian_; }
|
|
|
|
} // namespace esphome::runtime_image
|