kviewshell
GRect.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #ifndef _GRECT_H_
00058 #define _GRECT_H_
00059 #ifdef HAVE_CONFIG_H
00060 #include "config.h"
00061 #endif
00062 #if NEED_GNUG_PRAGMAS
00063 # pragma interface
00064 #endif
00065
00066
00080
00081 #include "DjVuGlobal.h"
00082
00083 #ifdef HAVE_NAMESPACES
00084 namespace DJVU {
00085 # ifdef NOT_DEFINED // Just to fool emacs c++ mode
00086 }
00087 #endif
00088 #endif
00089
00090
00091
00121
00122
00123
00124
00132 class GRect
00133 {
00134 public:
00145 enum OrientationBits
00146 {
00147 BOTTOM_UP=0x1,
00148 MIRROR=0x2,
00149 ROTATE90_CW=0x4
00150 };
00151
00165 enum Orientations
00166 {
00167 TDLRNR=0,
00168 BULRNR=BOTTOM_UP,
00169 TDRLNR=MIRROR,
00170 BURLNR=MIRROR|BOTTOM_UP,
00171 TDLRCW=ROTATE90_CW,
00172 BULRCW=ROTATE90_CW|BOTTOM_UP,
00173 TDRLCW=ROTATE90_CW|MIRROR,
00174 BURLCW=ROTATE90_CW|MIRROR|BOTTOM_UP
00175 };
00176
00177 static Orientations
00178 rotate(const int angle,Orientations orientation)
00179 {
00180 for(int a=(((angle)%360)+405)%360;a>90;a-=90)
00181 orientation=(Orientations)((int)orientation^(int)(orientation&ROTATE90_CW)?BURLCW:TDLRCW);
00182 return orientation;
00183 }
00184
00185 static int
00186 findangle(const Orientations orientation)
00187 {
00188 int a=270;
00189 while(a&&(rotate(a,BURLNR)!=orientation)&&(rotate(a,TDRLNR)!=orientation))
00190 a-=90;
00191 return a;
00192 }
00193
00195 GRect();
00199 GRect(int xmin, int ymin, unsigned int width=0, unsigned int height=0);
00201 int width() const;
00203 int height() const;
00205 int area() const;
00207 int isempty() const;
00212 int contains(int x, int y) const;
00216 int contains(const GRect & rect) const;
00218 friend int operator==(const GRect & r1, const GRect & r2);
00220 friend int operator!=(const GRect & r1, const GRect & r2);
00222 void clear();
00227 int inflate(int dx, int dy);
00231 int translate(int dx, int dy);
00234 int intersect(const GRect &rect1, const GRect &rect2);
00238 int recthull(const GRect &rect1, const GRect &rect2);
00240 void scale(float factor);
00242 void scale(float xfactor, float yfactor);
00244 int xmin;
00246 int ymin;
00248 int xmax;
00250 int ymax;
00251 };
00252
00253
00263 class GRectMapper
00264 {
00265 public:
00267 GRectMapper();
00270 void clear();
00272 void set_input(const GRect &rect);
00274 GRect get_input();
00276 void set_output(const GRect &rect);
00278 GRect get_output();
00283 void rotate(int count=1);
00288 void mirrorx();
00293 void mirrory();
00300 void map(int &x, int &y);
00305 void map(GRect &rect);
00312 void unmap(int &x, int &y);
00317 void unmap(GRect &rect);
00318 private:
00319
00320 struct GRatio {
00321 GRatio ();
00322 GRatio (int p, int q);
00323 int p;
00324 int q;
00325 };
00326
00327 GRect rectFrom;
00328 GRect rectTo;
00329 int code;
00330
00331 void precalc();
00332 friend int operator*(int n, GRatio r );
00333 friend int operator/(int n, GRatio r );
00334 GRatio rw;
00335 GRatio rh;
00336 };
00337
00338
00340
00341
00342
00343
00344
00345 inline
00346 GRect::GRect()
00347 : xmin(0), ymin(0), xmax(0), ymax(0)
00348 {
00349 }
00350
00351 inline
00352 GRect::GRect(int xmin, int ymin, unsigned int width, unsigned int height)
00353 : xmin(xmin), ymin(ymin), xmax(xmin+width), ymax(ymin+height)
00354 {
00355 }
00356
00357 inline int
00358 GRect::width() const
00359 {
00360 return xmax - xmin;
00361 }
00362
00363 inline int
00364 GRect::height() const
00365 {
00366 return ymax - ymin;
00367 }
00368
00369 inline int
00370 GRect::isempty() const
00371 {
00372 return (xmin>=xmax || ymin>=ymax);
00373 }
00374
00375 inline int
00376 GRect::area() const
00377 {
00378 return isempty() ? 0 : (xmax-xmin)*(ymax-ymin);
00379 }
00380
00381 inline int
00382 GRect::contains(int x, int y) const
00383 {
00384 return (x>=xmin && x<xmax && y>=ymin && y<ymax);
00385 }
00386
00387 inline void
00388 GRect::clear()
00389 {
00390 xmin = xmax = ymin = ymax = 0;
00391 }
00392
00393 inline int
00394 operator!=(const GRect & r1, const GRect & r2)
00395 {
00396 return !(r1==r2);
00397 }
00398
00399
00400
00401 #ifdef HAVE_NAMESPACES
00402 }
00403 # ifndef NOT_USING_DJVU_NAMESPACE
00404 using namespace DJVU;
00405 # endif
00406 #endif
00407 #endif