Commit 6bcda032 authored by twanvl's avatar twanvl

Symbol resizing using aspect ratio;

 TODO: copy code for rarity box to other styles
parent e575df6c
...@@ -199,10 +199,10 @@ card style: ...@@ -199,10 +199,10 @@ card style:
type: type:
left: 35 left: 35
top : 298 top : 298
width: 286 width: { 308 - max(22,card_style.rarity.content_width) }
height: 20 height: 20
alignment: top shrink-overflow alignment: top shrink-overflow
z index: 1 z index: 2
padding top: 2 padding top: 2
font: font:
name: Matrix name: Matrix
...@@ -211,12 +211,13 @@ card style: ...@@ -211,12 +211,13 @@ card style:
separator color: rgb(128,128,128) separator color: rgb(128,128,128)
rarity: rarity:
left: 320 right: 342
top : 297 top : 297
width: 22 width: 44
height: 22 height: 22
z index: 1 z index: 1
render style: image render style: image
alignment: middle right
choice images: choice images:
# Images based on the set symbol # Images based on the set symbol
basic land: script: symbol_variation(symbol: set.symbol, variation: "common") basic land: script: symbol_variation(symbol: set.symbol, variation: "common")
......
...@@ -170,7 +170,11 @@ void Style::checkContentDependencies(Context& ctx, const Dependency& dep) const ...@@ -170,7 +170,11 @@ void Style::checkContentDependencies(Context& ctx, const Dependency& dep) const
} }
void Style::markDependencyMember(const String& name, const Dependency& dep) const { void Style::markDependencyMember(const String& name, const Dependency& dep) const {
// no content specific properties here // mark dependencies on content
if (dep.type == DEP_DUMMY && dep.index == false && starts_with(name, _("content "))) {
// anything that starts with "content_" is a content property
const_cast<Dependency&>(dep).index = true;
}
} }
void mark_dependency_member(const Style& style, const String& name, const Dependency& dep) { void mark_dependency_member(const Style& style, const String& name, const Dependency& dep) {
......
...@@ -283,6 +283,12 @@ IMPLEMENT_REFLECTION_ENUM(ChoiceRenderStyle) { ...@@ -283,6 +283,12 @@ IMPLEMENT_REFLECTION_ENUM(ChoiceRenderStyle) {
VALUE_N("both list", RENDER_BOTH_LIST); VALUE_N("both list", RENDER_BOTH_LIST);
} }
template <typename T> void reflect_content(T& tag, const ChoiceStyle& cs) {}
template <> void reflect_content(GetMember& tag, const ChoiceStyle& cs) {
REFLECT_N("content_width", cs.content_width);
REFLECT_N("content_height", cs.content_height);
}
IMPLEMENT_REFLECTION(ChoiceStyle) { IMPLEMENT_REFLECTION(ChoiceStyle) {
REFLECT_ALIAS(300, "card list colors", "colors card list"); REFLECT_ALIAS(300, "card list colors", "colors card list");
REFLECT_BASE(Style); REFLECT_BASE(Style);
...@@ -295,6 +301,7 @@ IMPLEMENT_REFLECTION(ChoiceStyle) { ...@@ -295,6 +301,7 @@ IMPLEMENT_REFLECTION(ChoiceStyle) {
REFLECT(font); REFLECT(font);
REFLECT(image); REFLECT(image);
REFLECT(choice_images); REFLECT(choice_images);
reflect_content(tag, *this);
} }
// ----------------------------------------------------------------------------- : ChoiceValue // ----------------------------------------------------------------------------- : ChoiceValue
......
...@@ -155,6 +155,8 @@ class ChoiceStyle : public Style { ...@@ -155,6 +155,8 @@ class ChoiceStyle : public Style {
int angle; ///< Angle by which the images are rotated int angle; ///< Angle by which the images are rotated
wxImageList* thumbnails; ///< Thumbnails for the choices wxImageList* thumbnails; ///< Thumbnails for the choices
vector<ThumbnailStatus> thumbnails_status; ///< Which thumbnails are up to date? vector<ThumbnailStatus> thumbnails_status; ///< Which thumbnails are up to date?
// information from image rendering
double content_width, content_height; ///< Size of the rendered image/text
/// Load the mask image, if it's not already done /// Load the mask image, if it's not already done
void loadMask(Package& pkg); void loadMask(Package& pkg);
......
...@@ -81,14 +81,6 @@ void TextStyle::checkContentDependencies(Context& ctx, const Dependency& dep) co ...@@ -81,14 +81,6 @@ void TextStyle::checkContentDependencies(Context& ctx, const Dependency& dep) co
Style ::checkContentDependencies(ctx, dep); Style ::checkContentDependencies(ctx, dep);
alignment.initDependencies(ctx, dep); alignment.initDependencies(ctx, dep);
} }
void TextStyle::markDependencyMember(const String& name, const Dependency& dep) const {
Style::markDependencyMember(name, dep);
// mark dependencies on content
if (dep.type == DEP_DUMMY && dep.index == false &&
(name == _("content width") || name == _("content height") || name == _("content lines"))) {
const_cast<Dependency&>(dep).index = true;
}
}
template <typename T> void reflect_content(T& tag, const TextStyle& ts) {} template <typename T> void reflect_content(T& tag, const TextStyle& ts) {}
template <> void reflect_content(GetMember& tag, const TextStyle& ts) { template <> void reflect_content(GetMember& tag, const TextStyle& ts) {
......
...@@ -75,7 +75,6 @@ class TextStyle : public Style { ...@@ -75,7 +75,6 @@ class TextStyle : public Style {
virtual bool update(Context&); virtual bool update(Context&);
virtual void initDependencies(Context&, const Dependency&) const; virtual void initDependencies(Context&, const Dependency&) const;
virtual void checkContentDependencies(Context&, const Dependency&) const; virtual void checkContentDependencies(Context&, const Dependency&) const;
virtual void markDependencyMember(const String& name, const Dependency&) const;
/// The rotation to use when drawing /// The rotation to use when drawing
inline Rotation getRotation() const { inline Rotation getRotation() const {
......
...@@ -387,7 +387,13 @@ Image SymbolToImage::generate(const Options& opt) const { ...@@ -387,7 +387,13 @@ Image SymbolToImage::generate(const Options& opt) const {
the_symbol = opt.local_package->readFile<SymbolP>(filename); the_symbol = opt.local_package->readFile<SymbolP>(filename);
} }
int size = max(100, 3*max(opt.width,opt.height)); int size = max(100, 3*max(opt.width,opt.height));
return render_symbol(the_symbol, *variation->filter, variation->border_radius, size, size); if (opt.width <= 1 || opt.height <= 1) {
return render_symbol(the_symbol, *variation->filter, variation->border_radius, size, size);
} else {
int width = size * opt.width / max(opt.width,opt.height);
int height = size * opt.height / max(opt.width,opt.height);
return render_symbol(the_symbol, *variation->filter, variation->border_radius, width, height, false, true);
}
} }
bool SymbolToImage::operator == (const GeneratedImage& that) const { bool SymbolToImage::operator == (const GeneratedImage& that) const {
const SymbolToImage* that2 = dynamic_cast<const SymbolToImage*>(&that); const SymbolToImage* that2 = dynamic_cast<const SymbolToImage*>(&that);
......
...@@ -71,8 +71,8 @@ void filter_symbol(Image& symbol, const SymbolFilter& filter) { ...@@ -71,8 +71,8 @@ void filter_symbol(Image& symbol, const SymbolFilter& filter) {
} }
} }
Image render_symbol(const SymbolP& symbol, const SymbolFilter& filter, double border_radius, int width, int height, bool edit_hints) { Image render_symbol(const SymbolP& symbol, const SymbolFilter& filter, double border_radius, int width, int height, bool edit_hints, bool allow_smaller) {
Image i = render_symbol(symbol, border_radius, width, height, edit_hints); Image i = render_symbol(symbol, border_radius, width, height, edit_hints, allow_smaller);
filter_symbol(i, filter); filter_symbol(i, filter);
return i; return i;
} }
......
...@@ -35,7 +35,7 @@ class AColor : public Color { ...@@ -35,7 +35,7 @@ class AColor : public Color {
void filter_symbol(Image& symbol, const SymbolFilter& filter); void filter_symbol(Image& symbol, const SymbolFilter& filter);
/// Render a Symbol to an Image and filter it /// Render a Symbol to an Image and filter it
Image render_symbol(const SymbolP& symbol, const SymbolFilter& filter, double border_radius = 0.05, int width = 100, int height = 100, bool edit_hints = false); Image render_symbol(const SymbolP& symbol, const SymbolFilter& filter, double border_radius = 0.05, int width = 100, int height = 100, bool edit_hints = false, bool allow_smaller = false);
/// Is a point inside a symbol? /// Is a point inside a symbol?
enum SymbolSet enum SymbolSet
......
...@@ -14,14 +14,14 @@ DECLARE_TYPEOF_COLLECTION(SymbolPartP); ...@@ -14,14 +14,14 @@ DECLARE_TYPEOF_COLLECTION(SymbolPartP);
// ----------------------------------------------------------------------------- : Simple rendering // ----------------------------------------------------------------------------- : Simple rendering
Image render_symbol(const SymbolP& symbol, double border_radius, int width, int height, bool editing_hints) { Image render_symbol(const SymbolP& symbol, double border_radius, int width, int height, bool editing_hints, bool allow_smaller) {
SymbolViewer viewer(symbol, editing_hints, width, border_radius); SymbolViewer viewer(symbol, editing_hints, width, border_radius);
// limit width/height ratio to aspect ratio of symbol // limit width/height ratio to aspect ratio of symbol
double ar = symbol->aspectRatio(); double ar = symbol->aspectRatio();
double par = (double)width/height; double par = (double)width/height;
if (par > ar && ar > 1) { if (par > ar && (ar > 1 || (allow_smaller && height < width))) {
width = height * ar; width = height * ar;
} else if (par < ar && ar < 1) { } else if (par < ar && (ar < 1 || (allow_smaller && width < height))) {
height = width / ar; height = width / ar;
} }
if (width > height) { if (width > height) {
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
// ----------------------------------------------------------------------------- : Simple rendering // ----------------------------------------------------------------------------- : Simple rendering
/// Render a Symbol to an Image /// Render a Symbol to an Image
Image render_symbol(const SymbolP& symbol, double border_radius = 0.05, int width = 100, int height = 100, bool editing_hints = false); Image render_symbol(const SymbolP& symbol, double border_radius = 0.05, int width = 100, int height = 100, bool editing_hints = false, bool allow_smaller = false);
// ----------------------------------------------------------------------------- : Symbol Viewer // ----------------------------------------------------------------------------- : Symbol Viewer
......
...@@ -12,6 +12,40 @@ ...@@ -12,6 +12,40 @@
// ----------------------------------------------------------------------------- : ChoiceValueViewer // ----------------------------------------------------------------------------- : ChoiceValueViewer
bool ChoiceValueViewer::prepare(RotatedDC& dc) {
if (style().render_style & RENDER_IMAGE) {
style().initImage();
ScriptableImage& img = style().image;
Context& ctx = viewer.getContext();
ctx.setVariable(_("input"), to_script(value().value()));
img.update(ctx);
//generate
if (img.isReady()) {
GeneratedImage::Options img_options(0,0, viewer.stylesheet.get(), &getSet());
if (nativeLook()) {
img_options.width = img_options.height = 16;
img_options.preserve_aspect = ASPECT_BORDER;
} else if(style().render_style & RENDER_TEXT) {
// also drawing text, use original size
} else {
img_options.width = (int) dc.trX(style().width);
img_options.height = (int) dc.trY(style().height);
img_options.preserve_aspect = (style().alignment & ALIGN_STRETCH) ? ASPECT_STRETCH : ASPECT_FIT;
}
// don't worry we cache the image
Image image = img.generate(img_options, true);
// store content properties
if (style().content_width != image.GetWidth() ||
style().content_height != image.GetHeight()) {
style().content_width = image.GetWidth();
style().content_height = image.GetHeight();
return true;
}
}
}
return false;
}
void ChoiceValueViewer::draw(RotatedDC& dc) { void ChoiceValueViewer::draw(RotatedDC& dc) {
drawFieldBorder(dc); drawFieldBorder(dc);
if (style().render_style & RENDER_HIDDEN) return; if (style().render_style & RENDER_HIDDEN) return;
...@@ -19,14 +53,7 @@ void ChoiceValueViewer::draw(RotatedDC& dc) { ...@@ -19,14 +53,7 @@ void ChoiceValueViewer::draw(RotatedDC& dc) {
double margin = 0; double margin = 0;
if (style().render_style & RENDER_IMAGE) { if (style().render_style & RENDER_IMAGE) {
// draw image // draw image
// map<String,ScriptableImage>::iterator it = style().choice_images.find(cannocial_name_form(value().value()));
// if (it != style().choice_images.end() && it->second.isReady()) {
// ScriptableImage& img = it->second;
style().initImage();
ScriptableImage& img = style().image; ScriptableImage& img = style().image;
Context& ctx = viewer.getContext();
ctx.setVariable(_("input"), to_script(value().value()));
img.update(ctx);
if (img.isReady()) { if (img.isReady()) {
GeneratedImage::Options img_options(0,0, viewer.stylesheet.get(), &getSet()); GeneratedImage::Options img_options(0,0, viewer.stylesheet.get(), &getSet());
if (nativeLook()) { if (nativeLook()) {
......
...@@ -20,6 +20,7 @@ class ChoiceValueViewer : public ValueViewer { ...@@ -20,6 +20,7 @@ class ChoiceValueViewer : public ValueViewer {
public: public:
DECLARE_VALUE_VIEWER(Choice) : ValueViewer(parent,style) {} DECLARE_VALUE_VIEWER(Choice) : ValueViewer(parent,style) {}
virtual bool prepare(RotatedDC& dc);
virtual void draw(RotatedDC& dc); virtual void draw(RotatedDC& dc);
virtual void onStyleChange(bool); virtual void onStyleChange(bool);
}; };
......
...@@ -32,7 +32,7 @@ void SymbolValueViewer::draw(RotatedDC& dc) { ...@@ -32,7 +32,7 @@ void SymbolValueViewer::draw(RotatedDC& dc) {
ar = min(style().max_aspect_ratio, max(style().min_aspect_ratio, ar)); ar = min(style().max_aspect_ratio, max(style().min_aspect_ratio, ar));
// render and filter variations // render and filter variations
FOR_EACH(variation, style().variations) { FOR_EACH(variation, style().variations) {
Image img = render_symbol(symbol, *variation->filter, variation->border_radius, 100 * ar, 100); Image img = render_symbol(symbol, *variation->filter, variation->border_radius, 200 * ar, 200);
Image resampled((int) (wh * ar), (int) wh, false); Image resampled((int) (wh * ar), (int) wh, false);
resample(img, resampled); resample(img, resampled);
symbols.push_back(Bitmap(resampled)); symbols.push_back(Bitmap(resampled));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment