Some fixes and optimizations to the GUI2 canvas

This commit is contained in:
Charles Dang 2016-09-10 16:29:03 +11:00
parent 5e750b0083
commit 6758ef48d3
2 changed files with 28 additions and 15 deletions

View file

@ -151,9 +151,9 @@ static void draw_line(surface& canvas,
static void draw_circle(surface& canvas,
SDL_Renderer* renderer,
Uint32 color,
const unsigned x_center,
const unsigned y_center,
const unsigned radius)
const int x_center,
const int y_center,
const int radius)
{
unsigned w = canvas->w;
@ -175,16 +175,18 @@ static void draw_circle(surface& canvas,
int x = radius;
int y = 0;
while(!(y > x)) {
SDL_RenderDrawPoint(renderer, x_center + x, y_center + y);
SDL_RenderDrawPoint(renderer, x_center + x, y_center - y);
SDL_RenderDrawPoint(renderer, x_center - x, y_center + y);
SDL_RenderDrawPoint(renderer, x_center - x, y_center - y);
std::vector<SDL_Point> points;
SDL_RenderDrawPoint(renderer, x_center + y, y_center + x);
SDL_RenderDrawPoint(renderer, x_center + y, y_center - x);
SDL_RenderDrawPoint(renderer, x_center - y, y_center + x);
SDL_RenderDrawPoint(renderer, x_center - y, y_center - x);
while(!(y > x)) {
points.push_back({x_center + x, y_center + y});
points.push_back({x_center + x, y_center - y});
points.push_back({x_center - x, y_center + y});
points.push_back({x_center - x, y_center - y});
points.push_back({x_center + y, y_center + x});
points.push_back({x_center + y, y_center - x});
points.push_back({x_center - y, y_center + x});
points.push_back({x_center - y, y_center - x});
d += 2 * y + 1;
++y;
@ -193,6 +195,8 @@ static void draw_circle(surface& canvas,
--x;
}
}
SDL_RenderDrawPoints(renderer, points.data(), points.size());
}
/***** ***** ***** ***** ***** LINE ***** ***** ***** ***** *****/
@ -1395,12 +1399,18 @@ tcanvas::tcanvas()
, w_(0)
, h_(0)
, canvas_()
, renderer_()
, renderer_(nullptr)
, variables_()
, is_dirty_(true)
{
}
tcanvas::~tcanvas()
{
SDL_DestroyRenderer(renderer_);
}
void tcanvas::draw(const bool force)
{
log_scope2(log_gui_draw, "Canvas: drawing.");
@ -1419,6 +1429,8 @@ void tcanvas::draw(const bool force)
DBG_GUI_D << "Canvas: create new empty canvas.\n";
canvas_.assign(create_neutral_surface(w_, h_));
SDL_DestroyRenderer(renderer_);
renderer_ = SDL_CreateSoftwareRenderer(canvas_);
SDL_SetRenderDrawBlendMode(renderer_, SDL_BLENDMODE_BLEND);
@ -1427,10 +1439,10 @@ void tcanvas::draw(const bool force)
log_scope2(log_gui_draw, "Canvas: draw shape.");
shape->draw(canvas_, renderer_, variables_);
SDL_RenderPresent(renderer_);
}
SDL_RenderPresent(renderer_);
is_dirty_ = false;
}

View file

@ -76,6 +76,7 @@ public:
typedef std::shared_ptr<const tshape> const_tshape_ptr;
tcanvas();
~tcanvas();
/**
* Draws the canvas.