Separated wxImage::FloodFill from image.cpp

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14897 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2002-04-01 22:14:42 +00:00
parent fd7ab28c5e
commit 0fa784572f
21 changed files with 48 additions and 242 deletions

View File

@@ -180,6 +180,7 @@ iconbndl.cpp Common
imagall.cpp Common imagall.cpp Common
imagbmp.cpp Common imagbmp.cpp Common
image.cpp Common image.cpp Common
imagfill.cpp Common
imaggif.cpp Common imaggif.cpp Common
imagiff.cpp Common imagiff.cpp Common
imagjpeg.cpp Common Win32Only imagjpeg.cpp Common Win32Only

View File

@@ -820,248 +820,6 @@ bool wxImage::SetMaskFromImage(const wxImage& mask,
return TRUE; return TRUE;
} }
// DoFloodFill
// Fills with the colour extracted from fillBrush, starting at x,y until either
// a color different from the start pixel is reached (wxFLOOD_SURFACE)
// or fill color is reached (wxFLOOD_BORDER)
bool wxImage::MatchPixel(int x, int y, int w, int h, const wxColour & c)
{
if ((x<0)||(x>=w)||(y<0)||(y>=h)) return false;
unsigned char r = GetRed(x,y);
unsigned char g = GetGreen(x,y);
unsigned char b = GetBlue(x,y);
return c.Red() == r && c.Green() == g && c.Blue() == b ;
}
bool wxImage::MatchBoundaryPixel(int x, int y, int w, int h, const wxColour & fill, const wxColour & bound)
{
if ((x<0)||(x>=w)||(y<0)||(y>=h)) return TRUE;
unsigned char r = GetRed(x,y);
unsigned char g = GetGreen(x,y);
unsigned char b = GetBlue(x,y);
if ( fill.Red() == r && fill.Green() == g && fill.Blue() == b ) return TRUE;
if ( bound.Red() == r && bound.Green() == g && bound.Blue() == b ) return TRUE;
return FALSE ;
}
void wxImage::DoFloodFill (wxCoord x, wxCoord y, const wxBrush & fillBrush,
const wxColour& testColour, int style /*=wxFLOOD_SURFACE */,
int LogicalFunction /*= wxCOPY, currently unused */)
{
/* A diamond flood-fill using a circular queue system.
Each pixel surrounding the current pixel is added to
the queue if it meets the criteria, then is retrieved in
its turn. Code originally based on http://www.drawit.co.nz/Developers.htm */
int width = GetWidth();
int height = GetHeight();
//Draw using a pen made from the current brush colour
//Potentially allows us to use patterned flood fills in future code
wxColour fillColour = fillBrush.GetColour();
unsigned char r = fillColour.Red();
unsigned char g = fillColour.Green();
unsigned char b = fillColour.Blue();
//initial test :
if (style == wxFLOOD_SURFACE)
{
//if wxFLOOD_SURFACE, if fill colour is same as required, we don't do anything
if ( GetRed(x,y) != r
|| GetGreen(x,y) != g
|| GetBlue (x,y) != b )
{
//prepare memory for queue
//queue save, start, read
size_t *qs, *qst, *qr;
//queue size (physical)
long qSz= height * width * 2;
qst = new size_t [qSz];
//temporary x and y locations
int xt, yt;
for (int i=0; i < qSz; i++)
qst[i] = 0;
// start queue
qs=qr=qst;
*qs=xt=x;
qs++;
*qs=yt=y;
qs++;
SetRGB(xt,yt,r,g,b);
//Main queue loop
while(qr!=qs)
{
//Add new members to queue
//Above current pixel
if(MatchPixel(xt,yt-1,width,height,testColour))
{
*qs=xt;
qs++;
*qs=yt-1;
qs++;
SetRGB(xt,yt-1,r,g,b);
//Loop back to beginning of queue
if(qs>=(qst+qSz)) qs=qst;
}
//Below current pixel
if(MatchPixel(xt,yt+1,width,height,testColour))
{
*qs=xt;
qs++;
*qs=yt+1;
qs++;
SetRGB(xt,yt+1,r,g,b);
if(qs>=(qst+qSz)) qs=qst;
}
//Left of current pixel
if(MatchPixel(xt-1,yt,width,height,testColour))
{
*qs=xt-1;
qs++;
*qs=yt;
qs++;
SetRGB(xt-1,yt,r,g,b);
if(qs>=(qst+qSz)) qs=qst;
}
//Right of current pixel
if(MatchPixel(xt+1,yt,width,height,testColour))
{
*qs=xt+1;
qs++;
*qs=yt;
qs++;
SetRGB(xt+1,yt,r,g,b);
if(qs>=(qst+qSz)) qs=qst;
}
//Retrieve current queue member
qr+=2;
//Loop back to the beginning
if(qr>=(qst+qSz)) qr=qst;
xt=*qr;
yt=*(qr+1);
//Go Back to beginning of loop
}
delete [] qst ;
}
}
else
{
//style is wxFLOOD_BORDER
// fill up to testColor border - if already testColour don't do anything
if ( GetRed(x,y) != testColour.Red()
|| GetGreen(x,y) != testColour.Green()
|| GetBlue(x,y) != testColour.Blue() )
{
//prepare memory for queue
//queue save, start, read
size_t *qs, *qst, *qr;
//queue size (physical)
long qSz= height * width * 2;
qst = new size_t [qSz];
//temporary x and y locations
int xt, yt;
for (int i=0; i < qSz; i++)
qst[i] = 0;
// start queue
qs=qr=qst;
*qs=xt=x;
qs++;
*qs=yt=y;
qs++;
SetRGB(xt,yt,r,g,b);
//Main queue loop
while(qr!=qs)
{
//Add new members to queue
//Above current pixel
if(!MatchBoundaryPixel(xt,yt-1,width,height,fillColour,testColour))
{
*qs=xt;
qs++;
*qs=yt-1;
qs++;
SetRGB(xt,yt-1,r,g,b);
//Loop back to beginning of queue
if(qs>=(qst+qSz)) qs=qst;
}
//Below current pixel
if(!MatchBoundaryPixel(xt,yt+1,width,height,fillColour,testColour))
{
*qs=xt;
qs++;
*qs=yt+1;
qs++;
SetRGB(xt,yt+1,r,g,b);
if(qs>=(qst+qSz)) qs=qst;
}
//Left of current pixel
if(!MatchBoundaryPixel(xt-1,yt,width,height,fillColour,testColour))
{
*qs=xt-1;
qs++;
*qs=yt;
qs++;
SetRGB(xt-1,yt,r,g,b);
if(qs>=(qst+qSz)) qs=qst;
}
//Right of current pixel
if(!MatchBoundaryPixel(xt+1,yt,width,height,fillColour,testColour))
{
*qs=xt+1;
qs++;
*qs=yt;
qs++;
SetRGB(xt+1,yt,r,g,b);
if(qs>=(qst+qSz)) qs=qst;
}
//Retrieve current queue member
qr+=2;
//Loop back to the beginning
if(qr>=(qst+qSz)) qr=qst;
xt=*qr;
yt=*(qr+1);
//Go Back to beginning of loop
}
delete [] qst ;
}
}
//all done,
}
#if wxUSE_PALETTE #if wxUSE_PALETTE
// Palette functions // Palette functions

View File

@@ -108,6 +108,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -688,6 +689,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -108,6 +108,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -688,6 +689,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -105,6 +105,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -714,6 +715,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -105,6 +105,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -714,6 +715,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -108,6 +108,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -588,6 +589,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -105,6 +105,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -681,6 +682,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -107,6 +107,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -676,6 +677,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -92,6 +92,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -749,6 +750,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -175,6 +175,7 @@ COMMONOBJS = \
$(MSWDIR)\imagall.obj \ $(MSWDIR)\imagall.obj \
$(MSWDIR)\imagbmp.obj \ $(MSWDIR)\imagbmp.obj \
$(MSWDIR)\image.obj \ $(MSWDIR)\image.obj \
$(MSWDIR)\imagfill.obj \
$(MSWDIR)\imaggif.obj \ $(MSWDIR)\imaggif.obj \
$(MSWDIR)\imagiff.obj \ $(MSWDIR)\imagiff.obj \
$(MSWDIR)\imagjpeg.obj \ $(MSWDIR)\imagjpeg.obj \
@@ -772,6 +773,8 @@ $(MSWDIR)\imagbmp.obj: $(COMMDIR)\imagbmp.$(SRCSUFF)
$(MSWDIR)\image.obj: $(COMMDIR)\image.$(SRCSUFF) $(MSWDIR)\image.obj: $(COMMDIR)\image.$(SRCSUFF)
$(MSWDIR)\imagfill.obj: $(COMMDIR)\imagfill.$(SRCSUFF)
$(MSWDIR)\imaggif.obj: $(COMMDIR)\imaggif.$(SRCSUFF) $(MSWDIR)\imaggif.obj: $(COMMDIR)\imaggif.$(SRCSUFF)
$(MSWDIR)\imagiff.obj: $(COMMDIR)\imagiff.$(SRCSUFF) $(MSWDIR)\imagiff.obj: $(COMMDIR)\imagiff.$(SRCSUFF)

View File

@@ -161,6 +161,7 @@ COMMONOBJS = \
$(MSWDIR)\imagall.obj \ $(MSWDIR)\imagall.obj \
$(MSWDIR)\imagbmp.obj \ $(MSWDIR)\imagbmp.obj \
$(MSWDIR)\image.obj \ $(MSWDIR)\image.obj \
$(MSWDIR)\imagfill.obj \
$(MSWDIR)\imaggif.obj \ $(MSWDIR)\imaggif.obj \
$(MSWDIR)\imagiff.obj \ $(MSWDIR)\imagiff.obj \
$(MSWDIR)\imagxpm.obj \ $(MSWDIR)\imagxpm.obj \
@@ -624,6 +625,8 @@ $(MSWDIR)\imagbmp.obj: $(COMMDIR)\imagbmp.$(SRCSUFF)
$(MSWDIR)\image.obj: $(COMMDIR)\image.$(SRCSUFF) $(MSWDIR)\image.obj: $(COMMDIR)\image.$(SRCSUFF)
$(MSWDIR)\imagfill.obj: $(COMMDIR)\imagfill.$(SRCSUFF)
$(MSWDIR)\imaggif.obj: $(COMMDIR)\imaggif.$(SRCSUFF) $(MSWDIR)\imaggif.obj: $(COMMDIR)\imaggif.$(SRCSUFF)
$(MSWDIR)\imagiff.obj: $(COMMDIR)\imagiff.$(SRCSUFF) $(MSWDIR)\imagiff.obj: $(COMMDIR)\imagiff.$(SRCSUFF)

View File

@@ -146,6 +146,7 @@ COMMONOBJS1 = \
$(COMMDIR)\imagall.obj \ $(COMMDIR)\imagall.obj \
$(COMMDIR)\imagbmp.obj \ $(COMMDIR)\imagbmp.obj \
$(COMMDIR)\image.obj \ $(COMMDIR)\image.obj \
$(COMMDIR)\imagfill.obj \
$(COMMDIR)\imaggif.obj \ $(COMMDIR)\imaggif.obj \
$(COMMDIR)\imagiff.obj \ $(COMMDIR)\imagiff.obj \
$(COMMDIR)\imagxpm.obj \ $(COMMDIR)\imagxpm.obj \
@@ -1078,6 +1079,11 @@ $(COMMDIR)/image.obj: $*.$(SRCSUFF)
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF) $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
<< <<
$(COMMDIR)/imagfill.obj: $*.$(SRCSUFF)
cl @<<
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
<<
$(COMMDIR)/imaggif.obj: $*.$(SRCSUFF) $(COMMDIR)/imaggif.obj: $*.$(SRCSUFF)
cl @<< cl @<<
$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF) $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)

View File

@@ -214,6 +214,7 @@ COMMONOBJS = \
$(COMMDIR)/imagall.$(OBJSUFF) \ $(COMMDIR)/imagall.$(OBJSUFF) \
$(COMMDIR)/imagbmp.$(OBJSUFF) \ $(COMMDIR)/imagbmp.$(OBJSUFF) \
$(COMMDIR)/image.$(OBJSUFF) \ $(COMMDIR)/image.$(OBJSUFF) \
$(COMMDIR)/imagfill.$(OBJSUFF) \
$(COMMDIR)/imaggif.$(OBJSUFF) \ $(COMMDIR)/imaggif.$(OBJSUFF) \
$(COMMDIR)/imagiff.$(OBJSUFF) \ $(COMMDIR)/imagiff.$(OBJSUFF) \
$(COMMDIR)/imagjpeg.$(OBJSUFF) \ $(COMMDIR)/imagjpeg.$(OBJSUFF) \

