windows-nt/Source/XPSP1/NT/printscan/ui/uicommon/regionde.h
2020-09-26 16:20:57 +08:00

224 lines
8.1 KiB
C++

// RegionDetector.h: interface for the CRegionDetector class.
//
//////////////////////////////////////////////////////////////////////
#include "32BitDib.h"
struct CRegionList
{
private:
CRegionList( const CRegionList & );
CRegionList &operator=( const CRegionList & );
public:
CRegionList(int num);
virtual ~CRegionList()
{
delete m_pRects;
delete m_pixelsFilled;
delete m_valid;
delete m_type;
delete m_totalColored;
delete m_totalIntensity;
delete m_totalEdge;
delete m_backgroundColorPixels;
}
// public... number of valid rects
int Size(int r)
{
return (m_pRects[r].right-m_pRects[r].left)*(m_pRects[r].bottom-m_pRects[r].top);
}
// public
RECT operator[](int num)
{
return nthRegion(num);
}
// public
int UnionIntersectingRegions();
// public
RECT unionAll();
// private
RECT nthRegion(int num);
int RegionType(int region);
bool largeRegion(int region);
double ClassifyRegion(int region); // determine if the region is a text or a graphics region
bool checkIfValidRegion(int region, int border = 0); // syncs whether a region is valid or not
bool ValidRegion(int region, int border = 0); // determines if a region is likely a worthless speck of dust or shadow or if we should care about the region
bool InsideRegion(int region, int x, int y, int border=0); // border is the amount of border space to place around the outside of the region
void AddPixel(int region, ULONG pixel,ULONG edge, int x, int y);
// unions two regions together... region b is invalidated
bool UnionRegions(int a, int b);
RECT UnionRects(RECT a, RECT b);
bool MergerIntersectsPhoto(int a, int b); // if we merge these two regions, will we also be merging with a photo region (a taboo)
// see InsideRegion for an explaination of what border is
bool CheckIntersect(int a, int b, int border=0); // do regions a and b intersect?
bool CheckIntersect(RECT r1, RECT r2, int border=0); // do regions a and b intersect?
static RECT Intersect(RECT r1, RECT r2);
static bool InsideRegion(RECT region, int x, int y, int border=0); // border is the amount of border space to place around the outside of the region
// compact down ignores all other info aside from rect location
// leads to faster access
void CompactDown(int size);
// dibs are stored upside down from normal screen coords
// so apps will often want to flip the bitmap first
void FlipVertically();
int m_numRects;
int m_validRects;
int m_nBitmapWidth;
int m_nBitmapHeight;
RECT * m_pRects;
bool * m_valid; // is the rectangle a valid rectangle or has it been sent to the region graveyard in the sky
int * m_type; // is this region a text region or a photograph? PHOTOGRAPH_REGION TEXT_REGION
// the following indicators are used to determine if a region is a valid region
ULONG * m_pixelsFilled; // how many of the pixels in the region were actually selected?
ULONG * m_totalColored; // accumulated color difference indicator
ULONG * m_totalIntensity; // accumulated intensity indicator
ULONG * m_totalEdge; // accumulated edge values
int *m_backgroundColorPixels; // number of pixels which are very close to the background color (used for determining text region status... particularly useful in cases where part of a text region may have a shadow which could lead the program to think it was a photo region
int m_maxRects;
};
class CRegionDetector
{
private:
// Not implemented
CRegionDetector( const CRegionDetector & );
CRegionDetector &operator=( const CRegionDetector & );
public: // will be made private when we are done debugging
C32BitDibWrapper * m_pScan;
C32BitDibWrapper * m_pScanBlurred;
C32BitDibWrapper * m_pScanDoubleBlurred;
C32BitDibWrapper * m_pScanTripleBlurred;
C32BitDibWrapper * m_pScanHorizontalBlurred;
C32BitDibWrapper * m_pScanVerticalBlurred;
C32BitDibWrapper * m_pScanDoubleHorizontalBlurred;
C32BitDibWrapper * m_pScanDoubleVerticalBlurred;
C32BitDibWrapper * m_pScanEdges;
C32BitDibWrapper * m_pScanDoubleEdges;
C32BitDibWrapper * m_pScanTripleEdges;
C32BitDibWrapper * m_pScanHorizontalEdges;
C32BitDibWrapper * m_pScanDoubleHorizontalEdges;
C32BitDibWrapper * m_pScanVerticalEdges;
C32BitDibWrapper * m_pScanDoubleVerticalEdges;
C32BitDibWrapper * m_pScanWithShadows;
CRegionList * m_pRegions;
int m_resampleFactor; // ratio between imageDimensions and origional image dimensions
int m_intent; // either try to avoid deciding stray dots are images or try to avoid deciding real images aren't images
// not used as yet
public:
CRegionDetector(BYTE* dib)
{
m_pScan = new C32BitDibWrapper(dib);
m_pScanBlurred = new C32BitDibWrapper(); // create an empty wrapper
m_pScanDoubleBlurred = new C32BitDibWrapper();
m_pScanTripleBlurred = new C32BitDibWrapper();
m_pScanHorizontalBlurred = new C32BitDibWrapper();
m_pScanVerticalBlurred = new C32BitDibWrapper();
m_pScanDoubleHorizontalBlurred = new C32BitDibWrapper();
m_pScanDoubleVerticalBlurred = new C32BitDibWrapper();
m_pScanEdges = new C32BitDibWrapper();
m_pScanDoubleEdges = new C32BitDibWrapper();
m_pScanTripleEdges = new C32BitDibWrapper();
m_pScanHorizontalEdges = new C32BitDibWrapper();
m_pScanVerticalEdges = new C32BitDibWrapper();
m_pScanDoubleHorizontalEdges = new C32BitDibWrapper();
m_pScanDoubleVerticalEdges = new C32BitDibWrapper();
m_resampleFactor=1;
m_pScanWithShadows = NULL;
m_pRegions=NULL;
m_intent=TRUE; // m_intent isn't yet implemented
}
CRegionDetector(BITMAP pBitmap)
{
m_pScan = new C32BitDibWrapper(pBitmap);
m_pScanBlurred = new C32BitDibWrapper(); // create an empty wrapper
m_pScanDoubleBlurred = new C32BitDibWrapper();
m_pScanTripleBlurred = new C32BitDibWrapper();
m_pScanHorizontalBlurred = new C32BitDibWrapper();
m_pScanVerticalBlurred = new C32BitDibWrapper();
m_pScanDoubleHorizontalBlurred = new C32BitDibWrapper();
m_pScanDoubleVerticalBlurred = new C32BitDibWrapper();
m_pScanEdges = new C32BitDibWrapper();
m_pScanDoubleEdges = new C32BitDibWrapper();
m_pScanTripleEdges = new C32BitDibWrapper();
m_pScanHorizontalEdges = new C32BitDibWrapper();
m_pScanVerticalEdges = new C32BitDibWrapper();
m_pScanDoubleHorizontalEdges = new C32BitDibWrapper();
m_pScanDoubleVerticalEdges = new C32BitDibWrapper();
m_resampleFactor=1;
m_pScanWithShadows = NULL;
m_pRegions=NULL;
m_intent=TRUE; // m_intent isn't yet implemented
}
virtual ~CRegionDetector()
{
if (m_pScan) delete m_pScan;
if (m_pScanBlurred) delete m_pScanBlurred;
if (m_pScanDoubleBlurred) delete m_pScanDoubleBlurred;
if (m_pScanTripleBlurred) delete m_pScanTripleBlurred;
if (m_pScanHorizontalBlurred) delete m_pScanHorizontalBlurred;
if (m_pScanVerticalBlurred) delete m_pScanVerticalBlurred;
if (m_pScanDoubleHorizontalBlurred) delete m_pScanDoubleHorizontalBlurred;
if (m_pScanDoubleVerticalBlurred) delete m_pScanDoubleVerticalBlurred;
if (m_pScanEdges) delete m_pScanEdges;
if (m_pScanDoubleEdges) delete m_pScanDoubleEdges;
if (m_pScanTripleEdges) delete m_pScanTripleEdges;
if (m_pScanHorizontalEdges) delete m_pScanHorizontalEdges;
if (m_pScanVerticalEdges) delete m_pScanVerticalEdges;
if (m_pScanDoubleHorizontalEdges) delete m_pScanDoubleHorizontalEdges;
if (m_pScanDoubleVerticalEdges) delete m_pScanDoubleVerticalEdges;
if (m_pScanWithShadows) delete m_pScanWithShadows;
if(m_pRegions!=NULL) delete m_pRegions;
}
public:
int FindRegions();
bool FindSingleRegion();
bool CollisionDetection(RECT r1, RECT r2, C32BitDibWrapper* pImage);
bool ConvertToOrigionalCoordinates();
};