21 #ifndef AGG_TRANS_VIEWPORT_INCLUDED 22 #define AGG_TRANS_VIEWPORT_INCLUDED 26 #include "agg_trans_affine.h" 54 m_aspect(aspect_ratio_stretch),
69 void preserve_aspect_ratio(
double alignx,
71 aspect_ratio_e aspect)
80 void device_viewport(
double x1,
double y1,
double x2,
double y2)
90 void world_viewport(
double x1,
double y1,
double x2,
double y2)
100 void device_viewport(
double* x1,
double* y1,
double* x2,
double* y2)
const 109 void world_viewport(
double* x1,
double* y1,
double* x2,
double* y2)
const 118 void world_viewport_actual(
double* x1,
double* y1,
119 double* x2,
double* y2)
const 128 bool is_valid()
const {
return m_is_valid; }
129 double align_x()
const {
return m_align_x; }
130 double align_y()
const {
return m_align_y; }
131 aspect_ratio_e aspect_ratio()
const {
return m_aspect; }
134 void transform(
double* x,
double* y)
const 136 *x = (*x - m_wx1) * m_kx + m_dx1;
137 *y = (*y - m_wy1) * m_ky + m_dy1;
141 void transform_scale_only(
double* x,
double* y)
const 148 void inverse_transform(
double* x,
double* y)
const 150 *x = (*x - m_dx1) / m_kx + m_wx1;
151 *y = (*y - m_dy1) / m_ky + m_wy1;
155 void inverse_transform_scale_only(
double* x,
double* y)
const 162 double device_dx()
const {
return m_dx1 - m_wx1 * m_kx; }
163 double device_dy()
const {
return m_dy1 - m_wy1 * m_ky; }
166 double scale_x()
const 172 double scale_y()
const 180 return (m_kx + m_ky) * 0.5;
199 unsigned byte_size()
const 201 return sizeof(*this);
204 void serialize(int8u* ptr)
const 206 std::memcpy(ptr,
this,
sizeof(*
this));
209 void deserialize(
const int8u* ptr)
211 std::memcpy(
this, ptr,
sizeof(*
this));
225 aspect_ratio_e m_aspect;
242 inline void trans_viewport::update()
244 const double epsilon = 1e-30;
245 if(std::fabs(m_world_x1 - m_world_x2) < epsilon ||
246 std::fabs(m_world_y1 - m_world_y2) < epsilon ||
247 std::fabs(m_device_x1 - m_device_x2) < epsilon ||
248 std::fabs(m_device_y1 - m_device_y2) < epsilon)
252 m_wx2 = m_world_x1 + 1.0;
253 m_wy2 = m_world_y2 + 1.0;
262 double world_x1 = m_world_x1;
263 double world_y1 = m_world_y1;
264 double world_x2 = m_world_x2;
265 double world_y2 = m_world_y2;
266 double device_x1 = m_device_x1;
267 double device_y1 = m_device_y1;
268 double device_x2 = m_device_x2;
269 double device_y2 = m_device_y2;
270 if(m_aspect != aspect_ratio_stretch)
273 m_kx = (device_x2 - device_x1) / (world_x2 - world_x1);
274 m_ky = (device_y2 - device_y1) / (world_y2 - world_y1);
276 if((m_aspect == aspect_ratio_meet) == (m_kx < m_ky))
278 d = (world_y2 - world_y1) * m_ky / m_kx;
279 world_y1 += (world_y2 - world_y1 - d) * m_align_y;
280 world_y2 = world_y1 + d;
284 d = (world_x2 - world_x1) * m_kx / m_ky;
285 world_x1 += (world_x2 - world_x1 - d) * m_align_x;
286 world_x2 = world_x1 + d;
295 m_kx = (device_x2 - device_x1) / (world_x2 - world_x1);
296 m_ky = (device_y2 - device_y1) / (world_y2 - world_y1);