From 3eece6eb61afda0a95f8151cff36229cd9d13dba Mon Sep 17 00:00:00 2001 From: twanvl Date: Fri, 22 Dec 2006 19:29:51 +0000 Subject: [PATCH] support for masks in choice styles git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@148 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/data/field/choice.cpp | 10 +++++++++- src/data/field/choice.hpp | 4 ++++ src/data/field/text.cpp | 2 +- src/gfx/blend_image.cpp | 2 +- src/render/value/choice.cpp | 6 ++++++ src/script/script_manager.cpp | 2 +- 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/data/field/choice.cpp b/src/data/field/choice.cpp index 9ae635d0..3f6ce6bc 100644 --- a/src/data/field/choice.cpp +++ b/src/data/field/choice.cpp @@ -7,6 +7,7 @@ // ----------------------------------------------------------------------------- : Includes #include +#include DECLARE_TYPEOF_COLLECTION(ChoiceField::ChoiceP); typedef map map_String_ScriptableImage; @@ -185,6 +186,13 @@ void ChoiceStyle::initDependencies(Context& ctx, const Dependency& dep) const { } } +void ChoiceStyle::loadMask(Package& pkg) { + if (mask.Ok() || mask_filename.empty()) return; + // load file + InputStreamP image_file = pkg.openIn(mask_filename); + mask.LoadFile(*image_file); +} + IMPLEMENT_REFLECTION_ENUM(ChoicePopupStyle) { VALUE_N("dropdown", POPUP_DROPDOWN); VALUE_N("menu", POPUP_MENU); @@ -204,7 +212,7 @@ IMPLEMENT_REFLECTION(ChoiceStyle) { REFLECT_BASE(Style); REFLECT(popup_style); REFLECT(render_style); - REFLECT_N("maks",mask_filename); + REFLECT_N("mask",mask_filename); REFLECT(combine); REFLECT(alignment); REFLECT(colors_card_list); diff --git a/src/data/field/choice.hpp b/src/data/field/choice.hpp index 27515588..cdc49700 100644 --- a/src/data/field/choice.hpp +++ b/src/data/field/choice.hpp @@ -125,6 +125,10 @@ class ChoiceStyle : public Style { String mask_filename; ///< Filename of an additional mask over the images ImageCombine combine; ///< Combining mode for drawing the images Alignment alignment; ///< Alignment of images + Image mask; ///< The actual mask image + + /// Load the mask image, if it's not already done + void loadMask(Package& pkg); virtual bool update(Context&); virtual void initDependencies(Context&, const Dependency&) const; diff --git a/src/data/field/text.cpp b/src/data/field/text.cpp index 14def149..3557bb0f 100644 --- a/src/data/field/text.cpp +++ b/src/data/field/text.cpp @@ -95,7 +95,7 @@ String TextValue::toString() const { } bool TextValue::update(Context& ctx) { Value::update(ctx); - WITH_DYNAMIC_ARG(last_update_age, last_update.get()); + WITH_DYNAMIC_ARG(last_update_age, value.isDefault() ? 0 : last_update.get()); bool change = field().default_script.invokeOnDefault(ctx, value) | field(). script.invokeOn(ctx, value); if (change) last_update.update(); diff --git a/src/gfx/blend_image.cpp b/src/gfx/blend_image.cpp index 7af5984b..92b1f37d 100644 --- a/src/gfx/blend_image.cpp +++ b/src/gfx/blend_image.cpp @@ -77,7 +77,7 @@ void mask_blend(Image& img1, const Image& img2, const Image& mask) { void set_alpha(Image& img, const Image& img_alpha) { if (img.GetWidth() != img_alpha.GetWidth() || img.GetHeight() != img_alpha.GetHeight()) { - throw InternalError(_("Image used with maks must have same size as mask")); + throw Error(_("Image must have same size as mask")); } if (!img.HasAlpha()) img.InitAlpha(); Byte *im = img.GetAlpha(), *al = img_alpha.GetData(); diff --git a/src/render/value/choice.cpp b/src/render/value/choice.cpp index 26202173..437f7983 100644 --- a/src/render/value/choice.cpp +++ b/src/render/value/choice.cpp @@ -34,6 +34,12 @@ void ChoiceValueViewer::draw(RotatedDC& dc) { ); } if (i) { + // apply mask? + style().loadMask(*viewer.stylesheet); + if (style().mask.Ok()) { + set_alpha(i->image, style().mask); + } + // draw dc.DrawImage(i->image, align_in_rect(style().alignment, RealSize(i->image.GetWidth(), i->image.GetHeight()), style().getRect()), i->combine == COMBINE_NORMAL ? style().combine : i->combine diff --git a/src/script/script_manager.cpp b/src/script/script_manager.cpp index 9938f373..a47f20d5 100644 --- a/src/script/script_manager.cpp +++ b/src/script/script_manager.cpp @@ -30,7 +30,7 @@ DECLARE_TYPEOF_NO_REV(IndexMap_FieldP_ValueP); void init_script_functions(Context& ctx); void init_script_image_functions(Context& ctx); -#define LOG_UPDATES +//#define LOG_UPDATES // ----------------------------------------------------------------------------- : SetScriptContext : initialization