From 0b22b17153967fef873b891689a153e72bd56a52 Mon Sep 17 00:00:00 2001 From: Brendan Hagan Date: Wed, 27 Jul 2022 23:02:01 -0400 Subject: [PATCH 1/4] feat: initial implementation for to_card_image() function (closes #33) --- src/gfx/generated_image.cpp | 13 ++++++++++++- src/gfx/generated_image.hpp | 13 +++++++++++++ src/script/functions/image.cpp | 12 ++++++++++-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/gfx/generated_image.cpp b/src/gfx/generated_image.cpp index 5465c16f..8d0ef742 100644 --- a/src/gfx/generated_image.cpp +++ b/src/gfx/generated_image.cpp @@ -441,7 +441,18 @@ Image BuiltInImage::generate(const Options& opt) const { bool BuiltInImage::operator == (const GeneratedImage& that) const { const BuiltInImage* that2 = dynamic_cast(&that); return that2 && name == that2->name; -} +} + +// ----------------------------------------------------------------------------- : ArbitraryImage + +Image ArbitraryImage::generate(const Options& opt) const { + return image; +} +bool ArbitraryImage::operator == (const GeneratedImage& that) const { + const ArbitraryImage* that2 = dynamic_cast(&that); + return that2 && image.IsSameAs(that2->image); +} + // ----------------------------------------------------------------------------- : SymbolToImage diff --git a/src/gfx/generated_image.hpp b/src/gfx/generated_image.hpp index fd14ccd1..d1e78221 100644 --- a/src/gfx/generated_image.hpp +++ b/src/gfx/generated_image.hpp @@ -346,6 +346,19 @@ public: bool operator == (const GeneratedImage& that) const override; private: String name; +}; + +// ----------------------------------------------------------------------------- : Arbitrary + +class ArbitraryImage : public GeneratedImage { +public: + inline ArbitraryImage(const Image image) + : image(image) + {} + Image generate(const Options& opt) const override; + bool operator == (const GeneratedImage& that) const override; +private: + Image image; }; // ----------------------------------------------------------------------------- : SymbolToImage diff --git a/src/script/functions/image.cpp b/src/script/functions/image.cpp index 3e9caf65..1e147eb6 100644 --- a/src/script/functions/image.cpp +++ b/src/script/functions/image.cpp @@ -15,7 +15,8 @@ #include #include #include -#include +#include +#include #include #include @@ -27,6 +28,12 @@ SCRIPT_FUNCTION(to_image) { SCRIPT_PARAM_C(GeneratedImageP, input); return input; } + +SCRIPT_FUNCTION(to_card_image) { + SCRIPT_PARAM(Set*, set); + SCRIPT_PARAM(CardP, input); + return make_intrusive(export_bitmap(set, input).ConvertToImage()); +} // ----------------------------------------------------------------------------- : Image functions @@ -209,7 +216,8 @@ SCRIPT_FUNCTION(built_in_image) { // ----------------------------------------------------------------------------- : Init void init_script_image_functions(Context& ctx) { - ctx.setVariable(_("to_image"), script_to_image); + ctx.setVariable(_("to_image"), script_to_image); + ctx.setVariable(_("to_card_image"), script_to_card_image); ctx.setVariable(_("linear_blend"), script_linear_blend); ctx.setVariable(_("masked_blend"), script_masked_blend); ctx.setVariable(_("combine_blend"), script_combine_blend); From a1fda8c6cdff9914c0af17efc5124ce6566a7b98 Mon Sep 17 00:00:00 2001 From: Brendan Hagan Date: Thu, 28 Jul 2022 00:18:28 -0400 Subject: [PATCH 2/4] feat: barebones image width/height script functions Ideally want a better way to make these properties or something. --- src/script/functions/image.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/script/functions/image.cpp b/src/script/functions/image.cpp index 1e147eb6..23fb8094 100644 --- a/src/script/functions/image.cpp +++ b/src/script/functions/image.cpp @@ -36,6 +36,18 @@ SCRIPT_FUNCTION(to_card_image) { } // ----------------------------------------------------------------------------- : Image functions + +SCRIPT_FUNCTION(width_of) { + SCRIPT_PARAM(GeneratedImageP, input); + Image image = input->generate(GeneratedImage::Options()); + SCRIPT_RETURN(image.GetWidth()); +} + +SCRIPT_FUNCTION(height_of) { + SCRIPT_PARAM(GeneratedImageP, input); + Image image = input->generate(GeneratedImage::Options()); + SCRIPT_RETURN(image.GetHeight()); +} SCRIPT_FUNCTION(linear_blend) { SCRIPT_PARAM(GeneratedImageP, image1); @@ -217,7 +229,9 @@ SCRIPT_FUNCTION(built_in_image) { void init_script_image_functions(Context& ctx) { ctx.setVariable(_("to_image"), script_to_image); - ctx.setVariable(_("to_card_image"), script_to_card_image); + ctx.setVariable(_("to_card_image"), script_to_card_image); + ctx.setVariable(_("width_of"), script_width_of); + ctx.setVariable(_("height_of"), script_height_of); ctx.setVariable(_("linear_blend"), script_linear_blend); ctx.setVariable(_("masked_blend"), script_masked_blend); ctx.setVariable(_("combine_blend"), script_combine_blend); From 05855b812a73a5ec2020f364e47ef4cc96146e67 Mon Sep 17 00:00:00 2001 From: Brendan Hagan Date: Fri, 12 Aug 2022 22:49:27 -0400 Subject: [PATCH 3/4] feat: add ability to control zoom/angle on generated card image --- src/data/format/formats.hpp | 6 ++-- src/data/format/image.cpp | 63 +++++++++++++++++++++++++++------- src/script/functions/image.cpp | 11 +++++- 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/data/format/formats.hpp b/src/data/format/formats.hpp index 4e317ca0..fd7d9665 100644 --- a/src/data/format/formats.hpp +++ b/src/data/format/formats.hpp @@ -99,11 +99,11 @@ void export_images(const SetP& set, const vector& cards, void export_image(const SetP& set, const CardP& card, const String& filename); /// Generate a bitmap image of a card -Bitmap export_bitmap(const SetP& set, const CardP& card); +Bitmap export_bitmap(const SetP& set, const CardP& card); +Bitmap export_bitmap(const SetP& set, const CardP& card, const double zoom, const Radians angle_radians); /// Export a set to Magic Workstation format void export_mws(Window* parent, const SetP& set); /// Export a set to Apprentice -void export_apprentice(Window* parent, const SetP& set); - +void export_apprentice(Window* parent, const SetP& set); diff --git a/src/data/format/image.cpp b/src/data/format/image.cpp index 91a4997e..0083a03c 100644 --- a/src/data/format/image.cpp +++ b/src/data/format/image.cpp @@ -25,15 +25,35 @@ void export_image(const SetP& set, const CardP& card, const String& filename) { } class UnzoomedDataViewer : public DataViewer { -public: +public: + UnzoomedDataViewer(); + UnzoomedDataViewer(double zoom, double angle); virtual ~UnzoomedDataViewer() {}; Rotation getRotation() const override; -private: - double angle = 0.0; -}; +private: + double zoom; + double angle; + bool declared_values; +}; + +UnzoomedDataViewer::UnzoomedDataViewer() + : zoom(1.0) + , angle(0.0) + , declared_values(false) +{} + +UnzoomedDataViewer::UnzoomedDataViewer(const double zoom, const Radians angle = 0.0) + : zoom(zoom) + , angle(angle) + , declared_values(true) +{} Rotation UnzoomedDataViewer::getRotation() const { - if (!stylesheet) stylesheet = set->stylesheet; + if (!stylesheet) stylesheet = set->stylesheet; + if (declared_values) { + return Rotation(angle, stylesheet->getCardRect(), zoom, 1.0, ROTATION_ATTACH_TOP_LEFT); + } + double export_zoom = settings.stylesheetSettingsFor(set->stylesheetFor(card)).export_zoom(); bool use_viewer_rotation = !settings.stylesheetSettingsFor(set->stylesheetFor(card)).card_normal_export(); @@ -42,26 +62,43 @@ Rotation UnzoomedDataViewer::getRotation() const { } else { return Rotation(angle, stylesheet->getCardRect(), export_zoom, 1.0, ROTATION_ATTACH_TOP_LEFT); } -} - -Bitmap export_bitmap(const SetP& set, const CardP& card) { - if (!set) throw Error(_("no set")); - // create viewer +} + +Bitmap export_bitmap(const SetP& set, const CardP& card) { + if (!set) throw Error(_("no set")); UnzoomedDataViewer viewer = UnzoomedDataViewer(); viewer.setSet(set); viewer.setCard(card); // size of cards RealSize size = viewer.getRotation().getExternalSize(); // create bitmap & dc - Bitmap bitmap((int) size.width, (int) size.height); + Bitmap bitmap((int)size.width, (int)size.height); if (!bitmap.Ok()) throw InternalError(_("Unable to create bitmap")); wxMemoryDC dc; dc.SelectObject(bitmap); // draw viewer.draw(dc); dc.SelectObject(wxNullBitmap); - return bitmap; -} + return bitmap; +} + +Bitmap export_bitmap(const SetP& set, const CardP& card, const double zoom, const Radians angle = 0.0) { + if (!set) throw Error(_("no set")); + UnzoomedDataViewer viewer = UnzoomedDataViewer(zoom, angle); + viewer.setSet(set); + viewer.setCard(card); + // size of cards + RealSize size = viewer.getRotation().getExternalSize(); + // create bitmap & dc + Bitmap bitmap((int)size.width, (int)size.height); + if (!bitmap.Ok()) throw InternalError(_("Unable to create bitmap")); + wxMemoryDC dc; + dc.SelectObject(bitmap); + // draw + viewer.draw(dc); + dc.SelectObject(wxNullBitmap); + return bitmap; +} // ----------------------------------------------------------------------------- : Multiple card export diff --git a/src/script/functions/image.cpp b/src/script/functions/image.cpp index 23fb8094..55ab22b1 100644 --- a/src/script/functions/image.cpp +++ b/src/script/functions/image.cpp @@ -32,7 +32,16 @@ SCRIPT_FUNCTION(to_image) { SCRIPT_FUNCTION(to_card_image) { SCRIPT_PARAM(Set*, set); SCRIPT_PARAM(CardP, input); - return make_intrusive(export_bitmap(set, input).ConvertToImage()); + SCRIPT_PARAM_DEFAULT(double, zoom, 100); + SCRIPT_PARAM_DEFAULT(Degrees, angle, 0); + SCRIPT_PARAM_DEFAULT(bool, use_user_settings, false); + if (use_user_settings) { + // Use the User's Preferences for Export Zoom and Angle settings. + return make_intrusive(export_bitmap(set, input).ConvertToImage()); + } else { + // Use the provided (or defaulted) Zoom and Angle. + return make_intrusive(export_bitmap(set, input, (zoom / 100), deg_to_rad(angle)).ConvertToImage()); + } } // ----------------------------------------------------------------------------- : Image functions From 6435055d5311c8a74f542bb8480ed65a357fba11 Mon Sep 17 00:00:00 2001 From: Brendan Hagan Date: Sat, 13 Aug 2022 22:43:42 -0400 Subject: [PATCH 4/4] feat: add card regions to declare image slice regions for DFCs --- data/ch-s.mse-locale/locale | 2 ++ data/ch-t.mse-locale/locale | 2 ++ data/da.mse-locale/locale | 2 ++ data/de.mse-locale/locale | 2 ++ data/en.mse-locale/locale | 2 ++ data/es.mse-locale/locale | 2 ++ data/fr.mse-locale/locale | 2 ++ data/it.mse-locale/locale | 2 ++ data/jp.mse-locale/locale | 2 ++ data/pl.mse-locale/locale | 2 ++ data/pt-br.mse-locale/locale | 2 ++ src/data/card_region.cpp | 25 +++++++++++++++++++++++++ src/data/card_region.hpp | 34 ++++++++++++++++++++++++++++++++++ src/data/stylesheet.cpp | 3 ++- src/data/stylesheet.hpp | 12 +++++++++--- 15 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/data/card_region.cpp create mode 100644 src/data/card_region.hpp diff --git a/data/ch-s.mse-locale/locale b/data/ch-s.mse-locale/locale index 33ce1d75..d63880e6 100644 --- a/data/ch-s.mse-locale/locale +++ b/data/ch-s.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: 关键词 keywords: 关键词 #_ADD pack: pack type +#_ADD card region: card region +#_ADD card regions: card regions # Symbol editor shapes shape: 图形 diff --git a/data/ch-t.mse-locale/locale b/data/ch-t.mse-locale/locale index 560caabf..70661099 100644 --- a/data/ch-t.mse-locale/locale +++ b/data/ch-t.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: 關鍵詞 keywords: 關鍵詞 #_ADD pack: pack type +#_ADD card region: card region +#_ADD card regions: card regions # Symbol editor shapes shape: 圖形 diff --git a/data/da.mse-locale/locale b/data/da.mse-locale/locale index 35749108..346ef803 100644 --- a/data/da.mse-locale/locale +++ b/data/da.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: keyword keywords: keywords pack: pack type + card region: card region + card regions: card regions # Symbol editor shapes shape: shape diff --git a/data/de.mse-locale/locale b/data/de.mse-locale/locale index e8b56090..22d94c37 100644 --- a/data/de.mse-locale/locale +++ b/data/de.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: keyword keywords: keywords pack: pack type + card region: card region + card regions: card regions # Symbol editor shapes shape: shape diff --git a/data/en.mse-locale/locale b/data/en.mse-locale/locale index ee0f4d0c..0632de4b 100644 --- a/data/en.mse-locale/locale +++ b/data/en.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: keyword keywords: keywords pack: pack type + card region: card region + card regions: card regions # Symbol editor shapes shape: shape diff --git a/data/es.mse-locale/locale b/data/es.mse-locale/locale index 48842f46..f72235b5 100644 --- a/data/es.mse-locale/locale +++ b/data/es.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: palabra clave keywords: palabras clave pack: mazo +#_ADD card region: card region +#_ADD card regions: card regions # Symbol editor shapes shape: forma diff --git a/data/fr.mse-locale/locale b/data/fr.mse-locale/locale index 79b7ee5e..de6a9294 100644 --- a/data/fr.mse-locale/locale +++ b/data/fr.mse-locale/locale @@ -898,6 +898,8 @@ type: circle: cercle ellipse: ellipse pack: type de pack +#_ADD card region: card region +#_ADD card regions: card regions square: carré rectangle: rectangle triangle: triangle diff --git a/data/it.mse-locale/locale b/data/it.mse-locale/locale index 58bb8bc2..c1091adb 100644 --- a/data/it.mse-locale/locale +++ b/data/it.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: parola-chiave keywords: parole chiave pack: tipo busta +#_ADD card region: card region +#_ADD card regions: card regions # Symbol editor shapes shape: forma diff --git a/data/jp.mse-locale/locale b/data/jp.mse-locale/locale index 6b324ff7..da040238 100644 --- a/data/jp.mse-locale/locale +++ b/data/jp.mse-locale/locale @@ -889,6 +889,8 @@ type: keyword: キーワード keywords: キーワード #_ADD pack: pack type +#_ADD card region: card region +#_ADD card regions: card regions # Symbol editor shapes shape: 形 diff --git a/data/pl.mse-locale/locale b/data/pl.mse-locale/locale index f630e3d5..a24553ef 100644 --- a/data/pl.mse-locale/locale +++ b/data/pl.mse-locale/locale @@ -924,6 +924,8 @@ type: keyword: słowo kluczowe (keyword) keywords: słowa kluczowe (keywords) pack: rodzaj paczki (pack type) +#_ADD card region: card region +#_ADD card regions: card regions # Symbol editor shapes shape: kształt diff --git a/data/pt-br.mse-locale/locale b/data/pt-br.mse-locale/locale index 5ed044c8..5d863245 100644 --- a/data/pt-br.mse-locale/locale +++ b/data/pt-br.mse-locale/locale @@ -891,6 +891,8 @@ type: keyword: palavra-chave keywords: palavras-chaves pack: tipo de pacote +#_ADD card region: card region +#_ADD card regions: card regions # Symbol editor shapes shape: forma diff --git a/src/data/card_region.cpp b/src/data/card_region.cpp new file mode 100644 index 00000000..4a197550 --- /dev/null +++ b/src/data/card_region.cpp @@ -0,0 +1,25 @@ +//+----------------------------------------------------------------------------+ +//| Description: Magic Set Editor - Program to make Magic (tm) cards | +//| Copyright: (C) Twan van Laarhoven and the other MSE developers | +//| License: GNU General Public License 2 or later (see file COPYING) | +//+----------------------------------------------------------------------------+ + +#include +#include + +CardRegion::CardRegion() + : name("") + , x(0.0) + , y(0.0) + , width(0) + , height(0) +{} +CardRegion::~CardRegion() {} + +IMPLEMENT_REFLECTION(CardRegion) { + REFLECT(name); + REFLECT(x); + REFLECT(y); + REFLECT(width); + REFLECT(height); +} diff --git a/src/data/card_region.hpp b/src/data/card_region.hpp new file mode 100644 index 00000000..4e5fac33 --- /dev/null +++ b/src/data/card_region.hpp @@ -0,0 +1,34 @@ +//+----------------------------------------------------------------------------+ +//| Description: Magic Set Editor - Program to make Magic (tm) cards | +//| Copyright: (C) Twan van Laarhoven and the other MSE developers | +//| License: GNU General Public License 2 or later (see file COPYING) | +//+----------------------------------------------------------------------------+ + +#pragma once + +#include +#include +#include