summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-04-11 17:23:10 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-04-11 17:23:10 (GMT)
commit84ceea525b3c493e8e4d9da7aaf5407c1eed7ada (patch)
tree1efc2f4009d4667a7ed5e2055851b2bb638bd32b /src
parentb2907798f28b4acce5b024f025e7b96079f53338 (diff)
downloadpowder-84ceea525b3c493e8e4d9da7aaf5407c1eed7ada.zip
powder-84ceea525b3c493e8e4d9da7aaf5407c1eed7ada.tar.gz
Nice drawing for brush
Diffstat (limited to 'src')
-rw-r--r--src/game/Brush.h58
-rw-r--r--src/game/EllipseBrush.h15
2 files changed, 54 insertions, 19 deletions
diff --git a/src/game/Brush.h b/src/game/Brush.h
index 617f7df..98d1321 100644
--- a/src/game/Brush.h
+++ b/src/game/Brush.h
@@ -13,12 +13,36 @@
class Brush
{
protected:
+ bool * outline;
bool * bitmap;
ui::Point size;
+ void updateOutline()
+ {
+ if(!bitmap)
+ GenerateBitmap();
+ if(!bitmap)
+ return;
+ if(outline)
+ free(outline);
+ int width = size.X*2;
+ int height = size.Y*2;
+ outline = (bool *)malloc(sizeof(bool)*((width+1)*(height+1)));
+ for(int x = 0; x <= width; x++)
+ {
+ for(int y = 0; y <= height; y++)
+ {
+ if(bitmap[y*width+x] && (!y || !x || y == height || x == width || !bitmap[y*width+(x+1)] || !bitmap[y*width+(x-1)] || !bitmap[(y-1)*width+x] || !bitmap[(y+1)*width+x]))
+ outline[y*width+x] = true;
+ else
+ outline[y*width+x] = false;
+ }
+ }
+ }
public:
Brush(ui::Point size_):
bitmap(NULL),
- size(size_)
+ size(size_),
+ outline(NULL)
{
};
@@ -30,10 +54,13 @@ public:
{
this->size = size;
GenerateBitmap();
+ updateOutline();
}
virtual ~Brush() {
if(bitmap)
delete bitmap;
+ if(outline)
+ delete outline;
}
virtual void RenderRect(Graphics * g, ui::Point position1, ui::Point position2)
{
@@ -50,16 +77,30 @@ public:
position1.X += width;
width *= -1;
}
- g->fillrect(position1.X-1, position1.Y-1, width+2, height+2, 255, 0, 255, 70);
+ g->xor_line(position1.X, position1.Y, position1.X+width, position1.Y);
+ g->xor_line(position1.X, position1.Y+height, position1.X+width, position1.Y+height);
+ g->xor_line(position1.X+width, position1.Y+1, position1.X+width, position1.Y+height-1);
+ g->xor_line(position1.X, position1.Y+1, position1.X, position1.Y+height-1);
}
virtual void RenderLine(Graphics * g, ui::Point position1, ui::Point position2)
{
- g->blend_line(position1.X, position1.Y, position2.X, position2.Y, 255, 0, 255, 70);
+ g->xor_line(position1.X, position1.Y, position2.X, position2.Y);
}
//Draw the brush outline onto the screen
virtual void RenderPoint(Graphics * g, ui::Point position)
{
- g->fillrect(position.X-size.X-1, position.Y-size.Y-1, (size.X*2)+2, (size.Y*2)+2, 255, 0, 255, 70);
+ if(!outline)
+ updateOutline();
+ if(!outline)
+ return;
+ for(int x = 0; x <= size.X*2; x++)
+ {
+ for(int y = 0; y <= size.Y*2; y++)
+ {
+ if(outline[y*(size.X*2)+x])
+ g->xor_pixel(position.X-size.X+x, position.Y-size.Y+y);
+ }
+ }
}
virtual void GenerateBitmap()
{
@@ -81,6 +122,15 @@ public:
GenerateBitmap();
return bitmap;
}
+
+ bool * GetOutline()
+ {
+ if(!outline)
+ updateOutline();
+ if(!outline)
+ return NULL;
+ return outline;
+ }
};
diff --git a/src/game/EllipseBrush.h b/src/game/EllipseBrush.h
index 2f2f815..0953c01 100644
--- a/src/game/EllipseBrush.h
+++ b/src/game/EllipseBrush.h
@@ -18,21 +18,6 @@ public:
{
};
- //Draw the brush outline onto the screen
- virtual void RenderPoint(Graphics * g, ui::Point position)
- {
- if(!bitmap)
- GenerateBitmap();
- //g->fillrect(position.X-size.X-1, position.Y-size.Y-1, (size.X*2)+2, (size.Y*2)+2, 255, 0, 255, 70);
- for(int x = 0; x <= size.X*2; x++)
- {
- for(int y = 0; y <= size.Y*2; y++)
- {
- if(bitmap[y*(size.X*2)+x])
- g->blendpixel(position.X-size.X+x, position.Y-size.Y+y, 255, 0, 255, 70);
- }
- }
- }
virtual void GenerateBitmap()
{
if(bitmap)