BugInTheSYS

Untitled

May 12th, 2012
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.87 KB | None | 0 0
  1. {$DEFINE USEMMX}
  2.  
  3. {$IFNDEF USEMMX}
  4. function TMainForm.AverageColor(Input: array of const): TColor;
  5. var i: Integer;
  6.     InputTypes: array[0..$FFF0 div SizeOf(TVarRec)]
  7.                 of TVarRec absolute Input;
  8.     Red, Green, Blue: Integer;
  9. begin
  10.   Red:=0;
  11.   Green:=0;
  12.   Blue:=0;
  13.   for i:= Low(Input) to High(Input) do begin
  14.     with InputTypes[i] do begin
  15.       if VType = vtInteger then begin
  16.         if VInteger < 0 then VInteger:= GetSysColor(VInteger and $000000FF);
  17.         inc(Red,GetRValue(VInteger));
  18.         inc(Green,GetGValue(VInteger));
  19.         inc(Blue,GetBValue(VInteger));
  20.       end else begin
  21.         raise  EInvalidArgument.Create('All parameters must be Integer');
  22.       end;
  23.     end;
  24.   end;
  25.   Red   :=Red   div length(Input);
  26.   Green :=Green div length(Input);
  27.   Blue  :=Blue  div length(Input);
  28.   Result:=RGB(Red,Green,Blue);
  29. end
  30. {$ELSE}
  31.  
  32. function TMainForm.AverageColor(Input: array of const): TColor;
  33. var i: Integer;
  34.     InputTypes: array[0..$FFF0 div SizeOf(TVarRec)]
  35.                 of TVarRec absolute Input;
  36.     ColorBytes: Array[0..3] of Integer;
  37.     SuperBytes: Array[0..3] of Integer;
  38.     LengthSngs: Array[0..3] of Single;
  39. begin
  40.   ColorBytes[0] := 0;
  41.   ColorBytes[1] := 0;
  42.   ColorBytes[2] := 0;
  43.   ColorBytes[3] := 0;
  44.   SuperBytes[0] := 0;
  45.   SuperBytes[1] := 0;
  46.   SuperBytes[2] := 0;
  47.   SuperBytes[3] := 0;
  48.   asm
  49.     MOVAPS XMM1, @ColorBytes ;ColorBytes in den MMX-Speicher schieben
  50.   end;
  51.   for i:= Low(Input) to High(Input) do begin
  52.     with InputTypes[i] do begin
  53.       if VType = vtInteger then begin
  54.         if VInteger < 0 then VInteger:= GetSysColor(VInteger and $000000FF);
  55.         SuperBytes[0] := GetRValue(VInteger);
  56.         SuperBytes[1] := GetGValue(VInteger);
  57.         SuperBytes[2] := GetBValue(VInteger);
  58.         asm
  59.           MOVAPS  XMM2, @SuperBytes ;SuperBytes in das zweite MMX-Register schreiben
  60.           PADDD   XMM1, XMM2        ;Parallel addieren... Das Ergebnis steht jetzt in XMM1!
  61.                                     ;Also erstmal nichts weiter machen...
  62.         end;
  63.       end else begin
  64.         raise  EInvalidArgument.Create('All parameters must be Integer');
  65.       end;
  66.     end;
  67.   end;
  68.   LengthSngs[0] := length(input);
  69.   LengthSngs[1] := length(input);
  70.   LengthSngs[2] := length(input);
  71.   asm
  72.     MOVAPS    XMM2, XMM1        ;fertiges zeug in xmm2 laden, damits zurückgerechnet werden kann
  73.     CVTDQ2PS  XMM1, XMM2        ;Alles in Floats umwandeln, damits ans dividieren gehen kann
  74.     MOVAPS    XMM2, @LengthSngs ;Längen wieder in xmm2 laden
  75.     DIVPS     XMM1, XMM2
  76.     MOVAPS    XMM2, XMM1        ;fertiges zeug in xmm2 laden, damits zurückgerechnet werden kann
  77.     CVTPS2DQ  XMM1, XMM2        ;Die Umwandlung zurück in integer machen
  78.     MOVAPS    @ColorBytes, XMM1 ;Die umgewandelten Daten zurückladen
  79.   end;
  80.   Result:=RGB(ColorBytes[0],ColorBytes[1],ColorBytes[2]);
  81. end
  82. {$ENDIF}
Advertisement
Add Comment
Please, Sign In to add comment