📄 cliutil.pas
字号:
pal1 := ctable[i];
//n := (pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) div 5;
n := (pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) div 3;
pal1.rgbRed := 0; //_MIN(Round(n*1.3), 255);
pal1.rgbGreen := 0; //_MIN(Round(n), 255);
pal1.rgbBlue := n; //_MIN(Round(n*1.3), 255);
MinDif := 768;
MatchColor := 0;
for j:=1 to 255 do begin
pal2 := ctable[j];
ColDif := Abs(pal2.rgbRed - pal1.rgbRed) +
Abs(pal2.rgbGreen - pal1.rgbGreen) +
Abs(pal2.rgbBlue - pal1.rgbBlue);
if ColDif < MinDif then begin
MinDif := ColDif;
MatchColor := j;
end;
end;
BlueColorLevel[i] := MatchColor;
end;
FuchsiaColorLevel[0] := 0;
for i:=1 to 255 do begin
pal1 := ctable[i];
n := (pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) div 3;
pal1.rgbRed := n;
pal1.rgbGreen := 0;
pal1.rgbBlue := n;
MinDif := 768;
MatchColor := 0;
for j:=1 to 255 do begin
pal2 := ctable[j];
ColDif := Abs(pal2.rgbRed - pal1.rgbRed) +
Abs(pal2.rgbGreen - pal1.rgbGreen) +
Abs(pal2.rgbBlue - pal1.rgbBlue);
if ColDif < MinDif then begin
MinDif := ColDif;
MatchColor := j;
end;
end;
FuchsiaColorLevel[i] := MatchColor;
end;
end;
//保存几个颜色表到文件
procedure SaveNearestIndex (flname: string);
var
nih: TNearestIndexHeader;
fhandle: integer;
begin
nih.Title := 'WEMADE Entertainment Inc.';
nih.IndexCount := Sizeof(Color256Mix);
if FileExists (flname) then begin
fhandle := FileOpen (flname, fmOpenWrite or fmShareDenyNone);
end else
fhandle := FileCreate (flname);
if fhandle > 0 then begin
FileWrite (fhandle, nih, sizeof(TNearestIndexHeader));
FileWrite (fhandle, Color256Mix, sizeof(Color256Mix));
FileWrite (fhandle, Color256Anti, sizeof(Color256Anti));
FileWrite (fhandle, HeavyDarkColorLevel, sizeof(HeavyDarkColorLevel));
FileWrite (fhandle, LightDarkColorLevel, sizeof(LightDarkColorLevel));
FileWrite (fhandle, DengunColorLevel, sizeof(DengunColorLevel));
FileClose (fhandle);
end;
end;
//从文件中读取几个颜色表
function LoadNearestIndex (flname: string): Boolean;
var
nih: TNearestIndexHeader;
fhandle, rsize: integer;
begin
Result := FALSE;
if FileExists (flname) then begin
fhandle := FileOpen (flname, fmOpenRead or fmShareDenyNone);
if fhandle > 0 then begin
FileRead (fhandle, nih, sizeof(TNearestIndexHeader));
if nih.IndexCount = Sizeof(Color256Mix) then begin
Result := TRUE;
rsize := 256*256;
if rsize <> FileRead (fhandle, Color256Mix, sizeof(Color256Mix)) then Result := FALSE;
if rsize <> FileRead (fhandle, Color256Anti, sizeof(Color256Anti)) then Result := FALSE;
if rsize <> FileRead (fhandle, HeavyDarkColorLevel, sizeof(HeavyDarkColorLevel)) then Result := FALSE;
if rsize <> FileRead (fhandle, LightDarkColorLevel, sizeof(LightDarkColorLevel)) then Result := FALSE;
if rsize <> FileRead (fhandle, DengunColorLevel, sizeof(DengunColorLevel)) then Result := FALSE;
end;
FileClose (fhandle);
end;
end;
end;
//生成雾的效果
procedure FogCopy (PSource: Pbyte; ssx, ssy, swidth, sheight: integer;
PDest: Pbyte; ddx, ddy, dwidth, dheight, maxfog: integer);
var
i, j, n, k, row, srclen, scount, si, di, srcheight, spitch, dpitch: integer;
sptr, dptr: PByte;
begin
if (PSource = nil) or (pDest = nil) then exit;
spitch := swidth;
dpitch := dwidth;
if ddx < 0 then begin
ssx := ssx - ddx;
swidth := swidth + ddx;
//dwidth := dwidth + ddx;
ddx := 0;
end;
if ddy < 0 then begin
ssy := ssy - ddy;
sheight := sheight + ddy;
//dheight := dheight + ddy;
ddy := 0;
end;
//if ssx+swidth > dwidth then swidth := dwidth - ssx;
//if ssy+sheight > dheight then sheight := dheight - ssy;
srclen := _MIN(swidth, dwidth-ddx);
srcheight := _MIN(sheight, dheight-ddy);
if (srclen <= 0) or (srcheight <= 0) then exit;
asm
mov row, 0
@@NextRow:
mov eax, row
cmp eax, srcheight
jae @@Finish
mov esi, psource
mov eax, ssy
add eax, row
mov ebx, spitch
imul eax, ebx
add eax, ssx
add esi, eax //sptr
mov edi, pdest
mov eax, ddy
add eax, row
mov ebx, dpitch
imul eax, ebx
add eax, ddx
add edi, eax //dptr
mov ebx, srclen
@@FogNext:
cmp ebx, 0
jbe @@FinOne
cmp ebx, 8
jb @@FinOne //@@EageNext
db $0F,$6F,$06 /// movq mm0, [esi]
db $0F,$6F,$0F /// movq mm1, [edi]
db $0F,$FE,$C8 /// paddd mm1, mm0
db $0F,$7F,$0F /// movq [edi], mm1
sub ebx, 8
add esi, 8
add edi, 8
jmp @@FogNext
{@@EageNext:
movzx eax, [esi].byte
movzx ecx, [edi].byte
add eax, ecx
mov [edi].byte, al
dec ebx
inc esi
inc edi
jmp @@FogNext }
@@FinOne:
inc row
jmp @@NextRow
@@Finish:
db $0F,$77 /// emms
end;
end;
//显示雾效果
procedure DrawFog (ssuf: TDirectDrawSurface; fogmask: PByte; fogwidth: integer);
var
i, j, idx, row, n, count: integer;
ddsd: TDDSurfaceDesc;
sptr, mptr, pmix: PByte;
//source: array[0..910] of byte;
bitindex, scount, dcount, srclen, destlen, srcheight: integer;
lpitch: integer;
src, msk: array[0..7] of byte;
pSrc, psource, pColorLevel: Pbyte;
begin
if ssuf.Width > SCREENWIDTH + 100 then exit;
// if ssuf.Width > 900 then exit;
case DarkLevel of
1: pColorLevel := @HeavyDarkColorLevel; //深夜
2: pColorLevel := @LightDarkColorLevel; //中等亮度
3: pColorLevel := @DengunColorLevel; //中午
else exit;
end;
try
ddsd.dwSize := SizeOf(ddsd);
ssuf.Lock (TRect(nil^), ddsd);
srclen := _MIN(ssuf.Width, fogwidth);
pSrc := @src;
srcheight := ssuf.Height;
lpitch := ddsd.lPitch;
psource := ddsd.lpSurface;
asm
mov row, 0
@@NextRow:
mov ebx, row
mov eax, srcheight
cmp ebx, eax
jae @@DrawFogFin
mov esi, psource //esi = ddsd.lpSurface;
mov eax, lpitch
mov ebx, row
imul eax, ebx
add esi, eax
mov edi, fogmask //edi = fogmask
mov eax, fogwidth
mov ebx, row
imul eax, ebx
add edi, eax
mov ecx, srclen
mov edx, pColorLevel
@@NextByte:
cmp ecx, 0
jbe @@Finish
movzx eax, [edi].byte //fogmask
///cmp eax, 30
///ja @@SkipByte
imul eax, 256
movzx ebx, [esi].byte //家胶 ddsd.lpSurface;
add eax, ebx
mov al, [edx+eax].byte //pColorLevel
mov [esi].byte, al
///@@SkipByte:
dec ecx
inc esi
inc edi
jmp @@NextByte
@@Finish:
inc row
jmp @@NextRow
@@DrawFogFin:
db $0F,$77 /// emms
end;
finally
ssuf.UnLock();
end;
end;
procedure DrawFog2 (ssuf: TDirectDrawSurface; fogmask: PByte; fogwidth: integer);
var
i, j, n, scount, srclen, offsvalue: integer;
sddsd: TDDSurfaceDesc;
sptr, fptr, pColorLevel: Pbyte;
source: array[0..810] of byte;
begin
if ssuf.Width > SCREENWIDTH then exit;
// if ssuf.Width > 800 then exit;
try
sddsd.dwSize := SizeOf(sddsd);
ssuf.Lock (TRect(nil^), sddsd);
srclen := _MIN(ssuf.Width, fogwidth);
case DarkLevel of
0: pColorLevel := @HeavyDarkColorLevel;
1: pColorLevel := @LightDarkColorLevel;
2: pColorLevel := @DengunColorLevel;
end;
for i:=0 to ssuf.height-1 do begin
sptr := PBYTE(integer(sddsd.lpSurface) + i*sddsd.lPitch);
fptr := PBYTE(integer(fogmask) + i*fogwidth);
asm
mov scount, 0
mov esi, sptr
lea edi, source
@@CopySource:
mov ebx, scount //ebx = scount
cmp ebx, srclen
jae @@EndSourceCopy
db $0F,$6F,$04,$1E /// movq mm0, [esi+ebx]
db $0F,$7F,$07 /// movq [edi], mm0
xor ebx, ebx
@@Loop8:
cmp ebx, 8
jz @@EndLoop8
mov ecx, fptr
add ecx, scount
add ecx, ebx
movzx eax, [ecx].byte
cmp eax, 30
jae @@Skip
imul eax, 256
mov ecx, eax
movzx eax, [edi+ebx].byte
mov edx, pColorLevel
add edx, ecx
movzx eax, [edx+eax].byte //
mov [edi+ebx], al
@@Skip:
inc ebx
jmp @@Loop8
@@EndLoop8:
mov ebx, scount
db $0F,$6F,$07 /// movq mm0, [edi]
db $0F,$7F,$04,$1E /// movq [esi+ebx], mm0
add edi, 8
add scount, 8
jmp @@CopySource
@@EndSourceCopy:
db $0F,$77 /// emms
end;
end;
finally
ssuf.UnLock();
end;
end;
procedure MakeDark (ssuf: TDirectDrawSurface; darklevel: integer);
var
i, j, idx, row, n, count: integer;
ddsd: TDDSurfaceDesc;
sptr, mptr, pmix: PByte;
//source: array[0..910] of byte;
bitindex, scount, dcount, srclen, destlen, srcheight: integer;
lpitch: integer;
src, msk: array[0..7] of byte;
pSrc, psource, pColorLevel: Pbyte;
begin
if not darklevel in [1..30] then exit;
if ssuf.Width > SCREENWIDTH + 100 then exit;
// if ssuf.Width > 900 then exit;
try
ddsd.dwSize := SizeOf(ddsd);
ssuf.Lock (TRect(nil^), ddsd);
srclen := ssuf.Width;
srcheight := ssuf.Height;
pSrc := @src;
//if HeavyDark then pColorLevel := @HeavyDarkColorLevel
//else pColorLevel := @LightDarkColorLevel;
pColorLevel := @HeavyDarkColorLevel;
lpitch := ddsd.lPitch;
psource := ddsd.lpSurface;
asm
mov row, 0
@@NextRow:
mov ebx, row
mov eax, srcheight
cmp ebx, eax
jae @@DrawFogFin
mov esi, psource //sptr
mov eax, lpitch
mov ebx, row
imul eax, ebx
add esi, eax
mov eax, srclen
mov scount, eax
@@FogNext:
mov edx, pSrc //pSrc = array[0..7]
mov ebx, scount
cmp ebx, 0
jbe @@Finish
cmp ebx, 8
jb @@FogSmall
db $0F,$6F,$06 /// movq mm0, [esi] //8官捞飘 佬澜 sptr
db $0F,$7F,$02 /// movq [edx], mm0
mov count, 8
@@LevelChange:
mov eax, darklevel
imul eax, 256
movzx ebx, [edx].byte //8官捞飘 弓澜栏肺 佬篮 单捞磐
add eax, ebx
mov ebx, pColorLevel
mov al, [ebx+eax].byte
mov [edx].byte, al
@@Skip1:
dec count
inc edx
inc edi
cmp count, 0
ja @@LevelChange
sub edx, 8
db $0F,$6F,$02 /// movq mm0, [edx]
db $0F,$7F,$06 /// movq [esi], mm0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -