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:
type:
left: 35
top : 298
width: 286
width: { 308 - max(22,card_style.rarity.content_width) }
height: 20
alignment: top shrink-overflow
z index: 1
z index: 2
padding top: 2
font:
name: Matrix
......@@ -211,12 +211,13 @@ card style:
separator color: rgb(128,128,128)
rarity:
left: 320
right: 342
top : 297
width: 22
width: 44
height: 22
z index: 1
render style: image
alignment: middle right
choice images:
# Images based on the set symbol
basic land: script: symbol_variation(symbol: set.symbol, variation: "common")
......
......@@ -170,7 +170,11 @@ void Style::checkContentDependencies(Context& ctx, 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) {
......
......@@ -283,6 +283,12 @@ IMPLEMENT_REFLECTION_ENUM(ChoiceRenderStyle) {
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) {
REFLECT_ALIAS(300, "card list colors", "colors card list");
REFLECT_BASE(Style);
......@@ -295,6 +301,7 @@ IMPLEMENT_REFLECTION(ChoiceStyle) {
REFLECT(font);
REFLECT(image);
REFLECT(choice_images);
reflect_content(tag, *this);
}
// ----------------------------------------------------------------------------- : ChoiceValue
......
......@@ -155,6 +155,8 @@ class ChoiceStyle : public Style {
int angle; ///< Angle by which the images are rotated
wxImageList* thumbnails; ///< Thumbnails for the choices
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
void loadMask(Package& pkg);
......
......@@ -81,14 +81,6 @@ void TextStyle::checkContentDependencies(Context& ctx, const Dependency& dep) co
Style ::checkContentDependencies(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 <> void reflect_content(GetMember& tag, const TextStyle& ts) {
......
......@@ -75,7 +75,6 @@ class TextStyle : public Style {
virtual bool update(Context&);
virtual void initDependencies(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
inline Rotation getRotation() const {
......
......@@ -387,7 +387,13 @@ Image SymbolToImage::generate(const Options& opt) const {
the_symbol = opt.local_package->readFile<SymbolP>(filename);
}
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 {
const SymbolToImage* that2 = dynamic_cast<const SymbolToImage*>(&that);
......
......@@ -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 i = render_symbol(symbol, border_radius, width, height, 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, allow_smaller);
filter_symbol(i, filter);
return i;
}
......
......@@ -35,7 +35,7 @@ class AColor : public Color {
void filter_symbol(Image& symbol, const SymbolFilter& filter);
/// 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?
enum SymbolSet
......
......@@ -14,14 +14,14 @@ DECLARE_TYPEOF_COLLECTION(SymbolPartP);
// ----------------------------------------------------------------------------- : 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);
// limit width/height ratio to aspect ratio of symbol
double ar = symbol->aspectRatio();
double par = (double)width/height;
if (par > ar && ar > 1) {
if (par > ar && (ar > 1 || (allow_smaller && height < width))) {
width = height * ar;
} else if (par < ar && ar < 1) {
} else if (par < ar && (ar < 1 || (allow_smaller && width < height))) {
height = width / ar;
}
if (width > height) {
......
......@@ -17,7 +17,7 @@
// ----------------------------------------------------------------------------- : Simple rendering
/// 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
......
......@@ -12,6 +12,40 @@
// ----------------------------------------------------------------------------- : 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) {
drawFieldBorder(dc);
if (style().render_style & RENDER_HIDDEN) return;
......@@ -19,14 +53,7 @@ void ChoiceValueViewer::draw(RotatedDC& dc) {
double margin = 0;
if (style().render_style & RENDER_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;
Context& ctx = viewer.getContext();
ctx.setVariable(_("input"), to_script(value().value()));
img.update(ctx);
if (img.isReady()) {
GeneratedImage::Options img_options(0,0, viewer.stylesheet.get(), &getSet());
if (nativeLook()) {
......
......@@ -20,6 +20,7 @@ class ChoiceValueViewer : public ValueViewer {
public:
DECLARE_VALUE_VIEWER(Choice) : ValueViewer(parent,style) {}
virtual bool prepare(RotatedDC& dc);
virtual void draw(RotatedDC& dc);
virtual void onStyleChange(bool);
};
......
......@@ -32,7 +32,7 @@ void SymbolValueViewer::draw(RotatedDC& dc) {
ar = min(style().max_aspect_ratio, max(style().min_aspect_ratio, ar));
// render and filter 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);
resample(img, 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