mirror of
https://github.com/esphome/esphome.git
synced 2024-12-23 05:54:56 +01:00
display: allow to align image with ImageAlign
(#4933)
This commit is contained in:
parent
a4ef26749b
commit
b558a1c9dd
2 changed files with 91 additions and 1 deletions
|
@ -311,6 +311,37 @@ void DisplayBuffer::vprintf_(int x, int y, Font *font, Color color, TextAlign al
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayBuffer::image(int x, int y, BaseImage *image, Color color_on, Color color_off) {
|
void DisplayBuffer::image(int x, int y, BaseImage *image, Color color_on, Color color_off) {
|
||||||
|
this->image(x, y, image, ImageAlign::TOP_LEFT, color_on, color_off);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplayBuffer::image(int x, int y, BaseImage *image, ImageAlign align, Color color_on, Color color_off) {
|
||||||
|
auto x_align = ImageAlign(int(align) & (int(ImageAlign::HORIZONTAL_ALIGNMENT)));
|
||||||
|
auto y_align = ImageAlign(int(align) & (int(ImageAlign::VERTICAL_ALIGNMENT)));
|
||||||
|
|
||||||
|
switch (x_align) {
|
||||||
|
case ImageAlign::RIGHT:
|
||||||
|
x -= image->get_width();
|
||||||
|
break;
|
||||||
|
case ImageAlign::CENTER_HORIZONTAL:
|
||||||
|
x -= image->get_width() / 2;
|
||||||
|
break;
|
||||||
|
case ImageAlign::LEFT:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (y_align) {
|
||||||
|
case ImageAlign::BOTTOM:
|
||||||
|
y -= image->get_height();
|
||||||
|
break;
|
||||||
|
case ImageAlign::CENTER_VERTICAL:
|
||||||
|
y -= image->get_height() / 2;
|
||||||
|
break;
|
||||||
|
case ImageAlign::TOP:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
image->draw(x, y, this, color_on, color_off);
|
image->draw(x, y, this, color_on, color_off);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,54 @@ enum class TextAlign {
|
||||||
BOTTOM_RIGHT = BOTTOM | RIGHT,
|
BOTTOM_RIGHT = BOTTOM | RIGHT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** ImageAlign is used to tell the display class how to position a image. By default
|
||||||
|
* the coordinates you enter for the image() functions take the upper left corner of the image
|
||||||
|
* as the "anchor" point. You can customize this behavior to, for example, make the coordinates
|
||||||
|
* refer to the *center* of the image.
|
||||||
|
*
|
||||||
|
* All image alignments consist of an X and Y-coordinate alignment. For the alignment along the X-axis
|
||||||
|
* these options are allowed:
|
||||||
|
*
|
||||||
|
* - LEFT (x-coordinate of anchor point is on left)
|
||||||
|
* - CENTER_HORIZONTAL (x-coordinate of anchor point is in the horizontal center of the image)
|
||||||
|
* - RIGHT (x-coordinate of anchor point is on right)
|
||||||
|
*
|
||||||
|
* For the Y-Axis alignment these options are allowed:
|
||||||
|
*
|
||||||
|
* - TOP (y-coordinate of anchor is on the top of the image)
|
||||||
|
* - CENTER_VERTICAL (y-coordinate of anchor is in the vertical center of the image)
|
||||||
|
* - BOTTOM (y-coordinate of anchor is on the bottom of the image)
|
||||||
|
*
|
||||||
|
* These options are then combined to create combined TextAlignment options like:
|
||||||
|
* - TOP_LEFT (default)
|
||||||
|
* - CENTER (anchor point is in the middle of the image bounds)
|
||||||
|
* - ...
|
||||||
|
*/
|
||||||
|
enum class ImageAlign {
|
||||||
|
TOP = 0x00,
|
||||||
|
CENTER_VERTICAL = 0x01,
|
||||||
|
BOTTOM = 0x02,
|
||||||
|
|
||||||
|
LEFT = 0x00,
|
||||||
|
CENTER_HORIZONTAL = 0x04,
|
||||||
|
RIGHT = 0x08,
|
||||||
|
|
||||||
|
TOP_LEFT = TOP | LEFT,
|
||||||
|
TOP_CENTER = TOP | CENTER_HORIZONTAL,
|
||||||
|
TOP_RIGHT = TOP | RIGHT,
|
||||||
|
|
||||||
|
CENTER_LEFT = CENTER_VERTICAL | LEFT,
|
||||||
|
CENTER = CENTER_VERTICAL | CENTER_HORIZONTAL,
|
||||||
|
CENTER_RIGHT = CENTER_VERTICAL | RIGHT,
|
||||||
|
|
||||||
|
BOTTOM_LEFT = BOTTOM | LEFT,
|
||||||
|
BOTTOM_CENTER = BOTTOM | CENTER_HORIZONTAL,
|
||||||
|
BOTTOM_RIGHT = BOTTOM | RIGHT,
|
||||||
|
|
||||||
|
HORIZONTAL_ALIGNMENT = LEFT | CENTER_HORIZONTAL | RIGHT,
|
||||||
|
VERTICAL_ALIGNMENT = TOP | CENTER_VERTICAL | BOTTOM
|
||||||
|
};
|
||||||
|
|
||||||
enum DisplayType {
|
enum DisplayType {
|
||||||
DISPLAY_TYPE_BINARY = 1,
|
DISPLAY_TYPE_BINARY = 1,
|
||||||
DISPLAY_TYPE_GRAYSCALE = 2,
|
DISPLAY_TYPE_GRAYSCALE = 2,
|
||||||
|
@ -300,12 +348,23 @@ class DisplayBuffer {
|
||||||
*
|
*
|
||||||
* @param x The x coordinate of the upper left corner.
|
* @param x The x coordinate of the upper left corner.
|
||||||
* @param y The y coordinate of the upper left corner.
|
* @param y The y coordinate of the upper left corner.
|
||||||
* @param image The image to draw
|
* @param image The image to draw.
|
||||||
* @param color_on The color to replace in binary images for the on bits.
|
* @param color_on The color to replace in binary images for the on bits.
|
||||||
* @param color_off The color to replace in binary images for the off bits.
|
* @param color_off The color to replace in binary images for the off bits.
|
||||||
*/
|
*/
|
||||||
void image(int x, int y, BaseImage *image, Color color_on = COLOR_ON, Color color_off = COLOR_OFF);
|
void image(int x, int y, BaseImage *image, Color color_on = COLOR_ON, Color color_off = COLOR_OFF);
|
||||||
|
|
||||||
|
/** Draw the `image` at [x,y] to the screen.
|
||||||
|
*
|
||||||
|
* @param x The x coordinate of the upper left corner.
|
||||||
|
* @param y The y coordinate of the upper left corner.
|
||||||
|
* @param image The image to draw.
|
||||||
|
* @param align The alignment of the image.
|
||||||
|
* @param color_on The color to replace in binary images for the on bits.
|
||||||
|
* @param color_off The color to replace in binary images for the off bits.
|
||||||
|
*/
|
||||||
|
void image(int x, int y, BaseImage *image, ImageAlign align, Color color_on = COLOR_ON, Color color_off = COLOR_OFF);
|
||||||
|
|
||||||
#ifdef USE_GRAPH
|
#ifdef USE_GRAPH
|
||||||
/** Draw the `graph` with the top-left corner at [x,y] to the screen.
|
/** Draw the `graph` with the top-left corner at [x,y] to the screen.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue