From 55168b50dc8f78dc853a7f96eaa60c51aa24df7f Mon Sep 17 00:00:00 2001 From: david072 Date: Sun, 12 Nov 2023 11:35:53 +0100 Subject: [PATCH] LibCards: Painting disabled cards --- Userland/Libraries/LibCards/Card.cpp | 6 ++++ Userland/Libraries/LibCards/Card.h | 4 +++ Userland/Libraries/LibCards/CardPainter.cpp | 40 +++++++++++++++++++++ Userland/Libraries/LibCards/CardPainter.h | 6 ++++ 4 files changed, 56 insertions(+) diff --git a/Userland/Libraries/LibCards/Card.cpp b/Userland/Libraries/LibCards/Card.cpp index 79a95a0ff2a..fef9afe05e5 100644 --- a/Userland/Libraries/LibCards/Card.cpp +++ b/Userland/Libraries/LibCards/Card.cpp @@ -2,6 +2,7 @@ * Copyright (c) 2020, Till Mayer * Copyright (c) 2022, the SerenityOS developers. * Copyright (c) 2022, Sam Atkins + * Copyright (c) 2023, David Ganz * * SPDX-License-Identifier: BSD-2-Clause */ @@ -22,6 +23,8 @@ Card::Card(Suit suit, Rank rank) void Card::paint(GUI::Painter& painter, bool highlighted) const { + VERIFY(!(highlighted && m_disabled)); + auto& card_painter = CardPainter::the(); auto bitmap = [&]() { if (m_inverted) @@ -30,6 +33,9 @@ void Card::paint(GUI::Painter& painter, bool highlighted) const VERIFY(!m_upside_down); return card_painter.card_front_highlighted(m_suit, m_rank); } + if (m_disabled) { + return m_upside_down ? card_painter.card_back_disabled() : card_painter.card_front_disabled(m_suit, m_rank); + } return m_upside_down ? card_painter.card_back() : card_painter.card_front(m_suit, m_rank); }(); painter.blit(position(), bitmap, bitmap->rect()); diff --git a/Userland/Libraries/LibCards/Card.h b/Userland/Libraries/LibCards/Card.h index 210d4bdd905..f0e193322b4 100644 --- a/Userland/Libraries/LibCards/Card.h +++ b/Userland/Libraries/LibCards/Card.h @@ -2,6 +2,7 @@ * Copyright (c) 2020, Till Mayer * Copyright (c) 2022, the SerenityOS developers. * Copyright (c) 2022, Sam Atkins + * Copyright (c) 2023, David Ganz * * SPDX-License-Identifier: BSD-2-Clause */ @@ -99,6 +100,7 @@ public: bool is_upside_down() const { return m_upside_down; } bool is_inverted() const { return m_inverted; } bool is_previewed() const { return m_previewed; } + bool is_disabled() const { return m_disabled; } Gfx::Color color() const { return (m_suit == Suit::Diamonds || m_suit == Suit::Hearts) ? Color::Red : Color::Black; } void set_position(const Gfx::IntPoint p) { m_rect.set_location(p); } @@ -106,6 +108,7 @@ public: void set_upside_down(bool upside_down) { m_upside_down = upside_down; } void set_inverted(bool inverted) { m_inverted = inverted; } void set_previewed(bool previewed) { m_previewed = previewed; } + void set_disabled(bool disabled) { m_disabled = disabled; } void save_old_position(); @@ -125,6 +128,7 @@ private: bool m_upside_down { false }; bool m_inverted { false }; bool m_previewed { false }; + bool m_disabled { false }; }; enum class Shuffle { diff --git a/Userland/Libraries/LibCards/CardPainter.cpp b/Userland/Libraries/LibCards/CardPainter.cpp index e97e0df9d2b..044f31be28e 100644 --- a/Userland/Libraries/LibCards/CardPainter.cpp +++ b/Userland/Libraries/LibCards/CardPainter.cpp @@ -2,6 +2,7 @@ * Copyright (c) 2020, Till Mayer * Copyright (c) 2022, the SerenityOS developers. * Copyright (c) 2022-2023, Sam Atkins + * Copyright (c) 2023, David Ganz * * SPDX-License-Identifier: BSD-2-Clause */ @@ -79,6 +80,8 @@ static constexpr Gfx::CharacterBitmap s_club { 9, 9 }; +static constexpr u8 s_disabled_alpha = 90; + NonnullRefPtr CardPainter::card_front(Suit suit, Rank rank) { auto suit_id = to_underlying(suit); @@ -120,6 +123,21 @@ NonnullRefPtr CardPainter::card_front_highlighted(Suit suit, Rank r return *m_cards_highlighted[suit_id][rank_id]; } +NonnullRefPtr CardPainter::card_front_disabled(Suit suit, Rank rank) +{ + auto suit_id = to_underlying(suit); + auto rank_id = to_underlying(rank); + + auto& existing_bitmap = m_cards_disabled[suit_id][rank_id]; + if (!existing_bitmap.is_null()) + return *existing_bitmap; + + m_cards_disabled[suit_id][rank_id] = create_card_bitmap(); + paint_disabled_card(*m_cards_disabled[suit_id][rank_id], card_front(suit, rank)); + + return *m_cards_disabled[suit_id][rank_id]; +} + NonnullRefPtr CardPainter::card_front_inverted(Suit suit, Rank rank) { auto suit_id = to_underlying(suit); @@ -146,6 +164,17 @@ NonnullRefPtr CardPainter::card_back_inverted() return *m_card_back_inverted; } +NonnullRefPtr CardPainter::card_back_disabled() +{ + if (!m_card_back_disabled.is_null()) + return *m_card_back_disabled; + + m_card_back_disabled = create_card_bitmap(); + paint_disabled_card(*m_card_back_disabled, card_back()); + + return *m_card_back_disabled; +} + void CardPainter::set_back_image_path(StringView path) { if (m_back_image_path == path) @@ -467,4 +496,15 @@ void CardPainter::paint_highlighted_card(Gfx::Bitmap& bitmap, Gfx::Bitmap const& painter.blit({ 4, 4 }, source_to_highlight, source_to_highlight.rect().shrunken(8, 8)); } +void CardPainter::paint_disabled_card(Gfx::Bitmap& bitmap, Gfx::Bitmap const& source_to_disable) +{ + Gfx::Painter painter { bitmap }; + auto disabled_color = Color(Color::Black); + disabled_color.set_alpha(s_disabled_alpha); + + painter.blit_filtered(Gfx::IntPoint {}, source_to_disable, source_to_disable.rect(), [&](Color color) { + return color.blend(disabled_color); + }); +} + } diff --git a/Userland/Libraries/LibCards/CardPainter.h b/Userland/Libraries/LibCards/CardPainter.h index 31278ed279f..ea94083d3c1 100644 --- a/Userland/Libraries/LibCards/CardPainter.h +++ b/Userland/Libraries/LibCards/CardPainter.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2022-2023, Sam Atkins + * Copyright (c) 2023, David Ganz * * SPDX-License-Identifier: BSD-2-Clause */ @@ -23,6 +24,8 @@ public: NonnullRefPtr card_front_inverted(Suit, Rank); NonnullRefPtr card_back_inverted(); NonnullRefPtr card_front_highlighted(Suit, Rank); + NonnullRefPtr card_front_disabled(Suit, Rank); + NonnullRefPtr card_back_disabled(); void set_back_image_path(StringView path); void set_front_images_set_name(StringView path); @@ -36,14 +39,17 @@ private: void paint_card_back(Gfx::Bitmap&); void paint_inverted_card(Gfx::Bitmap& bitmap, Gfx::Bitmap const& source_to_invert); void paint_highlighted_card(Gfx::Bitmap& bitmap, Gfx::Bitmap const& source_to_highlight); + void paint_disabled_card(Gfx::Bitmap& bitmap, Gfx::Bitmap const& source_to_disable); Array, to_underlying(Suit::__Count)> m_suit_pips; Array, to_underlying(Suit::__Count)> m_suit_pips_flipped_vertically; Array, to_underlying(Rank::__Count)>, to_underlying(Suit::__Count)> m_cards; Array, to_underlying(Rank::__Count)>, to_underlying(Suit::__Count)> m_cards_inverted; Array, to_underlying(Rank::__Count)>, to_underlying(Suit::__Count)> m_cards_highlighted; + Array, to_underlying(Rank::__Count)>, to_underlying(Suit::__Count)> m_cards_disabled; RefPtr m_card_back; RefPtr m_card_back_inverted; + RefPtr m_card_back_disabled; String m_back_image_path; String m_front_images_set_name;