void ExpandCelCanvas::validateSourceCanvas(const gfx::Region& rgn) { getSourceCanvas(); gfx::Region rgnToValidate(rgn); rgnToValidate.offset(-m_bounds.getOrigin()); rgnToValidate.createSubtraction(rgnToValidate, m_validSrcRegion); rgnToValidate.createIntersection(rgnToValidate, gfx::Region(m_srcImage->bounds())); if (m_celImage) { gfx::Region rgnToClear; rgnToClear.createSubtraction(rgnToValidate, gfx::Region(m_celImage->bounds() .offset(m_origCelPos) .offset(-m_bounds.getOrigin()))); for (const auto& rc : rgnToClear) fill_rect(m_srcImage, rc, m_srcImage->maskColor()); for (const auto& rc : rgnToValidate) m_srcImage->copy(m_celImage, rc.x, rc.y, rc.x+m_bounds.x-m_origCelPos.x, rc.y+m_bounds.y-m_origCelPos.y, rc.w, rc.h); } else { for (const auto& rc : rgnToValidate) fill_rect(m_srcImage, rc, m_srcImage->maskColor()); } m_validSrcRegion.createUnion(m_validSrcRegion, rgnToValidate); }
void ExpandCelCanvas::validateDestCanvas(const gfx::Region& rgn) { Image* src; int src_x, src_y; if ((m_flags & NeedsSource) == NeedsSource) { validateSourceCanvas(rgn); src = m_srcImage.get(); src_x = m_bounds.x; src_y = m_bounds.y; } else { src = m_celImage.get(); src_x = m_origCelPos.x; src_y = m_origCelPos.y; } getDestCanvas(); gfx::Region rgnToValidate(rgn); rgnToValidate.offset(-m_bounds.origin()); rgnToValidate.createSubtraction(rgnToValidate, m_validDstRegion); rgnToValidate.createIntersection(rgnToValidate, gfx::Region(m_dstImage->bounds())); if (src) { gfx::Region rgnToClear; rgnToClear.createSubtraction(rgnToValidate, gfx::Region(src->bounds() .offset(src_x, src_y) .offset(-m_bounds.origin()))); for (const auto& rc : rgnToClear) fill_rect(m_dstImage.get(), rc, m_dstImage->maskColor()); for (const auto& rc : rgnToValidate) m_dstImage->copy(src, gfx::Clip(rc.x, rc.y, rc.x+m_bounds.x-src_x, rc.y+m_bounds.y-src_y, rc.w, rc.h)); } else { for (const auto& rc : rgnToValidate) fill_rect(m_dstImage.get(), rc, m_dstImage->maskColor()); } m_validDstRegion.createUnion(m_validDstRegion, rgnToValidate); }