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. +