Fix editor drawing code (issue 355, editor decorators weren't visible outside sprite bounds)

This commit is contained in:
David Capello 2014-03-03 00:09:14 -03:00
parent 1b86d613bf
commit 10ae3a9d28
2 changed files with 76 additions and 86 deletions

View File

@ -403,32 +403,6 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& rc, in
g->blit(tmp, 0, 0, dest_x, dest_y, width, height); g->blit(tmp, 0, 0, dest_x, dest_y, width, height);
} }
} }
// Document settings
IDocumentSettings* docSettings =
UIContext::instance()->getSettings()->getDocumentSettings(m_document);
// Draw the pixel grid
if (docSettings->getPixelGridVisible()) {
if (m_zoom > 1)
this->drawGrid(Rect(0, 0, 1, 1),
docSettings->getPixelGridColor());
}
// Draw the grid
if (docSettings->getGridVisible())
this->drawGrid(docSettings->getGridBounds(),
docSettings->getGridColor());
// Draw the mask
if (m_document->getBoundariesSegments())
this->drawMask();
// Post-render decorator.
if (m_decorator) {
EditorPostRenderImpl postRender(this);
m_decorator->postRenderDecorator(&postRender);
}
} }
void Editor::drawSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& rc) void Editor::drawSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& rc)
@ -484,12 +458,32 @@ void Editor::drawSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& rc)
SkinTheme* theme = static_cast<SkinTheme*>(this->getTheme()); SkinTheme* theme = static_cast<SkinTheme*>(this->getTheme());
g->fillRegion(theme->getColor(ThemeColor::EditorFace), outside); g->fillRegion(theme->getColor(ThemeColor::EditorFace), outside);
// Draw the pixel grid
if (docSettings->getPixelGridVisible()) {
if (m_zoom > 1)
drawGrid(g, enclosingRect, Rect(0, 0, 1, 1), docSettings->getPixelGridColor());
}
// Draw the grid
if (docSettings->getGridVisible())
drawGrid(g, enclosingRect, docSettings->getGridBounds(), docSettings->getGridColor());
// Draw the borders that enclose the sprite. // Draw the borders that enclose the sprite.
enclosingRect.enlarge(1); enclosingRect.enlarge(1);
g->drawRect(theme->getColor(ThemeColor::EditorSpriteBorder), enclosingRect); g->drawRect(theme->getColor(ThemeColor::EditorSpriteBorder), enclosingRect);
g->drawHLine( g->drawHLine(
theme->getColor(ThemeColor::EditorSpriteBottomBorder), theme->getColor(ThemeColor::EditorSpriteBottomBorder),
enclosingRect.x, enclosingRect.y+enclosingRect.h, enclosingRect.w); enclosingRect.x, enclosingRect.y+enclosingRect.h, enclosingRect.w);
// Draw the mask
if (m_document->getBoundariesSegments())
drawMask(g);
// Post-render decorator.
if (m_decorator) {
EditorPostRenderImpl postRender(this);
m_decorator->postRenderDecorator(&postRender);
}
} }
void Editor::drawSpriteUnclippedRect(const gfx::Rect& rc) void Editor::drawSpriteUnclippedRect(const gfx::Rect& rc)
@ -527,59 +521,55 @@ void Editor::drawSpriteClipped(const gfx::Region& updateRegion)
* regenerate boundaries, use the sprite_generate_mask_boundaries() * regenerate boundaries, use the sprite_generate_mask_boundaries()
* routine. * routine.
*/ */
void Editor::drawMask() void Editor::drawMask(Graphics* g)
{ {
if ((m_flags & kShowMaskFlag) == 0) if ((m_flags & kShowMaskFlag) == 0)
return; return;
View* view = View::getView(this);
Rect vp = view->getViewportBounds();
Point scroll = view->getViewScroll();
int x1, y1, x2, y2; int x1, y1, x2, y2;
int c, x, y; int x = m_offset_x;
int y = m_offset_y;
dotted_mode(m_offset_count);
x = vp.x - scroll.x + m_offset_x;
y = vp.y - scroll.y + m_offset_y;
int nseg = m_document->getBoundariesSegmentsCount(); int nseg = m_document->getBoundariesSegmentsCount();
const BoundSeg* seg = m_document->getBoundariesSegments(); const BoundSeg* seg = m_document->getBoundariesSegments();
for (c=0; c<nseg; ++c, ++seg) { dotted_mode(m_offset_count);
x1 = seg->x1<<m_zoom;
y1 = seg->y1<<m_zoom; for (int c=0; c<nseg; ++c, ++seg) {
x2 = seg->x2<<m_zoom; x1 = seg->x1 << m_zoom;
y2 = seg->y2<<m_zoom; y1 = seg->y1 << m_zoom;
x2 = seg->x2 << m_zoom;
y2 = seg->y2 << m_zoom;
#if 1 // Bounds inside mask #if 1 // Bounds inside mask
if (!seg->open) if (!seg->open)
#else // Bounds outside mask #else // Bounds outside mask
if (seg->open) if (seg->open)
#endif #endif
{ {
if (x1 == x2) { if (x1 == x2) {
x1--; x1--;
x2--; x2--;
y2--; y2--;
}
else {
y1--;
y2--;
x2--;
}
} }
else else {
{ y1--;
if (x1 == x2) { y2--;
y2--; x2--;
}
else {
x2--;
}
} }
}
else {
if (x1 == x2) {
y2--;
}
else {
x2--;
}
}
line(ji_screen, x+x1, y+y1, x+x2, y+y2, 0); // The color doesn't matter, we are using dotted_mode()
// TODO send dotted_mode() to ui::Graphics domain.
g->drawLine(0, gfx::Point(x+x1, y+y1), gfx::Point(x+x2, y+y2));
} }
dotted_mode(-1); dotted_mode(-1);
@ -598,32 +588,30 @@ void Editor::drawMaskSafe()
Region region; Region region;
getDrawableRegion(region, kCutTopWindows); getDrawableRegion(region, kCutTopWindows);
acquire_bitmap(ji_screen);
if (thick) if (thick)
editor_clean_cursor(); editor_clean_cursor();
else else
jmouse_hide(); jmouse_hide();
gfx::Point offset = -getBounds().getOrigin();
GraphicsPtr g = getGraphics(getClientBounds());
for (Region::const_iterator it=region.begin(), end=region.end(); for (Region::const_iterator it=region.begin(), end=region.end();
it != end; ++it) { it != end; ++it) {
const Rect& rc = *it; IntersectClip clip(g, gfx::Rect(*it).offset(offset));
set_clip_rect(ji_screen, rc.x, rc.y, rc.x2()-1, rc.y2()-1); if (clip)
drawMask(); drawMask(g);
} }
set_clip_rect(ji_screen, 0, 0, JI_SCREEN_W-1, JI_SCREEN_H-1);
// Draw the cursor // Draw the cursor
if (thick) if (thick)
editor_draw_cursor(m_cursor_screen_x, m_cursor_screen_y); editor_draw_cursor(m_cursor_screen_x, m_cursor_screen_y);
else else
jmouse_show(); jmouse_show();
release_bitmap(ji_screen);
} }
} }
void Editor::drawGrid(const Rect& gridBounds, const app::Color& color) void Editor::drawGrid(Graphics* g, const gfx::Rect& spriteBounds, const Rect& gridBounds, const app::Color& color)
{ {
if ((m_flags & kShowGridFlag) == 0) if ((m_flags & kShowGridFlag) == 0)
return; return;
@ -646,28 +634,31 @@ void Editor::drawGrid(const Rect& gridBounds, const app::Color& color)
// Convert the "grid" rectangle to screen coordinates // Convert the "grid" rectangle to screen coordinates
editorToScreen(grid, &grid); editorToScreen(grid, &grid);
// Get the grid's color // Adjust for client area
int grid_color = color_utils::color_for_allegro(color, bitmap_color_depth(ji_screen)); gfx::Rect bounds = getBounds();
grid.offset(-bounds.getOrigin());
// Get the position of the sprite in the screen. while (grid.x-grid.w >= spriteBounds.x) grid.x -= grid.w;
Rect spriteRect; while (grid.y-grid.h >= spriteBounds.y) grid.y -= grid.h;
editorToScreen(Rect(0, 0, m_sprite->getWidth(), m_sprite->getHeight()), &spriteRect);
// Get the grid's color
ui::Color grid_color = color_utils::color_for_ui(color);
// Draw horizontal lines // Draw horizontal lines
int x1 = spriteRect.x; int x1 = spriteBounds.x;
int y1 = grid.y; int y1 = grid.y;
int x2 = spriteRect.x+spriteRect.w; int x2 = spriteBounds.x + spriteBounds.w;
int y2 = spriteRect.y+spriteRect.h; int y2 = spriteBounds.y + spriteBounds.h;
for (int c=y1; c<=y2; c+=grid.h) for (int c=y1; c<=y2; c+=grid.h)
hline(ji_screen, x1, c, x2, grid_color); g->drawHLine(grid_color, x1, c, spriteBounds.w);
// Draw vertical lines // Draw vertical lines
x1 = grid.x; x1 = grid.x;
y1 = spriteRect.y; y1 = spriteBounds.y;
for (int c=x1; c<=x2; c+=grid.w) for (int c=x1; c<=x2; c+=grid.w)
vline(ji_screen, c, y1, y2, grid_color); g->drawVLine(grid_color, c, y1, spriteBounds.h);
} }
void Editor::flashCurrentLayer() void Editor::flashCurrentLayer()
@ -1057,7 +1048,7 @@ void Editor::onPaint(ui::PaintEvent& ev)
// Draw the mask boundaries // Draw the mask boundaries
if (m_document->getBoundariesSegments()) { if (m_document->getBoundariesSegments()) {
drawMask(); drawMask(g);
m_mask_timer.start(); m_mask_timer.start();
} }
else { else {

View File

@ -117,9 +117,6 @@ namespace app {
// Draws the sprite taking care of the whole clipping region. // Draws the sprite taking care of the whole clipping region.
void drawSpriteClipped(const gfx::Region& updateRegion); void drawSpriteClipped(const gfx::Region& updateRegion);
void drawMask();
void drawMaskSafe();
void flashCurrentLayer(); void flashCurrentLayer();
void screenToEditor(int xin, int yin, int* xout, int* yout); void screenToEditor(int xin, int yin, int* xout, int* yout);
@ -195,7 +192,9 @@ namespace app {
void editor_clean_cursor(bool refresh = true); void editor_clean_cursor(bool refresh = true);
bool editor_cursor_is_subpixel(); bool editor_cursor_is_subpixel();
void drawGrid(const gfx::Rect& gridBounds, const app::Color& color); void drawMaskSafe();
void drawMask(ui::Graphics* g);
void drawGrid(ui::Graphics* g, const gfx::Rect& spriteBounds, const gfx::Rect& gridBounds, const app::Color& color);
void editor_setcursor(); void editor_setcursor();