Replace internal doc::Brush image with a doc::ImageRef

This commit is contained in:
David Capello 2015-04-25 19:41:07 -03:00
parent 3810cfc1fa
commit 4a05436252
2 changed files with 16 additions and 22 deletions

View File

@ -24,7 +24,6 @@ Brush::Brush()
m_type = kCircleBrushType;
m_size = 1;
m_angle = 0;
m_image = NULL;
regenerate();
}
@ -34,7 +33,6 @@ Brush::Brush(BrushType type, int size, int angle)
m_type = type;
m_size = size;
m_angle = angle;
m_image = NULL;
regenerate();
}
@ -74,11 +72,7 @@ void Brush::setAngle(int angle)
// Cleans the brush's data (image and region).
void Brush::clean()
{
if (m_image) {
delete m_image;
m_image = NULL;
}
m_image.reset();
m_scanline.clear();
}
@ -98,23 +92,23 @@ void Brush::regenerate()
if (m_type == kSquareBrushType && m_angle != 0 && m_size > 2)
size = (int)std::sqrt((double)2*m_size*m_size)+2;
m_image = Image::create(IMAGE_BITMAP, size, size);
m_image.reset(Image::create(IMAGE_BITMAP, size, size));
if (size == 1) {
clear_image(m_image, BitmapTraits::max_value);
clear_image(m_image.get(), BitmapTraits::max_value);
}
else {
clear_image(m_image, BitmapTraits::min_value);
clear_image(m_image.get(), BitmapTraits::min_value);
switch (m_type) {
case kCircleBrushType:
fill_ellipse(m_image, 0, 0, size-1, size-1, BitmapTraits::max_value);
fill_ellipse(m_image.get(), 0, 0, size-1, size-1, BitmapTraits::max_value);
break;
case kSquareBrushType:
if (m_angle == 0 || size <= 2) {
clear_image(m_image, BitmapTraits::max_value);
clear_image(m_image.get(), BitmapTraits::max_value);
}
else {
double a = PI * m_angle / 180;
@ -131,7 +125,7 @@ void Brush::regenerate()
int y4 = int(y3 - d*sin(a+PI));
int points[8] = { x1, y1, x2, y2, x3, y3, x4, y4 };
doc::algorithm::polygon(4, points, m_image, algo_hline);
doc::algorithm::polygon(4, points, m_image.get(), algo_hline);
}
break;
@ -144,7 +138,7 @@ void Brush::regenerate()
int x2 = int(x1 + d*cos(a));
int y2 = int(y1 - d*sin(a));
draw_line(m_image, x1, y1, x2, y2, BitmapTraits::max_value);
draw_line(m_image.get(), x1, y1, x2, y2, BitmapTraits::max_value);
break;
}
}
@ -155,11 +149,11 @@ void Brush::regenerate()
m_scanline[y].state = false;
for (int x=0; x<m_image->width(); x++) {
if (get_pixel(m_image, x, y)) {
if (get_pixel(m_image.get(), x, y)) {
m_scanline[y].x1 = x;
for (; x<m_image->width(); x++)
if (!get_pixel(m_image, x, y))
if (!get_pixel(m_image.get(), x, y))
break;
m_scanline[y].x2 = x-1;

View File

@ -1,5 +1,5 @@
// Aseprite Document Library
// Copyright (c) 2001-2014 David Capello
// Copyright (c) 2001-2015 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
@ -8,15 +8,15 @@
#define DOC_BRUSH_H_INCLUDED
#pragma once
#include "doc/brush_type.h"
#include "doc/image_ref.h"
#include "gfx/point.h"
#include "gfx/rect.h"
#include "doc/brush_type.h"
#include <vector>
namespace doc {
class Image;
struct BrushScanline {
int state, x1, x2;
};
@ -34,7 +34,7 @@ namespace doc {
BrushType type() const { return m_type; }
int size() const { return m_size; }
int angle() const { return m_angle; }
Image* image() { return m_image; }
Image* image() { return m_image.get(); }
const std::vector<BrushScanline>& scanline() const { return m_scanline; }
const gfx::Rect& bounds() const { return m_bounds; }
@ -50,7 +50,7 @@ namespace doc {
BrushType m_type; // Type of brush
int m_size; // Size (diameter)
int m_angle; // Angle in degrees 0-360
Image* m_image; // Image of the brush
ImageRef m_image; // Image of the brush
std::vector<BrushScanline> m_scanline;
gfx::Rect m_bounds;
};