From 122f6f991cc6ec8833a6dedcd12693843acbd1af Mon Sep 17 00:00:00 2001 From: Maschell Date: Mon, 7 Sep 2020 20:32:15 +0200 Subject: [PATCH] Update GuiImage to allow to be set by color instead of a texture --- src/gui/GuiImage.cpp | 24 ++++++++++++++++++------ src/gui/GuiImage.h | 13 +++++++++++-- src/gui/GuiText.cpp | 10 +++++++++- src/gui/GuiTextureData.cpp | 5 ----- src/menu/MainWindow.cpp | 4 +++- src/menu/MainWindow.h | 1 + 6 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/gui/GuiImage.cpp b/src/gui/GuiImage.cpp index cd5ee0e..3026481 100644 --- a/src/gui/GuiImage.cpp +++ b/src/gui/GuiImage.cpp @@ -22,8 +22,13 @@ GuiImage::GuiImage(GuiTextureData *texture) { setTexture(texture); } +GuiImage::GuiImage(SDL_Color color, float width, float height) { + this->color = color; + this->setSize(width, height); +} + GuiImage::~GuiImage() { - if(this->texture && freeTextureData){ + if (this->texture && freeTextureData) { delete this->texture; } } @@ -33,13 +38,20 @@ void GuiImage::draw(Renderer *renderer) { return; } + SDL_Rect rect; + rect.x = (int) getLeft(); + rect.y = (int) getTop(); + rect.w = (int) (getScaleX() * getWidth()); + rect.h = (int) (getScaleY() * getHeight()); + if (texture) { - SDL_Rect rect; - rect.x = (int) getLeft(); - rect.y = (int) getTop(); - rect.w = (int) (getScaleX() * getWidth()); - rect.h = (int) (getScaleY() * getHeight()); texture->draw(renderer, rect, getAngle()); + } else { + SDL_SetRenderDrawColor(renderer->getRenderer(), color.r, color.g, color.b, color.a); + SDL_RenderFillRect(renderer->getRenderer(), &rect); + if(getAngle() != 0.0f){ + DEBUG_FUNCTION_LINE("Drawing a rotated rect is not supported yet"); + } } } diff --git a/src/gui/GuiImage.h b/src/gui/GuiImage.h index 05b5e39..e5b80ed 100644 --- a/src/gui/GuiImage.h +++ b/src/gui/GuiImage.h @@ -23,19 +23,28 @@ //!Display, manage, and manipulate images in the GUI class GuiImage : public GuiElement { public: - //!\overload - //!\param img Pointer to GuiImageData element + GuiImage() = default; + //! Draws an image from an existing texture + //!\param texture Pointer to GuiTextureData element explicit GuiImage(GuiTextureData *texture); + //! Draws a colored rectangle + //!\param texture Pointer to GuiTextureData element + explicit GuiImage(SDL_Color color, float width, float height); + //!Destructor ~GuiImage() override; void draw(Renderer *r) override; void setTexture(GuiTextureData *tex); + private: GuiTextureData *texture = nullptr; bool freeTextureData = false; + + // Color of the rect that's drawn if the picture has no texture. + SDL_Color color = {0, 0, 0, 0}; }; diff --git a/src/gui/GuiText.cpp b/src/gui/GuiText.cpp index 7caa8a0..07960f8 100644 --- a/src/gui/GuiText.cpp +++ b/src/gui/GuiText.cpp @@ -76,10 +76,18 @@ void GuiText::updateTexture(Renderer *renderer) { textureData->setBlendMode(SDL_BLENDMODE_BLEND); texture.setTexture(textureData); + // Set render target to texture SDL_SetRenderTarget(renderer->getRenderer(), temp); + + // Clear texture. + SDL_SetRenderDrawColor(renderer->getRenderer(), 0, 0, 0, 0); SDL_RenderClear(renderer->getRenderer()); + + // Draw text to texture FC_DrawColumn(fc_font, renderer->getRenderer(), 0, 0, maxWidth, text.c_str()); - SDL_SetRenderTarget(renderer->getRenderer(), NULL); + + // Restore render target + SDL_SetRenderTarget(renderer->getRenderer(), nullptr); } else { DEBUG_FUNCTION_LINE("Failed to create texture"); } diff --git a/src/gui/GuiTextureData.cpp b/src/gui/GuiTextureData.cpp index 7885583..52a4d94 100644 --- a/src/gui/GuiTextureData.cpp +++ b/src/gui/GuiTextureData.cpp @@ -59,11 +59,6 @@ GuiTextureData::~GuiTextureData() { void GuiTextureData::draw(Renderer *renderer, const SDL_Rect& dest, float angle) { if (texture == nullptr && imgSurface) { - SDL_Surface *optimizedSurface = SDL_ConvertSurfaceFormat(imgSurface, renderer->getPixelFormat(), 0); - if (optimizedSurface != nullptr) { - SDL_FreeSurface(imgSurface); - imgSurface = optimizedSurface; - } texture = SDL_CreateTextureFromSurface(renderer->getRenderer(), imgSurface); } if (!texture) { diff --git a/src/menu/MainWindow.cpp b/src/menu/MainWindow.cpp index 03e0e5a..82d716c 100644 --- a/src/menu/MainWindow.cpp +++ b/src/menu/MainWindow.cpp @@ -17,12 +17,14 @@ MainWindow::~MainWindow() { delete bgMusic; } -MainWindow::MainWindow(int32_t w, int32_t h, Renderer* renderer) : GuiFrame(w, h) { +MainWindow::MainWindow(int32_t w, int32_t h, Renderer* renderer) : GuiFrame(w, h), bgImage({100, 0, 0, 255}, w, h) { auto picture_path = "button.png"; auto font_path = "FreeSans.ttf"; auto bgMusic_path = "bgMusic.ogg"; auto music_click = "button_click.mp3"; + append(&bgImage); + TTF_Font *font; SDL_RWops *rw = SDL_RWFromMem((void *) Resources::GetFile(font_path), Resources::GetFileSize(font_path)); diff --git a/src/menu/MainWindow.h b/src/menu/MainWindow.h index 925b249..fbfdeab 100644 --- a/src/menu/MainWindow.h +++ b/src/menu/MainWindow.h @@ -25,5 +25,6 @@ private: GuiImage *image4 = nullptr; GuiImage *image5 = nullptr; GuiButton *button = nullptr; + GuiImage bgImage; GuiSound *bgMusic = nullptr; };