Commit 61126b1f authored by twanvl's avatar twanvl

finished symbol rendering

parent be3b5391
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
// ----------------------------------------------------------------------------- : Includes // ----------------------------------------------------------------------------- : Includes
#include <render/symbol/filter.hpp> #include <render/symbol/filter.hpp>
#include <render/symbol/viewer.hpp>
#include <gfx/gfx.hpp> #include <gfx/gfx.hpp>
#include <util/error.hpp> #include <util/error.hpp>
...@@ -37,6 +38,12 @@ void filter_symbol(Image& symbol, const SymbolFilter& filter) { ...@@ -37,6 +38,12 @@ void filter_symbol(Image& symbol, const SymbolFilter& filter) {
} }
} }
Image render_symbol(const SymbolP& symbol, const SymbolFilter& filter, double border_radius, int size) {
Image i = render_symbol(symbol, border_radius, size);
filter_symbol(i, filter);
return i;
}
// ----------------------------------------------------------------------------- : SymbolFilter // ----------------------------------------------------------------------------- : SymbolFilter
IMPLEMENT_REFLECTION(SymbolFilter) { IMPLEMENT_REFLECTION(SymbolFilter) {
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <util/prec.hpp> #include <util/prec.hpp>
#include <util/reflect.hpp> #include <util/reflect.hpp>
DECLARE_POINTER_TYPE(Symbol);
class SymbolFilter; class SymbolFilter;
// ----------------------------------------------------------------------------- : Color // ----------------------------------------------------------------------------- : Color
...@@ -32,6 +33,9 @@ class AColor : public Color { ...@@ -32,6 +33,9 @@ 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
Image render_symbol(const SymbolP& symbol, const SymbolFilter& filter, double border_radius = 0.05, int size = 100);
/// Is a point inside a symbol? /// Is a point inside a symbol?
enum SymbolSet enum SymbolSet
{ SYMBOL_INSIDE { SYMBOL_INSIDE
......
...@@ -11,6 +11,19 @@ ...@@ -11,6 +11,19 @@
DECLARE_TYPEOF_COLLECTION(SymbolPartP); DECLARE_TYPEOF_COLLECTION(SymbolPartP);
// ----------------------------------------------------------------------------- : Simple rendering
Image render_symbol(const SymbolP& symbol, double border_radius, int size) {
SymbolViewer viewer(symbol, border_radius);
Bitmap bmp(size, size);
wxMemoryDC dc;
dc.SelectObject(bmp);
clearDC_black(dc);
viewer.draw(dc);
dc.SelectObject(wxNullBitmap);
return bmp.ConvertToImage();
}
// ----------------------------------------------------------------------------- : Constructor // ----------------------------------------------------------------------------- : Constructor
SymbolViewer::SymbolViewer(const SymbolP& symbol, double border_radius) SymbolViewer::SymbolViewer(const SymbolP& symbol, double border_radius)
......
...@@ -41,12 +41,13 @@ class SymbolViewer : public SymbolView { ...@@ -41,12 +41,13 @@ class SymbolViewer : public SymbolView {
// --------------------------------------------------- : Drawing // --------------------------------------------------- : Drawing
public:
/// Draw the symbol to a dc /// Draw the symbol to a dc
void draw(DC& dc); void draw(DC& dc);
void highlightPart(DC& dc, const SymbolPart& part, HighlightStyle style); void highlightPart(DC& dc, const SymbolPart& part, HighlightStyle style);
void onAction(const Action&, bool) {}
private: private:
/// Combines a symbol part with what is currently drawn, the border and interior are drawn separatly /// Combines a symbol part with what is currently drawn, the border and interior are drawn separatly
/** directB/directI are true if the border/interior is the screen dc, false if it /** directB/directI are true if the border/interior is the screen dc, false if it
......
...@@ -7,9 +7,51 @@ ...@@ -7,9 +7,51 @@
// ----------------------------------------------------------------------------- : Includes // ----------------------------------------------------------------------------- : Includes
#include <render/value/symbol.hpp> #include <render/value/symbol.hpp>
#include <render/symbol/filter.hpp>
#include <data/set.hpp>
#include <data/symbol.hpp>
#include <gui/util.hpp> // draw_checker
#include <util/error.hpp>
DECLARE_TYPEOF_COLLECTION(SymbolStyle::VariationP);
// ----------------------------------------------------------------------------- : SymbolValueViewer // ----------------------------------------------------------------------------- : SymbolValueViewer
void SymbolValueViewer::draw(RotatedDC& dc) { void SymbolValueViewer::draw(RotatedDC& dc) {
// TODO drawFieldBorder(dc);
// draw checker background
draw_checker(dc, style().getRect());
double wh = min(style().width, style().height);
// try to load symbol
if (symbols.empty() && !value().filename.empty()) {
try {
// load symbol
SymbolP symbol = getSet().readFile<SymbolP>(value().filename);
// render and filter variations
FOR_EACH(variation, style().variations) {
Image img = render_symbol(symbol, *variation->filter, variation->border_radius);
Image resampled(wh, wh, false);
resample(img, resampled);
symbols.push_back(Bitmap(resampled));
}
} catch (const Error& e) {
handle_error(e);
}
}
// draw image, if any
for (size_t i = 0 ; i < symbols.size() ; ++i) {
// todo : labels?
dc.DrawBitmap(symbols[i], style().getPos() + RealSize(i * (wh + 2), 0));
}
// draw helper text if there are no symbols
if (symbols.empty()) {
dc.SetFont(wxFont(10,wxSWISS,wxNORMAL,wxNORMAL));
dc.SetTextForeground(*wxBLACK);
RealSize text_size = dc.GetTextExtent(_("double click to edit symbol"));
dc.DrawText(_("double click to edit symbol"), align_in_rect(ALIGN_MIDDLE_CENTER, text_size, style().getRect()));
}
}
void SymbolValueViewer::onValueChange() {
symbols.clear();
} }
...@@ -21,6 +21,10 @@ class SymbolValueViewer : public ValueViewer { ...@@ -21,6 +21,10 @@ class SymbolValueViewer : public ValueViewer {
DECLARE_VALUE_VIEWER(Symbol) : ValueViewer(parent,style) {} DECLARE_VALUE_VIEWER(Symbol) : ValueViewer(parent,style) {}
virtual void draw(RotatedDC& dc); virtual void draw(RotatedDC& dc);
void onValueChange();
private:
vector<Bitmap> symbols; ///< Cached images
}; };
// ----------------------------------------------------------------------------- : EOF // ----------------------------------------------------------------------------- : EOF
......
...@@ -112,22 +112,30 @@ class Package { ...@@ -112,22 +112,30 @@ class Package {
/// Open a file given an absolute filename /// Open a file given an absolute filename
static InputStreamP openAbsoluteFile(const String& name); static InputStreamP openAbsoluteFile(const String& name);
/* // --------------------------------------------------- : Managing the inside of the package : IO files // --------------------------------------------------- : Managing the inside of the package : Reader/writer
template <typename T> template <typename T>
void readFile<T> (String n, T& obj) { void readFile(const String& file, T& obj) {
In i(openFileIn(n), filename + _("/") + n); Reader reader(openIn(file), absoluteFilename() + _("/") + file);
try { try {
i(obj); reader.handle(obj);
} catch (ParseError e) { } catch (const ParseError& err) {
throw FileParseError(e.what(), filename+_("/")+n); // more detailed message throw FileParseError(err.what(), absoluteFilename() + _("/") + file); // more detailed message
} }
} }
template <typename T>
T readFile(const String& file) {
T obj;
readFile(file, obj);
return obj;
}
template <typename T> template <typename T>
void writeFile(const String& file, T obj) { void writeFile(const String& file, const T& obj) {
Writer writer(openOut(file));
writer.handle(obj);
} }
*/
// --------------------------------------------------- : Private stuff // --------------------------------------------------- : Private stuff
private: private:
......
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