Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {$DEFINE USEMMX}
- {$IFNDEF USEMMX}
- function TMainForm.AverageColor(Input: array of const): TColor;
- var i: Integer;
- InputTypes: array[0..$FFF0 div SizeOf(TVarRec)]
- of TVarRec absolute Input;
- Red, Green, Blue: Integer;
- begin
- Red:=0;
- Green:=0;
- Blue:=0;
- for i:= Low(Input) to High(Input) do begin
- with InputTypes[i] do begin
- if VType = vtInteger then begin
- if VInteger < 0 then VInteger:= GetSysColor(VInteger and $000000FF);
- inc(Red,GetRValue(VInteger));
- inc(Green,GetGValue(VInteger));
- inc(Blue,GetBValue(VInteger));
- end else begin
- raise EInvalidArgument.Create('All parameters must be Integer');
- end;
- end;
- end;
- Red :=Red div length(Input);
- Green :=Green div length(Input);
- Blue :=Blue div length(Input);
- Result:=RGB(Red,Green,Blue);
- end
- {$ELSE}
- function TMainForm.AverageColor(Input: array of const): TColor;
- var i: Integer;
- InputTypes: array[0..$FFF0 div SizeOf(TVarRec)]
- of TVarRec absolute Input;
- ColorBytes: Array[0..3] of Integer;
- SuperBytes: Array[0..3] of Integer;
- LengthSngs: Array[0..3] of Single;
- begin
- ColorBytes[0] := 0;
- ColorBytes[1] := 0;
- ColorBytes[2] := 0;
- ColorBytes[3] := 0;
- SuperBytes[0] := 0;
- SuperBytes[1] := 0;
- SuperBytes[2] := 0;
- SuperBytes[3] := 0;
- asm
- MOVAPS XMM1, @ColorBytes ;ColorBytes in den MMX-Speicher schieben
- end;
- for i:= Low(Input) to High(Input) do begin
- with InputTypes[i] do begin
- if VType = vtInteger then begin
- if VInteger < 0 then VInteger:= GetSysColor(VInteger and $000000FF);
- SuperBytes[0] := GetRValue(VInteger);
- SuperBytes[1] := GetGValue(VInteger);
- SuperBytes[2] := GetBValue(VInteger);
- asm
- MOVAPS XMM2, @SuperBytes ;SuperBytes in das zweite MMX-Register schreiben
- PADDD XMM1, XMM2 ;Parallel addieren... Das Ergebnis steht jetzt in XMM1!
- ;Also erstmal nichts weiter machen...
- end;
- end else begin
- raise EInvalidArgument.Create('All parameters must be Integer');
- end;
- end;
- end;
- LengthSngs[0] := length(input);
- LengthSngs[1] := length(input);
- LengthSngs[2] := length(input);
- asm
- MOVAPS XMM2, XMM1 ;fertiges zeug in xmm2 laden, damits zurückgerechnet werden kann
- CVTDQ2PS XMM1, XMM2 ;Alles in Floats umwandeln, damits ans dividieren gehen kann
- MOVAPS XMM2, @LengthSngs ;Längen wieder in xmm2 laden
- DIVPS XMM1, XMM2
- MOVAPS XMM2, XMM1 ;fertiges zeug in xmm2 laden, damits zurückgerechnet werden kann
- CVTPS2DQ XMM1, XMM2 ;Die Umwandlung zurück in integer machen
- MOVAPS @ColorBytes, XMM1 ;Die umgewandelten Daten zurückladen
- end;
- Result:=RGB(ColorBytes[0],ColorBytes[1],ColorBytes[2]);
- end
- {$ENDIF}
Advertisement
Add Comment
Please, Sign In to add comment