Tried a different one,
int point(int x, int y){
return Pokitto::Display::getPixel(x, y);
}
void line(int x1,int y1,int x2,int y2, int colour){
Pokitto::Display::setColor(colour);
Pokitto::Display::drawLine(x1, y1, x2, y2);
}
void flood_fill(int x, int y, int target, int fill_color){
// check current pixel
if(point(x,y) != target) return;
int l = x, r = x;
// find furthest left pixel to fill from
while(point(l -1, y) == target && l -1 > -1){
l--;
}
// find furthes right pixel to fill to
while(point(r +1, y) == target && r +1 < Pokitto::Display::width - 1){
r++;
}
// draw a line between the two
line (l,y,r,y, fill_color);
PC::update();
wait_us(2000);
// move along that line and see if we can fill above or below
for(x = l; x<r; x++){
if(y +1 < Pokitto::Display::height - 1) flood_fill(x, y +1, target, fill_color);
if(y -1 > -1) flood_fill(x, y -1, target, fill_color);
}
}
This one similarly fails ‘sometimes’. This time it fails if the starting point of the fill is only 1px wide. I just don’t see why though.
Full Code…
Flashes a red pixel at the start point, press A to continue filling.
#include "Pokitto.h"
using PC = Pokitto::Core;
using PD = Pokitto::Display;
const uint16_t palette[] = {
0xFFFF,0x0000,0x73B9,0xBDD7,0xF00F
};
const uint8_t script[] = {
0xFF,0x01,0x23,0x0B,0x3A,0x0B,0x3A,0x21,0x71,0x21,0x71,0x0B,0x7D,0x0B,0x88,0x16,0x88,0x5E,0x7F,0x5E,0x7F,0x38,0x40,0x38,
0x3E,0x36,0x35,0x36,0x34,0x38,0x2D,0x38,0x2D,0x41,0x23,0x48,0x23,0x0B,0xFE,0x02,0x25,0x45,0xFF,0x01,0x21,0x48,0x21,0x0A,
0x7E,0x0A,0x8A,0x16,0x8A,0x5F,0x56,0x5F,0x56,0x64,0x52,0x6C,0x4E,0x71,0x4A,0x74,0x44,0x7D,0x3C,0x81,0x3C,0x8C,0x0A,0x8C,
0x0A,0x6D,0x09,0x6D,0x09,0x51,0x0D,0x4B,0x14,0x45,0x15,0x41,0x19,0x3A,0x1E,0x37,0x21,0x36,0x21,0x36,0x1E,0x38,0x1A,0x3A,
0x16,0x41,0x15,0x45,0x0E,0x4B,0x0A,0x51,0x0A,0x6C,0x0B,0x6D,0x0B,0x8B,0x28,0x8B,0x28,0x76,0x30,0x76,0x34,0x72,0x34,0x5F,
0x32,0x5C,0x32,0x52,0x41,0x45,0x41,0x39,0x3E,0x37,0x3B,0x37,0x3E,0x3A,0x3E,0x41,0x3D,0x42,0x36,0x42,0x33,0x3F,0x2A,0x46,
0x1E,0x4C,0x12,0x55,0x12,0x54,0x1E,0x4B,0x1A,0x4A,0x17,0x47,0x1A,0x49,0x1E,0x4A,0x21,0x48,0xFF,0x01,0x32,0x3D,0x34,0x36,
0x3C,0x37,0x3D,0x3A,0x3D,0x41,0x36,0x41,0x32,0x3D,0xFF,0x01,0x33,0x5C,0x33,0x52,0x42,0x45,0x42,0x39,0x7D,0x39,0x7D,0x5E,
0x34,0x5E,0x33,0x5A,0xFF,0x01,0x3C,0x0B,0x6F,0x0B,0x6F,0x20,0x3C,0x20,0x3C,0x0B,0xFF,0x01,0x60,0x0E,0x6B,0x0E,0x6B,0x1C,
0x60,0x1C,0x60,0x0E,0xFE,0x03,0x3E,0x1F,0xFF,0x01,0x62,0x0F,0x69,0x0F,0x69,0x1B,0x62,0x1B,0x62,0x0F,0xFE,0x02,0x63,0x1A,
0xFF,0x01,0x2F,0x39,0x32,0x39,0x32,0x3B,0x2F,0x3F,0x2F,0x39,0xFF,0x01,0x29,0x8B,0x29,0x77,0x30,0x77,0x35,0x72,0x35,0x69,
0x39,0x6B,0x41,0x6B,0x41,0x6D,0x45,0x72,0x49,0x72,0x49,0x74,0x43,0x7D,0x3B,0x80,0x3B,0x8B,0x29,0x8B,0xFF,0x01,0x35,0x5F,
0x35,0x64,0x3A,0x61,0x35,0x5F,0xFF,0x01,0x39,0x62,0x35,0x64,0x35,0x5F,0x4A,0x5F,0x40,0x69,0x3F,0x69,0x41,0x67,0x3C,0x62,
0x39,0x62,0xFF,0x01,0x4E,0x5F,0x55,0x5F,0x55,0x64,0x51,0x6C,0x4E,0x70,0x49,0x71,0x46,0x71,0x43,0x6D,0x43,0x6A,0x4E,0x5F,
0xFF,0x01,0x44,0x6A,0x44,0x6D,0x46,0x70,0x48,0x70,0x4C,0x6F,0x4D,0x6C,0x49,0x69,0x44,0x6A,0xFF,0x01,0x36,0x68,0x3E,0x6A,
0x40,0x67,0x3C,0x63,0x39,0x63,0x36,0x65,0x36,0x68,0xFF,0x01,0x7E,0x0B,0x89,0x16,0x89,0x5E,0xFE,0x01,0x22,0x0B,0xFE,0x01,
0x3B,0x0B,0xFE,0x01,0x61,0x0F,0xFE,0x01,0x6A,0x1B,0xFE,0x01,0x70,0x0F,0xFE,0x01,0x7E,0x5E,0xFE,0x01,0x4B,0x60,0xFE,0x01,
0x2E,0x39,0xFF,0xFF,
};
int point(int x, int y){
return Pokitto::Display::getPixel(x, y);
}
void line(int x1,int y1,int x2,int y2, int colour){
Pokitto::Display::setColor(colour);
Pokitto::Display::drawLine(x1, y1, x2, y2);
}
void flood_fill(int x, int y, int target, int fill_color){
// check current pixel
if(point(x,y) != target) return;
int l = x, r = x;
// find furthest left pixel to fill from
while(point(l -1, y) == target && l -1 > -1){
l--;
}
// find furthes right pixel to fill to
while(point(r +1, y) == target && r +1 < Pokitto::Display::width - 1){
r++;
}
// draw a line between the two
line (l,y,r,y, fill_color);
PC::update();
wait_us(2000);
// move along that line and see if we can fill above or below
for(x = l; x<r; x++){
if(y +1 < Pokitto::Display::height - 1) flood_fill(x, y +1, target, fill_color);
if(y -1 > -1) flood_fill(x, y -1, target, fill_color);
}
}
int main() {
PC::begin();
PD::persistence = true;
PD::invisiblecolor = 0;
PD::load565Palette(palette);
int ending=0;
int t=0;
int colour = 0;
int lastX, lastY=0;
int offX, offY=0;
int b1,b2,task=0;
while(ending==0){
PC::update();
b1 = script[t++];
b2 = script[t++];
if(b1==0xFF && b2==0xFF){
ending = 1;
}else if(b1==0xFF){
// new line
colour = b2;
PD::setColor(b2);
task = 2;
}else if(b1==0xFE){
//flood fill
colour = b2;
PD::setColor(b2);
task = 1;
}else if(task==0){
// continue line
PD::drawLine(offX+lastX, offY+lastY, b1, b2);
lastX = b1;
lastY = b2;
}else if(task==1){
//floodfill
int col = point(offX+b1, offY+b2);
PD::setColor(4);
Pokitto::Display::drawPixel(offX+b1, offY+b2);
int OK = 0;
while(OK==0){
if(Pokitto::Buttons::aBtn()) OK = 1;
PD::setColor(4);
Pokitto::Display::drawPixel(offX+b1, offY+b2);
PC::update();
PD::setColor(col);
Pokitto::Display::drawPixel(offX+b1, offY+b2);
PC::update();
}
while(Pokitto::Buttons::aBtn()){
PC::update();
}
PD::setColor(col);
Pokitto::Display::drawPixel(offX+b1, offY+b2);
flood_fill(offX+b1, offY+b2, 0, colour);
task = 0;
}else if(task==2){
//start line
lastX=b1;
lastY=b2;
task=0;
}
// watch it draw!
wait_us(20000);
}
while( PC::isRunning() ){
if( !PC::update() ) continue;
}
return 1;
}