diff --git a/.gitattributes b/.gitattributes
index 477f6caf3d..512de7a244 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3072,6 +3072,7 @@ components/synedit/test/testmarkuphighall.pas svneol=native#text/pascal
components/synedit/test/testmarkupifdef.pas svneol=native#text/pascal
components/synedit/test/testmarkupwordgroup.pas svneol=native#text/pascal
components/synedit/test/testnavigation.pas svneol=native#text/pascal
+components/synedit/test/testpaintcolormerging.pas svneol=native#text/pascal
components/synedit/test/testsearch.pas svneol=native#text/pascal
components/synedit/test/testsynbeautifier.pas svneol=native#text/pascal
components/synedit/test/testsyncroedit.pas svneol=native#text/pascal
diff --git a/components/synedit/syneditmiscclasses.pp b/components/synedit/syneditmiscclasses.pp
index 4894ae3780..f9b2952057 100644
--- a/components/synedit/syneditmiscclasses.pp
+++ b/components/synedit/syneditmiscclasses.pp
@@ -279,7 +279,8 @@ type
procedure MaybeInitFrameSides;
procedure MergeToInfo(var AnInfo: TSynSelectedColorMergeInfo;
AColor: TColor; APriority, AnAlpha: Integer);
- function CalculateInfo(var AnInfo: TSynSelectedColorMergeInfo; ANoneColor: TColor): TColor;
+ function CalculateInfo(var AnInfo: TSynSelectedColorMergeInfo;
+ ANoneColor: TColor; IsFrame: Boolean = False): TColor;
property FrameSidePriority[Side: TLazSynBorderSide]: integer read GetFrameSidePriority;
property FrameSideOrigin[Side: TLazSynBorderSide]: TSynFrameEdges read GetFrameSideOrigin;
public
@@ -829,7 +830,7 @@ begin
end;
function TSynSelectedColorMergeResult.CalculateInfo(var AnInfo: TSynSelectedColorMergeInfo;
- ANoneColor: TColor): TColor;
+ ANoneColor: TColor; IsFrame: Boolean): TColor;
var
i, j, c, p: Integer;
tmp: TSynSelectedColorAlphaEntry;
@@ -871,10 +872,12 @@ begin
// The highlighter may have merged, before defaults where set in
// TLazSynPaintTokenBreaker.GetNextHighlighterTokenFromView / InitSynAttr
- if Result = clNone then
+ if (Result = clNone) and (not IsFrame) then
Result := ANoneColor;
if (c >= 0) and (AnInfo.AlphaStack[0].Priority >= p) then begin
+ if (Result = clNone) then
+ Result := ANoneColor;
Result := ColorToRGB(Result); // no system color.
C1 := Red(Result);
C2 := Green(Result);
@@ -939,10 +942,10 @@ begin
Background := CalculateInfo(FMergeInfos[sscBack], Background);
Foreground := CalculateInfo(FMergeInfos[sscFore], Foreground);
// if the frame is clNone, and alpha is aplied, use the background as base
- FFrameSideColors[bsLeft] := CalculateInfo(FMergeInfos[sscFrameLeft], Background);
- FFrameSideColors[bsRight] := CalculateInfo(FMergeInfos[sscFrameRight], Background);
- FFrameSideColors[bsTop] := CalculateInfo(FMergeInfos[sscFrameTop], Background);
- FFrameSideColors[bsBottom] := CalculateInfo(FMergeInfos[sscFrameBottom], Background);
+ FFrameSideColors[bsLeft] := CalculateInfo(FMergeInfos[sscFrameLeft], Background, True);
+ FFrameSideColors[bsRight] := CalculateInfo(FMergeInfos[sscFrameRight], Background, True);
+ FFrameSideColors[bsTop] := CalculateInfo(FMergeInfos[sscFrameTop], Background, True);
+ FFrameSideColors[bsBottom] := CalculateInfo(FMergeInfos[sscFrameBottom], Background, True);
EndUpdate;
FMergeInfoInitialized := False;
end;
diff --git a/components/synedit/test/SynTest.lpi b/components/synedit/test/SynTest.lpi
index a305f4a937..2e3892bf51 100644
--- a/components/synedit/test/SynTest.lpi
+++ b/components/synedit/test/SynTest.lpi
@@ -45,7 +45,7 @@
-
+
@@ -146,6 +146,11 @@
+
+
+
+
+
@@ -166,9 +171,6 @@
-
-
-
diff --git a/components/synedit/test/SynTest.lpr b/components/synedit/test/SynTest.lpr
index 2d51b93622..8a89dbd713 100644
--- a/components/synedit/test/SynTest.lpr
+++ b/components/synedit/test/SynTest.lpr
@@ -8,7 +8,7 @@ uses
TestSearch, TestSynBeautifier, TestTrimSpace, TestSyncroEdit, TestSynTextArea,
TestHighlightPas, TestHighlightXml, TestHighlightMulti,
TestMarkupwordGroup, TestMarkupHighAll, TestFoldedView, TestSynSharedEdits,
- TestHighlighterLfm, TestHighlightFoldBase, TestMarkupIfDef;
+ TestHighlighterLfm, TestHighlightFoldBase, TestMarkupIfDef, testPaintColorMerging;
{$IFDEF WINDOWS}{ $R SynTest.rc}{$ENDIF}
diff --git a/components/synedit/test/testpaintcolormerging.pas b/components/synedit/test/testpaintcolormerging.pas
new file mode 100644
index 0000000000..9b13d97296
--- /dev/null
+++ b/components/synedit/test/testpaintcolormerging.pas
@@ -0,0 +1,130 @@
+unit TestPaintColorMerging;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ testregistry, TestBase, SynEditHighlighter, SynEditMiscClasses, SynEditTypes, Graphics,
+ sysutils;
+
+type
+
+ { TTestPaintColorMerging }
+
+ TTestPaintColorMerging = class(TTestBase)
+ published
+ procedure MergeAttrib;
+ end;
+
+implementation
+
+{ TTestPaintColorMerging }
+
+procedure TTestPaintColorMerging.MergeAttrib;
+
+ procedure SetAttrib(AnAttrib: TSynHighlighterAttributes;
+ AFore, ABack, AFrame: TColor;
+ AStyle: TFontStyles = []; AStyleMask: TFontStyles = [];
+ AFrameSides: TSynFrameEdges = sfeAround; AFrameStyle: TSynLineStyle = slsSolid;
+ AStartX: Integer = -1; AEndX: Integer = -1);
+ begin
+ AnAttrib.Foreground := AFore;
+ AnAttrib.Background := ABack;
+ AnAttrib.FrameColor := AFrame;
+ AnAttrib.Style := AStyle;
+ AnAttrib.StyleMask := AStyleMask;
+ AnAttrib.FrameEdges := AFrameSides;
+ AnAttrib.FrameStyle := AFrameStyle;
+ if AnAttrib is TSynSelectedColor then begin
+ TSynSelectedColor(AnAttrib).SetFrameBoundsPhys(AStartX, AEndX);
+ end;
+ end;
+
+ procedure CheckAttrib(AName: String; AnAttrib: TSynSelectedColorMergeResult;
+ AFore, ABack, AFrameL, AFrameR, AFrameT, AFrameB: TColor;
+ AStyle: TFontStyles = []);
+ begin
+ AssertEquals(AName + ' Fore', AFore, AnAttrib.Foreground);
+ AssertEquals(AName + ' Back', ABack, AnAttrib.Background);
+ AssertEquals(AName + ' FrameL', AFrameL, AnAttrib.FrameSideColors[bsLeft]);
+ AssertEquals(AName + ' FrameR', AFrameR, AnAttrib.FrameSideColors[bsRight]);
+ AssertEquals(AName + ' FrameT', AFrameT, AnAttrib.FrameSideColors[bsTop]);
+ AssertEquals(AName + ' FrameB', AFrameB, AnAttrib.FrameSideColors[bsBottom]);
+ AssertTrue(AName + ' Style', AStyle = AnAttrib.Style);
+ end;
+
+var
+ Merger: TSynSelectedColorMergeResult;
+ Base: TSynHighlighterAttributes;
+ Modifier: TSynSelectedColor;
+ b1, b2: TLazSynDisplayTokenBound;
+begin
+ b1.Logical := -1;
+ b1.Physical := 3;
+ b2.Logical := -1;
+ b2.Physical := 7;
+
+ Merger := TSynSelectedColorMergeResult.Create;
+ Base := TSynHighlighterAttributes.Create;
+ Modifier := TSynSelectedColor.Create;
+
+ SetAttrib(Base, clRed, clYellow, clNone);
+ Merger.Assign(Base);
+ Merger.CurrentStartX := b1;
+ Merger.CurrentEndX := b2;
+ CheckAttrib('', Merger, clRed, clYellow, clNone, clNone, clNone, clNone);
+
+
+ SetAttrib(Base, clRed, clYellow, clNone);
+ Merger.Assign(Base);
+ Merger.CurrentStartX := b1;
+ Merger.CurrentEndX := b2;
+ Merger.ProcessMergeInfo;
+ CheckAttrib('', Merger, clRed, clYellow, clNone, clNone, clNone, clNone);
+
+
+ SetAttrib(Base, clRed, clYellow, clNone);
+ Merger.Assign(Base);
+ Merger.CurrentStartX := b1;
+ Merger.CurrentEndX := b2;
+ Merger.InitMergeInfo;
+ Merger.ProcessMergeInfo;
+ CheckAttrib('', Merger, clRed, clYellow, clNone, clNone, clNone, clNone);
+
+
+ SetAttrib(Base, clRed, clYellow, clNone);
+ SetAttrib(Modifier, clNone, clNone, clNone);
+ Merger.Assign(Base);
+ Merger.Merge(Modifier);
+ Merger.ProcessMergeInfo;
+ CheckAttrib('', Merger, clRed, clYellow, clNone, clNone, clNone, clNone);
+
+ SetAttrib(Base, clRed, clYellow, clNone);
+ SetAttrib(Modifier, clNone, clNone, clNone, [], [], sfeAround, slsSolid, 3, 7);
+ Merger.Assign(Base);
+ Merger.Merge(Modifier);
+ Merger.ProcessMergeInfo;
+ CheckAttrib('', Merger, clRed, clYellow, clNone, clNone, clNone, clNone);
+
+
+ SetAttrib(Base, clRed, clYellow, clNone);
+ SetAttrib(Modifier, clNone, clGray, clGreen, [], [], sfeAround, slsSolid, 3, 7);
+ Merger.Assign(Base);
+ Merger.Merge(Modifier, b1, b2);
+ Merger.ProcessMergeInfo;
+ CheckAttrib('', Merger, clRed, clGray, clGreen, clGreen, clGreen, clGreen);
+
+
+
+
+ FreeAndNil(Merger);
+ FreeAndNil(Base);
+ FreeAndNil(Modifier);
+end;
+
+initialization
+ RegisterTest(TTestPaintColorMerging);
+
+end.
+