📄 teblndwk.pas
字号:
unit teBlndWk;
interface
{$INCLUDE teDefs.inc}
uses
{$IFDEF WIN32}
Windows, Messages,
{$ENDIF WIN32}
SysUtils, Classes, teRender,
{$ifdef CLX}
QT, QGraphics;
{$else}
Graphics;
{$endif CLX}
const
Mask_32_1 = $7F7F7F7F;
Mask_32_2 = $3F3F3F3F;
Mask_32_3 = $1F1F1F1F;
Mask_32_4 = $0F0F0F0F;
Mask_16_1 = $7BEF7BEF;
Mask_16_2 = $39E739E7;
Mask_16_3 = $18E318E3;
Mask_16_4 = $08610861;
{$ifndef CLX}
Mask_15_1 = $3DEF3DEF;
Mask_15_2 = $1CE71CE7;
Mask_15_3 = $0C630C63;
Mask_15_4 = $04210421;
{$endif CLX}
procedure StandardFuseFrame(BrushBmp: TBitmap; CurrentFrame: Integer);
procedure BlendBmps(WorkBmp, DstBmp, SrcBmp, BrushBmp: TBitmap;
PixelFormat: TPixelFormat; Level, EqualQuads: Integer);
procedure BlendBmp(Bmp, BrushBmp: TBitmap; PixelFormat: TPixelFormat;
Color: TColor; R: TRect; Level: Integer);
implementation
var
ColorBlendArrayRed,
ColorBlendArrayGreen,
ColorBlendArrayBlue: array[0..255] of Byte;
ColorBlendArrayRedValue,
ColorBlendArrayGreenValue,
ColorBlendArrayBlueValue,
ColorBlendArrayLevel: Byte;
ColorBlendArrayPixelFormat: TPixelFormat;
ColorBlendArrayInitialized: Boolean = False;
procedure StandardFuseFrame(BrushBmp: TBitmap; CurrentFrame: Integer);
const
PixelArray: array[1..64*2] of byte =
(4, 4,
0, 0,
4, 0,
0, 4,
6, 6,
2, 2,
6, 2,
2, 6,
6, 4,
2, 0,
6, 0,
2, 4,
4, 6,
0, 2,
4, 2,
0, 6,
5, 7,
1, 3,
5, 3,
1, 7,
7, 5,
3, 1,
7, 1,
3, 5,
7, 7,
3, 3,
7, 3,
3, 7,
5, 5,
1, 1,
5, 1,
1, 5,
5, 4,
1, 0,
5, 0,
1, 4,
7, 6,
3, 2,
7, 2,
3, 6,
7, 4,
3, 0,
7, 0,
3, 4,
5, 6,
1, 2,
5, 2,
1, 6,
6, 7,
2, 3,
6, 3,
2, 7,
4, 5,
0, 1,
4, 1,
0, 5,
4, 7,
0, 3,
4, 3,
0, 7,
6, 5,
2, 1,
6, 1,
2, 5);
begin
{$ifndef CLX}
BrushBmp.Canvas.Pixels[
PixelArray[(CurrentFrame*2)-1], PixelArray[CurrentFrame*2]] := clBlack;
{$endif CLX}
end;
procedure TEAlphaBlendMMX(Work, Dst, Src: Pointer; Size, Alpha: Integer);
{$ifdef TrialLimited}begin end;{$else}
type
TEAlphaBlendMMXProc = procedure(Work, Dst, Src: Pointer; Size, Alpha: Integer);
const
Body: array[1..364] of Byte = (
$55,
$8B,$EC,
$57,
$56,
$53,
$89,$D7,
$89,$CE,
$89,$C3,
$8B,$4D,$0C,
$C1,$E9,$0C,
$C1,$E1,$09,
$0F,$84,$94,$00,$00,$00,
$8D,$3C,$CF,
$8D,$34,$CE,
$8D,$1C,$CB,
$F7,$D9,
$0F,$EF,$C0,
$0F,$6E,$4D,$08,
$0F,$61,$C9,
$0F,$62,$C9,
$B8,$40,$00,$00,$00,
$81,$C1,$00,$02,$00,$00,
$8B,$54,$CE,$E0,
$8B,$54,$CE,$C0,
$83,$E9,$08,
$48,
$75,$F2,
$81,$C1,$00,$02,$00,$00,
$B8,$40,$00,$00,$00,
$8B,$54,$CF,$E0,
$8B,$54,$CF,$C0,
$83,$E9,$08,
$48,
$75,$F2,
$B8,$00,$02,$00,$00,
$0F,$6F,$14,$CF,
$0F,$6F,$1C,$CE,
$0F,$6F,$E2,
$0F,$60,$D0,
$0F,$6F,$EB,
$0F,$60,$D8,
$0F,$F9,$D3,
$0F,$D5,$D1,
$0F,$68,$E0,
$0F,$6F,$F5,
$0F,$68,$E8,
$0F,$F9,$E5,
$0F,$D5,$E1,
$0F,$71,$D2,$08,
$0F,$71,$D4,$08,
$0F,$67,$D4,
$0F,$FC,$D6,
// db $0F,$7F,$14,$CB
$0F,$E7,$14,$CB,
$83,$C1,$01,
$48,
$75,$BF,
$09,$C9,
$7C,$84,
$8B,$4D,$0C,
$81,$E1,$F8,$0F,$00,$00,
$C1,$E9,$03,
$74,$4D,
$8D,$3C,$CF,
$8D,$34,$CE,
$8D,$1C,$CB,
$F7,$D9,
$0F,$6F,$14,$CF,
$0F,$6F,$1C,$CE,
$0F,$6F,$E2,
$0F,$60,$D0,
$0F,$6F,$EB,
$0F,$60,$D8,
$0F,$F9,$D3,
$0F,$D5,$D1,
$0F,$68,$E0,
$0F,$6F,$F5,
$0F,$68,$E8,
$0F,$F9,$E5,
$0F,$D5,$E1,
$0F,$71,$D2,$08,
$0F,$71,$D4,$08,
$0F,$67,$D4,
$0F,$FC,$D6,
// db $0F,$7F,$14,$CB
$0F,$E7,$14,$CB,
$83,$C1,$01,
$09,$C9,
$7C,$BE,
$8B,$45,$0C,
$83,$E0,$04,
$74,$4D,
$8B,$07,
$8B,$16,
$25,$00,$FF,$00,$FF,
$81,$E2,$00,$FF,$00,$FF,
$C1,$E8,$08,
$C1,$EA,$08,
$29,$D0,
$0F,$AF,$45,$08,
$C1,$E8,$08,
$01,$D0,
$C1,$E0,$08,
$25,$00,$FF,$00,$FF,
$8B,$0F,
$8B,$16,
$81,$E1,$FF,$00,$FF,$00,
$81,$E2,$FF,$00,$FF,$00,
$29,$D1,
$0F,$AF,$4D,$08,
$C1,$E9,$08,
$01,$D1,
$81,$E1,$FF,$00,$FF,$00,
$09,$C1,
$89,$0B,
$5B,
$5E,
$5F,
$0F,$AE,$FF,
$0F,$77,
$5D,
$C2,$08,$00,
$90);
var
BC: PByteArray;
begin
GetMem(BC, SizeOf(Body));
try
CopyMemory(@(BC[0]), @Body, SizeOf(Body));
if not TEProcessorInfo.SSE then
begin
PByte(@BC[162])^ := $7F;
PByte(@BC[256])^ := $7F;
PByte(@BC[354])^ := $90;
PByte(@BC[355])^ := $90;
PByte(@BC[356])^ := $90;
end;
TEAlphaBlendMMXProc(BC)(Work, Dst, Src, Size, Alpha);
finally
FreeMem(BC);
end;
end;
{$endif TrialLimited}
procedure TEAlphaBlendAsm(Work, Dst, Src: Pointer; PixelFormat: TPixelFormat;
Size, Alpha, EqualPerc: Integer; IsColor: Boolean; Color: TColor);
type
TAlphaBlendAsmProc = procedure(Work, Dst, Src:Pointer);
const
CommonBody1: array[1..30] of Byte = (
$53,
$57,
$56,
$55,
$89,$D7,
$89,$CE,
$EB,$14,
$83,$C0,$04,
$83,$C6,$04,
$83,$C7,$04,
$3D,$67,$45,$23,$01,
$0F,$84,$51,$00,$00,$00);
BodyMemCmp: array[1..8] of Byte = (
$8B,$0F,
$8B,$16,
$39,$D1,
$74,$E4);
BodyMemNoCmp: array[1..4] of Byte = (
$8B,$0F,
$8B,$16);
BodyColorCmp1: array[1..11] of Byte = (
$B9,$67,$45,$23,$01,
$8B,$16,
$39,$D1,
$74,$E1);
BodyColorCmp2: array[1..11] of Byte = (
$8B,$0F,
$BA,$67,$45,$23,$01,
$39,$D1,
$74,$E1);
BodyColorNoCmp1: array[1..7] of Byte = (
$B9,$67,$45,$23,$01,
$8B,$16);
BodyColorNoCmp2: array[1..7] of Byte = (
$8B,$0F,
$BA,$67,$45,$23,$01);
CommonBody2: array[1..38] of Byte = (
$89,$CB,
$89,$D5,
$81,$E3,$00,$FF,$00,$FF,
$81,$E5,$00,$FF,$00,$FF,
$C1,$EB,$08,
$81,$E1,$FF,$00,$FF,$00,
$C1,$ED,$08,
$81,$E2,$FF,$00,$FF,$00,
$29,$D1,
$29,$EB
);
CommonBody3: array[1..48] of Byte =
(
$01,$EB,
$01,$D1,
$C1,$E3,$08,
$81,$E1,$FF,$00,$FF,$00,
$81,$E3,$00,$FF,$00,$FF,
$83,$C7,$04,
$09,$D9,
$83,$C6,$04,
$89,$08,
$83,$C0,$04,
$3D,$67,$45,$23,$01,
$0F,$85,$AF,$FF,$FF,$FF,
$5D,
$5E,
$5F,
$5B,
$C3);
function BodyDst(Data: PByteArray; DoComp, IsColor, Exchange: Boolean;
Color: DWord): Integer;
begin
if IsColor
then
begin
if Exchange
then
begin
if DoComp
then
begin
CopyMemory(Data, @BodyColorCmp2, SizeOf(BodyColorCmp2));
Result := SizeOf(BodyColorCmp2);
end
else
begin
CopyMemory(Data, @BodyColorNoCmp2, SizeOf(BodyColorNoCmp2));
Result := SizeOf(BodyColorNoCmp2);
end;
PDWord(@Data[3])^ := Color;
end
else
begin
if DoComp
then
begin
CopyMemory(Data, @BodyColorCmp1, SizeOf(BodyColorCmp1));
Result := SizeOf(BodyColorCmp1);
end
else
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -