Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void floodFillScanlineStack(Paint::Bitmap^ bm, int x, int y, System::Drawing::Color newColor, System::Drawing::Color oldColor)
- {
- if (oldColor == newColor) return;
- int x1;
- bool spanAbove, spanBelow;
- std::vector<int> stackX, stackY;
- stackX.push_back(x);
- stackY.push_back(y);
- while (!stackX.empty())
- {
- x = stackX.back(); y = stackY.back();
- stackX.pop_back(); stackY.pop_back();
- x1 = x;
- while (x1 >= 0 && bm->GetPixel(x1, y) == oldColor) x1--;
- x1++;
- spanAbove = spanBelow = 0;
- while (x1 < bm->Width && bm->GetPixel(x1, y) == oldColor)
- {
- bm->SetPixel(x1, y, newColor);
- if (!spanAbove && y > 0 && bm->GetPixel(x1, y - 1) == oldColor)
- {
- stackX.push_back(x1);
- stackY.push_back(y - 1);
- spanAbove = 1;
- }
- else if (spanAbove && y > 0 && bm->GetPixel(x1, y - 1) != oldColor)
- {
- spanAbove = 0;
- }
- if (!spanBelow && y < bm->Height - 1 && bm->GetPixel(x1, y + 1) == oldColor)
- {
- stackX.push_back(x1);
- stackY.push_back(y + 1);
- spanBelow = 1;
- }
- else if (spanBelow && y < bm->Height - 1 && bm->GetPixel(x1, y + 1) != oldColor)
- {
- spanBelow = 0;
- }
- x1++;
- }
- }
- }
- void Paint::PaintForm::Fill(int x, int y, Color newClr, Color oldClr)
- {
- floodFillScanlineStack(Img, x, y, newClr, oldClr);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement