mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-15 06:39:26 +02:00
SynEdit: Alphablend (low-lighting) for markup
git-svn-id: trunk@41188 -
This commit is contained in:
parent
c115ca588a
commit
062c0899c3
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -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
|
||||
|
@ -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;
|
||||
|
@ -45,7 +45,7 @@
|
||||
<PackageName Value="FCL"/>
|
||||
</Item5>
|
||||
</RequiredPackages>
|
||||
<Units Count="20">
|
||||
<Units Count="21">
|
||||
<Unit0>
|
||||
<Filename Value="SynTest.lpr"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
@ -146,6 +146,11 @@
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="TestMarkupIfDef"/>
|
||||
</Unit19>
|
||||
<Unit20>
|
||||
<Filename Value="testpaintcolormerging.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="TestPaintColorMerging"/>
|
||||
</Unit20>
|
||||
</Units>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
@ -166,9 +171,6 @@
|
||||
<OverflowChecks Value="True"/>
|
||||
<StackChecks Value="True"/>
|
||||
</Checks>
|
||||
<Optimizations>
|
||||
<OptimizationLevel Value="0"/>
|
||||
</Optimizations>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
|
@ -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}
|
||||
|
||||
|
130
components/synedit/test/testpaintcolormerging.pas
Normal file
130
components/synedit/test/testpaintcolormerging.pas
Normal file
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user