Recent

Author Topic: [CLOSED] Improvement of TFPCustomImage.FindHandlerFromExtension  (Read 740 times)

lagprogramming

  • Sr. Member
  • ****
  • Posts: 407
packages/fcl-image/src/fpimage.inc has the following function:
Code: Pascal  [Select][+][-]
  1. class function TFPCustomImage.FindHandlerFromExtension(extension: String
  2.   ): TIHData;
  3. var s : string;
  4.     r : integer;
  5. begin
  6.   if extension='' then
  7.     Exit(nil);
  8.   extension := lowercase (extension);
  9.   if (extension <> '') and (extension[1] = '.') then
  10.     delete (extension,1,1);
  11.   with ImageHandlers do
  12.     begin
  13.       r := count-1;
  14.       s := dumchar  + extension + dumchar;
  15.       while (r >= 0) do
  16.         begin
  17.         Result := GetData(r);
  18.         if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
  19.           Exit;
  20.         dec (r);
  21.         end;
  22.     end;
  23.   Result := nil;
  24. end;
The patch at the end of the message changes the above code to
Code: Pascal  [Select][+][-]
  1. class function TFPCustomImage.FindHandlerFromExtension(extension: String
  2.   ): TIHData;
  3. var s : string;
  4.     r : integer;
  5. begin
  6.   if extension <> '' then
  7.     begin
  8.     extension := lowercase (extension);
  9.     if extension[1] = '.' then
  10.       delete (extension,1,1);
  11.     with ImageHandlers do
  12.       begin
  13.         r := count-1;
  14.         s := dumchar  + extension + dumchar;
  15.         while (r >= 0) do
  16.           begin
  17.           Result := GetData(r);
  18.           if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
  19.             Exit;
  20.           dec (r);
  21.           end;
  22.       end;
  23.     end;
  24.   Result := nil;
  25. end;


Code: Pascal  [Select][+][-]
  1. begin
  2.   if extension='' then
  3.     Exit(nil);
  4.   //CODE
  5.   Result := nil;
  6. end;
is changed to
Code: Pascal  [Select][+][-]
  1. begin
  2.   if extension<>'' then
  3.     begin
  4.     //CODE
  5.     end;
  6.   Result := nil;
  7. end;
and after that
Code: Pascal  [Select][+][-]
  1. if (extension <> '') and (extension[1] = '.') then
is replaced with
Code: Pascal  [Select][+][-]
  1. if extension[1] = '.' then

The modified pascal code avoids duplicate nil assignments to function's result and also avoids the duplicate check for a nil(empty) extension variable. Obviously, the compiler produces better code for the modified pascal sources than for the original.
I've tried to keep the original code formatting style, here is the patch.
Code: Pascal  [Select][+][-]
  1. diff --git a/packages/fcl-image/src/fpimage.inc b/packages/fcl-image/src/fpimage.inc
  2. index 531c4ec219..b4fb9dac24 100644
  3. --- a/packages/fcl-image/src/fpimage.inc
  4. +++ b/packages/fcl-image/src/fpimage.inc
  5. @@ -274,22 +274,23 @@ class function TFPCustomImage.FindHandlerFromExtension(extension: String
  6.  var s : string;
  7.      r : integer;
  8.  begin
  9. -  if extension='' then
  10. -    Exit(nil);
  11. -  extension := lowercase (extension);
  12. -  if (extension <> '') and (extension[1] = '.') then
  13. -    delete (extension,1,1);
  14. -  with ImageHandlers do
  15. +  if extension <> '' then
  16.      begin
  17. -      r := count-1;
  18. -      s := dumchar  + extension + dumchar;
  19. -      while (r >= 0) do
  20. -        begin
  21. -        Result := GetData(r);
  22. -        if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
  23. -          Exit;
  24. -        dec (r);
  25. -        end;
  26. +    extension := lowercase (extension);
  27. +    if extension[1] = '.' then
  28. +      delete (extension,1,1);
  29. +    with ImageHandlers do
  30. +      begin
  31. +        r := count-1;
  32. +        s := dumchar  + extension + dumchar;
  33. +        while (r >= 0) do
  34. +          begin
  35. +          Result := GetData(r);
  36. +          if (pos(s, dumchar+Result.Fextension+dumchar) <> 0) then
  37. +            Exit;
  38. +          dec (r);
  39. +          end;
  40. +      end;
  41.      end;
  42.    Result := nil;
  43.  end;
« Last Edit: July 13, 2023, 08:21:54 am by lagprogramming »

 

TinyPortal © 2005-2018