diff --git a/assets/cards/faces/10C.png b/assets/cards/faces/10C.png
index 39f6953..b4b9142 100644
Binary files a/assets/cards/faces/10C.png and b/assets/cards/faces/10C.png differ
diff --git a/assets/cards/faces/10D.png b/assets/cards/faces/10D.png
index 952f17d..16721d2 100644
Binary files a/assets/cards/faces/10D.png and b/assets/cards/faces/10D.png differ
diff --git a/assets/cards/faces/10H.png b/assets/cards/faces/10H.png
index 8347275..97881a2 100644
Binary files a/assets/cards/faces/10H.png and b/assets/cards/faces/10H.png differ
diff --git a/assets/cards/faces/10S.png b/assets/cards/faces/10S.png
index 9c732dd..a7634d2 100644
Binary files a/assets/cards/faces/10S.png and b/assets/cards/faces/10S.png differ
diff --git a/assets/cards/faces/2C.png b/assets/cards/faces/2C.png
index 8134924..9e1d816 100644
Binary files a/assets/cards/faces/2C.png and b/assets/cards/faces/2C.png differ
diff --git a/assets/cards/faces/2D.png b/assets/cards/faces/2D.png
index 155ab50..90f44c6 100644
Binary files a/assets/cards/faces/2D.png and b/assets/cards/faces/2D.png differ
diff --git a/assets/cards/faces/2H.png b/assets/cards/faces/2H.png
index ebfa450..bf08097 100644
Binary files a/assets/cards/faces/2H.png and b/assets/cards/faces/2H.png differ
diff --git a/assets/cards/faces/2S.png b/assets/cards/faces/2S.png
index 0d5ee80..73cba4c 100644
Binary files a/assets/cards/faces/2S.png and b/assets/cards/faces/2S.png differ
diff --git a/assets/cards/faces/3C.png b/assets/cards/faces/3C.png
index dfbfd87..237782a 100644
Binary files a/assets/cards/faces/3C.png and b/assets/cards/faces/3C.png differ
diff --git a/assets/cards/faces/3D.png b/assets/cards/faces/3D.png
index 9a6afa8..b528213 100644
Binary files a/assets/cards/faces/3D.png and b/assets/cards/faces/3D.png differ
diff --git a/assets/cards/faces/3H.png b/assets/cards/faces/3H.png
index fb3a8bc..c91e015 100644
Binary files a/assets/cards/faces/3H.png and b/assets/cards/faces/3H.png differ
diff --git a/assets/cards/faces/3S.png b/assets/cards/faces/3S.png
index 87641cd..2258e79 100644
Binary files a/assets/cards/faces/3S.png and b/assets/cards/faces/3S.png differ
diff --git a/assets/cards/faces/4C.png b/assets/cards/faces/4C.png
index 1d1801f..9d4d541 100644
Binary files a/assets/cards/faces/4C.png and b/assets/cards/faces/4C.png differ
diff --git a/assets/cards/faces/4D.png b/assets/cards/faces/4D.png
index e855c94..6039794 100644
Binary files a/assets/cards/faces/4D.png and b/assets/cards/faces/4D.png differ
diff --git a/assets/cards/faces/4H.png b/assets/cards/faces/4H.png
index 30ee126..d8b6ca1 100644
Binary files a/assets/cards/faces/4H.png and b/assets/cards/faces/4H.png differ
diff --git a/assets/cards/faces/4S.png b/assets/cards/faces/4S.png
index 8a9f6ca..3014c27 100644
Binary files a/assets/cards/faces/4S.png and b/assets/cards/faces/4S.png differ
diff --git a/assets/cards/faces/5C.png b/assets/cards/faces/5C.png
index 66de502..90a372a 100644
Binary files a/assets/cards/faces/5C.png and b/assets/cards/faces/5C.png differ
diff --git a/assets/cards/faces/5D.png b/assets/cards/faces/5D.png
index a6d7eec..133ea43 100644
Binary files a/assets/cards/faces/5D.png and b/assets/cards/faces/5D.png differ
diff --git a/assets/cards/faces/5H.png b/assets/cards/faces/5H.png
index 19ca087..7f0519e 100644
Binary files a/assets/cards/faces/5H.png and b/assets/cards/faces/5H.png differ
diff --git a/assets/cards/faces/5S.png b/assets/cards/faces/5S.png
index 0b83f51..2a2575e 100644
Binary files a/assets/cards/faces/5S.png and b/assets/cards/faces/5S.png differ
diff --git a/assets/cards/faces/6C.png b/assets/cards/faces/6C.png
index bbdb6ac..192f005 100644
Binary files a/assets/cards/faces/6C.png and b/assets/cards/faces/6C.png differ
diff --git a/assets/cards/faces/6D.png b/assets/cards/faces/6D.png
index 740ab42..a0a6caa 100644
Binary files a/assets/cards/faces/6D.png and b/assets/cards/faces/6D.png differ
diff --git a/assets/cards/faces/6H.png b/assets/cards/faces/6H.png
index 07399f0..ec5e5bc 100644
Binary files a/assets/cards/faces/6H.png and b/assets/cards/faces/6H.png differ
diff --git a/assets/cards/faces/6S.png b/assets/cards/faces/6S.png
index 7ffe917..f9a92ec 100644
Binary files a/assets/cards/faces/6S.png and b/assets/cards/faces/6S.png differ
diff --git a/assets/cards/faces/7C.png b/assets/cards/faces/7C.png
index a5006f9..f9e1899 100644
Binary files a/assets/cards/faces/7C.png and b/assets/cards/faces/7C.png differ
diff --git a/assets/cards/faces/7D.png b/assets/cards/faces/7D.png
index b77fe88..94ba6b2 100644
Binary files a/assets/cards/faces/7D.png and b/assets/cards/faces/7D.png differ
diff --git a/assets/cards/faces/7H.png b/assets/cards/faces/7H.png
index 9ee6ac9..1e6fa7e 100644
Binary files a/assets/cards/faces/7H.png and b/assets/cards/faces/7H.png differ
diff --git a/assets/cards/faces/7S.png b/assets/cards/faces/7S.png
index 7bebe8a..f652e8b 100644
Binary files a/assets/cards/faces/7S.png and b/assets/cards/faces/7S.png differ
diff --git a/assets/cards/faces/8C.png b/assets/cards/faces/8C.png
index 9018ee4..29abffb 100644
Binary files a/assets/cards/faces/8C.png and b/assets/cards/faces/8C.png differ
diff --git a/assets/cards/faces/8D.png b/assets/cards/faces/8D.png
index b9d323c..63bfc75 100644
Binary files a/assets/cards/faces/8D.png and b/assets/cards/faces/8D.png differ
diff --git a/assets/cards/faces/8H.png b/assets/cards/faces/8H.png
index 4b4b596..1728ee0 100644
Binary files a/assets/cards/faces/8H.png and b/assets/cards/faces/8H.png differ
diff --git a/assets/cards/faces/8S.png b/assets/cards/faces/8S.png
index 36371e0..50167d4 100644
Binary files a/assets/cards/faces/8S.png and b/assets/cards/faces/8S.png differ
diff --git a/assets/cards/faces/9C.png b/assets/cards/faces/9C.png
index a98202d..111016c 100644
Binary files a/assets/cards/faces/9C.png and b/assets/cards/faces/9C.png differ
diff --git a/assets/cards/faces/9D.png b/assets/cards/faces/9D.png
index 8e9e3cc..832ad3e 100644
Binary files a/assets/cards/faces/9D.png and b/assets/cards/faces/9D.png differ
diff --git a/assets/cards/faces/9H.png b/assets/cards/faces/9H.png
index 03b790d..51fd98a 100644
Binary files a/assets/cards/faces/9H.png and b/assets/cards/faces/9H.png differ
diff --git a/assets/cards/faces/9S.png b/assets/cards/faces/9S.png
index b659087..67046bb 100644
Binary files a/assets/cards/faces/9S.png and b/assets/cards/faces/9S.png differ
diff --git a/assets/cards/faces/AC.png b/assets/cards/faces/AC.png
index 4fb1eb3..7426cb5 100644
Binary files a/assets/cards/faces/AC.png and b/assets/cards/faces/AC.png differ
diff --git a/assets/cards/faces/AD.png b/assets/cards/faces/AD.png
index d40fe47..baa9b39 100644
Binary files a/assets/cards/faces/AD.png and b/assets/cards/faces/AD.png differ
diff --git a/assets/cards/faces/AH.png b/assets/cards/faces/AH.png
index af91dc6..1e99b6a 100644
Binary files a/assets/cards/faces/AH.png and b/assets/cards/faces/AH.png differ
diff --git a/assets/cards/faces/AS.png b/assets/cards/faces/AS.png
index 2044a27..3565d1c 100644
Binary files a/assets/cards/faces/AS.png and b/assets/cards/faces/AS.png differ
diff --git a/assets/cards/faces/JC.png b/assets/cards/faces/JC.png
index 97fa126..394dba1 100644
Binary files a/assets/cards/faces/JC.png and b/assets/cards/faces/JC.png differ
diff --git a/assets/cards/faces/JD.png b/assets/cards/faces/JD.png
index 112b719..786fbf9 100644
Binary files a/assets/cards/faces/JD.png and b/assets/cards/faces/JD.png differ
diff --git a/assets/cards/faces/JH.png b/assets/cards/faces/JH.png
index 57f1dd2..cd72ab0 100644
Binary files a/assets/cards/faces/JH.png and b/assets/cards/faces/JH.png differ
diff --git a/assets/cards/faces/JS.png b/assets/cards/faces/JS.png
index 297ab8c..a42f91a 100644
Binary files a/assets/cards/faces/JS.png and b/assets/cards/faces/JS.png differ
diff --git a/assets/cards/faces/KC.png b/assets/cards/faces/KC.png
index 98a3ef6..730155b 100644
Binary files a/assets/cards/faces/KC.png and b/assets/cards/faces/KC.png differ
diff --git a/assets/cards/faces/KD.png b/assets/cards/faces/KD.png
index 2898c30..658146e 100644
Binary files a/assets/cards/faces/KD.png and b/assets/cards/faces/KD.png differ
diff --git a/assets/cards/faces/KH.png b/assets/cards/faces/KH.png
index 3d1076b..2b9ffa8 100644
Binary files a/assets/cards/faces/KH.png and b/assets/cards/faces/KH.png differ
diff --git a/assets/cards/faces/KS.png b/assets/cards/faces/KS.png
index eac2e72..f878bf5 100644
Binary files a/assets/cards/faces/KS.png and b/assets/cards/faces/KS.png differ
diff --git a/assets/cards/faces/QC.png b/assets/cards/faces/QC.png
index 9c10284..93deb0a 100644
Binary files a/assets/cards/faces/QC.png and b/assets/cards/faces/QC.png differ
diff --git a/assets/cards/faces/QD.png b/assets/cards/faces/QD.png
index 90ac3a7..199d15b 100644
Binary files a/assets/cards/faces/QD.png and b/assets/cards/faces/QD.png differ
diff --git a/assets/cards/faces/QH.png b/assets/cards/faces/QH.png
index 9469d2c..2376737 100644
Binary files a/assets/cards/faces/QH.png and b/assets/cards/faces/QH.png differ
diff --git a/assets/cards/faces/QS.png b/assets/cards/faces/QS.png
index 63e37cf..19f5690 100644
Binary files a/assets/cards/faces/QS.png and b/assets/cards/faces/QS.png differ
diff --git a/solitaire_engine/assets/themes/default/clubs_10.svg b/solitaire_engine/assets/themes/default/clubs_10.svg
index cc9d59b..148b63e 100644
--- a/solitaire_engine/assets/themes/default/clubs_10.svg
+++ b/solitaire_engine/assets/themes/default/clubs_10.svg
@@ -2,15 +2,24 @@
-
+
10
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_2.svg b/solitaire_engine/assets/themes/default/clubs_2.svg
index 7858796..e1bf5e3 100644
--- a/solitaire_engine/assets/themes/default/clubs_2.svg
+++ b/solitaire_engine/assets/themes/default/clubs_2.svg
@@ -2,15 +2,24 @@
-
+
2
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_3.svg b/solitaire_engine/assets/themes/default/clubs_3.svg
index f527127..08012b5 100644
--- a/solitaire_engine/assets/themes/default/clubs_3.svg
+++ b/solitaire_engine/assets/themes/default/clubs_3.svg
@@ -2,15 +2,24 @@
-
+
3
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_4.svg b/solitaire_engine/assets/themes/default/clubs_4.svg
index b9b4b62..ad9d868 100644
--- a/solitaire_engine/assets/themes/default/clubs_4.svg
+++ b/solitaire_engine/assets/themes/default/clubs_4.svg
@@ -2,15 +2,24 @@
-
+
4
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_5.svg b/solitaire_engine/assets/themes/default/clubs_5.svg
index 4e33adb..82a9edb 100644
--- a/solitaire_engine/assets/themes/default/clubs_5.svg
+++ b/solitaire_engine/assets/themes/default/clubs_5.svg
@@ -2,15 +2,24 @@
-
+
5
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_6.svg b/solitaire_engine/assets/themes/default/clubs_6.svg
index ca85c51..70c9b8f 100644
--- a/solitaire_engine/assets/themes/default/clubs_6.svg
+++ b/solitaire_engine/assets/themes/default/clubs_6.svg
@@ -2,15 +2,24 @@
-
+
6
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_7.svg b/solitaire_engine/assets/themes/default/clubs_7.svg
index b0e1613..20bc607 100644
--- a/solitaire_engine/assets/themes/default/clubs_7.svg
+++ b/solitaire_engine/assets/themes/default/clubs_7.svg
@@ -2,15 +2,24 @@
-
+
7
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_8.svg b/solitaire_engine/assets/themes/default/clubs_8.svg
index fd1eddb..4b69e67 100644
--- a/solitaire_engine/assets/themes/default/clubs_8.svg
+++ b/solitaire_engine/assets/themes/default/clubs_8.svg
@@ -2,15 +2,24 @@
-
+
8
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_9.svg b/solitaire_engine/assets/themes/default/clubs_9.svg
index d6facf5..6a26fe6 100644
--- a/solitaire_engine/assets/themes/default/clubs_9.svg
+++ b/solitaire_engine/assets/themes/default/clubs_9.svg
@@ -2,15 +2,24 @@
-
+
9
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_ace.svg b/solitaire_engine/assets/themes/default/clubs_ace.svg
index 7a43d1e..674591d 100644
--- a/solitaire_engine/assets/themes/default/clubs_ace.svg
+++ b/solitaire_engine/assets/themes/default/clubs_ace.svg
@@ -2,15 +2,24 @@
-
+
A
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_jack.svg b/solitaire_engine/assets/themes/default/clubs_jack.svg
index b8efe0e..83bf611 100644
--- a/solitaire_engine/assets/themes/default/clubs_jack.svg
+++ b/solitaire_engine/assets/themes/default/clubs_jack.svg
@@ -2,15 +2,24 @@
-
+
J
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_king.svg b/solitaire_engine/assets/themes/default/clubs_king.svg
index c312301..e35d89c 100644
--- a/solitaire_engine/assets/themes/default/clubs_king.svg
+++ b/solitaire_engine/assets/themes/default/clubs_king.svg
@@ -2,15 +2,24 @@
-
+
K
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/clubs_queen.svg b/solitaire_engine/assets/themes/default/clubs_queen.svg
index 909471f..c16de4e 100644
--- a/solitaire_engine/assets/themes/default/clubs_queen.svg
+++ b/solitaire_engine/assets/themes/default/clubs_queen.svg
@@ -2,15 +2,24 @@
-
+
Q
- ♣
-
- ♣
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_10.svg b/solitaire_engine/assets/themes/default/diamonds_10.svg
index 787dbf3..d2528c0 100644
--- a/solitaire_engine/assets/themes/default/diamonds_10.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_10.svg
@@ -2,15 +2,24 @@
-
+
10
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_2.svg b/solitaire_engine/assets/themes/default/diamonds_2.svg
index ec359ca..6ae1a8e 100644
--- a/solitaire_engine/assets/themes/default/diamonds_2.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_2.svg
@@ -2,15 +2,24 @@
-
+
2
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_3.svg b/solitaire_engine/assets/themes/default/diamonds_3.svg
index 0cd574b..ac2411b 100644
--- a/solitaire_engine/assets/themes/default/diamonds_3.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_3.svg
@@ -2,15 +2,24 @@
-
+
3
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_4.svg b/solitaire_engine/assets/themes/default/diamonds_4.svg
index 850eb6e..d07270c 100644
--- a/solitaire_engine/assets/themes/default/diamonds_4.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_4.svg
@@ -2,15 +2,24 @@
-
+
4
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_5.svg b/solitaire_engine/assets/themes/default/diamonds_5.svg
index 4e5d760..d1765b2 100644
--- a/solitaire_engine/assets/themes/default/diamonds_5.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_5.svg
@@ -2,15 +2,24 @@
-
+
5
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_6.svg b/solitaire_engine/assets/themes/default/diamonds_6.svg
index c2ab18b..8e62b15 100644
--- a/solitaire_engine/assets/themes/default/diamonds_6.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_6.svg
@@ -2,15 +2,24 @@
-
+
6
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_7.svg b/solitaire_engine/assets/themes/default/diamonds_7.svg
index 08fc2df..7bde549 100644
--- a/solitaire_engine/assets/themes/default/diamonds_7.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_7.svg
@@ -2,15 +2,24 @@
-
+
7
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_8.svg b/solitaire_engine/assets/themes/default/diamonds_8.svg
index 56ad92c..a93a50f 100644
--- a/solitaire_engine/assets/themes/default/diamonds_8.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_8.svg
@@ -2,15 +2,24 @@
-
+
8
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_9.svg b/solitaire_engine/assets/themes/default/diamonds_9.svg
index 3edd6a8..bb5bd30 100644
--- a/solitaire_engine/assets/themes/default/diamonds_9.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_9.svg
@@ -2,15 +2,24 @@
-
+
9
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_ace.svg b/solitaire_engine/assets/themes/default/diamonds_ace.svg
index a98bc3e..da050b1 100644
--- a/solitaire_engine/assets/themes/default/diamonds_ace.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_ace.svg
@@ -2,15 +2,24 @@
-
+
A
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_jack.svg b/solitaire_engine/assets/themes/default/diamonds_jack.svg
index 5f2284a..397e49e 100644
--- a/solitaire_engine/assets/themes/default/diamonds_jack.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_jack.svg
@@ -2,15 +2,24 @@
-
+
J
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_king.svg b/solitaire_engine/assets/themes/default/diamonds_king.svg
index 9c99bd2..2546ba1 100644
--- a/solitaire_engine/assets/themes/default/diamonds_king.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_king.svg
@@ -2,15 +2,24 @@
-
+
K
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/diamonds_queen.svg b/solitaire_engine/assets/themes/default/diamonds_queen.svg
index 8149a9b..0c6540e 100644
--- a/solitaire_engine/assets/themes/default/diamonds_queen.svg
+++ b/solitaire_engine/assets/themes/default/diamonds_queen.svg
@@ -2,15 +2,24 @@
-
+
Q
- ♦
-
- ♦
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_10.svg b/solitaire_engine/assets/themes/default/hearts_10.svg
index dee6d99..b7c1e61 100644
--- a/solitaire_engine/assets/themes/default/hearts_10.svg
+++ b/solitaire_engine/assets/themes/default/hearts_10.svg
@@ -2,15 +2,24 @@
-
+
10
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_2.svg b/solitaire_engine/assets/themes/default/hearts_2.svg
index a1004c8..a2de249 100644
--- a/solitaire_engine/assets/themes/default/hearts_2.svg
+++ b/solitaire_engine/assets/themes/default/hearts_2.svg
@@ -2,15 +2,24 @@
-
+
2
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_3.svg b/solitaire_engine/assets/themes/default/hearts_3.svg
index 671e2d3..d81e942 100644
--- a/solitaire_engine/assets/themes/default/hearts_3.svg
+++ b/solitaire_engine/assets/themes/default/hearts_3.svg
@@ -2,15 +2,24 @@
-
+
3
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_4.svg b/solitaire_engine/assets/themes/default/hearts_4.svg
index cd7b61b..428976f 100644
--- a/solitaire_engine/assets/themes/default/hearts_4.svg
+++ b/solitaire_engine/assets/themes/default/hearts_4.svg
@@ -2,15 +2,24 @@
-
+
4
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_5.svg b/solitaire_engine/assets/themes/default/hearts_5.svg
index 2b73200..72a4ff5 100644
--- a/solitaire_engine/assets/themes/default/hearts_5.svg
+++ b/solitaire_engine/assets/themes/default/hearts_5.svg
@@ -2,15 +2,24 @@
-
+
5
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_6.svg b/solitaire_engine/assets/themes/default/hearts_6.svg
index cedc285..cc3f363 100644
--- a/solitaire_engine/assets/themes/default/hearts_6.svg
+++ b/solitaire_engine/assets/themes/default/hearts_6.svg
@@ -2,15 +2,24 @@
-
+
6
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_7.svg b/solitaire_engine/assets/themes/default/hearts_7.svg
index 7cc2063..a2c654e 100644
--- a/solitaire_engine/assets/themes/default/hearts_7.svg
+++ b/solitaire_engine/assets/themes/default/hearts_7.svg
@@ -2,15 +2,24 @@
-
+
7
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_8.svg b/solitaire_engine/assets/themes/default/hearts_8.svg
index b190afa..4721a79 100644
--- a/solitaire_engine/assets/themes/default/hearts_8.svg
+++ b/solitaire_engine/assets/themes/default/hearts_8.svg
@@ -2,15 +2,24 @@
-
+
8
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_9.svg b/solitaire_engine/assets/themes/default/hearts_9.svg
index 83cb835..b1fa666 100644
--- a/solitaire_engine/assets/themes/default/hearts_9.svg
+++ b/solitaire_engine/assets/themes/default/hearts_9.svg
@@ -2,15 +2,24 @@
-
+
9
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_ace.svg b/solitaire_engine/assets/themes/default/hearts_ace.svg
index 100e02c..3cd302d 100644
--- a/solitaire_engine/assets/themes/default/hearts_ace.svg
+++ b/solitaire_engine/assets/themes/default/hearts_ace.svg
@@ -2,15 +2,24 @@
-
+
A
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_jack.svg b/solitaire_engine/assets/themes/default/hearts_jack.svg
index 1b4c8fe..e9415b0 100644
--- a/solitaire_engine/assets/themes/default/hearts_jack.svg
+++ b/solitaire_engine/assets/themes/default/hearts_jack.svg
@@ -2,15 +2,24 @@
-
+
J
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_king.svg b/solitaire_engine/assets/themes/default/hearts_king.svg
index 74934e7..b8ab614 100644
--- a/solitaire_engine/assets/themes/default/hearts_king.svg
+++ b/solitaire_engine/assets/themes/default/hearts_king.svg
@@ -2,15 +2,24 @@
-
+
K
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/hearts_queen.svg b/solitaire_engine/assets/themes/default/hearts_queen.svg
index 843c3cf..abac2b1 100644
--- a/solitaire_engine/assets/themes/default/hearts_queen.svg
+++ b/solitaire_engine/assets/themes/default/hearts_queen.svg
@@ -2,15 +2,24 @@
-
+
Q
- ♥
-
- ♥
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_10.svg b/solitaire_engine/assets/themes/default/spades_10.svg
index 174a1bd..955fa51 100644
--- a/solitaire_engine/assets/themes/default/spades_10.svg
+++ b/solitaire_engine/assets/themes/default/spades_10.svg
@@ -2,15 +2,24 @@
-
+
10
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_2.svg b/solitaire_engine/assets/themes/default/spades_2.svg
index de978fe..28aaa67 100644
--- a/solitaire_engine/assets/themes/default/spades_2.svg
+++ b/solitaire_engine/assets/themes/default/spades_2.svg
@@ -2,15 +2,24 @@
-
+
2
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_3.svg b/solitaire_engine/assets/themes/default/spades_3.svg
index 24696c7..8c6c6a5 100644
--- a/solitaire_engine/assets/themes/default/spades_3.svg
+++ b/solitaire_engine/assets/themes/default/spades_3.svg
@@ -2,15 +2,24 @@
-
+
3
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_4.svg b/solitaire_engine/assets/themes/default/spades_4.svg
index fa700db..5df2db1 100644
--- a/solitaire_engine/assets/themes/default/spades_4.svg
+++ b/solitaire_engine/assets/themes/default/spades_4.svg
@@ -2,15 +2,24 @@
-
+
4
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_5.svg b/solitaire_engine/assets/themes/default/spades_5.svg
index bf6cfb9..300d9e7 100644
--- a/solitaire_engine/assets/themes/default/spades_5.svg
+++ b/solitaire_engine/assets/themes/default/spades_5.svg
@@ -2,15 +2,24 @@
-
+
5
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_6.svg b/solitaire_engine/assets/themes/default/spades_6.svg
index 7b16a84..59f7930 100644
--- a/solitaire_engine/assets/themes/default/spades_6.svg
+++ b/solitaire_engine/assets/themes/default/spades_6.svg
@@ -2,15 +2,24 @@
-
+
6
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_7.svg b/solitaire_engine/assets/themes/default/spades_7.svg
index f7e946b..128a168 100644
--- a/solitaire_engine/assets/themes/default/spades_7.svg
+++ b/solitaire_engine/assets/themes/default/spades_7.svg
@@ -2,15 +2,24 @@
-
+
7
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_8.svg b/solitaire_engine/assets/themes/default/spades_8.svg
index 545f837..30d9a21 100644
--- a/solitaire_engine/assets/themes/default/spades_8.svg
+++ b/solitaire_engine/assets/themes/default/spades_8.svg
@@ -2,15 +2,24 @@
-
+
8
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_9.svg b/solitaire_engine/assets/themes/default/spades_9.svg
index 6d9ae0a..608e29b 100644
--- a/solitaire_engine/assets/themes/default/spades_9.svg
+++ b/solitaire_engine/assets/themes/default/spades_9.svg
@@ -2,15 +2,24 @@
-
+
9
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_ace.svg b/solitaire_engine/assets/themes/default/spades_ace.svg
index ef0b36d..7791731 100644
--- a/solitaire_engine/assets/themes/default/spades_ace.svg
+++ b/solitaire_engine/assets/themes/default/spades_ace.svg
@@ -2,15 +2,24 @@
-
+
A
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_jack.svg b/solitaire_engine/assets/themes/default/spades_jack.svg
index 96d6382..b0e37e8 100644
--- a/solitaire_engine/assets/themes/default/spades_jack.svg
+++ b/solitaire_engine/assets/themes/default/spades_jack.svg
@@ -2,15 +2,24 @@
-
+
J
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_king.svg b/solitaire_engine/assets/themes/default/spades_king.svg
index 87e86b8..1c30a42 100644
--- a/solitaire_engine/assets/themes/default/spades_king.svg
+++ b/solitaire_engine/assets/themes/default/spades_king.svg
@@ -2,15 +2,24 @@
-
+
K
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/assets/themes/default/spades_queen.svg b/solitaire_engine/assets/themes/default/spades_queen.svg
index c462ea6..1ac976c 100644
--- a/solitaire_engine/assets/themes/default/spades_queen.svg
+++ b/solitaire_engine/assets/themes/default/spades_queen.svg
@@ -2,15 +2,24 @@
-
+
Q
- ♠
-
- ♠
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solitaire_engine/src/assets/card_face_svg.rs b/solitaire_engine/src/assets/card_face_svg.rs
index 8c91636..7631cab 100644
--- a/solitaire_engine/src/assets/card_face_svg.rs
+++ b/solitaire_engine/src/assets/card_face_svg.rs
@@ -161,12 +161,38 @@ fn glyph_paint_attrs(colour: &str, paint: GlyphPaint) -> String {
}
}
-fn suit_glyph(suit: Suit) -> &'static str {
+/// SVG `path` `d` attribute tracing the suit's silhouette inside a
+/// 32 × 32 logical box (origin top-left, +Y down). All four suits are
+/// authored as a single closed perimeter so the same path renders
+/// correctly whether filled (♥ ♠) or outlined (♦ ♣).
+///
+/// Path-based rendering replaces the earlier `` approach because
+/// the bundled `FiraMono` font doesn't carry the Unicode suit glyphs
+/// (U+2660-2666) at the requested size — `usvg` was falling back to a
+/// substitute rendering that produced near-invisible "tofu" marks.
+/// Paths bypass the font system entirely.
+fn suit_path_d(suit: Suit) -> &'static str {
match suit {
- Suit::Clubs => "♣",
- Suit::Diamonds => "♦",
- Suit::Hearts => "♥",
- Suit::Spades => "♠",
+ Suit::Hearts => {
+ "M16,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 \
+ C 12,4 14,6 16,9 C 18,6 20,4 23,4 \
+ C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z"
+ }
+ Suit::Diamonds => "M16,2 L 29,16 L 16,30 L 3,16 Z",
+ Suit::Spades => {
+ "M16,4 C 9,9 2,14 2,21 C 2,25 5,28 9,28 \
+ C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 \
+ C 18,26 19,28 23,28 C 27,28 30,25 30,21 \
+ C 30,14 23,9 16,4 Z"
+ }
+ Suit::Clubs => {
+ "M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 \
+ C 9,14 4,17 4,21 C 4,24 7,27 10,27 \
+ C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 \
+ C 18,26 20,27 22,27 C 25,27 28,24 28,21 \
+ C 28,17 23,14 20,14 C 21,13 22,12 22,10 \
+ C 22,7 19,4 16,4 Z"
+ }
}
}
@@ -174,7 +200,7 @@ fn suit_glyph(suit: Suit) -> &'static str {
/// self-contained, parsable SVG document.
pub fn face_svg(rank: Rank, suit: Suit) -> String {
let (colour, paint) = suit_paint(suit);
- let glyph = suit_glyph(suit);
+ let path_d = suit_path_d(suit);
let rank_text = rank_filename(rank);
let small_glyph_attrs = glyph_paint_attrs(colour, paint);
let large_glyph_attrs = glyph_paint_attrs(colour, paint);
@@ -183,27 +209,42 @@ pub fn face_svg(rank: Rank, suit: Suit) -> String {
// border: 1 px → 2 px stroke-width
// corner radius: 8 px → 16 px rx/ry
// rank font: 18 px → 36 px
- // small glyph: 10 px → 20 px
- // large glyph: 32 px → 64 px
+ // small glyph: 10 px → 20 px (suit_path_d is authored at 32 →
+ // scale 0.625 to land at 20)
+ // large glyph: 32 px → 64 px (scale 2.0)
//
// Inset the border by 1 px so the 2 px stroke renders fully
// inside the 256 × 384 pixmap rather than getting clipped.
+ //
+ // Suit glyphs are rendered as inline SVG paths (not ``)
+ // because the bundled `FiraMono` font doesn't carry usable
+ // U+2660-2666 glyphs at the requested size. See `suit_path_d`
+ // for the rationale.
format!(
r##""##
)
}
diff --git a/solitaire_engine/tests/card_face_svg_pin.rs b/solitaire_engine/tests/card_face_svg_pin.rs
index 28579a0..35489a9 100644
--- a/solitaire_engine/tests/card_face_svg_pin.rs
+++ b/solitaire_engine/tests/card_face_svg_pin.rs
@@ -24,58 +24,58 @@ use solitaire_engine::assets::card_face_svg::{
use solitaire_engine::assets::rasterize_svg;
const EXPECTED: &[(&str, u64)] = &[
- ("face_AC", 0xca11dff5bb9f0eb0),
- ("face_2C", 0xc929a25f0f217577),
- ("face_3C", 0xdaede8383266b5c3),
- ("face_4C", 0xeaa3ea51866f69e5),
- ("face_5C", 0xe5a74589cb09cc5c),
- ("face_6C", 0xdbbc1036895ee08e),
- ("face_7C", 0xb8a28119a85ccf5d),
- ("face_8C", 0xab4d19ce4b8d15e7),
- ("face_9C", 0x17c95eb07f382059),
- ("face_10C", 0x1f1b2c84e42211b1),
- ("face_JC", 0xd87c45124df8b03d),
- ("face_QC", 0xe23701b6685994b2),
- ("face_KC", 0xc628e55b8a15472a),
- ("face_AD", 0x49a140d84b0a731b),
- ("face_2D", 0x713f755b5ecfb67a),
- ("face_3D", 0xe59a72abc47af7d4),
- ("face_4D", 0xf75ac828822079d1),
- ("face_5D", 0x6db0cc9a5849395f),
- ("face_6D", 0x9b034cf6851512de),
- ("face_7D", 0x85f96e0326780a6e),
- ("face_8D", 0x59ec5533b615ecd4),
- ("face_9D", 0x3689911671b30921),
- ("face_10D", 0x682684217e3e8b60),
- ("face_JD", 0xd999f85e6862c5a7),
- ("face_QD", 0x6db493a3b370b211),
- ("face_KD", 0x4c2ec19166fdee7b),
- ("face_AH", 0x0d41c498281b9a74),
- ("face_2H", 0xec6493b71d4576b1),
- ("face_3H", 0xd2fb4b5956caf15b),
- ("face_4H", 0xfbe8e1eaa2b28c5a),
- ("face_5H", 0x649a0964e549f008),
- ("face_6H", 0xa10fa42b5549fc85),
- ("face_7H", 0x6823107295c149b5),
- ("face_8H", 0x474d2de14865e65b),
- ("face_9H", 0x1b0de1af8dae108a),
- ("face_10H", 0x451fd5855859c9d7),
- ("face_JH", 0xd821a7d4c79a37e0),
- ("face_QH", 0xde0c6ef7e963861a),
- ("face_KH", 0xe29039cb6a115214),
- ("face_AS", 0x1697fbcc61b64e0f),
- ("face_2S", 0x5ada7ea3e39547d0),
- ("face_3S", 0x6d8eed531f2d659c),
- ("face_4S", 0x1b1a2d25e080d71e),
- ("face_5S", 0x5eb82baa4f9a74bb),
- ("face_6S", 0xa00b217892d32ead),
- ("face_7S", 0xaf60935ec8d93346),
- ("face_8S", 0xffbde852d8699a80),
- ("face_9S", 0x8f68afa04b88e1a2),
- ("face_10S", 0x96fa4a08f168210a),
- ("face_JS", 0x73030a8109b5b5e6),
- ("face_QS", 0x303eb6c33e363cc1),
- ("face_KS", 0x3ed5b5a9432c91e9),
+ ("face_AC", 0x79b449cb455e496d),
+ ("face_2C", 0x10a1056c4800c45e),
+ ("face_3C", 0xbd128e390e06673a),
+ ("face_4C", 0x949c323c78a804c0),
+ ("face_5C", 0xd396d5ed99fb57e9),
+ ("face_6C", 0x15519c6d72d1720f),
+ ("face_7C", 0xc24bdc1a2d380d78),
+ ("face_8C", 0x36464f4ab4cf672e),
+ ("face_9C", 0x32add2eb53b1aec4),
+ ("face_10C", 0x68619202f29481fc),
+ ("face_JC", 0x116b3eeac58e0f58),
+ ("face_QC", 0xb149ab5b2cac85e3),
+ ("face_KC", 0x2a9fd2c63b99bd3b),
+ ("face_AD", 0xe49c3fec2c01817c),
+ ("face_2D", 0x8f42b4014e0d6809),
+ ("face_3D", 0x63ff77fa873c557b),
+ ("face_4D", 0x33356bd9628daaf2),
+ ("face_5D", 0x8897839054dbd808),
+ ("face_6D", 0x03ff93fb0c05a195),
+ ("face_7D", 0xc2b7f97f5b1cc545),
+ ("face_8D", 0xd8515a8278d74a7b),
+ ("face_9D", 0xfbfe52ec3bbd2962),
+ ("face_10D", 0x8f2dfc06a1d55a2f),
+ ("face_JD", 0x3941d34384607530),
+ ("face_QD", 0x0dcf5a9e2fc99f02),
+ ("face_KD", 0xb834cb89d80bd39c),
+ ("face_AH", 0x1a2e6d2ac818093f),
+ ("face_2H", 0x8ab9ad7d2111233e),
+ ("face_3H", 0x5e1057fa87c90968),
+ ("face_4H", 0x1e1550b0af8a35a5),
+ ("face_5H", 0x77404642251596d3),
+ ("face_6H", 0xf7bec77bcbb9f942),
+ ("face_7H", 0x9b7c52a5c03fb4f2),
+ ("face_8H", 0xd2623a827963fe68),
+ ("face_9H", 0xec19380e53986015),
+ ("face_10H", 0x1205d0ec042a7484),
+ ("face_JH", 0xd28bf03e6e871ccb),
+ ("face_QH", 0x78548704b4530c65),
+ ("face_KH", 0x9708e6c2d9c3bedf),
+ ("face_AS", 0xebabc54128f38105),
+ ("face_2S", 0xaac2970387b18ffe),
+ ("face_3S", 0xb0864e78a6802bea),
+ ("face_4S", 0xd118bc992bd41330),
+ ("face_5S", 0x7fb7d6040d9b0641),
+ ("face_6S", 0xbc048e82f1079637),
+ ("face_7S", 0x147ee7c002e43648),
+ ("face_8S", 0xfed30db056fbaa8e),
+ ("face_9S", 0x332bc2060d8fcca4),
+ ("face_10S", 0x0b810ffaf105421c),
+ ("face_JS", 0x2ea7b956f2f23c28),
+ ("face_QS", 0xedca2e002087ae6b),
+ ("face_KS", 0x92e486d4e96ac4a3),
("back_0", 0xf698d0e161eae13a),
("back_1", 0x446fdc0a3c83a03a),
("back_2", 0xcf188fdec9f5819a),