1 // -*- related-file-name: "../../libefont/t1mm.cc" -*-
2 #ifndef EFONT_T1MM_HH
3 #define EFONT_T1MM_HH
4 #include <efont/t1cs.hh>
5 class ErrorHandler;
6 namespace Efont {
7 class Type1Font;
8 
9 class MultipleMasterSpace : public CharstringProgram { public:
10 
11     MultipleMasterSpace(PermString, int naxes, int nmasters);
12     // default destructor
13 
14     typedef Vector<double> NumVector;
15 
font_name() const16     PermString font_name() const	{ return _font_name; }
naxes() const17     int naxes() const			{ return _naxes; }
nmasters() const18     int nmasters() const		{ return _nmasters; }
19 
20     int axis(PermString) const;
21     double axis_low(int) const;
22     double axis_high(int) const;
23 
axis_type(int a) const24     PermString axis_type(int a) const	{ return _axis_types[a]; }
axis_label(int a) const25     PermString axis_label(int a) const	{ return _axis_labels[a]; }
26     inline PermString axis_abbreviation(int a) const;
27     static PermString axis_abbreviation(PermString);
28 
ndv() const29     const Type1Charstring &ndv() const	{ return _ndv; }
cdv() const30     const Type1Charstring &cdv() const	{ return _cdv; }
31 
32     void set_master_positions(const Vector<NumVector> &);
33     void set_normalize(const Vector<NumVector> &, const Vector<NumVector> &);
34     void set_axis_type(int, PermString);
35     void set_axis_label(int, PermString);
set_ndv(const Type1Charstring & cs)36     void set_ndv(const Type1Charstring &cs) { _ndv = cs; }
set_cdv(const Type1Charstring & cs)37     void set_cdv(const Type1Charstring &cs) { _cdv = cs; }
38     void set_design_vector(const NumVector &);
39     void set_weight_vector(const NumVector &);
40 
41     bool check(ErrorHandler * = 0);
42     bool check_intermediate(ErrorHandler * = 0);
43 
44     NumVector empty_design_vector() const;
45     inline const NumVector &default_design_vector() const;
46     bool set_design(NumVector &, int, double, ErrorHandler * = 0) const;
47     bool set_design(NumVector &, PermString, double, ErrorHandler * = 0) const;
48 
49     inline const NumVector &default_weight_vector() const;
50 
51     bool design_to_norm_design(const NumVector &, NumVector &, ErrorHandler * = 0) const;
52     bool design_to_weight(const NumVector &, NumVector &, ErrorHandler * = 0) const;
53 
54     NumVector *mm_vector(VectorType, bool writable) const;
55 
56   private:
57 
58     mutable bool _ok;
59 
60     PermString _font_name;
61     int _naxes;
62     int _nmasters;
63 
64     Vector<NumVector> _master_positions;
65     Vector<NumVector> _normalize_in;
66     Vector<NumVector> _normalize_out;
67 
68     Vector<PermString> _axis_types;
69     Vector<PermString> _axis_labels;
70 
71     Type1Charstring _ndv;
72     Type1Charstring _cdv;
73 
74     NumVector _default_design_vector;
75     NumVector _default_weight_vector;
76 
77     mutable NumVector *_design_vector;
78     mutable NumVector *_norm_design_vector;
79     mutable NumVector *_weight_vector;
80 
81     bool error(ErrorHandler *, const char *, ...) const;
82 
83     MultipleMasterSpace(const MultipleMasterSpace &);
84     MultipleMasterSpace &operator=(const MultipleMasterSpace &);
85 
86     bool normalize_vector(ErrorHandler *) const;
87     bool convert_vector(ErrorHandler *) const;
88 
89 };
90 
91 
default_design_vector() const92 inline const Vector<double> &MultipleMasterSpace::default_design_vector() const
93 {
94     return _default_design_vector;
95 }
96 
default_weight_vector() const97 inline const Vector<double> &MultipleMasterSpace::default_weight_vector() const
98 {
99     return _default_weight_vector;
100 }
101 
axis_abbreviation(int a) const102 inline PermString MultipleMasterSpace::axis_abbreviation(int a) const
103 {
104     return axis_abbreviation(_axis_types[a]);
105 }
106 
107 }
108 #endif
109