mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	display: move Image, Font and Animation code into components (#4967)
				
					
				
			* display: move `Font` to `components/font` * display: move `Animation` to `components/animation` * display: move `Image` to `components/image`
This commit is contained in:
		| @@ -1,7 +1,7 @@ | |||||||
| import logging | import logging | ||||||
|  |  | ||||||
| from esphome import automation, core | from esphome import automation, core | ||||||
| from esphome.components import display, font | from esphome.components import font | ||||||
| import esphome.components.image as espImage | import esphome.components.image as espImage | ||||||
| from esphome.components.image import CONF_USE_TRANSPARENCY | from esphome.components.image import CONF_USE_TRANSPARENCY | ||||||
| import esphome.config_validation as cv | import esphome.config_validation as cv | ||||||
| @@ -18,6 +18,7 @@ from esphome.core import CORE, HexInt | |||||||
|  |  | ||||||
| _LOGGER = logging.getLogger(__name__) | _LOGGER = logging.getLogger(__name__) | ||||||
|  |  | ||||||
|  | AUTO_LOAD = ["image"] | ||||||
| CODEOWNERS = ["@syndlex"] | CODEOWNERS = ["@syndlex"] | ||||||
| DEPENDENCIES = ["display"] | DEPENDENCIES = ["display"] | ||||||
| MULTI_CONF = True | MULTI_CONF = True | ||||||
| @@ -27,16 +28,18 @@ CONF_START_FRAME = "start_frame" | |||||||
| CONF_END_FRAME = "end_frame" | CONF_END_FRAME = "end_frame" | ||||||
| CONF_FRAME = "frame" | CONF_FRAME = "frame" | ||||||
|  |  | ||||||
| Animation_ = display.display_ns.class_("Animation", espImage.Image_) | animation_ns = cg.esphome_ns.namespace("animation") | ||||||
|  |  | ||||||
|  | Animation_ = animation_ns.class_("Animation", espImage.Image_) | ||||||
|  |  | ||||||
| # Actions | # Actions | ||||||
| NextFrameAction = display.display_ns.class_( | NextFrameAction = animation_ns.class_( | ||||||
|     "AnimationNextFrameAction", automation.Action, cg.Parented.template(Animation_) |     "AnimationNextFrameAction", automation.Action, cg.Parented.template(Animation_) | ||||||
| ) | ) | ||||||
| PrevFrameAction = display.display_ns.class_( | PrevFrameAction = animation_ns.class_( | ||||||
|     "AnimationPrevFrameAction", automation.Action, cg.Parented.template(Animation_) |     "AnimationPrevFrameAction", automation.Action, cg.Parented.template(Animation_) | ||||||
| ) | ) | ||||||
| SetFrameAction = display.display_ns.class_( | SetFrameAction = animation_ns.class_( | ||||||
|     "AnimationSetFrameAction", automation.Action, cg.Parented.template(Animation_) |     "AnimationSetFrameAction", automation.Action, cg.Parented.template(Animation_) | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,9 +3,10 @@ | |||||||
| #include "esphome/core/hal.h" | #include "esphome/core/hal.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace display { | namespace animation { | ||||||
| 
 | 
 | ||||||
| Animation::Animation(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, ImageType type) | Animation::Animation(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, | ||||||
|  |                      image::ImageType type) | ||||||
|     : Image(data_start, width, height, type), |     : Image(data_start, width, height, type), | ||||||
|       animation_data_start_(data_start), |       animation_data_start_(data_start), | ||||||
|       current_frame_(0), |       current_frame_(0), | ||||||
| @@ -65,5 +66,5 @@ void Animation::update_data_start_() { | |||||||
|   this->data_start_ = this->animation_data_start_ + image_size * this->current_frame_; |   this->data_start_ = this->animation_data_start_ + image_size * this->current_frame_; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| }  // namespace display
 | }  // namespace animation
 | ||||||
| }  // namespace esphome
 | }  // namespace esphome
 | ||||||
