Add new "Image Color" parameter in brush slots (fix #1259)

This commit is contained in:
David Capello 2016-09-20 10:14:41 -03:00
parent ae2acf62f7
commit 1ffbd4c343
7 changed files with 51 additions and 4 deletions

View File

@ -170,6 +170,7 @@
<option id="brush_angle" type="bool" default="true" />
<option id="fg_color" type="bool" default="false" />
<option id="bg_color" type="bool" default="false" />
<option id="image_color" type="bool" default="true" />
<option id="ink_type" type="bool" default="true" />
<option id="ink_opacity" type="bool" default="true" />
<option id="shade" type="bool" default="true" />

View File

@ -1,5 +1,5 @@
<!-- ASEPRITE -->
<!-- Copyright (C) 2015 by David Capello -->
<!-- Copyright (C) 2015-2016 by David Capello -->
<gui>
<vbox id="brush_slot_params">
<grid columns="2">
@ -15,6 +15,7 @@
<buttonset id="color_params" columns="2" multiple="true">
<item id="fg_color" text="Foreground" />
<item id="bg_color" text="Background" />
<item id="image_color" text="Image Color" hspan="2" />
</buttonset>
<label text="Ink:" />

View File

@ -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");
}
}

View File

@ -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),

View File

@ -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

View File

@ -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())

View File

@ -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);