CommonDef.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:4k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit CommonDef;
  2. //---------------------------------------------------------------------------
  3. // CommonDef.pas                                        Modified: 04-Jan-2007
  4. // Asphyre eXtreme II Common Framework definitions                Version 1.0
  5. //---------------------------------------------------------------------------
  6. // The contents of this file are subject to the Mozilla Public License
  7. // Version 1.1 (the "License"); you may not use this file except in
  8. // compliance with the License. You may obtain a copy of the License at
  9. // http://www.mozilla.org/MPL/
  10. //
  11. // Software distributed under the License is distributed on an "AS IS"
  12. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  13. // License for the specific language governing rights and limitations
  14. // under the License.
  15. //---------------------------------------------------------------------------
  16. interface
  17. //---------------------------------------------------------------------------
  18. function DisplaceRB(Color: Cardinal): Cardinal;
  19. procedure LineConvMasked(Source, Dest: Pointer; Count, Tolerance: Integer;
  20.  ColorMask: Cardinal);
  21. //---------------------------------------------------------------------------
  22. implementation
  23. //---------------------------------------------------------------------------
  24. type
  25.  PRealColor = ^TRealColor;
  26.  TRealColor = record
  27.   r, g, b, a: Real;
  28.  end;
  29. //---------------------------------------------------------------------------
  30. function DisplaceRB(Color: Cardinal): Cardinal;
  31. asm { params: eax, edx, ecx }
  32.  mov ecx, eax
  33.  mov edx, eax
  34.  and eax, 0FF00FF00h
  35.  and edx, 0000000FFh
  36.  shl edx, 16
  37.  or eax, edx
  38.  mov edx, ecx
  39.  shr edx, 16
  40.  and edx, 0000000FFh
  41.  or eax, edx
  42. end;
  43. //---------------------------------------------------------------------------
  44. function Color2Real(Color: Longword): TRealColor;
  45. begin
  46.  Result.r:= (Color and $FF) / 255.0;
  47.  Result.g:= ((Color shr 8) and $FF) / 255.0;
  48.  Result.b:= ((Color shr 16) and $FF) / 255.0;
  49.  Result.a:= ((Color shr 24) and $FF) / 255.0;
  50. end;
  51. //---------------------------------------------------------------------------
  52. function Real2Color(Pix: TRealColor): Longword;
  53. begin
  54.  Result:= Round(Pix.r * 255.0) + (Round(Pix.g * 255.0) shl 8) +
  55.   (Round(Pix.b * 255.0) shl 16) + (Round(Pix.a * 255.0) shl 24);
  56. end;
  57. //---------------------------------------------------------------------------
  58. function Linear2Sine(Alpha: Real): Real;
  59. const
  60.  PiHalf = Pi / 2.0;
  61. begin
  62.  Result:= (Sin((Alpha * Pi) - PiHalf) + 1.0) / 2.0;
  63. end;
  64. //---------------------------------------------------------------------------
  65. procedure LineConvMasked(Source, Dest: Pointer; Count, Tolerance: Integer;
  66.  ColorMask: Cardinal);
  67. const
  68.  Delta2Dist = 57.73502692;
  69.  DeltaMin = 0.025;
  70. var
  71.  InPx, OutPx: PLongword;
  72.  Color, cMask: TRealColor;
  73.  i: Integer;
  74.  Delta, DeltaMax: Real;
  75. begin
  76.  InPx:= Source;
  77.  OutPx:= Dest;
  78.  cMask:= Color2Real(DisplaceRB(ColorMask));
  79.  DeltaMax:= (Abs(Tolerance) / Delta2Dist) + DeltaMin;
  80.  for i:= 0 to Count - 1 do
  81.   begin
  82.    // retreive real color
  83.    Color:= Color2Real(DisplaceRB(InPx^));
  84.    // calculate the difference (in %)
  85.    Delta:= Sqrt(Sqr(Color.r - cMask.r) + Sqr(Color.g - cMask.g) + Sqr(Color.b - cMask.b));
  86.    // based on distance, find the specified alpha-channel
  87.    Color.a:= 1.0;
  88.    if (Delta <= DeltaMax) then
  89.     Color.a:= Linear2Sine(Delta / DeltaMax);
  90.    // write final pixel
  91.    OutPx^:= DisplaceRB(Real2Color(Color));
  92.    // advance in pixel list
  93.    Inc(InPx);
  94.    Inc(OutPx);
  95.   end;
  96. end;
  97. //---------------------------------------------------------------------------
  98. end.