simplified coord transformation interface.
This commit is contained in:
parent
18ef498140
commit
e2d645ad80
5 changed files with 52 additions and 118 deletions
|
@ -34,21 +34,21 @@ namespace mapnik {
|
|||
template <typename Transform,typename Geometry>
|
||||
struct MAPNIK_DECL coord_transform
|
||||
{
|
||||
coord_transform(Transform const& t,Geometry& geom)
|
||||
coord_transform(Transform const& t, Geometry& geom)
|
||||
: t_(t), geom_(geom) {}
|
||||
|
||||
|
||||
unsigned vertex(double *x , double *y) const
|
||||
{
|
||||
unsigned command = geom_.vertex(x,y);
|
||||
*x = t_.forward_x_(x);
|
||||
*y = t_.forward_y_(y);
|
||||
t_.forward(x,y);
|
||||
return command;
|
||||
}
|
||||
|
||||
void rewind (unsigned pos)
|
||||
{
|
||||
geom_.rewind(pos);
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
Transform const& t_;
|
||||
Geometry& geom_;
|
||||
|
@ -60,13 +60,13 @@ namespace mapnik {
|
|||
int width;
|
||||
int height;
|
||||
double scale_;
|
||||
Envelope<double> extent;
|
||||
Envelope<double> extent_;
|
||||
public:
|
||||
CoordTransform(int width,int height,const Envelope<double>& extent)
|
||||
:width(width),height(height),extent(extent)
|
||||
:width(width),height(height),extent_(extent)
|
||||
{
|
||||
double sx=((double)width)/extent.width();
|
||||
double sy=((double)height)/extent.height();
|
||||
double sx=((double)width)/extent_.width();
|
||||
double sy=((double)height)/extent_.height();
|
||||
scale_=std::min(sx,sy);
|
||||
}
|
||||
|
||||
|
@ -74,48 +74,29 @@ namespace mapnik {
|
|||
{
|
||||
return scale_;
|
||||
}
|
||||
|
||||
inline void forward_x(double* x) const
|
||||
|
||||
inline void forward(double * x, double * y) const
|
||||
{
|
||||
*x = (*x - extent.minx() ) * scale_;
|
||||
|
||||
*x = (*x - extent_.minx()) * scale_;
|
||||
*y = (extent_.maxy() - *y) * scale_;
|
||||
}
|
||||
|
||||
inline void forward_y(double* y) const
|
||||
|
||||
inline void backward(double * x, double * y) const
|
||||
{
|
||||
*y = (extent.maxy() - *y) * scale_;
|
||||
*x = extent_.minx() + *x/scale_;
|
||||
*y = extent_.maxy() - *y/scale_;
|
||||
}
|
||||
|
||||
inline double forward_x_(double* x) const
|
||||
{
|
||||
return (*x - extent.minx() ) * scale_;
|
||||
}
|
||||
|
||||
inline double forward_y_(double* y) const
|
||||
{
|
||||
return (extent.maxy() - *y) * scale_;
|
||||
}
|
||||
|
||||
inline void backward_x(double* x) const
|
||||
{
|
||||
*x = extent.minx() + *x/scale_;
|
||||
}
|
||||
|
||||
inline void backward_y(double* y) const
|
||||
{
|
||||
*y = extent.maxy() - *y/scale_;
|
||||
}
|
||||
|
||||
|
||||
inline coord2d& forward(coord2d& c) const
|
||||
{
|
||||
forward_x(&c.x);
|
||||
forward_y(&c.y);
|
||||
forward(&c.x,&c.y);
|
||||
return c;
|
||||
}
|
||||
|
||||
inline coord2d& backward(coord2d& c) const
|
||||
{
|
||||
backward_x(&c.x);
|
||||
backward_y(&c.y);
|
||||
backward(&c.x,&c.y);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
@ -125,10 +106,8 @@ namespace mapnik {
|
|||
double y0 = e.miny();
|
||||
double x1 = e.maxx();
|
||||
double y1 = e.maxy();
|
||||
forward_x(&x0);
|
||||
forward_y(&y0);
|
||||
forward_x(&x1);
|
||||
forward_y(&y1);
|
||||
forward(&x0,&y0);
|
||||
forward(&x1,&y1);
|
||||
return Envelope<double>(x0,y0,x1,y1);
|
||||
}
|
||||
|
||||
|
@ -138,11 +117,8 @@ namespace mapnik {
|
|||
double y0 = e.miny();
|
||||
double x1 = e.maxx();
|
||||
double y1 = e.maxy();
|
||||
backward_x(&x0);
|
||||
backward_y(&y0);
|
||||
backward_x(&x1);
|
||||
backward_y(&y1);
|
||||
|
||||
backward(&x0,&y0);
|
||||
backward(&x1,&y1);
|
||||
return Envelope<double>(x0,y0,x1,y1);
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <boost/utility.hpp>
|
||||
// mapnik
|
||||
#include <mapnik/vertex_vector.hpp>
|
||||
#include <mapnik/vertex_transform.hpp>
|
||||
#include <mapnik/ctrans.hpp>
|
||||
#include <mapnik/geom_util.hpp>
|
||||
|
||||
|
@ -83,7 +82,6 @@ namespace mapnik {
|
|||
virtual void label_position(double *x, double *y) const=0;
|
||||
virtual void move_to(value_type x,value_type y)=0;
|
||||
virtual void line_to(value_type x,value_type y)=0;
|
||||
virtual void transform(const mapnik::CoordTransform& t)=0;
|
||||
virtual unsigned num_points() const = 0;
|
||||
virtual unsigned vertex(double* x, double* y)=0;
|
||||
virtual void rewind(unsigned )=0;
|
||||
|
@ -121,13 +119,7 @@ namespace mapnik {
|
|||
}
|
||||
|
||||
void line_to(value_type ,value_type ) {}
|
||||
|
||||
void transform(const mapnik::CoordTransform& t)
|
||||
{
|
||||
t.forward_x(&pt_.x);
|
||||
t.forward_y(&pt_.y);
|
||||
}
|
||||
|
||||
|
||||
unsigned num_points() const
|
||||
{
|
||||
return 1;
|
||||
|
@ -193,7 +185,6 @@ namespace mapnik {
|
|||
unsigned i,j;
|
||||
for (i = size-1,j = 0; j < size; i = j, ++j)
|
||||
{
|
||||
|
||||
cont_.get_vertex(i,&x0,&y0);
|
||||
cont_.get_vertex(j,&x1,&y1);
|
||||
ai = x0 * y1 - x1 * y0;
|
||||
|
@ -221,15 +212,6 @@ namespace mapnik {
|
|||
cont_.push_back(x,y,SEG_MOVETO);
|
||||
}
|
||||
|
||||
void transform(mapnik::CoordTransform const& t)
|
||||
{
|
||||
unsigned size = cont_.size();
|
||||
for (unsigned pos=0; pos < size; ++pos)
|
||||
{
|
||||
cont_.transform_at(pos,t);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned num_points() const
|
||||
{
|
||||
return cont_.size();
|
||||
|
@ -339,16 +321,7 @@ namespace mapnik {
|
|||
{
|
||||
cont_.push_back(x,y,SEG_MOVETO);
|
||||
}
|
||||
|
||||
void transform(mapnik::CoordTransform const& t)
|
||||
{
|
||||
unsigned size = cont_.size();
|
||||
for (unsigned pos=0; pos < size; ++pos)
|
||||
{
|
||||
cont_.transform_at(pos,t);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unsigned num_points() const
|
||||
{
|
||||
return cont_.size();
|
||||
|
|
|
@ -33,34 +33,34 @@ namespace mapnik
|
|||
template <typename T0 ,typename T1,int shift=8>
|
||||
struct Shift
|
||||
{
|
||||
typedef T0 value_type;
|
||||
typedef T1 return_type;
|
||||
static return_type apply(value_type val)
|
||||
{
|
||||
return static_cast<return_type>(val*(1<<shift));
|
||||
}
|
||||
typedef T0 value_type;
|
||||
typedef T1 return_type;
|
||||
static return_type apply(value_type val)
|
||||
{
|
||||
return static_cast<return_type>(val*(1<<shift));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T0,typename T1>
|
||||
struct Shift<T0,T1,0>
|
||||
{
|
||||
typedef T0 value_type;
|
||||
typedef T1 return_type;
|
||||
static return_type apply(value_type val)
|
||||
{
|
||||
return static_cast<return_type>(val);
|
||||
}
|
||||
typedef T0 value_type;
|
||||
typedef T1 return_type;
|
||||
static return_type apply(value_type val)
|
||||
{
|
||||
return static_cast<return_type>(val);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct Shift<T,T,0>
|
||||
{
|
||||
typedef T value_type;
|
||||
typedef T return_type;
|
||||
static T& apply(T& val)
|
||||
{
|
||||
return val;
|
||||
}
|
||||
typedef T value_type;
|
||||
typedef T return_type;
|
||||
static T& apply(T& val)
|
||||
{
|
||||
return val;
|
||||
}
|
||||
};
|
||||
|
||||
typedef Shift<double,double,0> NO_SHIFT;
|
||||
|
|
|
@ -110,19 +110,11 @@ namespace mapnik
|
|||
return commands_[block] [pos & block_mask];
|
||||
}
|
||||
|
||||
void transform_at(unsigned pos,const CoordTransform& t)
|
||||
{
|
||||
if (pos >= pos_) return;
|
||||
unsigned block = pos >> block_shift;
|
||||
value_type* vertex = vertexs_[block] + (( pos & block_mask) << 1);
|
||||
t.forward_x(vertex);
|
||||
++vertex;
|
||||
t.forward_y(vertex);
|
||||
}
|
||||
void set_capacity(size_t)
|
||||
{
|
||||
//do nothing
|
||||
}
|
||||
|
||||
private:
|
||||
void allocate_block(unsigned block)
|
||||
{
|
||||
|
@ -181,13 +173,6 @@ namespace mapnik
|
|||
return cont_.end();
|
||||
}
|
||||
|
||||
void transform_at(unsigned pos,const CoordTransform& t)
|
||||
{
|
||||
if (pos >= cont_.size()) return;
|
||||
vertex_type & c = cont_[pos];
|
||||
t.forward_x(&boost::get<0>(c));
|
||||
t.forward_y(&boost::get<1>(c));
|
||||
}
|
||||
void set_capacity(size_t size)
|
||||
{
|
||||
cont_.reserve(size);
|
||||
|
|
|
@ -96,7 +96,7 @@ namespace mapnik
|
|||
{
|
||||
Color const& bg=m.getBackground();
|
||||
pixmap_.setBackground(bg);
|
||||
std::clog << "scale="<<m.scale()<<std::endl;
|
||||
std::clog << "scale=" << m.scale() << "\n";
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -172,7 +172,9 @@ namespace mapnik
|
|||
if (geom && geom->num_points() > 1)
|
||||
{
|
||||
path_type path(t_,*geom);
|
||||
agg::row_ptr_cache<agg::int8u> buf(pixmap_.raw_data(),pixmap_.width(),pixmap_.height(),
|
||||
agg::row_ptr_cache<agg::int8u> buf(pixmap_.raw_data(),
|
||||
pixmap_.width(),
|
||||
pixmap_.height(),
|
||||
pixmap_.width()*4);
|
||||
agg::pixfmt_rgba32 pixf(buf);
|
||||
ren_base renb(pixf);
|
||||
|
@ -286,8 +288,7 @@ namespace mapnik
|
|||
if ( data )
|
||||
{
|
||||
geom->label_position(&x,&y);
|
||||
t_.forward_x(&x);
|
||||
t_.forward_y(&y);
|
||||
t_.forward(&x,&y);
|
||||
int w = data->width();
|
||||
int h = data->height();
|
||||
int px=int(floor(x - 0.5 * w));
|
||||
|
@ -435,8 +436,7 @@ namespace mapnik
|
|||
double x;
|
||||
double y;
|
||||
geom->label_position(&x,&y);
|
||||
t_.forward_x(&x);
|
||||
t_.forward_y(&y);
|
||||
t_.forward(&x,&y);
|
||||
|
||||
face_ptr face = font_manager_.get_face("Bitstream Vera Sans Roman");//TODO
|
||||
//face_ptr face = font_manager_.get_face("Times New Roman Regular");//TODO
|
||||
|
|
Loading…
Reference in a new issue