View File

@@ -119,6 +119,7 @@ COMMONOBJS = \
$(COMMDIR)\imagall.obj \ $(COMMDIR)\imagall.obj \
$(COMMDIR)\imagbmp.obj \ $(COMMDIR)\imagbmp.obj \
$(COMMDIR)\image.obj \ $(COMMDIR)\image.obj \
$(COMMDIR)\imagfill.obj \
$(COMMDIR)\imaggif.obj \ $(COMMDIR)\imaggif.obj \
$(COMMDIR)\imagiff.obj \ $(COMMDIR)\imagiff.obj \
$(COMMDIR)\imagjpeg.obj \ $(COMMDIR)\imagjpeg.obj \

View File

@@ -195,6 +195,7 @@ COMMONOBJS = \
$(COMMDIR)\$D\imagall.obj \ $(COMMDIR)\$D\imagall.obj \
$(COMMDIR)\$D\imagbmp.obj \ $(COMMDIR)\$D\imagbmp.obj \
$(COMMDIR)\$D\image.obj \ $(COMMDIR)\$D\image.obj \
$(COMMDIR)\$D\imagfill.obj \
$(COMMDIR)\$D\imaggif.obj \ $(COMMDIR)\$D\imaggif.obj \
$(COMMDIR)\$D\imagiff.obj \ $(COMMDIR)\$D\imagiff.obj \
$(COMMDIR)\$D\imagjpeg.obj \ $(COMMDIR)\$D\imagjpeg.obj \

View File

@@ -157,6 +157,7 @@ COMMONOBJS = &
imagall.obj & imagall.obj &
imagbmp.obj & imagbmp.obj &
image.obj & image.obj &
imagfill.obj &
imaggif.obj & imaggif.obj &
imagiff.obj & imagiff.obj &
imagjpeg.obj & imagjpeg.obj &
@@ -916,6 +917,9 @@ imagbmp.obj: $(COMMDIR)\imagbmp.cpp
image.obj: $(COMMDIR)\image.cpp image.obj: $(COMMDIR)\image.cpp
*$(CCC) $(CPPFLAGS) $(IFLAGS) $< *$(CCC) $(CPPFLAGS) $(IFLAGS) $<
imagfill.obj: $(COMMDIR)\imagfill.cpp
*$(CCC) $(CPPFLAGS) $(IFLAGS) $<
imaggif.obj: $(COMMDIR)\imaggif.cpp imaggif.obj: $(COMMDIR)\imaggif.cpp
*$(CCC) $(CPPFLAGS) $(IFLAGS) $< *$(CCC) $(CPPFLAGS) $(IFLAGS) $<

View File

@@ -101,6 +101,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -694,6 +695,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \

View File

@@ -325,6 +325,10 @@ SOURCE=.\common\image.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\common\imagfill.cpp
# End Source File
# Begin Source File
SOURCE=.\common\imaggif.cpp SOURCE=.\common\imaggif.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -484,6 +484,10 @@ SOURCE=.\common\image.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\common\imagfill.cpp
# End Source File
# Begin Source File
SOURCE=.\common\imaggif.cpp SOURCE=.\common\imaggif.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -139,6 +139,7 @@ ALL_SOURCES = \
common/imagall.cpp \ common/imagall.cpp \
common/imagbmp.cpp \ common/imagbmp.cpp \
common/image.cpp \ common/image.cpp \
common/imagfill.cpp \
common/imaggif.cpp \ common/imaggif.cpp \
common/imagiff.cpp \ common/imagiff.cpp \
common/imagjpeg.cpp \ common/imagjpeg.cpp \
@@ -702,6 +703,7 @@ COMMONOBJS = \
imagall.o \ imagall.o \
imagbmp.o \ imagbmp.o \
image.o \ image.o \
imagfill.o \
imaggif.o \ imaggif.o \
imagiff.o \ imagiff.o \
imagjpeg.o \ imagjpeg.o \