diff --git a/data/pref.xml b/data/pref.xml
index 66488f459..fad78ac83 100644
--- a/data/pref.xml
+++ b/data/pref.xml
@@ -170,6 +170,7 @@
+
diff --git a/data/widgets/brush_slot_params.xml b/data/widgets/brush_slot_params.xml
index 6ad243acd..8f23acd5d 100644
--- a/data/widgets/brush_slot_params.xml
+++ b/data/widgets/brush_slot_params.xml
@@ -1,5 +1,5 @@
-
+
@@ -15,6 +15,7 @@
+
diff --git a/src/app/app_brushes.cpp b/src/app/app_brushes.cpp
index c099fb5bc..ce0e6b057 100644
--- a/src/app/app_brushes.cpp
+++ b/src/app/app_brushes.cpp
@@ -382,6 +382,11 @@ void AppBrushes::load(const std::string& filename)
flags |= int(BrushSlot::Flags::PixelPerfect);
}
+ // Image color (enabled by default for backward compatibility)
+ if (!brushElem->Attribute("imagecolor") ||
+ bool_attr_is_true(brushElem, "imagecolor"))
+ flags |= int(BrushSlot::Flags::ImageColor);
+
if (flags != 0)
flags |= int(BrushSlot::Flags::Locked);
@@ -441,6 +446,11 @@ void AppBrushes::save(const std::string& filename) const
save_xml_image(&maskElem, slot.brush()->maskBitmap());
brushElem.InsertEndChild(maskElem);
}
+
+ // Image color
+ brushElem.SetAttribute(
+ "imagecolor",
+ (flags & int(BrushSlot::Flags::ImageColor)) ? "true": "false");
}
}
diff --git a/src/app/brush_slot.h b/src/app/brush_slot.h
index e511a2bce..bfd3b3986 100644
--- a/src/app/brush_slot.h
+++ b/src/app/brush_slot.h
@@ -1,5 +1,5 @@
// Aseprite
-// Copyright (C) 2001-2015 David Capello
+// Copyright (C) 2001-2016 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@@ -28,7 +28,8 @@ public:
InkType = 0x0040,
InkOpacity = 0x0080,
Shade = 0x0100,
- PixelPerfect = 0x0200
+ PixelPerfect = 0x0200,
+ ImageColor = 0x0400,
};
BrushSlot(Flags flags = Flags(0),
diff --git a/src/app/commands/cmd_new_brush.cpp b/src/app/commands/cmd_new_brush.cpp
index 4f173d74d..13260b305 100644
--- a/src/app/commands/cmd_new_brush.cpp
+++ b/src/app/commands/cmd_new_brush.cpp
@@ -150,8 +150,17 @@ void NewBrushCommand::createBrush(const Site& site, const Mask* mask)
brush->setPatternOrigin(mask->bounds().origin());
ContextBar* ctxBar = App::instance()->contextBar();
+ int flags = int(BrushSlot::Flags::BrushType);
+ {
+ // TODO merge this code with ContextBar::createBrushSlotFromPreferences()?
+ auto& pref = Preferences::instance();
+ auto& saveBrush = pref.saveBrush;
+ if (saveBrush.imageColor())
+ flags |= int(BrushSlot::Flags::ImageColor);
+ }
+
int slot = App::instance()->brushes().addBrushSlot(
- BrushSlot(BrushSlot::Flags::BrushType, brush));
+ BrushSlot(BrushSlot::Flags(flags), brush));
ctxBar->setActiveBrush(brush);
// Get the shortcut for this brush and show it to the user
diff --git a/src/app/ui/brush_popup.cpp b/src/app/ui/brush_popup.cpp
index f6da99288..afffc0d94 100644
--- a/src/app/ui/brush_popup.cpp
+++ b/src/app/ui/brush_popup.cpp
@@ -186,6 +186,7 @@ private:
params.brushAngle()->setSelected(brush.hasFlag(BrushSlot::Flags::BrushAngle));
params.fgColor()->setSelected(brush.hasFlag(BrushSlot::Flags::FgColor));
params.bgColor()->setSelected(brush.hasFlag(BrushSlot::Flags::BgColor));
+ params.imageColor()->setSelected(brush.hasFlag(BrushSlot::Flags::ImageColor));
params.inkType()->setSelected(brush.hasFlag(BrushSlot::Flags::InkType));
params.inkOpacity()->setSelected(brush.hasFlag(BrushSlot::Flags::InkOpacity));
params.shade()->setSelected(brush.hasFlag(BrushSlot::Flags::Shade));
@@ -204,6 +205,7 @@ private:
if (params.brushAngle()->isSelected()) flags |= int(BrushSlot::Flags::BrushAngle);
if (params.fgColor()->isSelected()) flags |= int(BrushSlot::Flags::FgColor);
if (params.bgColor()->isSelected()) flags |= int(BrushSlot::Flags::BgColor);
+ if (params.imageColor()->isSelected()) flags |= int(BrushSlot::Flags::ImageColor);
if (params.inkType()->isSelected()) flags |= int(BrushSlot::Flags::InkType);
if (params.inkOpacity()->isSelected()) flags |= int(BrushSlot::Flags::InkOpacity);
if (params.shade()->isSelected()) flags |= int(BrushSlot::Flags::Shade);
@@ -291,6 +293,7 @@ private:
params.brushAngle()->setSelected(saveBrush.brushAngle());
params.fgColor()->setSelected(saveBrush.fgColor());
params.bgColor()->setSelected(saveBrush.bgColor());
+ params.imageColor()->setSelected(saveBrush.imageColor());
params.inkType()->setSelected(saveBrush.inkType());
params.inkOpacity()->setSelected(saveBrush.inkOpacity());
params.shade()->setSelected(saveBrush.shade());
@@ -310,6 +313,8 @@ private:
saveBrush.fgColor(params.fgColor()->isSelected());
if (saveBrush.bgColor() != params.bgColor()->isSelected())
saveBrush.bgColor(params.bgColor()->isSelected());
+ if (saveBrush.imageColor() != params.imageColor()->isSelected())
+ saveBrush.imageColor(params.imageColor()->isSelected());
if (saveBrush.inkType() != params.inkType()->isSelected())
saveBrush.inkType(params.inkType()->isSelected());
if (saveBrush.inkOpacity() != params.inkOpacity()->isSelected())
diff --git a/src/app/ui/context_bar.cpp b/src/app/ui/context_bar.cpp
index 2e076af6d..391c979b4 100644
--- a/src/app/ui/context_bar.cpp
+++ b/src/app/ui/context_bar.cpp
@@ -1795,6 +1795,25 @@ void ContextBar::setActiveBrushBySlot(tools::Tool* tool, int slot)
if (brush.hasFlag(BrushSlot::Flags::BgColor))
pref.colorBar.bgColor(brush.bgColor());
+ // If the image/stamp brush doesn't have the "ImageColor" flag, it
+ // means that we have to change the image color to the current
+ // "foreground color".
+ if (brush.brush() &&
+ brush.brush()->type() == doc::kImageBrushType &&
+ !brush.hasFlag(BrushSlot::Flags::ImageColor)) {
+ auto pixelFormat = brush.brush()->image()->pixelFormat();
+
+ brush.brush()->setImageColor(
+ Brush::ImageColor::MainColor,
+ color_utils::color_for_image(pref.colorBar.fgColor(),
+ pixelFormat));
+
+ brush.brush()->setImageColor(
+ Brush::ImageColor::BackgroundColor,
+ color_utils::color_for_image(pref.colorBar.bgColor(),
+ pixelFormat));
+ }
+
if (brush.hasFlag(BrushSlot::Flags::InkType))
setInkType(brush.inkType());
@@ -1884,6 +1903,7 @@ BrushSlot ContextBar::createBrushSlotFromPreferences()
if (saveBrush.brushAngle()) flags |= int(BrushSlot::Flags::BrushAngle);
if (saveBrush.fgColor()) flags |= int(BrushSlot::Flags::FgColor);
if (saveBrush.bgColor()) flags |= int(BrushSlot::Flags::BgColor);
+ if (saveBrush.imageColor()) flags |= int(BrushSlot::Flags::ImageColor);
if (saveBrush.inkType()) flags |= int(BrushSlot::Flags::InkType);
if (saveBrush.inkOpacity()) flags |= int(BrushSlot::Flags::InkOpacity);
if (saveBrush.shade()) flags |= int(BrushSlot::Flags::Shade);