aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--cocoa/PlatCocoa.h2
-rw-r--r--cocoa/PlatCocoa.mm21
-rwxr-xr-xgtk/PlatGTK.cxx27
-rw-r--r--qt/ScintillaEditBase/PlatQt.cpp5
-rw-r--r--qt/ScintillaEditBase/PlatQt.h1
-rw-r--r--src/Platform.h1
-rw-r--r--win32/PlatWin.cxx58
7 files changed, 92 insertions, 23 deletions
diff --git a/cocoa/PlatCocoa.h b/cocoa/PlatCocoa.h
index b918e5ed0..98a9b11ed 100644
--- a/cocoa/PlatCocoa.h
+++ b/cocoa/PlatCocoa.h
@@ -60,6 +60,7 @@ private:
/** Set the CGContext's fill colour to the specified desired colour. */
void FillColour(const ColourDesired &back);
+ void FillColour(ColourAlpha fill);
// 24-bit RGB+A bitmap data constants
@@ -95,6 +96,7 @@ public:
void Polygon(Scintilla::Point *pts, size_t npts, ColourDesired fore, ColourDesired back) override;
void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void FillRectangle(PRectangle rc, ColourDesired back) override;
+ void FillRectangle(PRectangle rc, Fill fill) override;
void FillRectangle(PRectangle rc, Surface &surfacePattern) override;
void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
diff --git a/cocoa/PlatCocoa.mm b/cocoa/PlatCocoa.mm
index f84a335aa..a4f01c5c6 100644
--- a/cocoa/PlatCocoa.mm
+++ b/cocoa/PlatCocoa.mm
@@ -479,6 +479,17 @@ void SurfaceImpl::PenColour(ColourDesired fore) {
//--------------------------------------------------------------------------------------------------
+void SurfaceImpl::FillColour(ColourAlpha fill) {
+ // Set the Fill color to match
+ CGContextSetRGBFillColor(gc,
+ fill.GetRedComponent(),
+ fill.GetGreenComponent(),
+ fill.GetBlueComponent(),
+ fill.GetAlphaComponent());
+}
+
+//--------------------------------------------------------------------------------------------------
+
void SurfaceImpl::FillColour(const ColourDesired &back) {
if (gc) {
ColourDesired colour(back.AsInteger());
@@ -662,6 +673,16 @@ void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back) {
//--------------------------------------------------------------------------------------------------
+void SurfaceImpl::FillRectangle(PRectangle rc, Fill fill) {
+ if (gc) {
+ FillColour(fill.colour);
+ CGRect rect = PRectangleToCGRect(rc);
+ CGContextFillRect(gc, rect);
+ }
+}
+
+//--------------------------------------------------------------------------------------------------
+
static void drawImageRefCallback(void *info, CGContextRef gc) {
CGImageRef pattern = static_cast<CGImageRef>(info);
CGContextDrawImage(gc, CGRectMake(0, 0, CGImageGetWidth(pattern), CGImageGetHeight(pattern)), pattern);
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx
index b9c049f1d..3debf8fc8 100755
--- a/gtk/PlatGTK.cxx
+++ b/gtk/PlatGTK.cxx
@@ -155,6 +155,7 @@ public:
int Supports(int feature) noexcept override;
bool Initialised() override;
void PenColour(ColourDesired fore) override;
+ void PenColourAlpha(ColourAlpha fore);
int LogPixelsY() override;
int PixelDivisions() override;
int DeviceHeightFont(int points) override;
@@ -163,6 +164,7 @@ public:
void Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back) override;
void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void FillRectangle(PRectangle rc, ColourDesired back) override;
+ void FillRectangle(PRectangle rc, Fill fill) override;
void FillRectangle(PRectangle rc, Surface &surfacePattern) override;
void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
@@ -399,11 +401,20 @@ int SurfaceImpl::Supports(int feature) noexcept {
void SurfaceImpl::PenColour(ColourDesired fore) {
if (context) {
- const ColourDesired cdFore(fore.AsInteger());
cairo_set_source_rgb(context,
- cdFore.GetRed() / 255.0,
- cdFore.GetGreen() / 255.0,
- cdFore.GetBlue() / 255.0);
+ fore.GetRed() / 255.0,
+ fore.GetGreen() / 255.0,
+ fore.GetBlue() / 255.0);
+ }
+}
+
+void SurfaceImpl::PenColourAlpha(ColourAlpha fore) {
+ if (context) {
+ cairo_set_source_rgba(context,
+ fore.GetRed() / 255.0,
+ fore.GetGreen() / 255.0,
+ fore.GetBlue() / 255.0,
+ fore.GetAlpha() / 255.0);
}
}
@@ -503,6 +514,14 @@ void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back) {
}
}
+void SurfaceImpl::FillRectangle(PRectangle rc, Fill fill) {
+ PenColourAlpha(fill.colour);
+ if (context && (rc.left < maxCoordinate)) { // Protect against out of range
+ CairoRectangle(rc);
+ cairo_fill(context);
+ }
+}
+
void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) {
SurfaceImpl &surfi = dynamic_cast<SurfaceImpl &>(surfacePattern);
if (context && surfi.psurf) {
diff --git a/qt/ScintillaEditBase/PlatQt.cpp b/qt/ScintillaEditBase/PlatQt.cpp
index a1adf0a0d..37fc409f7 100644
--- a/qt/ScintillaEditBase/PlatQt.cpp
+++ b/qt/ScintillaEditBase/PlatQt.cpp
@@ -319,6 +319,11 @@ void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back)
GetPainter()->fillRect(QRectFFromPRect(rc), QColorFromCA(back));
}
+void SurfaceImpl::FillRectangle(PRectangle rc, Fill fill)
+{
+ GetPainter()->fillRect(QRectFFromPRect(rc), QColorFromColourAlpha(fill.colour));
+}
+
void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern)
{
// Tile pattern over rectangle
diff --git a/qt/ScintillaEditBase/PlatQt.h b/qt/ScintillaEditBase/PlatQt.h
index a743a4be5..173bd53d5 100644
--- a/qt/ScintillaEditBase/PlatQt.h
+++ b/qt/ScintillaEditBase/PlatQt.h
@@ -103,6 +103,7 @@ public:
void RectangleDraw(PRectangle rc, ColourDesired fore,
ColourDesired back) override;
void FillRectangle(PRectangle rc, ColourDesired back) override;
+ void FillRectangle(PRectangle rc, Fill fill) override;
void FillRectangle(PRectangle rc, Surface &surfacePattern) override;
void RoundedRectangle(PRectangle rc, ColourDesired fore,
ColourDesired back) override;
diff --git a/src/Platform.h b/src/Platform.h
index 45c04abdc..abad8abfa 100644
--- a/src/Platform.h
+++ b/src/Platform.h
@@ -191,6 +191,7 @@ public:
virtual void Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back)=0;
virtual void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back)=0;
virtual void FillRectangle(PRectangle rc, ColourDesired back)=0;
+ virtual void FillRectangle(PRectangle rc, Fill fill)=0;
virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0;
virtual void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back)=0;
virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index 3f93a96fd..3fae8e90f 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -489,6 +489,7 @@ public:
void Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back) override;
void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void FillRectangle(PRectangle rc, ColourDesired back) override;
+ void FillRectangle(PRectangle rc, Fill fill) override;
void FillRectangle(PRectangle rc, Surface &surfacePattern) override;
void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
@@ -688,6 +689,20 @@ void SurfaceGDI::FillRectangle(PRectangle rc, ColourDesired back) {
::ExtTextOut(hdc, rcw.left, rcw.top, ETO_OPAQUE, &rcw, TEXT(""), 0, nullptr);
}
+void SurfaceGDI::FillRectangle(PRectangle rc, Fill fill) {
+ if (fill.colour.IsOpaque()) {
+ // Using ExtTextOut rather than a FillRect ensures that no dithering occurs.
+ // There is no need to allocate a brush either.
+ const RECT rcw = RectFromPRectangle(rc);
+ ::SetBkColor(hdc, fill.colour.GetColour().AsInteger());
+ ::ExtTextOut(hdc, rcw.left, rcw.top, ETO_OPAQUE, &rcw, TEXT(""), 0, nullptr);
+ } else {
+ const ColourDesired fillOpaque = fill.colour.GetColour();
+ const int alpha = fill.colour.GetAlpha();
+ AlphaRectangle(rc, 0, fillOpaque, alpha, fillOpaque, alpha, 0);
+ }
+}
+
void SurfaceGDI::FillRectangle(PRectangle rc, Surface &surfacePattern) {
HBRUSH br;
if (SurfaceGDI *psgdi = dynamic_cast<SurfaceGDI *>(&surfacePattern); psgdi && psgdi->bitmap) {
@@ -1218,6 +1233,15 @@ const int SupportsD2D[] = {
SC_SUPPORTS_LINE_DRAWS_FINAL,
};
+constexpr D2D_COLOR_F ColorFromColourAlpha(ColourAlpha colour) noexcept {
+ return D2D_COLOR_F{
+ colour.GetRedComponent(),
+ colour.GetGreenComponent(),
+ colour.GetBlueComponent(),
+ colour.GetAlphaComponent()
+ };
+}
+
}
class BlobInline;
@@ -1267,6 +1291,7 @@ public:
void PenColour(ColourDesired fore) override;
void D2DPenColour(ColourDesired fore, int alpha=255);
+ void D2DPenColourAlpha(ColourAlpha fore) noexcept;
int LogPixelsY() override;
int PixelDivisions() override;
int DeviceHeightFont(int points) override;
@@ -1275,6 +1300,7 @@ public:
void Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back) override;
void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void FillRectangle(PRectangle rc, ColourDesired back) override;
+ void FillRectangle(PRectangle rc, Fill fill) override;
void FillRectangle(PRectangle rc, Surface &surfacePattern) override;
void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
@@ -1426,13 +1452,12 @@ void SurfaceD2D::PenColour(ColourDesired fore) {
}
void SurfaceD2D::D2DPenColour(ColourDesired fore, int alpha) {
+ D2DPenColourAlpha(ColourAlpha(fore, alpha));
+}
+
+void SurfaceD2D::D2DPenColourAlpha(ColourAlpha fore) noexcept {
if (pRenderTarget) {
- const D2D_COLOR_F col {
- fore.GetRedComponent(),
- fore.GetGreenComponent(),
- fore.GetBlueComponent(),
- alpha / 255.0f
- };
+ const D2D_COLOR_F col = ColorFromColourAlpha(fore);
if (pBrush) {
pBrush->SetColor(col);
} else {
@@ -1573,6 +1598,14 @@ void SurfaceD2D::FillRectangle(PRectangle rc, ColourDesired back) {
}
}
+void SurfaceD2D::FillRectangle(PRectangle rc, Fill fill) {
+ if (pRenderTarget) {
+ D2DPenColourAlpha(fill.colour);
+ const D2D1_RECT_F rectangle = RectangleFromPRectangle(rc);
+ pRenderTarget->FillRectangle(&rectangle, pBrush);
+ }
+}
+
void SurfaceD2D::FillRectangle(PRectangle rc, Surface &surfacePattern) {
SurfaceD2D *psurfOther = dynamic_cast<SurfaceD2D *>(&surfacePattern);
PLATFORM_ASSERT(psurfOther);
@@ -1640,19 +1673,6 @@ void SurfaceD2D::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fil
}
}
-namespace {
-
-constexpr D2D_COLOR_F ColorFromColourAlpha(ColourAlpha colour) noexcept {
- return D2D_COLOR_F{
- colour.GetRedComponent(),
- colour.GetGreenComponent(),
- colour.GetBlueComponent(),
- colour.GetAlphaComponent()
- };
-}
-
-}
-
void SurfaceD2D::GradientRectangle(PRectangle rc, const std::vector<ColourStop> &stops, GradientOptions options) {
if (pRenderTarget) {
D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES lgbp {