123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #ifndef __REGION_H
- #define __REGION_H
- #include <tataki/bitmap/bitmap.h>
- #include <bfc/dispatch.h>
- #include <tataki/export.h>
- class BaseWnd;
- class Canvas;
- class api_region;
- class RegionServer;
- #include <tataki/region/api_region.h>
- class TATAKIAPI RegionI : public api_region
- {
- public:
- RegionI();
- RegionI(const RegionI *copy);
- RegionI(const RECT *r);
- RegionI(int l, int t, int r, int b);
- RegionI(OSREGIONHANDLE region);
- RegionI(SkinBitmap *bitmap, RECT *r=NULL, int xoffset=0, int yoffset=0, bool inverted=false, int dothreshold=0, __int8 threshold=0, int threversed=0, int minalpha=1);
- RegionI(Canvas *c, RECT *defboundbox=NULL);
- virtual ~RegionI();
- api_region *clone();
- void disposeClone(api_region *r);
- bool ptInRegion(const POINT *pt);
- void offset(int x, int y);
- void getBox(RECT *r);
- void subtractRegion(const api_region *reg);
- void subtractRect(const RECT *r);
- void addRect(const RECT *r);
- void addRegion(const api_region *r);
- void andRegion(const api_region *r);
- void setRect(const RECT *r);
- void empty();
- int isEmpty();
- int equals(const api_region *r);
- int enclosed(const api_region *r, api_region *outside=NULL);
- int intersectRgn(const api_region *r, api_region *intersection);
- int doesIntersectRgn(const api_region *r);
- int intersectRect(const RECT *r, api_region *intersection);
- int doesIntersectRect(const RECT *r);
- int isRect();
- void scale(double sx, double sy, bool round=0);
- void debug(int async=0);
- // NONPORTABLE
- OSREGIONHANDLE makeWindowRegion(); // gives you a handle to a clone of the OSREGION object so you can insert it into a window's region with SetWindowRgn. ANY other use is prohibited
- OSREGIONHANDLE getOSHandle(); // avoid as much as you can, should be used only by WIN32-dependant classes
- // END NONPORTABLE
- int getNumRects();
- int enumRect(int n, RECT *r);
- OSREGIONHANDLE alphaToRegionRect(void *pbits32, int bmX, int bmY, int bmWidth, int bmHeight, int fullw, int fullh, int xoffset, int yoffset, bool portion, int _x, int _y, int _w, int _h, bool inverted, int dothreshold, unsigned __int8 threshold, int thinverse, int minalpha);
- private:
- inline void init();
- void optimize();
- void deoptimize();
- OSREGIONHANDLE hrgn;
- OSREGIONHANDLE alphaToRegionRect(SkinBitmap *bitmap, int xoffset, int yoffset, bool portion, int _x, int _y, int _w, int _h, bool inverted=false, int dothreshold=0, unsigned __int8 threshold=0, int thinverse=0, int minalpha=1/* 1..255*/);
- RECT overlay;
- int clonecount;
- RegionI *lastdebug;
- RegionServer *srv;
- RECT optrect;
- int optimized;
- protected:
- RECVS_DISPATCH;
- };
- class RegionServer : public Dispatchable {
- protected:
- RegionServer() {}
- virtual ~RegionServer() {}
- public:
- void addRef(void *client);
- void delRef(void *client);
- api_region *getRegion();
- enum {
- REGIONSERVER_ADDREF = 500,
- REGIONSERVER_DELREF = 550,
- REGIONSERVER_GETREGION = 600,
- };
- };
- inline void RegionServer::addRef(void *client) {
- _voidcall(REGIONSERVER_ADDREF, (api_region *)NULL, client);
- }
- inline void RegionServer::delRef(void *client) {
- _voidcall(REGIONSERVER_DELREF, client);
- }
- inline api_region * RegionServer::getRegion() {
- return _call(REGIONSERVER_GETREGION, (api_region *)NULL);
- }
- class TATAKIAPI RegionServerI : public RegionServer
- {
- public :
- RegionServerI() { numrefs = 0; }
- virtual ~RegionServerI() {}
-
- virtual void addRef(void *client) { numrefs++; }
- virtual void delRef(void *client) { numrefs--; }
- virtual api_region *getRegion()=0;
- virtual int getNumRefs() { return numrefs; }
- protected:
- RECVS_DISPATCH;
- private:
- int numrefs;
- };
- #endif
|