📄 salphagraph.pas
字号:
inc(R1.Left, - R2.Left);
dec(h, - R2.Left);
R2.Left := 0;
end;
if R1.Top < R2.Top then begin
if (R1.Top < 0) then begin
inc(R2.Top, - R1.Top);
dec(h, - R1.Top);
R1.Top := 0;
end;
end
else
if (R2.Top < 0) then begin
inc(R1.Top, - R2.Top);
dec(h, - R2.Top);
R2.Top := 0;
end;
c.R := 255; c.G := 0; c.B := 255; // clFuchsia
col.C := CtrlParentColor;
if not CI.Ready then for Y := 0 to h do begin
S1 := Bmp.ScanLine[R1.Top + Y];
S2 := MasterBitmap.ScanLine[R2.Top + Y];
M := MasterBitmap.ScanLine[R2.Top + HeightOf(MaskData.R) div 2 + Y];
for X := 0 to w do if (S2[R2.Left + X].R <> c.R) or (S2[R2.Left + X].G <> c.G) or (S2[R2.Left + X].B <> c.B) then begin // v4
S1[R1.Left + X].R := IntToByte(((S1[R1.Left + X].R - S2[R2.Left + X].R) * M[R2.Left + X].R + S2[R2.Left + X].R shl 8) shr 8);
S1[R1.Left + X].G := IntToByte(((S1[R1.Left + X].G - S2[R2.Left + X].G) * M[R2.Left + X].G + S2[R2.Left + X].G shl 8) shr 8);
S1[R1.Left + X].B := IntToByte(((S1[R1.Left + X].B - S2[R2.Left + X].B) * M[R2.Left + X].B + S2[R2.Left + X].B shl 8) shr 8);
end;
end
else for Y := 0 to h do begin
S1 := Bmp.ScanLine[R1.Top + Y];
S2 := MasterBitmap.ScanLine[R2.Top + Y];
M := MasterBitmap.ScanLine[R2.Top + HeightOf(MaskData.R) div 2 + Y];
for X := 0 to w do if (S2[R2.Left + X].R <> c.R) or (S2[R2.Left + X].G <> c.G) or (S2[R2.Left + X].B <> c.B) then begin
S1[R1.Left + X].R := IntToByte(((S1[R1.Left + X].R - S2[R2.Left + X].R) * M[R2.Left + X].R + S2[R2.Left + X].R shl 8) shr 8);
S1[R1.Left + X].G := IntToByte(((S1[R1.Left + X].G - S2[R2.Left + X].G) * M[R2.Left + X].G + S2[R2.Left + X].G shl 8) shr 8);
S1[R1.Left + X].B := IntToByte(((S1[R1.Left + X].B - S2[R2.Left + X].B) * M[R2.Left + X].B + S2[R2.Left + X].B shl 8) shr 8);
end;
end;
end;
end;
procedure DrawSkinGlyph(Bmp : TBitmap; P : TPoint; State, AddedTransparency : integer; MaskData : TsMaskData);
var
w, h, cy, cx : integer;
dw : integer;
c : TsColor;
begin
w := WidthOf(MaskData.R) div MaskData.ImageCount;
h := HeightOf(MaskData.R) div (1 + MaskData.MaskType);
if State > MaskData.ImageCount - 1 then State := MaskData.ImageCount - 1;
dw := State * w;
if p.y < 0 then cy := - p.y else cy := 0;
if p.x < 0 then cx := - p.x else cx := 0;
if MaskData.Bmp = nil then with TsSkinManager(MaskData.Manager) do begin
if MaskData.Manager = nil then Exit;
if MaskData.ImageCount = 0 then Exit;
if (MaskData.MaskType > 0) then begin
BlendGlyphByMask(Rect(p.x + cx, p.y + cy, p.x + w - 1 + cx, p.y + h + cy - 1),
Rect(dw + cx + MaskData.R.Left, cy + MaskData.R.Top, dw + w - 1 + cx + MaskData.R.Left, h - 1 + cy + MaskData.R.Top),
Bmp, MasterBitmap, clFuchsia, AddedTransparency, MaskData);
end
else begin
c.C := clFuchsia;
if AddedTransparency <> 1 then begin
BlendTransRectangle(Bmp, p.x + cx, p.y + cy, MasterBitmap,
Rect(dw + cx + MaskData.R.Left, cy + MaskData.R.Top, dw + cx + MaskData.R.Left + w - 1, cy + MaskData.R.Top + h - 1),
0.5, c);
end
else
CopyTransRect(Bmp, MasterBitmap, p.x + cx, p.y + cy,
Rect(dw + cx + MaskData.R.Left, cy + MaskData.R.Top, dw + cx + MaskData.R.Left + w - 1, cy + MaskData.R.Top + h - 1),
clFuchsia, EmptyCI, True);
end;
end
else begin
BlendGlyphByMask(Rect(p.x + cx, p.y + cy, p.x + w - 1 + cx, p.y + h + cy - 1),
Rect(dw + cx + MaskData.R.Left, cy + MaskData.R.Top, dw + w - 1 + cx + MaskData.R.Left, h - 1 + cy + MaskData.R.Top),
Bmp, MaskData.Bmp, clFuchsia, AddedTransparency, MaskData);
end;
end;
procedure BlendGlyphByMask(R1, R2 : TRect; Bmp1, Bmp2 : TBitmap; TransColor : TColor; AddedTransparency : integer; MaskData : TsMaskData);
var
S1, S2, M : PRGBArray;
X, Y, h, w, hdiv2: Integer;
c, ct : TsColor;
RegRect : TRect;
begin
// hdiv2 := HeightOf(MaskData.R);
// if MaskData.MaskType > 0 then hdiv2 := hdiv2 div 2 else hdiv2 := 0;
// if MaskData.MaskType > 0 then
hdiv2 := HeightOf(MaskData.R) div (MaskData.MaskType + 1);//2 else hdiv2 := Bmp2.Height div 2;
// if MaskData.MaskType > 0 then hdiv2 := HeightOf(MaskData.R) div 2 else hdiv2 := Bmp2.Height div 2;
h := Min(HeightOf(R1), HeightOf(R2));
h := min(h, Bmp1.Height - R1.Top - 1);
if MaskData.ImageCount < 1 then h := min(h, hdiv2 - R2.Top - 1);
w := Min(WidthOf(R1), WidthOf(R2));
w := min(w, Bmp1.Width - R1.Left - 1);
if MaskData.ImageCount < 1 then w := min(w, Bmp2.Width - R2.Left - 1);
RegRect := Rect(-1, 0, 0, 0);
ct.C := ColorToRGB(clFuchsia);
if MaskData.MaskType = 0 then begin
CopyTransRectA(Bmp1, Bmp2, R1.Left, R1.Top, R2, clFuchsia, EmptyCI);
end
else try
c.A := 0;
if R2.Top + h > Bmp2.Height then Exit;
for Y := 0 to h do begin
S1 := Bmp1.ScanLine[R1.Top + Y];
S2 := Bmp2.ScanLine[R2.Top + Y];
M := Bmp2.ScanLine[R2.Top + hdiv2 + Y];
for X := 0 to w do begin
c.R := S2[R2.Left + X].R;
c.G := S2[R2.Left + X].G;
c.B := S2[R2.Left + X].B;
// If not transparent..
if c.C <> ct.C then begin
if AddedTransparency <> 1 then begin
S1[R1.Left + X].R := IntToByte(((S1[R1.Left + X].R - S2[R2.Left + X].R) * min(M[R2.Left + X].R + 100, 255) + S2[R2.Left + X].R shl 8) shr 8);
S1[R1.Left + X].G := IntToByte(((S1[R1.Left + X].G - S2[R2.Left + X].G) * min(M[R2.Left + X].G + 100, 255) + S2[R2.Left + X].G shl 8) shr 8);
S1[R1.Left + X].B := IntToByte(((S1[R1.Left + X].B - S2[R2.Left + X].B) * min(M[R2.Left + X].B + 100, 255) + S2[R2.Left + X].B shl 8) shr 8);
end
else begin
S1[R1.Left + X].R := IntToByte(((S1[R1.Left + X].R - S2[R2.Left + X].R) * M[R2.Left + X].R + S2[R2.Left + X].R shl 8) shr 8);
S1[R1.Left + X].G := IntToByte(((S1[R1.Left + X].G - S2[R2.Left + X].G) * M[R2.Left + X].G + S2[R2.Left + X].G shl 8) shr 8);
S1[R1.Left + X].B := IntToByte(((S1[R1.Left + X].B - S2[R2.Left + X].B) * M[R2.Left + X].B + S2[R2.Left + X].B shl 8) shr 8);
end;
end;
end;
end;
except end;
end;
procedure UpdateCorners(SkinData : TsCommonData; State : integer);
begin
UpdateCorners(SkinData, State, [scLeftTop, scLeftBottom, scRightTop, scRightBottom]);
end;
procedure UpdateCorners(SkinData : TsCommonData; State : integer; Corners : TsCorners);
var
w, Width, Height : integer;
dw, dh : integer;
MaskData : TsMaskData;
CI : TCacheInfo;
ParentRGB : TsRGB;
ParentColor : TsColor;
SrcBmp : TBitmap;
wl, wt, wr, wb : integer;
procedure CopyTransCorner(SrcBmp: Graphics.TBitMap; X, Y : integer; SrcRect: TRect);
var
Dst, Src : PRGBArray;
sX, sY, SrcX, DstX, DstY : Integer;
MaskColor : TsColor;
NewColor : TsRGB;
h, w : integer;
col : TsColor;
begin
MaskColor.C := ColorToRGB(clFuchsia);
if SrcRect.Top < 0 then SrcRect.Top := 0;
if SrcRect.Bottom > SrcBmp.Height - 1 then SrcRect.Bottom := SrcBmp.Height - 1;
if SrcRect.Left < 0 then SrcRect.Left := 0;
if SrcRect.Right > SrcBmp.Width - 1 then SrcRect.Right := SrcBmp.Width - 1;
h := HeightOf(SrcRect);
w := WidthOf(SrcRect);
if ci.Ready and Fast24Src.Attach(ci.Bmp) then for sY := 0 to h do begin //!!!
DstY := sY + Y;
if (DstY <= SkinData.FCacheBmp.Height - 1) and (DstY >= 0) then begin
Dst := SkinData.FCacheBmp.ScanLine[DstY];
Src := SrcBmp.ScanLine[sY + SrcRect.Top];
for sX := 0 to w do begin
DstX := sX + X;
if (DstX <= SkinData.FCacheBmp.Width - 1) and (DstX >= 0) then begin
SrcX := sX + SrcRect.Left;
if (Src[SrcX].B = MaskColor.B) and (Src[SrcX].G = MaskColor.G) and (Src[SrcX].R = MaskColor.R) {if transparent pixel}
then begin
if ParentCenterColor <> clFuchsia then Dst[DstX] := ParentRGB else if CI.Ready then begin
if (ci.Y + DstY >= ci.Bmp.Height) or (ci.X + DstX >= ci.Bmp.Width) or (ci.Y + DstY < 0) or (ci.X + DstX < 0) then continue;
try
col := Fast24Src.Pixels[ci.X + DstX, ci.Y + DstY];// GetPixel(ci.Bmp.Canvas.Handle, ci.X + DstX, ci.Y + DstY);
finally
NewColor.R := col.R;
NewColor.G := col.G;
NewColor.B := col.B;
Dst[DstX] := NewColor
end
end
end;
end;
end
end;
end
else if ParentColor.C <> clFuchsia then for sY := 0 to h do begin //!!!
DstY := sY + Y;
if (DstY <= SkinData.FCacheBmp.Height - 1) and (DstY >= 0) then begin
Dst := SkinData.FCacheBmp.ScanLine[DstY];
Src := SrcBmp.ScanLine[sY + SrcRect.Top];
for sX := 0 to w do begin
DstX := sX + X;
if (DstX <= SkinData.FCacheBmp.Width - 1) and (DstX >= 0) then begin
SrcX := sX + SrcRect.Left;
if (Src[SrcX].B = MaskColor.B) and (Src[SrcX].G = MaskColor.G) and (Src[SrcX].R = MaskColor.R) then begin
Dst[DstX] := ParentRGB
end;
end;
end
end;
end;
end;
procedure CopyMasterCorner(R1, R2 : TRect; Bmp : TBitmap{v4.74});
var
S1, S2 : PRGBArray;
X, Y, h, w: Integer;
c : TsRGB;
col : TsColor;
begin
h := Min(HeightOf(R1), HeightOf(R2));
h := Min(h, SkinData.FCacheBmp.Height - R1.Top);
h := Min(h, Bmp.Height - R2.Top) - 1; //!!!
if h < 0 then Exit;
w := Min(WidthOf(R1), WidthOf(R2));
w := Min(w, SkinData.FCacheBmp.Width - R1.Left);
w := Min(w, Bmp.Width - R2.Left) - 1; //!!!
if w < 0 then Exit;
if R1.Left < R2.Left then begin
if (R1.Left < 0) then begin
inc(R2.Left, - R1.Left);
dec(h, - R1.Left);
R1.Left := 0;
end;
end
else begin
if (R2.Left < 0) then begin
inc(R1.Left, - R2.Left);
dec(h, - R2.Left);
R2.Left := 0;
end;
end;
if R1.Top < R2.Top then begin
if (R1.Top < 0) then begin
inc(R2.Top, - R1.Top);
dec(h, - R1.Top);
R1.Top := 0;
end;
end
else begin
if (R2.Top < 0) then begin
inc(R1.Top, - R2.Top);
dec(h, - R2.Top);
R2.Top := 0;
end;
end;
c.R := 255; c.G := 0; c.B := 255; // clFuchsia
col.C := ParentCenterColor;
if not CI.Ready then begin
if ParentCenterColor <> clFuchsia then for Y := 0 to h do begin
S1 := SkinData.FCacheBmp.ScanLine[R1.Top + Y];
S2 := Bmp.ScanLine[R2.Top + Y];
for X := 0 to w do begin
if (S2[R2.Left + X].R = c.R) and (S2[R2.Left + X].G = c.G) and (S2[R2.Left + X].B = c.B) then begin
S1[R1.Left + X].R := col.R;
S1[R1.Left + X].G := col.G;
S1[R1.Left + X].B := col.B;
end;
end;
end;
end
else begin
if Fast24Src.Attach(ci.Bmp) then for Y := 0 to h do begin
S1 := SkinData.FCacheBmp.ScanLine[R1.Top + Y];
S2 := Bmp.ScanLine[R2.Top + Y];
for X := 0 to w do begin
if (S2[R2.Left + X].R = c.R) and (S2[R2.Left + X].G = c.G) and (S2[R2.Left + X].B = c.B) then begin
if ParentCenterColor <> clFuchsia then begin
S1[R1.Left + X].R := col.R;
S1[R1.Left + X].G := col.G;
S1[R1.Left + X].B := col.B;
end
else begin
if (CI.Bmp.Height <= R1.Top + ci.Y + Y) then Continue;
if (CI.Bmp.Width <= R1.Left + ci.X + X) then Break;
if R1.Top + ci.Y + Y < 0 then Break;
if R1.Left + ci.X + X < 0 then Continue;
col := Fast24Src.Pixels[R1.Left + ci.X + X, R1.Top + ci.Y + Y];
// GetPixel(ci.Bmp.Canvas.Handle, R1.Left + ci.X + X, R1.Top + ci.Y + Y);
S1[R1.Left + X].R := col.R;
S1[R1.Left + X].G := col.G;
S1[R1.Left + X].B := col.B;
end;
end
end;
end;
end;
end;
begin
if not Assigned(Skindata.SkinManager) then Exit;
if (SkinData.BorderIndex < 0) or not Skindata.SkinManager.IsValidImgIndex(SkinData.BorderIndex) or // v4.74 (SkinData.SkinManager.ma[SkinData.BorderIndex].Bmp <> nil) or
not Assigned(SkinData.FCacheBmp) or
(SkinData.FOwnerControl = nil) or not (SkinData.FOwnerControl is TControl) or
(SkinData.FOwnerControl.Width < 2) or (SkinData.FOwnerControl.Height < 2) then Exit;
CI := GetParentCache(SkinData);
if (SkinData.FOwnerControl <> nil) and (SkinData.FOwnerControl.Parent <> nil) then begin
if not CI.Ready then begin
ParentCenterColor := ColorToRGB(TsHackedControl(SkinData.FOwnerControl.Parent).Color);//CI.Bmp.Canvas.Pixels[CI.Bmp.Width div 2, CI.Bmp.Height div 2];
end
else if not SkinData.ParentTextured and (ParentCenterColor = clFuchsia{ParentCenterColor may be already defined}) then begin
InitParentColor(SkinData.FOwnerControl.Parent);
end else ParentCenterColor := clFuchsia;
end else ParentCenterColor := clFuchsia;
MaskData := SkinData.SkinManager.ma[SkinData.BorderIndex];
Width := SkinData.FOwnerControl.Width;
Height := SkinData.FOwnerControl.Height;
wl := MaskData.WL; wt := MaskData.WT; wr := MaskData.WR; wb := MaskData.WB;
if (MaskData.ImageCount = 0) and (MaskData.Bmp <> nil) then begin // if external
MaskData.MaskType := 1;
MaskData.ImageCount := 3;
MaskData.R := Rect(0, 0, MaskData.Bmp.Width, MaskData.Bmp.Height);
end;
if ParentCenterColor <> clFuchsia then begin
ParentColor.C := ColorToRGB(ParentCenterColor);
ParentRGB.R := ParentColor.R;
ParentRGB.G := ParentColor.G;
ParentRGB.B := ParentColor.B;
end
else begin
inc(CI.X, SkinData.FOwnerControl.Left);
inc(CI.Y, SkinData.FOwnerControl.Top);
end;
if State >= MaskData.ImageCount then State := MaskData.ImageCount - 1;
dw := State * WidthOf(MaskData.R) div (MaskData.ImageCount); // Width of mask
dh := HeightOf(MaskData.R) div (1 + MaskData.MaskType); // Height of mask
w := WidthOf(MaskData.R) div{ (3 * v5.10}MaskData.ImageCount - wl - wr; // Width of piece of mask
if MaskData.Bmp <> nil then SrcBmp := MaskData.Bmp else SrcBmp := SkinData.SkinManager.MasterBitmap;
if MaskData.MaskType = 0 then begin // Copy without mask
if (scLeftTop in Corners) then // left - top
CopyTransCorner(SrcBmp, 0, 0,
Rect(MaskData.R.Left + dw,
MaskData.R.Top,
MaskData.R.Left + dw + wl - 1,
MaskData.R.Top + wt - 1));
if (scLeftBottom in Corners) then // left - bottom
CopyTransCorner(SrcBmp, 0, Height - wb,
Rect(MaskData.R.Left,
MaskData.R.Bottom - wb,
MaskData.R.Left + wl - 1,
MaskData.R.Bottom - 1));
if (scRightBottom in Corners) then // right - bottom
CopyTransCorner(SrcBmp, Width - wr, Height - wb,
Rect(MaskData.R.Left + dw + wl + w, //3 * w - wr, v5.10
MaskData.R.Bottom - wb,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -