Refactored 'extras' stuff in Sprite class.

Now it is called "ExtraCel" which is the union of a Cel and an Image.
This commit is contained in:
David Capello 2010-04-24 16:09:35 -03:00
parent d79d29c1a5
commit bb6815524f
8 changed files with 88 additions and 64 deletions

View File

@ -106,9 +106,7 @@ void ChangeImageTypeCommand::execute(Context* context)
undoable.set_imgtype(m_imgtype, m_dithering);
// Regenerate extras
sprite->prepareExtra();
image_clear(sprite->getExtras(),
sprite->getExtras()->mask_color);
sprite->destroyExtraCel();
undoable.commit();
}

View File

@ -97,9 +97,7 @@ void PlayAnimationCommand::execute(Context* context)
clear_bitmap(ji_screen);
// Clear extras (e.g. pen preview)
sprite->prepareExtra();
image_clear(sprite->getExtras(),
sprite->getExtras()->mask_color);
sprite->destroyExtraCel();
/* do animation */
oldpal = NULL;

View File

@ -368,10 +368,10 @@ public:
return m_bound.seg;
}
void prepareExtra();
Image* getExtras() { return m_extras; }
int getExtrasOpacity() const { return m_extras_opacity; }
void setExtrasOpacity(int opacity) { m_extras_opacity = opacity; }
void prepareExtraCel(int x, int y, int w, int h, int opacity);
void destroyExtraCel();
Cel* getExtraCel() const;
Image* getExtraCelImage() const;
private:
Sprite* m_self; // pointer to the Sprite
@ -403,8 +403,8 @@ private:
PreferredEditorSettings m_preferred;
Image* m_extras; // Image with the sprite size to draw some extra stuff (e.g. editor's cursor)
int m_extras_opacity; // Opacity to be used to draw the extra image
Cel* m_extraCel; // Extra cel used to draw extra stuff (e.g. editor's pen preview, pixels in movement, etc.)
Image* m_extraImage; // Image of the extra cel
// Mutex to modify the 'locked' flag.
Vaca::Mutex* m_mutex;
@ -444,7 +444,8 @@ SpriteImpl::SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int n
m_undo = undo_new(m_self);
m_repository.paths = jlist_new();
m_repository.masks = jlist_new();
m_extras = NULL;
m_extraCel = NULL;
m_extraImage = NULL;
// Boundary stuff
m_bound.nseg = 0;
@ -628,7 +629,8 @@ SpriteImpl::~SpriteImpl()
// Destroy undo, mask, etc.
delete m_undo;
delete m_mask;
delete m_extras; // image
delete m_extraCel;
delete m_extraImage;
if (m_bound.seg) jfree(m_bound.seg);
delete m_mutex;
@ -921,18 +923,44 @@ void SpriteImpl::deletePalette(Palette* pal)
jlist_delete_link(m_palettes, link);
}
void SpriteImpl::prepareExtra()
void SpriteImpl::destroyExtraCel()
{
if (!m_extras ||
m_extras->imgtype != m_imgtype ||
m_extras->w != m_width ||
m_extras->h != m_height) {
delete m_extras; // image
m_extras = image_new(m_imgtype, m_width, m_height);
image_clear(m_extras, m_extras->mask_color = 0);
delete m_extraCel;
delete m_extraImage;
m_extraCel = NULL;
m_extraImage = NULL;
}
void SpriteImpl::prepareExtraCel(int x, int y, int w, int h, int opacity)
{
if (!m_extraCel)
m_extraCel = new Cel(0, 0); // Ignored fields for this cell (frame, and image index)
m_extraCel->x = x;
m_extraCel->y = y;
m_extraCel->opacity = opacity;
if (!m_extraImage ||
m_extraImage->imgtype != m_imgtype ||
m_extraImage->w != w ||
m_extraImage->h != h) {
delete m_extraImage; // image
m_extraImage = image_new(m_imgtype, w, h);
image_clear(m_extraImage,
m_extraImage->mask_color = 0);
}
}
Cel* SpriteImpl::getExtraCel() const
{
return m_extraCel;
}
Image* SpriteImpl::getExtraCelImage() const
{
return m_extraImage;
}
//////////////////////////////////////////////////////////////////////
// Constructors/Destructor
@ -1484,24 +1512,24 @@ const _BoundSeg* Sprite::getBoundariesSegments() const
//////////////////////////////////////////////////////////////////////
// Extras
void Sprite::prepareExtra()
void Sprite::prepareExtraCel(int x, int y, int w, int h, int opacity)
{
m_impl->prepareExtra();
m_impl->prepareExtraCel(x, y, w, h, opacity);
}
Image* Sprite::getExtras()
void Sprite::destroyExtraCel()
{
return m_impl->getExtras();
m_impl->destroyExtraCel();
}
int Sprite::getExtrasOpacity() const
Cel* Sprite::getExtraCel() const
{
return m_impl->getExtrasOpacity();
return m_impl->getExtraCel();
}
void Sprite::setExtrasOpacity(int opacity)
Image* Sprite::getExtraCelImage() const
{
m_impl->setExtrasOpacity(opacity);
return m_impl->getExtraCelImage();
}
static Layer* index2layer(const Layer* layer, int index, int* index_count)

View File

@ -206,12 +206,13 @@ public:
const _BoundSeg* getBoundariesSegments() const;
////////////////////////////////////////
// Extras
// Extra Cel (it is used to draw pen preview, pixels in movement,
// etc.)
void prepareExtra();
Image* getExtras();
int getExtrasOpacity() const;
void setExtrasOpacity(int opacity);
void prepareExtraCel(int x, int y, int w, int h, int opacity);
void destroyExtraCel();
Cel* getExtraCel() const;
Image* getExtraCelImage() const;
private:
Sprite();

View File

@ -1548,9 +1548,7 @@ static void chunk_set_imgtype_invert(UndoStream* stream, UndoChunkSetImgType *ch
sprite->setImgType(chunk->imgtype);
// Regenerate extras
sprite->prepareExtra();
image_clear(sprite->getExtras(),
sprite->getExtras()->mask_color);
sprite->destroyExtraCel();
}
}

