diff --git a/data/pref.xml b/data/pref.xml
index b9c5e5e57..8ecedff30 100644
--- a/data/pref.xml
+++ b/data/pref.xml
@@ -28,6 +28,8 @@
+
+
diff --git a/data/strings/en.ini b/data/strings/en.ini
index d03409ae1..81bdb31a1 100644
--- a/data/strings/en.ini
+++ b/data/strings/en.ini
@@ -1177,8 +1177,10 @@ simple_crosshair = Simple Crosshair
crosshair_on_sprite = Crosshair on Sprite
brush_preview = Brush Preview:
brush_preview_none = None
-brush_preview_edges = Brush Edges
-brush_preview_full = Full Real-time Brush Preview
+brush_preview_edges = Edges Only
+brush_preview_full = Full Preview
+brush_preview_fullall = Full Preview with All Tools
+brush_preview_fullnedges = Full Preview and Edges
cursor_color_type = Crosshair && Brush Edges Color:
cursor_neg_bw = Negative Black and White
cursor_specific_color = Specific Color
diff --git a/data/widgets/options.xml b/data/widgets/options.xml
index 613d7d8af..d08969fc5 100644
--- a/data/widgets/options.xml
+++ b/data/widgets/options.xml
@@ -292,6 +292,8 @@
+
+
diff --git a/src/app/ui/editor/brush_preview.cpp b/src/app/ui/editor/brush_preview.cpp
index 51f493694..1fcc07981 100644
--- a/src/app/ui/editor/brush_preview.cpp
+++ b/src/app/ui/editor/brush_preview.cpp
@@ -149,7 +149,7 @@ void BrushPreview::show(const gfx::Point& screenPos)
(ink->isEffect()) ||
// or when the brush color is transparent and we are not in the background layer
(!ink->isShading() &&
- (layer && !layer->isBackground()) &&
+ (layer && layer->isTransparent()) &&
((sprite->pixelFormat() == IMAGE_INDEXED && brush_color == mask_index) ||
(sprite->pixelFormat() == IMAGE_RGB && rgba_geta(brush_color) == 0) ||
(sprite->pixelFormat() == IMAGE_GRAYSCALE && graya_geta(brush_color) == 0))))) {
@@ -160,6 +160,8 @@ void BrushPreview::show(const gfx::Point& screenPos)
}
bool showPreview = false;
+ bool showPreviewWithEdges = false;
+ bool cancelEdges = false;
auto brushPreview = pref.cursor.brushPreview();
if (!m_editor->docPref().show.brushPreview())
brushPreview = app::gen::BrushPreview::NONE;
@@ -172,7 +174,18 @@ void BrushPreview::show(const gfx::Point& screenPos)
m_type = BRUSH_BOUNDARIES;
break;
case app::gen::BrushPreview::FULL:
+ case app::gen::BrushPreview::FULLALL:
+ case app::gen::BrushPreview::FULLNEDGES:
showPreview = m_editor->getState()->requireBrushPreview();
+ switch (brushPreview) {
+ case app::gen::BrushPreview::FULLALL:
+ m_type = CROSSHAIR;
+ cancelEdges = true;
+ break;
+ case app::gen::BrushPreview::FULLNEDGES:
+ showPreviewWithEdges = true;
+ break;
+ }
break;
}
@@ -183,6 +196,8 @@ void BrushPreview::show(const gfx::Point& screenPos)
// layer) we don't show the brush preview temporally.
if (showPreview && m_editor->isExtraCelLocked()) {
showPreview = false;
+ showPreviewWithEdges = false;
+ cancelEdges = false;
m_type |= BRUSH_BOUNDARIES;
}
@@ -195,9 +210,12 @@ void BrushPreview::show(const gfx::Point& screenPos)
// For cursor type 'bounds' we have to generate cursor boundaries
if (m_type & BRUSH_BOUNDARIES) {
if (brush->type() != kImageBrushType)
- showPreview = false;
- generateBoundaries();
+ showPreview = showPreviewWithEdges;
+ if (cancelEdges)
+ m_type &= ~BRUSH_BOUNDARIES;
}
+ if (m_type & BRUSH_BOUNDARIES)
+ generateBoundaries();
// Draw pixel/brush preview
if (showPreview) {