| @@ -1,14 +1,14 @@ | |||||||
| #pragma once | #pragma once | ||||||
| #include "image.h" | #include "esphome/components/image/image.h" | ||||||
| 
 | 
 | ||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace display { | namespace animation { | ||||||
| 
 | 
 | ||||||
| class Animation : public Image { | class Animation : public image::Image { | ||||||
|  public: |  public: | ||||||
|   Animation(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, ImageType type); |   Animation(const uint8_t *data_start, int width, int height, uint32_t animation_frame_count, image::ImageType type); | ||||||
| 
 | 
 | ||||||
|   uint32_t get_animation_frame_count() const; |   uint32_t get_animation_frame_count() const; | ||||||
|   int get_current_frame() const; |   int get_current_frame() const; | ||||||
| @@ -63,5 +63,5 @@ template<typename... Ts> class AnimationSetFrameAction : public Action<Ts...> { | |||||||
|   Animation *parent_; |   Animation *parent_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| }  // namespace display
 | }  // namespace animation
 | ||||||
| }  // namespace esphome
 | }  // namespace esphome
 | ||||||
| @@ -7,7 +7,6 @@ import re | |||||||
| import requests | import requests | ||||||
|  |  | ||||||
| from esphome import core | from esphome import core | ||||||
| from esphome.components import display |  | ||||||
| import esphome.config_validation as cv | import esphome.config_validation as cv | ||||||
| import esphome.codegen as cg | import esphome.codegen as cg | ||||||
| from esphome.helpers import copy_file_if_changed | from esphome.helpers import copy_file_if_changed | ||||||
| @@ -29,9 +28,11 @@ DOMAIN = "font" | |||||||
| DEPENDENCIES = ["display"] | DEPENDENCIES = ["display"] | ||||||
| MULTI_CONF = True | MULTI_CONF = True | ||||||
|  |  | ||||||
| Font = display.display_ns.class_("Font") | font_ns = cg.esphome_ns.namespace("font") | ||||||
| Glyph = display.display_ns.class_("Glyph") |  | ||||||
| GlyphData = display.display_ns.struct("GlyphData") | Font = font_ns.class_("Font") | ||||||
|  | Glyph = font_ns.class_("Glyph") | ||||||
|  | GlyphData = font_ns.struct("GlyphData") | ||||||
|  |  | ||||||
|  |  | ||||||
| def validate_glyphs(value): | def validate_glyphs(value): | ||||||
|   | |||||||
| @@ -2,13 +2,15 @@ | |||||||
| 
 | 
 | ||||||
| #include "esphome/core/hal.h" | #include "esphome/core/hal.h" | ||||||
| #include "esphome/core/log.h" | #include "esphome/core/log.h" | ||||||
|  | #include "esphome/core/color.h" | ||||||
|  | #include "esphome/components/display/display_buffer.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace display { | namespace font { | ||||||
| 
 | 
 | ||||||
| static const char *const TAG = "display"; | static const char *const TAG = "font"; | ||||||
| 
 | 
 | ||||||
| void Glyph::draw(int x_at, int y_start, DisplayBuffer *display, Color color) const { | void Glyph::draw(int x_at, int y_start, display::DisplayBuffer *display, Color color) const { | ||||||
|   int scan_x1, scan_y1, scan_width, scan_height; |   int scan_x1, scan_y1, scan_width, scan_height; | ||||||
|   this->scan_area(&scan_x1, &scan_y1, &scan_width, &scan_height); |   this->scan_area(&scan_x1, &scan_y1, &scan_width, &scan_height); | ||||||
| 
 | 
 | ||||||
| @@ -116,7 +118,7 @@ void Font::measure(const char *str, int *width, int *x_offset, int *baseline, in | |||||||
|   *x_offset = min_x; |   *x_offset = min_x; | ||||||
|   *width = x - min_x; |   *width = x - min_x; | ||||||
| } | } | ||||||
| void Font::print(int x_start, int y_start, DisplayBuffer *display, Color color, const char *text) { | void Font::print(int x_start, int y_start, display::DisplayBuffer *display, Color color, const char *text) { | ||||||
|   int i = 0; |   int i = 0; | ||||||
|   int x_at = x_start; |   int x_at = x_start; | ||||||
|   while (text[i] != '\0') { |   while (text[i] != '\0') { | ||||||
| @@ -143,5 +145,5 @@ void Font::print(int x_start, int y_start, DisplayBuffer *display, Color color, | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| }  // namespace display
 | }  // namespace font
 | ||||||
| }  // namespace esphome
 | }  // namespace esphome
 | ||||||
| @@ -1,12 +1,12 @@ | |||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include "esphome/core/datatypes.h" | #include "esphome/core/datatypes.h" | ||||||
| #include "display_buffer.h" | #include "esphome/core/color.h" | ||||||
|  | #include "esphome/components/display/display_buffer.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace display { | namespace font { | ||||||
| 
 | 
 | ||||||
| class DisplayBuffer; |  | ||||||
| class Font; | class Font; | ||||||
| 
 | 
 | ||||||
| struct GlyphData { | struct GlyphData { | ||||||
| @@ -22,7 +22,7 @@ class Glyph { | |||||||
|  public: |  public: | ||||||
|   Glyph(const GlyphData *data) : glyph_data_(data) {} |   Glyph(const GlyphData *data) : glyph_data_(data) {} | ||||||
| 
 | 
 | ||||||
|   void draw(int x, int y, DisplayBuffer *display, Color color) const; |   void draw(int x, int y, display::DisplayBuffer *display, Color color) const; | ||||||
| 
 | 
 | ||||||
|   const char *get_char() const; |   const char *get_char() const; | ||||||
| 
 | 
 | ||||||
| @@ -38,7 +38,7 @@ class Glyph { | |||||||
|   const GlyphData *glyph_data_; |   const GlyphData *glyph_data_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class Font : public BaseFont { | class Font : public display::BaseFont { | ||||||
|  public: |  public: | ||||||
|   /** Construct the font with the given glyphs.
 |   /** Construct the font with the given glyphs.
 | ||||||
|    * |    * | ||||||
| @@ -50,7 +50,7 @@ class Font : public BaseFont { | |||||||
| 
 | 
 | ||||||
|   int match_next_glyph(const char *str, int *match_length); |   int match_next_glyph(const char *str, int *match_length); | ||||||
| 
 | 
 | ||||||
|   void print(int x_start, int y_start, DisplayBuffer *display, Color color, const char *text) override; |   void print(int x_start, int y_start, display::DisplayBuffer *display, Color color, const char *text) override; | ||||||
|   void measure(const char *str, int *width, int *x_offset, int *baseline, int *height) override; |   void measure(const char *str, int *width, int *x_offset, int *baseline, int *height) override; | ||||||
|   inline int get_baseline() { return this->baseline_; } |   inline int get_baseline() { return this->baseline_; } | ||||||
|   inline int get_height() { return this->height_; } |   inline int get_height() { return this->height_; } | ||||||
| @@ -63,5 +63,5 @@ class Font : public BaseFont { | |||||||
|   int height_; |   int height_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| }  // namespace display
 | }  // namespace font
 | ||||||
| }  // namespace esphome
 | }  // namespace esphome
 | ||||||
| @@ -1,6 +1,5 @@ | |||||||
| #include "graph.h" | #include "graph.h" | ||||||
| #include "esphome/components/display/display_buffer.h" | #include "esphome/components/display/display_buffer.h" | ||||||
| #include "esphome/components/display/font.h" |  | ||||||
| #include "esphome/core/color.h" | #include "esphome/core/color.h" | ||||||
| #include "esphome/core/log.h" | #include "esphome/core/log.h" | ||||||
| #include "esphome/core/hal.h" | #include "esphome/core/hal.h" | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ namespace esphome { | |||||||
| // forward declare DisplayBuffer | // forward declare DisplayBuffer | ||||||
| namespace display { | namespace display { | ||||||
| class DisplayBuffer; | class DisplayBuffer; | ||||||
| class Font; | class BaseFont; | ||||||
| }  // namespace display | }  // namespace display | ||||||
|  |  | ||||||
| namespace graph { | namespace graph { | ||||||
| @@ -45,8 +45,8 @@ enum ValuePositionType { | |||||||
| class GraphLegend { | class GraphLegend { | ||||||
|  public: |  public: | ||||||
|   void init(Graph *g); |   void init(Graph *g); | ||||||
|   void set_name_font(display::Font *font) { this->font_label_ = font; } |   void set_name_font(display::BaseFont *font) { this->font_label_ = font; } | ||||||
|   void set_value_font(display::Font *font) { this->font_value_ = font; } |   void set_value_font(display::BaseFont *font) { this->font_value_ = font; } | ||||||
|   void set_width(uint32_t width) { this->width_ = width; } |   void set_width(uint32_t width) { this->width_ = width; } | ||||||
|   void set_height(uint32_t height) { this->height_ = height; } |   void set_height(uint32_t height) { this->height_ = height; } | ||||||
|   void set_border(bool val) { this->border_ = val; } |   void set_border(bool val) { this->border_ = val; } | ||||||
| @@ -63,8 +63,8 @@ class GraphLegend { | |||||||
|   ValuePositionType values_{VALUE_POSITION_TYPE_AUTO}; |   ValuePositionType values_{VALUE_POSITION_TYPE_AUTO}; | ||||||
|   bool units_{true}; |   bool units_{true}; | ||||||
|   DirectionType direction_{DIRECTION_TYPE_AUTO}; |   DirectionType direction_{DIRECTION_TYPE_AUTO}; | ||||||
|   display::Font *font_label_{nullptr}; |   display::BaseFont *font_label_{nullptr}; | ||||||
|   display::Font *font_value_{nullptr}; |   display::BaseFont *font_value_{nullptr}; | ||||||
|   // Calculated values |   // Calculated values | ||||||
|   Graph *parent_{nullptr}; |   Graph *parent_{nullptr}; | ||||||
|   //                      (x0)          (xs,ys)         (xs,ys) |   //                      (x0)          (xs,ys)         (xs,ys) | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ import re | |||||||
| import requests | import requests | ||||||
|  |  | ||||||
| from esphome import core | from esphome import core | ||||||
| from esphome.components import display, font | from esphome.components import font | ||||||
| import esphome.config_validation as cv | import esphome.config_validation as cv | ||||||
| import esphome.codegen as cg | import esphome.codegen as cg | ||||||
| from esphome.const import ( | from esphome.const import ( | ||||||
| @@ -28,7 +28,9 @@ DOMAIN = "image" | |||||||
| DEPENDENCIES = ["display"] | DEPENDENCIES = ["display"] | ||||||
| MULTI_CONF = True | MULTI_CONF = True | ||||||
|  |  | ||||||
| ImageType = display.display_ns.enum("ImageType") | image_ns = cg.esphome_ns.namespace("image") | ||||||
|  |  | ||||||
|  | ImageType = image_ns.enum("ImageType") | ||||||
| IMAGE_TYPE = { | IMAGE_TYPE = { | ||||||
|     "BINARY": ImageType.IMAGE_TYPE_BINARY, |     "BINARY": ImageType.IMAGE_TYPE_BINARY, | ||||||
|     "TRANSPARENT_BINARY": ImageType.IMAGE_TYPE_BINARY, |     "TRANSPARENT_BINARY": ImageType.IMAGE_TYPE_BINARY, | ||||||
| @@ -46,7 +48,7 @@ MDI_DOWNLOAD_TIMEOUT = 30  # seconds | |||||||
| SOURCE_LOCAL = "local" | SOURCE_LOCAL = "local" | ||||||
| SOURCE_MDI = "mdi" | SOURCE_MDI = "mdi" | ||||||
|  |  | ||||||
| Image_ = display.display_ns.class_("Image") | Image_ = image_ns.class_("Image") | ||||||
|  |  | ||||||
|  |  | ||||||
| def _compute_local_icon_path(value) -> Path: | def _compute_local_icon_path(value) -> Path: | ||||||
|   | |||||||
| @@ -3,9 +3,9 @@ | |||||||
| #include "esphome/core/hal.h" | #include "esphome/core/hal.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace display { | namespace image { | ||||||
| 
 | 
 | ||||||
| void Image::draw(int x, int y, DisplayBuffer *display, Color color_on, Color color_off) { | void Image::draw(int x, int y, display::DisplayBuffer *display, Color color_on, Color color_off) { | ||||||
|   switch (type_) { |   switch (type_) { | ||||||
|     case IMAGE_TYPE_BINARY: { |     case IMAGE_TYPE_BINARY: { | ||||||
|       for (int img_x = 0; img_x < width_; img_x++) { |       for (int img_x = 0; img_x < width_; img_x++) { | ||||||
| @@ -130,5 +130,5 @@ ImageType Image::get_type() const { return this->type_; } | |||||||
| Image::Image(const uint8_t *data_start, int width, int height, ImageType type) | Image::Image(const uint8_t *data_start, int width, int height, ImageType type) | ||||||
|     : width_(width), height_(height), type_(type), data_start_(data_start) {} |     : width_(width), height_(height), type_(type), data_start_(data_start) {} | ||||||
| 
 | 
 | ||||||
| }  // namespace display
 | }  // namespace image
 | ||||||
| }  // namespace esphome
 | }  // namespace esphome
 | ||||||
| @@ -1,9 +1,9 @@ | |||||||
| #pragma once | #pragma once | ||||||
| #include "esphome/core/color.h" | #include "esphome/core/color.h" | ||||||
| #include "display_buffer.h" | #include "esphome/components/display/display_buffer.h" | ||||||
| 
 | 
 | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace display { | namespace image { | ||||||
| 
 | 
 | ||||||
| enum ImageType { | enum ImageType { | ||||||
|   IMAGE_TYPE_BINARY = 0, |   IMAGE_TYPE_BINARY = 0, | ||||||
| @@ -31,15 +31,15 @@ inline int image_type_to_bpp(ImageType type) { | |||||||
| 
 | 
 | ||||||
| inline int image_type_to_width_stride(int width, ImageType type) { return (width * image_type_to_bpp(type) + 7u) / 8u; } | inline int image_type_to_width_stride(int width, ImageType type) { return (width * image_type_to_bpp(type) + 7u) / 8u; } | ||||||
| 
 | 
 | ||||||
| class Image : public BaseImage { | class Image : public display::BaseImage { | ||||||
|  public: |  public: | ||||||
|   Image(const uint8_t *data_start, int width, int height, ImageType type); |   Image(const uint8_t *data_start, int width, int height, ImageType type); | ||||||
|   Color get_pixel(int x, int y, Color color_on = COLOR_ON, Color color_off = COLOR_OFF) const; |   Color get_pixel(int x, int y, Color color_on = display::COLOR_ON, Color color_off = display::COLOR_OFF) const; | ||||||
|   int get_width() const override; |   int get_width() const override; | ||||||
|   int get_height() const override; |   int get_height() const override; | ||||||
|   ImageType get_type() const; |   ImageType get_type() const; | ||||||
| 
 | 
 | ||||||
|   void draw(int x, int y, DisplayBuffer *display, Color color_on, Color color_off) override; |   void draw(int x, int y, display::DisplayBuffer *display, Color color_on, Color color_off) override; | ||||||
| 
 | 
 | ||||||
|   void set_transparency(bool transparent) { transparent_ = transparent; } |   void set_transparency(bool transparent) { transparent_ = transparent; } | ||||||
|   bool has_transparency() const { return transparent_; } |   bool has_transparency() const { return transparent_; } | ||||||
| @@ -58,5 +58,5 @@ class Image : public BaseImage { | |||||||
|   bool transparent_; |   bool transparent_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| }  // namespace display
 | }  // namespace image
 | ||||||
| }  // namespace esphome
 | }  // namespace esphome
 | ||||||
		Reference in New Issue
	
	Block a user