SynEdit: Alphablend (low-lighting) for markup

git-svn-id: trunk@41188 -
This commit is contained in:
martin 2013-05-14 14:03:07 +00:00
parent c115ca588a
commit 062c0899c3
5 changed files with 148 additions and 12 deletions

1
.gitattributes vendored
View File

@ -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

View File

@ -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;

View File

@ -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>

View File

@ -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}

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