tahoma2d/toonz/sources/include/tunit.h

206 lines
5.2 KiB
C
Raw Normal View History

2016-05-17 03:04:11 +12:00
#pragma once
2016-03-19 06:57:51 +13:00
#ifndef TUNIT_INCLUDED
#define TUNIT_INCLUDED
#include "tcommon.h"
#undef DVAPI
#undef DVVAR
#ifdef TNZBASE_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
#ifdef _MSC_VER
2016-03-19 06:57:51 +13:00
#pragma warning(push)
#pragma warning(disable : 4251)
#endif
//---------------------------
2016-06-15 18:43:10 +12:00
class DVAPI TUnitConverter {
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
virtual ~TUnitConverter() {}
virtual TUnitConverter *clone() const = 0;
virtual double convertTo(double v) const = 0;
virtual double convertFrom(double v) const = 0;
2016-03-19 06:57:51 +13:00
};
//---------------------------
class DVAPI TSimpleUnitConverter final : public TUnitConverter {
2016-06-15 18:43:10 +12:00
const double m_factor, m_offset;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TSimpleUnitConverter(double factor = 1, double offset = 0)
: m_factor(factor), m_offset(offset) {}
2016-06-20 14:23:05 +12:00
TUnitConverter *clone() const override {
return new TSimpleUnitConverter(*this);
}
2016-06-19 20:06:29 +12:00
double convertTo(double v) const override { return v * m_factor + m_offset; }
2016-06-20 14:23:05 +12:00
double convertFrom(double v) const override {
return (v - m_offset) / m_factor;
}
2016-03-19 06:57:51 +13:00
};
//---------------------------
2016-06-15 18:43:10 +12:00
class DVAPI TUnit {
std::wstring m_defaultExtension;
std::vector<std::wstring> m_extensions;
TUnitConverter *m_converter;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TUnit(std::wstring ext, TUnitConverter *converter = 0);
TUnit(const TUnit &);
~TUnit();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TUnit *clone() const { return new TUnit(*this); }
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
const std::vector<std::wstring> &getExtensions() const {
return m_extensions;
}
void addExtension(std::wstring ext);
bool isExtension(std::wstring ext) const;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
std::wstring getDefaultExtension() const { return m_defaultExtension; }
void setDefaultExtension(std::wstring ext);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
double convertTo(double v) const { return m_converter->convertTo(v); }
double convertFrom(double v) const { return m_converter->convertFrom(v); }
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
// not implemented
TUnit &operator=(const TUnit &);
2016-03-19 06:57:51 +13:00
};
//---------------------------
2016-06-15 18:43:10 +12:00
class DVAPI TMeasure {
std::string m_name;
TUnit *m_mainUnit, *m_currentUnit, *m_standardUnit;
std::map<std::wstring, TUnit *> m_extensions;
double m_defaultValue;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TMeasure(std::string name, TUnit *mainUnit);
TMeasure(const TMeasure &);
~TMeasure();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
std::string getName() const { return m_name; }
void setName(std::string name) { m_name = name; }
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void add(TUnit *unit);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// main unit e' quella usata "internamente". puo' essere "strana"
const TUnit *getMainUnit() const { return m_mainUnit; }
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// current unit e' quella ad es. definita in preferences
const TUnit *getCurrentUnit() const { return m_currentUnit; }
void setCurrentUnit(TUnit *unit);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// standard unit e' quella usata nelle espressioni
const TUnit *getStandardUnit() const { return m_standardUnit; }
void setStandardUnit(TUnit *unit);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TUnit *getUnit(std::wstring ext) const;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
// defaultValue e' espresso in main unit
double getDefaultValue() const { return m_defaultValue; }
void setDefaultValue(double v) { m_defaultValue = v; }
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
// not implemented
TMeasure &operator=(const TMeasure &);
2016-03-19 06:57:51 +13:00
};
//---------------------------
2016-06-15 18:43:10 +12:00
class DVAPI TMeasureManager { // singleton
std::map<std::string, TMeasure *> m_measures;
TMeasureManager();
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
static TMeasureManager *instance() {
static TMeasureManager _instance;
return &_instance;
}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
void add(TMeasure *m);
TMeasure *get(std::string name) const;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
typedef double CameraSizeProvider();
void addCameraMeasures(CameraSizeProvider *cameraSizeProvider);
2016-03-19 06:57:51 +13:00
};
//---------------------------
2016-06-15 18:43:10 +12:00
class DVAPI TMeasuredValue {
const TMeasure *m_measure;
double m_value;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TMeasuredValue(std::string measureName);
~TMeasuredValue();
const TMeasure *getMeasure() const { return m_measure; }
void setMeasure(const TMeasure *measure);
void setMeasure(std::string measureName);
// used for mouse dragging to change value
// precision is how many times to divide by 10 to adjust value
// nothing calls precision yet, since just basic functionality
// is in place for dragging
void modifyValue(double direction, int precision = 0);
2016-06-15 18:43:10 +12:00
enum UnitType { MainUnit, CurrentUnit };
double getValue(UnitType uType) const {
return uType == MainUnit ? m_value
: m_measure->getCurrentUnit()->convertTo(m_value);
}
void setValue(UnitType uType, double value) {
m_value = uType == MainUnit
? value
: m_measure->getCurrentUnit()->convertFrom(value);
}
bool setValue(std::wstring s, int *pErr = 0); // if pErr != then *pErr
// contains error code. *pErr
// == 0 means OK
std::wstring toWideString(int decimals = 7) const;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
// not implemented
TMeasuredValue(const TMeasuredValue &);
TMeasuredValue &operator=(const TMeasuredValue &);
2016-03-19 06:57:51 +13:00
};
//---------------------------
2016-06-15 18:43:10 +12:00
// bruttacchietto. L'aspect ratio della field guide viene usata nelle
// conversioni
2016-03-19 06:57:51 +13:00
// fra fld e inch sulla verticale
2016-06-15 18:43:10 +12:00
namespace UnitParameters {
2016-03-19 06:57:51 +13:00
typedef std::pair<double, double> (*CurrentDpiGetter)();
DVAPI void setFieldGuideAspectRatio(double ar);
DVAPI double getFieldGuideAspectRatio();
DVAPI void setCurrentDpiGetter(CurrentDpiGetter f);
}
//---------------------------
#ifdef _MSC_VER
2016-03-19 06:57:51 +13:00
#pragma warning(pop)
#endif
#endif