1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:47:45 +00:00

LibCards: Make the card back image configurable

`CardPainter::set_background_image_path()` immediately repaints the card
back and inverted card back bitmaps if they exist, so users just need
to `update()` that part of the screen. This is handled automatically by
`CardGame`, but other users will have to do this manually.
This commit is contained in:
Sam Atkins 2022-08-21 15:47:06 +01:00 committed by Andreas Kling
parent 7f46d31849
commit 40b1428194
3 changed files with 35 additions and 4 deletions

View file

@ -5,6 +5,7 @@
*/ */
#include "CardGame.h" #include "CardGame.h"
#include <LibCards/CardPainter.h>
#include <LibConfig/Client.h> #include <LibConfig/Client.h>
#include <LibGfx/Palette.h> #include <LibGfx/Palette.h>
@ -18,9 +19,16 @@ CardGame::CardGame()
void CardGame::config_string_did_change(String const& domain, String const& group, String const& key, String const& value) void CardGame::config_string_did_change(String const& domain, String const& group, String const& key, String const& value)
{ {
if (domain == "Games" && group == "Cards" && key == "BackgroundColor") { if (domain == "Games" && group == "Cards") {
if (auto maybe_color = Gfx::Color::from_string(value); maybe_color.has_value()) { if (key == "BackgroundColor") {
if (auto maybe_color = Gfx::Color::from_string(value); maybe_color.has_value())
set_background_color(maybe_color.value()); set_background_color(maybe_color.value());
return;
}
if (key == "CardBackImage") {
CardPainter::the().set_background_image_path(value);
update();
return;
} }
} }
} }

View file

@ -7,6 +7,7 @@
*/ */
#include "CardPainter.h" #include "CardPainter.h"
#include <LibConfig/Client.h>
#include <LibGfx/Font/Font.h> #include <LibGfx/Font/Font.h>
#include <LibGfx/Font/FontDatabase.h> #include <LibGfx/Font/FontDatabase.h>
@ -18,6 +19,11 @@ CardPainter& CardPainter::the()
return s_card_painter; return s_card_painter;
} }
CardPainter::CardPainter()
{
m_background_image_path = Config::read_string("Games"sv, "Cards"sv, "CardBackImage"sv, "/res/icons/cards/buggie-deck.png"sv);
}
static constexpr Gfx::CharacterBitmap s_diamond { static constexpr Gfx::CharacterBitmap s_diamond {
" # " " # "
" ### " " ### "
@ -122,6 +128,18 @@ NonnullRefPtr<Gfx::Bitmap> CardPainter::card_back_inverted()
return *m_card_back_inverted; return *m_card_back_inverted;
} }
void CardPainter::set_background_image_path(String path)
{
if (m_background_image_path == path)
return;
m_background_image_path = path;
if (!m_card_back.is_null())
paint_card_back(*m_card_back);
if (!m_card_back_inverted.is_null())
paint_inverted_card(*m_card_back_inverted, *m_card_back);
}
NonnullRefPtr<Gfx::Bitmap> CardPainter::create_card_bitmap() NonnullRefPtr<Gfx::Bitmap> CardPainter::create_card_bitmap()
{ {
return Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, { Card::width, Card::height }).release_value_but_fixme_should_propagate_errors(); return Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRA8888, { Card::width, Card::height }).release_value_but_fixme_should_propagate_errors();
@ -177,7 +195,7 @@ void CardPainter::paint_card_back(Gfx::Bitmap& bitmap)
auto paint_rect = bitmap.rect(); auto paint_rect = bitmap.rect();
painter.clear_rect(paint_rect, Gfx::Color::Transparent); painter.clear_rect(paint_rect, Gfx::Color::Transparent);
auto image = Gfx::Bitmap::try_load_from_file("/res/icons/cards/buggie-deck.png"sv).release_value_but_fixme_should_propagate_errors(); auto image = Gfx::Bitmap::try_load_from_file(m_background_image_path).release_value_but_fixme_should_propagate_errors();
float aspect_ratio = image->width() / static_cast<float>(image->height()); float aspect_ratio = image->width() / static_cast<float>(image->height());
Gfx::IntSize target_size { static_cast<int>(aspect_ratio * (Card::height - 5)), Card::height - 5 }; Gfx::IntSize target_size { static_cast<int>(aspect_ratio * (Card::height - 5)), Card::height - 5 };

View file

@ -21,7 +21,10 @@ public:
NonnullRefPtr<Gfx::Bitmap> card_front_inverted(Suit, Rank); NonnullRefPtr<Gfx::Bitmap> card_front_inverted(Suit, Rank);
NonnullRefPtr<Gfx::Bitmap> card_back_inverted(); NonnullRefPtr<Gfx::Bitmap> card_back_inverted();
void set_background_image_path(String path);
private: private:
CardPainter();
NonnullRefPtr<Gfx::Bitmap> create_card_bitmap(); NonnullRefPtr<Gfx::Bitmap> create_card_bitmap();
void paint_card_front(Gfx::Bitmap&, Suit, Rank); void paint_card_front(Gfx::Bitmap&, Suit, Rank);
void paint_card_back(Gfx::Bitmap&); void paint_card_back(Gfx::Bitmap&);
@ -31,6 +34,8 @@ private:
Array<Array<RefPtr<Gfx::Bitmap>, to_underlying(Rank::__Count)>, to_underlying(Suit::__Count)> m_cards_inverted; Array<Array<RefPtr<Gfx::Bitmap>, to_underlying(Rank::__Count)>, to_underlying(Suit::__Count)> m_cards_inverted;
RefPtr<Gfx::Bitmap> m_card_back; RefPtr<Gfx::Bitmap> m_card_back;
RefPtr<Gfx::Bitmap> m_card_back_inverted; RefPtr<Gfx::Bitmap> m_card_back_inverted;
String m_background_image_path;
}; };
} }