mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	[sdl] Allow window to be resized. (#7698)
This commit is contained in:
		| @@ -9,8 +9,9 @@ void Sdl::setup() { | |||||||
|   ESP_LOGD(TAG, "Starting setup"); |   ESP_LOGD(TAG, "Starting setup"); | ||||||
|   SDL_Init(SDL_INIT_VIDEO); |   SDL_Init(SDL_INIT_VIDEO); | ||||||
|   this->window_ = SDL_CreateWindow(App.get_name().c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, |   this->window_ = SDL_CreateWindow(App.get_name().c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, | ||||||
|                                    this->width_, this->height_, 0); |                                    this->width_, this->height_, SDL_WINDOW_RESIZABLE); | ||||||
|   this->renderer_ = SDL_CreateRenderer(this->window_, -1, SDL_RENDERER_SOFTWARE); |   this->renderer_ = SDL_CreateRenderer(this->window_, -1, SDL_RENDERER_SOFTWARE); | ||||||
|  |   SDL_RenderSetLogicalSize(this->renderer_, this->width_, this->height_); | ||||||
|   this->texture_ = |   this->texture_ = | ||||||
|       SDL_CreateTexture(this->renderer_, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STATIC, this->width_, this->height_); |       SDL_CreateTexture(this->renderer_, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STATIC, this->width_, this->height_); | ||||||
|   SDL_SetTextureBlendMode(this->texture_, SDL_BLENDMODE_BLEND); |   SDL_SetTextureBlendMode(this->texture_, SDL_BLENDMODE_BLEND); | ||||||
| @@ -25,6 +26,10 @@ void Sdl::update() { | |||||||
|   this->y_low_ = this->height_; |   this->y_low_ = this->height_; | ||||||
|   this->x_high_ = 0; |   this->x_high_ = 0; | ||||||
|   this->y_high_ = 0; |   this->y_high_ = 0; | ||||||
|  |   this->redraw_(rect); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Sdl::redraw_(SDL_Rect &rect) { | ||||||
|   SDL_RenderCopy(this->renderer_, this->texture_, &rect, &rect); |   SDL_RenderCopy(this->renderer_, this->texture_, &rect, &rect); | ||||||
|   SDL_RenderPresent(this->renderer_); |   SDL_RenderPresent(this->renderer_); | ||||||
| } | } | ||||||
| @@ -33,15 +38,13 @@ void Sdl::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t * | |||||||
|                          display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) { |                          display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) { | ||||||
|   SDL_Rect rect{x_start, y_start, w, h}; |   SDL_Rect rect{x_start, y_start, w, h}; | ||||||
|   if (this->rotation_ != display::DISPLAY_ROTATION_0_DEGREES || bitness != display::COLOR_BITNESS_565 || big_endian) { |   if (this->rotation_ != display::DISPLAY_ROTATION_0_DEGREES || bitness != display::COLOR_BITNESS_565 || big_endian) { | ||||||
|     display::Display::draw_pixels_at(x_start, y_start, w, h, ptr, order, bitness, big_endian, x_offset, y_offset, |     Display::draw_pixels_at(x_start, y_start, w, h, ptr, order, bitness, big_endian, x_offset, y_offset, x_pad); | ||||||
|                                      x_pad); |  | ||||||
|   } else { |   } else { | ||||||
|     auto stride = x_offset + w + x_pad; |     auto stride = x_offset + w + x_pad; | ||||||
|     auto data = ptr + (stride * y_offset + x_offset) * 2; |     auto data = ptr + (stride * y_offset + x_offset) * 2; | ||||||
|     SDL_UpdateTexture(this->texture_, &rect, data, stride * 2); |     SDL_UpdateTexture(this->texture_, &rect, data, stride * 2); | ||||||
|   } |   } | ||||||
|   SDL_RenderCopy(this->renderer_, this->texture_, &rect, &rect); |   this->redraw_(rect); | ||||||
|   SDL_RenderPresent(this->renderer_); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void Sdl::draw_pixel_at(int x, int y, Color color) { | void Sdl::draw_pixel_at(int x, int y, Color color) { | ||||||
| @@ -84,6 +87,20 @@ void Sdl::loop() { | |||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|  |       case SDL_WINDOWEVENT: | ||||||
|  |         switch (e.window.event) { | ||||||
|  |           case SDL_WINDOWEVENT_SIZE_CHANGED: | ||||||
|  |           case SDL_WINDOWEVENT_EXPOSED: | ||||||
|  |           case SDL_WINDOWEVENT_RESIZED: { | ||||||
|  |             SDL_Rect rect{0, 0, this->width_, this->height_}; | ||||||
|  |             this->redraw_(rect); | ||||||
|  |             break; | ||||||
|  |           } | ||||||
|  |           default: | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |  | ||||||
|       default: |       default: | ||||||
|         ESP_LOGV(TAG, "Event %d", e.type); |         ESP_LOGV(TAG, "Event %d", e.type); | ||||||
|         break; |         break; | ||||||
|   | |||||||
| @@ -38,6 +38,7 @@ class Sdl : public display::Display { | |||||||
|  protected: |  protected: | ||||||
|   int get_width_internal() override { return this->width_; } |   int get_width_internal() override { return this->width_; } | ||||||
|   int get_height_internal() override { return this->height_; } |   int get_height_internal() override { return this->height_; } | ||||||
|  |   void redraw_(SDL_Rect &rect); | ||||||
|   int width_{}; |   int width_{}; | ||||||
|   int height_{}; |   int height_{}; | ||||||
|   SDL_Renderer *renderer_{}; |   SDL_Renderer *renderer_{}; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user