ToolLoopImpl(Editor* editor, Context* context, tools::Tool* tool, tools::Ink* ink, Document* document, tools::ToolLoop::Button button, const app::Color& fgColor, const app::Color& bgColor) : ToolLoopBase(editor, tool, ink, document, button, fgColor, bgColor) , m_context(context) , m_canceled(false) , m_transaction(m_context, m_tool->getText().c_str(), ((getInk()->isSelection() || getInk()->isEyedropper() || getInk()->isScrollMovement() || getInk()->isSlice() || getInk()->isZoom()) ? DoesntModifyDocument: ModifyDocument)) , m_expandCelCanvas(editor->getSite(), m_docPref.tiled.mode(), m_transaction, ExpandCelCanvas::Flags( ExpandCelCanvas::NeedsSource | // If the tool is freehand-like, we can use the modified // region directly as undo information to save the modified // pixels (it's faster than creating a Dirty object). // See ExpandCelCanvas::commit() for details about this flag. (getController()->isFreehand() ? ExpandCelCanvas::UseModifiedRegionAsUndoInfo: ExpandCelCanvas::None))) { ASSERT(m_context->activeDocument() == m_editor->document()); // Settings switch (tool->getFill(m_button)) { case tools::FillNone: m_filled = false; break; case tools::FillAlways: m_filled = true; break; case tools::FillOptional: m_filled = m_toolPref.filled(); break; } m_previewFilled = m_toolPref.filledPreview(); m_sprayWidth = m_toolPref.spray.width(); m_spraySpeed = m_toolPref.spray.speed(); if (m_ink->isSelection()) m_useMask = false; else m_useMask = m_document->isMaskVisible(); // Start with an empty mask if the user is selecting with "default selection mode" if (getInk()->isSelection() && (!m_document->isMaskVisible() || (int(getModifiers()) & int(tools::ToolLoopModifiers::kReplaceSelection)))) { Mask emptyMask; m_transaction.execute(new cmd::SetMask(m_document, &emptyMask)); } m_celOrigin = m_expandCelCanvas.getCel()->position(); m_mask = m_document->mask(); m_maskOrigin = (!m_mask->isEmpty() ? gfx::Point(m_mask->bounds().x-m_celOrigin.x, m_mask->bounds().y-m_celOrigin.y): gfx::Point(0, 0)); }