View File

@ -473,20 +473,21 @@ void RenderEngine::renderLayer(Sprite *sprite, Layer *layer, Image *image,
}
// Draw extras
if (layer == sprite->getCurrentLayer() && sprite->getExtras() != NULL) {
int opacity = sprite->getExtrasOpacity();
if (opacity > 0) {
if (layer == sprite->getCurrentLayer() && sprite->getExtraCel() != NULL) {
Cel* extraCel = sprite->getExtraCel();
if (extraCel->opacity > 0) {
Image* extraImage = sprite->getExtraCelImage();
if (zoom == 0) {
image_merge(image, sprite->getExtras(),
-source_x,
-source_y,
opacity, BLEND_MODE_NORMAL);
image_merge(image, extraImage,
extraCel->x - source_x,
extraCel->y - source_y,
extraCel->opacity, BLEND_MODE_NORMAL);
}
else {
(*zoomed_func)(image, sprite->getExtras(),
-source_x,
-source_y,
opacity, BLEND_MODE_NORMAL, zoom);
(*zoomed_func)(image, extraImage,
(extraCel->x << zoom) - source_x,
(extraCel->y << zoom) - source_y,
extraCel->opacity, BLEND_MODE_NORMAL, zoom);
}
}
}

View File

@ -273,11 +273,11 @@ void Editor::editor_draw_cursor(int x, int y, bool refresh)
int new_mask_color;
Pen* pen = editor_get_current_pen();
// Set the opacity for the 'extra' layer used to show the cursor preview
m_sprite->setExtrasOpacity(tool_settings->getOpacity());
// Create the 'extra' image/layer
m_sprite->prepareExtra();
// Create the extra cel to show the pen preview
m_sprite->prepareExtraCel(x-pen->get_size()/2,
y-pen->get_size()/2,
pen->get_size(), pen->get_size(),
tool_settings->getOpacity());
// In 'indexed' images, if the current color is 0, we have to use
// a different mask color (different from 0) to draw the extra layer
@ -288,10 +288,10 @@ void Editor::editor_draw_cursor(int x, int y, bool refresh)
new_mask_color = 0;
}
Image* extras = m_sprite->getExtras();
if (extras->mask_color != new_mask_color)
image_clear(extras, extras->mask_color = new_mask_color);
image_putpen(extras, pen, x, y, pen_color, extras->mask_color);
Image* extraImage = m_sprite->getExtraCelImage();
if (extraImage->mask_color != new_mask_color)
image_clear(extraImage, extraImage->mask_color = new_mask_color);
image_putpen(extraImage, pen, pen->get_size()/2, pen->get_size()/2, pen_color, extraImage->mask_color);
if (refresh) {
editors_draw_sprite(m_sprite,
@ -405,10 +405,10 @@ void Editor::editor_clean_cursor(bool refresh)
m_state != EDITOR_STATE_DRAWING) {
Pen* pen = editor_get_current_pen();
m_sprite->prepareExtra();
image_putpen(m_sprite->getExtras(), pen, x, y,
m_sprite->getExtras()->mask_color,
m_sprite->getExtras()->mask_color);
m_sprite->prepareExtraCel(x-pen->get_size()/2,
y-pen->get_size()/2,
pen->get_size(), pen->get_size(),
0); // Opacity = 0
if (refresh) {
editors_draw_sprite(m_sprite,

View File

@ -523,8 +523,8 @@ void Editor::flashCurrentLayer()
int x, y;
const Image* src_image = m_sprite->getCurrentImage(&x, &y);
if (src_image) {
m_sprite->prepareExtra();
Image* flash_image = m_sprite->getExtras();
m_sprite->prepareExtraCel(0, 0, m_sprite->getWidth(), m_sprite->getHeight(), 255);
Image* flash_image = m_sprite->getExtraCelImage();
int u, v;
image_clear(flash_image, flash_image->mask_color);