📄 cliutil.pas
字号:
unit cliUtil;
//工具库:主要提供一些图形操作函数
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DXDraws, DXClass, WIL, Grobal2, StdCtrls, DirectX, DIB, HUtil32,
wmutil; //, bmputil;
const
MAXGRADE = 64;
DIVUNIT = 4;
type
TColorEffect = (ceNone, ceGrayScale, ceBright, ceBlack, ceWhite, ceRed, ceGreen, ceBlue, ceYellow, ceFuchsia);
TNearestIndexHeader = record
Title: string[30];
IndexCount: integer;
desc: array[0..10] of byte;
end;
function HasMMX: Boolean;
procedure BuildColorLevels (ctable: TRGBQuads);
procedure BuildNearestIndex (ctable: TRGBQuads);
procedure SaveNearestIndex (flname: string);
function LoadNearestIndex (flname: string): Boolean;
procedure DrawFog (ssuf: TDirectDrawSurface; fogmask: PByte; fogwidth: integer);
procedure DrawFog2 (ssuf: TDirectDrawSurface; fogmask: PByte; fogwidth: integer);
procedure MakeDark (ssuf: TDirectDrawSurface; darklevel: integer);
procedure FogCopy (PSource: Pbyte; ssx, ssy, swidth, sheight: integer;
PDest: Pbyte; ddx, ddy, dwidth, dheight, maxfog: integer);
procedure DrawBlend (dsuf: TDirectDrawSurface; x, y: integer; ssuf: TDirectDrawSurface; blendmode: integer);
procedure DrawBlendEx (dsuf: TDirectDrawSurface; x, y: integer; ssuf: TDirectDrawSurface; ssufleft, ssuftop, ssufwidth, ssufheight, blendmode: integer);
procedure SpriteCopy(DestX, DestY : integer;
SourX, SourY : integer;
Size : TPoint;
Sour, Dest : TDirectDrawSurface);
procedure MMXBlt (ssuf, dsuf: TDirectDrawSurface);
procedure DrawEffect (x, y, width, height: integer; ssuf: TDirectDrawSurface; eff: TColorEffect);
procedure DrawLine(Surface: TDirectDrawSurface);
var
DarkLevel : integer;
implementation
uses Share;
var
RgbIndexTable: array[0..MAXGRADE-1, 0..MAXGRADE-1, 0..MAXGRADE-1] of byte;
Color256Mix: array[0..255, 0..255] of byte;
Color256Anti: array[0..255, 0..255] of byte;
HeavyDarkColorLevel: array[0..255, 0..255] of byte;
LightDarkColorLevel: array[0..255, 0..255] of byte;
DengunColorLevel: array[0..255, 0..255] of byte;
BrightColorLevel: array[0..255] of byte;
GrayScaleLevel: array[0..255] of byte;
RedishColorLevel: array[0..255] of byte;
BlackColorLevel: array[0..255] of byte;
WhiteColorLevel: array[0..255] of byte;
GreenColorLevel: array[0..255] of byte;
YellowColorLevel: array[0..255] of byte;
BlueColorLevel: array[0..255] of byte;
FuchsiaColorLevel: array[0..255] of byte;
//判断机器是否有MMX功能
function HasMMX: Boolean;
var
n: byte;
begin
asm
mov eax, 1
db $0F,$A2 /// CPUID
test edx, 00800000H
mov n, 1
jnz @@Found
mov n, 0
@@Found:
end;
if n = 1 then Result := TRUE
else Result := FALSE;
end;
procedure BuildNearestIndex (ctable: TRGBQuads);
var
r, g, b, rr, gg, bb, color, MinDif, ColDif: Integer;
MatchColor: Byte;
pal0, pal1, pal2: TRGBQuad;
//调色板混合256X256
procedure BuildMix;
var
i, j, n: integer;
begin
for i:=0 to 255 do begin
pal0 := ctable[i];
for j:=0 to 255 do begin
pal1 := ctable[j];
pal1.rgbRed := pal0.rgbRed div 2 + pal1.rgbRed div 2;
pal1.rgbGreen := pal0.rgbGreen div 2 + pal1.rgbGreen div 2;
pal1.rgbBlue := pal0.rgbBlue div 2 + pal1.rgbBlue div 2;
MinDif := 768;
MatchColor := 0;
for n:=0 to 255 do begin
pal2 := ctable[n];
ColDif := Abs(pal2.rgbRed - pal1.rgbRed) +
Abs(pal2.rgbGreen - pal1.rgbGreen) +
Abs(pal2.rgbBlue - pal1.rgbBlue);
if ColDif < MinDif then begin
MinDif := ColDif;
MatchColor := n;
end;
end;
Color256Mix[i, j] := MatchColor;
end;
end;
end;
//调色板动画颜色表256X256
procedure BuildAnti;
var
i, j, n, ever: integer;
begin
for i:=0 to 255 do begin
pal0 := ctable[i];
for j:=0 to 255 do begin
pal1 := ctable[j];
ever := _MAX(pal0.rgbRed, pal0.rgbGreen);
ever := _MAX(ever, pal0.rgbBlue);
// pal1.rgbRed := _MIN(255, Round (pal0.rgbRed + (255-ever)/255 * pal1.rgbRed));
// pal1.rgbGreen := _MIN(255, Round (pal0.rgbGreen + (255-ever)/255 * pal1.rgbGreen));
// pal1.rgbBlue := _MIN(255, Round (pal0.rgbBlue + (255-ever)/255 * pal1.rgbBlue));
pal1.rgbRed := _MIN(255, Round (pal0.rgbRed + (255-pal0.rgbRed)/255 * pal1.rgbRed));
pal1.rgbGreen := _MIN(255, Round (pal0.rgbGreen + (255-pal0.rgbGreen)/255 * pal1.rgbGreen));
pal1.rgbBlue := _MIN(255, Round (pal0.rgbBlue + (255-pal0.rgbBlue)/255 * pal1.rgbBlue));
MinDif := 768;
MatchColor := 0;
for n:=0 to 255 do begin
pal2 := ctable[n];
ColDif := Abs(pal2.rgbRed - pal1.rgbRed) +
Abs(pal2.rgbGreen - pal1.rgbGreen) +
Abs(pal2.rgbBlue - pal1.rgbBlue);
if ColDif < MinDif then begin
MinDif := ColDif;
MatchColor := n;
end;
end;
Color256Anti[i, j] := MatchColor;
end;
end;
end;
//灰阶颜色表256X256
procedure BuildColorLevels;
var
n, i, j, rr, gg, bb: integer;
begin
for n:=0 to 30 do begin
for i:=0 to 255 do begin
pal1 := ctable[i];
rr := _MIN(Round(pal1.rgbRed * (n+1) / 31) - 5, 255); //(n + (n-1)*3) / 121);
gg := _MIN(Round(pal1.rgbGreen * (n+1) / 31) - 5, 255); //(n + (n-1)*3) / 121);
bb := _MIN(Round(pal1.rgbBlue * (n+1) / 31) - 5, 255); //(n + (n-1)*3) / 121);
pal1.rgbRed := _MAX(0, rr);
pal1.rgbGreen := _MAX(0, gg);
pal1.rgbBlue := _MAX(0, bb);
MinDif := 768;
MatchColor := 0;
for j:=0 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;
HeavyDarkColorLevel[n, i] := MatchColor;
end;
end;
for n:=0 to 30 do begin
for i:=0 to 255 do begin
pal1 := ctable[i];
pal1.rgbRed := _MIN(Round(pal1.rgbRed * (n*3+47) / 140), 255);
pal1.rgbGreen := _MIN(Round(pal1.rgbGreen * (n*3+47) / 140), 255);
pal1.rgbBlue := _MIN(Round(pal1.rgbBlue * (n*3+47) / 140), 255);
MinDif := 768;
MatchColor := 0;
for j:=0 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;
LightDarkColorLevel[n, i] := MatchColor;
end;
end;
for n:=0 to 30 do begin
for i:=0 to 255 do begin
pal1 := ctable[i];
pal1.rgbRed := _MIN(Round(pal1.rgbRed * (n*3+120) / 214), 255);
pal1.rgbGreen := _MIN(Round(pal1.rgbGreen * (n*3+120) / 214), 255);
pal1.rgbBlue := _MIN(Round(pal1.rgbBlue * (n*3+120) / 214), 255);
MinDif := 768;
MatchColor := 0;
for j:=0 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;
DengunColorLevel[n, i] := MatchColor;
end;
end;
{for i:=0 to 255 do begin
HeavyDarkColorLevel[0, i] := HeavyDarkColorLevel[1, i];
LightDarkColorLevel[0, i] := LightDarkColorLevel[1, i];
DengunColorLevel[0, i] := DengunColorLevel[1, i];
end;}
for n:=31 to 255 do
for i:=0 to 255 do begin
HeavyDarkColorLevel[n, i] := HeavyDarkColorLevel[30, i];
LightDarkColorLevel[n, i] := LightDarkColorLevel[30, i];
DengunColorLevel[n, i] := DengunColorLevel[30, i];
end;
end;
begin
BuildMix;
BuildAnti;
BuildColorLevels;
end;
procedure BuildColorLevels (ctable: TRGBQuads);
var
n, i, j, MinDif, ColDif: integer;
pal1, pal2: TRGBQuad;
MatchColor: byte;
begin
BrightColorLevel[0] := 0;
for i:=1 to 255 do begin
pal1 := ctable[i];
pal1.rgbRed := _MIN(Round(pal1.rgbRed * 1.3), 255);
pal1.rgbGreen := _MIN(Round(pal1.rgbGreen * 1.3), 255);
pal1.rgbBlue := _MIN(Round(pal1.rgbBlue * 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;
BrightColorLevel[i] := MatchColor;
end;
GrayScaleLevel[0] := 0;
for i:=1 to 255 do begin
pal1 := ctable[i];
n := (pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) div 3;
pal1.rgbRed := n; //Round(pal1.rgbRed * (n*3+25) / 118);
pal1.rgbGreen := n; //Round(pal1.rgbGreen * (n*3+25) / 118);
pal1.rgbBlue := n; //Round(pal1.rgbBlue * (n*3+25) / 118);
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;
GrayScaleLevel[i] := MatchColor;
end;
BlackColorLevel[0] := 0;
for i:=1 to 255 do begin
pal1 := ctable[i];
n := Round ((pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) / 3 * 0.6);
pal1.rgbRed := n; //_MAX(8, Round(pal1.rgbRed * 0.7));
pal1.rgbGreen := n; //_MAX(8, Round(pal1.rgbGreen * 0.7));
pal1.rgbBlue := n; //_MAX(8, Round(pal1.rgbBlue * 0.7));
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;
BlackColorLevel[i] := MatchColor;
end;
WhiteColorLevel[0] := 0;
for i:=1 to 255 do begin
pal1 := ctable[i];
n := _MIN (Round ((pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) / 3 * 1.6), 255);
pal1.rgbRed := n; //_MAX(8, Round(pal1.rgbRed * 0.7));
pal1.rgbGreen := n; //_MAX(8, Round(pal1.rgbGreen * 0.7));
pal1.rgbBlue := n; //_MAX(8, Round(pal1.rgbBlue * 0.7));
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;
WhiteColorLevel[i] := MatchColor;
end;
RedishColorLevel[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 := 0;
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;
RedishColorLevel[i] := MatchColor;
end;
GreenColorLevel[0] := 0;
for i:=1 to 255 do begin
pal1 := ctable[i];
//n := (pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) div 5;
//pal1.rgbRed := 0;//_MIN(Round(n / 2), 255);
//pal1.rgbGreen := _MIN(Round(n), 255);
//pal1.rgbBlue := 0;//_MIN(Round(n / 2), 255);
n := (pal1.rgbRed + pal1.rgbGreen + pal1.rgbBlue) div 3;
pal1.rgbRed := 0;
pal1.rgbGreen := n;
pal1.rgbBlue := 0;
//pal1.rgbRed := _MIN(Round (pal1.rgbRed / 3), 255);
//pal1.rgbGreen := _MIN(Round (pal1.rgbGreen * 1.5), 255);
//pal1.rgbBlue := _MIN(Round (pal1.rgbBlue / 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;
GreenColorLevel[i] := MatchColor;
end;
YellowColorLevel[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 := n;
pal1.rgbBlue := 0;
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;
YellowColorLevel[i] := MatchColor;
end;
BlueColorLevel[0] := 0;
for i:=1 to 255 do begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -