#include "display_buffer.h" #include #include "esphome/core/application.h" #include "esphome/core/log.h" namespace esphome { namespace display { static const char *const TAG = "display"; void DisplayBuffer::init_internal_(uint32_t buffer_length) { ExternalRAMAllocator allocator(ExternalRAMAllocator::ALLOW_FAILURE); this->buffer_ = allocator.allocate(buffer_length); if (this->buffer_ == nullptr) { ESP_LOGE(TAG, "Could not allocate buffer for display!"); return; } this->clear(); } int DisplayBuffer::get_width() { switch (this->rotation_) { case DISPLAY_ROTATION_90_DEGREES: case DISPLAY_ROTATION_270_DEGREES: return this->get_height_internal(); case DISPLAY_ROTATION_0_DEGREES: case DISPLAY_ROTATION_180_DEGREES: default: return this->get_width_internal(); } } int DisplayBuffer::get_height() { switch (this->rotation_) { case DISPLAY_ROTATION_0_DEGREES: case DISPLAY_ROTATION_180_DEGREES: return this->get_height_internal(); case DISPLAY_ROTATION_90_DEGREES: case DISPLAY_ROTATION_270_DEGREES: default: return this->get_width_internal(); } } void HOT DisplayBuffer::draw_pixel_at(int x, int y, Color color) { if (!this->get_clipping().inside(x, y)) return; // NOLINT switch (this->rotation_) { case DISPLAY_ROTATION_0_DEGREES: break; case DISPLAY_ROTATION_90_DEGREES: std::swap(x, y); x = this->get_width_internal() - x - 1; break; case DISPLAY_ROTATION_180_DEGREES: x = this->get_width_internal() - x - 1; y = this->get_height_internal() - y - 1; break; case DISPLAY_ROTATION_270_DEGREES: std::swap(x, y); y = this->get_height_internal() - y - 1; break; } this->draw_absolute_pixel_internal(x, y, color); App.feed_wdt(); } } // namespace display } // namespace esphome