[Customdrawn] Rangecheck error

Michael Schnell mschnell at lumino.de
Tue Jul 3 12:00:47 CEST 2012


On 07/03/2012 10:48 AM, Felipe Monteiro de Carvalho wrote:
> Could you send me a patch? 
trying to remember which file(s) I modified ..... :-(
I'll try to look this up. (I'm not yet up to speed with svn but trying 
:-) ) ...

OK. See below. Not sure which changes in fact did the trick for the form 
and which were done trying to debug and to get e.g TLable running. And 
which might be shown due to me not merging and the repository getting 
changes.

I do remember the Get_Long / Get_ULong issue. Here I definitely found 
that the types Long and ULong were used in a sloppy way, resulting in a 
range check condition when an ULong value > $7FFFFFFF is assigned to a 
signed Long.

Similar with PtrInt vs THandle.

Maybe you want to take a look at my old posts on this in the this forum.....

-Michael

> TTInterp Line 481:
>     exc.opcode := exc.Code^[exc.IP];
> In which unit?
(*******************************************************************
  *
  *  TTInterp.pas                                              2.0
  *
  *  TrueType bytecode intepreter.
  *

IFAIR, all these range check problems are due to glitches in these Font 
related functions that seem to be implemented in a way that relies on 
range check beeing off. I don't think this is a good idea and I think 
that these issues should be fixed by using the correct types and/or 
explicit typecasts when appropriate.

-Michael

svn diff:
------------------------------------------------------------------------
--- components/lazutils/ttload.pas      (revision 37854)
+++ components/lazutils/ttload.pas      (working copy)
@@ -56,6 +56,8 @@

  implementation

+{$R-}
+
  uses TTError, TTMemory, TTFile;

    (* Composite glyph decoding flags *)
@@ -248,25 +250,27 @@
        exit;
      end;

-    with face^ do
-    begin
+//    with face^ do
+//    begin

-      numTables := tableDir.numTables;
+      face^.numTables := tableDir.numTables;

-      if Alloc( dirTables, numTables * sizeof( TTableDirEntry ) ) or
-         TT_Access_Frame( 16 * numTables ) then exit;
+      if Alloc( face^.dirTables, face^.numTables * sizeof( 
TTableDirEntry ) ) or
+         TT_Access_Frame( 16 * face^.numTables ) then exit;

-      for n := 0 to numTables-1 do with dirTables^[n] do
+      for n := 0 to face^.numTables-1 do
        begin
-        Tag        := GET_ULong;
-        Checksum   := GET_ULong;
-        Offset     := GET_Long;
-        Length     := Get_Long;
+        face^.dirTables^[n].Tag        := GET_ULong;
+        face^.dirTables^[n].Checksum   := GET_ULong;
+//        face^.dirTables^[n].Tag        := GET_Long;
+//        face^.dirTables^[n].Checksum   := GET_Long;
+        face^.dirTables^[n].Offset     := GET_Long;
+        face^.dirTables^[n].Length     := Get_Long;
        end;

        TT_Forget_Frame;

-   end;
+//   end;

     {$IFDEF FREETYPE_DEBUG} Writeln('loaded'); {$ENDIF}

Index: components/lazutils/lazfreetype.pas
===================================================================
--- components/lazutils/lazfreetype.pas (revision 37854)
+++ components/lazutils/lazfreetype.pas (working copy)
@@ -464,6 +464,8 @@
    TTGLoad,
    TTRaster;

+{$R-}
+
(*****************************************************************)
(* *)
(* *)
Index: components/lazutils/ttobjs.pas
===================================================================
--- components/lazutils/ttobjs.pas      (revision 37854)
+++ components/lazutils/ttobjs.pas      (working copy)
@@ -796,6 +796,8 @@



+{$R-}
+
  const
    objs_face_class     : TCache_Class
                        = (object_size: sizeof(TFace);
Index: components/lazutils/ttmemory.pas
===================================================================
--- components/lazutils/ttmemory.pas    (revision 37854)
+++ components/lazutils/ttmemory.pas    (working copy)
@@ -64,6 +64,7 @@

  uses TTTypes;

+{$R-}
  {$I TTCONFIG.INC}

  type
Index: components/lazutils/ttfile.pas
===================================================================
--- components/lazutils/ttfile.pas      (revision 37854)
+++ components/lazutils/ttfile.pas      (working copy)
@@ -48,6 +48,8 @@

  {$I TTCONFIG.INC}

+{$R-}
+
  uses TTTypes,
       TTError;

Index: lcl/interfaces/customdrawn/customdrawndefines.inc
===================================================================
--- lcl/interfaces/customdrawn/customdrawndefines.inc   (revision 37854)
+++ lcl/interfaces/customdrawn/customdrawndefines.inc   (working copy)
@@ -3,6 +3,12 @@
  {$modeswitch objectivec1}{$H+}// modeswitch seams to deactivate H+
  {$endif}

+
+
+{$define CD_Debug_TTF}
+
+
+
  // For now default to Android for arm-linux,
  // because LCL-CustomDrawn is our main Android widgetset.
  // Remove this when Android gets it's own target
Index: lcl/interfaces/fpgui/fpguiobject.inc
===================================================================
--- lcl/interfaces/fpgui/fpguiobject.inc        (revision 37854)
+++ lcl/interfaces/fpgui/fpguiobject.inc        (working copy)
@@ -150,7 +150,7 @@
  begin
    Timer := TFPGUITimer.Create(Interval, TimerFunc);

-  Result := PtrInt(Timer);
+  Result := THandle(Timer);
  end;

  {------------------------------------------------------------------------------

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus-ide.org/pipermail/customdrawn/attachments/20120703/f78bcad6/attachment-0002.html>


More information about the Customdrawn mailing list