On November 24, 2002 02:06 pm, Derick Rethans wrote:
> On Sun, 24 Nov 2002, Ilia Alshanetsky wrote:
> > iliaa               Sat Nov 23 20:15:35 2002 EDT
> >
> >   Modified files:
> >     /php4/ext/gd/libgd      gdft.c
> >   Log:
> >   Fixed 3 memory leaks.
> >   Formatted the code to meet PHP's coding standards, which makes it MUCH
> > easier to understand.
>
> But it also makes back porting patched to the real GD _much_ harder, and
> that's why we didn't change the coding style yet AFAIK.
>

The bundled GD has already undergone a number of major modifications and as we 
implement the PHP memory wrappers around memory allocation & handling that 
difference will only increase. GD 2.0.4 and later already differ 
significantly because the code has been 'cleaned-up' by the gd authors, so I 
do not believe this is a big concern. On the plus side by increasing the 
readability of the code it would be possible to easily to port a few changes 
that do happen. As we speak, I am working on porting gd 2.0.7 code changes to 
2.0.4 and I can tell you doing diff + patch does not work @ all, beyond very 
small chucks of code.

Ilia

> Derick
>
> > Index: php4/ext/gd/libgd/gdft.c
> > diff -u php4/ext/gd/libgd/gdft.c:1.13 php4/ext/gd/libgd/gdft.c:1.14
> > --- php4/ext/gd/libgd/gdft.c:1.13   Sun Nov 17 14:45:10 2002
> > +++ php4/ext/gd/libgd/gdft.c        Sat Nov 23 20:15:34 2002
> > @@ -330,153 +330,147 @@
> >    return (strcmp (a->fontlist, b->fontlist) == 0);
> >  }
> >
> > -static void *
> > -fontFetch (char **error, void *key)
> > +static void *fontFetch (char **error, void *key)
> >  {
> > -  font_t *a;
> > -  fontkey_t *b = (fontkey_t *) key;
> > -  int n;
> > -  int font_found = 0;
> > -  unsigned short platform, encoding;
> > -  char *fontsearchpath, *fontlist;
> > -  char *fullname = NULL;
> > -  char *name, *path, *dir;
> > -  char *strtok_ptr;
> > -  FT_Error err;
> > -  FT_CharMap found = 0;
> > -  FT_CharMap charmap;
> > -
> > -  a = (font_t *) gdMalloc (sizeof (font_t));
> > -  a->fontlist = gdEstrdup (b->fontlist);
> > -  a->library = b->library;
> > -
> > -  /*
> > -   * Search the pathlist for any of a list of font names.
> > -   */
> > -  fontsearchpath = getenv ("GDFONTPATH");
> > -  if (!fontsearchpath)
> > -    fontsearchpath = DEFAULT_FONTPATH;
> > -  fontlist = gdEstrdup (a->fontlist);
> > -
> > -  /*
> > -   * Must use gd_strtok_r else pointer corrupted by strtok in nested
> > loop. -   */
> > -  for (name = gd_strtok_r (fontlist, LISTSEPARATOR, &strtok_ptr); name;
> > -       name = gd_strtok_r (0, LISTSEPARATOR, &strtok_ptr))
> > -    {
> > -
> > -      /* make a fresh copy each time - strtok corrupts it. */
> > -      path = gdEstrdup (fontsearchpath);
> > -      /*
> > -       * Allocate an oversized buffer that is guaranteed to be
> > -       * big enough for all paths to be tested.
> > -       */
> > -      fullname = gdRealloc (fullname,
> > -                       strlen (fontsearchpath) + strlen (name) + 6);
> > -      /* if name is an absolute filename then test directly */
> > -      if (*name == '/' || (name[0] != 0 && name[1] == ':' && (name[2] ==
> > '/' || name[2] == '\\'))) - {
> > -     sprintf (fullname, "%s", name);
> > -     if (access (fullname, R_OK) == 0)
> > -       {
> > -         font_found++;
> > -         break;
> > -       }
> > -   }
> > -      for (dir = strtok (path, PATHSEPARATOR); dir;
> > -      dir = strtok (0, PATHSEPARATOR))
> > -   {
> > -     sprintf (fullname, "%s/%s.ttf", dir, name);
> > -     if (access (fullname, R_OK) == 0)
> > -       {
> > -         font_found++;
> > -         break;
> > -       }
> > -          sprintf (fullname, "%s/%s.pfa", dir, name);
> > -          if (access (fullname, R_OK) == 0)
> > -            {
> > -         font_found++;
> > -         break;
> > -   }
> > -     sprintf (fullname, "%s/%s.pfb", dir, name);
> > -     if (access (fullname, R_OK) == 0)
> > -       {
> > -         font_found++;
> > -   break;
> > -    }
> > -   }
> > -  gdFree (path);
> > -      if (font_found)
> > -   break;
> > -  }
> > -  gdFree (fontlist);
> > -  if (!font_found)
> > -    {
> > -      *error = "Could not find/open font";
> > -      return NULL;
> > -    }
> > -
> > -  err = FT_New_Face (*b->library, fullname, 0, &a->face);
> > -  if (err)
> > -    {
> > -      *error = "Could not read font";
> > -      return NULL;
> > -    }
> > -  gdFree (fullname);
> > -
> > -/* FIXME - This mapping stuff is imcomplete - where is the spec? */
> > -
> > -  a->have_char_map_unicode = 0;
> > -  a->have_char_map_big5 = 0;
> > -  a->have_char_map_sjis = 0;
> > -  a->have_char_map_apple_roman = 0;
> > -  for (n = 0; n < a->face->num_charmaps; n++)
> > -    {
> > -      charmap = a->face->charmaps[n];
> > -      platform = charmap->platform_id;
> > -      encoding = charmap->encoding_id;
> > -      if ((platform == 3 && encoding == 1) /* Windows Unicode */
> > -     || (platform == 3 && encoding == 0)   /* Windows Symbol */
> > -     || (platform == 2 && encoding == 1)   /* ISO Unicode */
> > -     || (platform == 0))
> > -   {                       /* Apple Unicode */
> > -     a->have_char_map_unicode = 1;
> > -     found = charmap;
> > -   }
> > -      else if (platform == 3 && encoding == 4)
> > -   {                       /* Windows Big5 */
> > -     a->have_char_map_big5 = 1;
> > -     found = charmap;
> > -   }
> > -      else if (platform == 3 && encoding == 2)
> > -   {                       /* Windows Sjis */
> > -     a->have_char_map_sjis = 1;
> > -     found = charmap;
> > -   }
> > -      else if ((platform == 1 && encoding == 0)            /* Apple Roman */
> > -          || (platform == 2 && encoding == 0))
> > -   {                       /* ISO ASCII */
> > -     a->have_char_map_apple_roman = 1;
> > -     found = charmap;
> > -   }
> > -    }
> > -  if (!found)
> > -    {
> > -      *error = "Unable to find a CharMap that I can handle";
> > -      return NULL;
> > -    }
> > +   font_t *a;
> > +   fontkey_t *b = (fontkey_t *) key;
> > +   int n;
> > +   int font_found = 0;
> > +   unsigned short platform, encoding;
> > +   char *fontsearchpath, *fontlist;
> > +   char *fullname = NULL;
> > +   char *name, *path=NULL, *dir;
> > +   char *strtok_ptr;
> > +   FT_Error err;
> > +   FT_CharMap found = 0;
> > +   FT_CharMap charmap;
> > +
> > +   a = (font_t *) gdPMalloc(sizeof(font_t));
> > +   a->fontlist = gdPEstrdup(b->fontlist);
> > +   a->library = b->library;
> > +
> > +   /*
> > +    * Search the pathlist for any of a list of font names.
> > +    */
> > +   fontsearchpath = getenv ("GDFONTPATH");
> > +   if (!fontsearchpath) {
> > +           fontsearchpath = DEFAULT_FONTPATH;
> > +   }
> > +   fontlist = gdEstrdup(a->fontlist);
> > +
> > +   /*
> > +    * Must use gd_strtok_r else pointer corrupted by strtok in nested
> > loop. +      */
> > +   for (name = gd_strtok_r (fontlist, LISTSEPARATOR, &strtok_ptr); name;
> > name = gd_strtok_r (0, LISTSEPARATOR, &strtok_ptr)) { +             /* make a fresh
> > copy each time - strtok corrupts it. */
> > +           path = gdEstrdup (fontsearchpath);
> > +
> > +           /*
> > +           * Allocate an oversized buffer that is guaranteed to be
> > +           * big enough for all paths to be tested.
> > +           */
> > +           fullname = gdRealloc (fullname, strlen (fontsearchpath) + strlen
> > (name) + 6); +
> > +           /* if name is an absolute filename then test directly */
> > +           if (*name == '/' || (name[0] != 0 && name[1] == ':' && (name[2] == '/'
> > || name[2] == '\\'))) { +                   sprintf(fullname, "%s", name);
> > +                   if (access(fullname, R_OK) == 0) {
> > +                           font_found++;
> > +                           break;
> > +                   }
> > +           }
> > +           for (dir = strtok (path, PATHSEPARATOR); dir; dir = strtok (0,
> > PATHSEPARATOR)) { +                 sprintf(fullname, "%s/%s.ttf", dir, name);
> > +                   if (access (fullname, R_OK) == 0) {
> > +                           font_found++;
> > +                           break;
> > +                   }
> > +                   sprintf(fullname, "%s/%s.pfa", dir, name);
> > +                   if (access(fullname, R_OK) == 0) {
> > +                           font_found++;
> > +                           break;
> > +                   }
> > +                   sprintf (fullname, "%s/%s.pfb", dir, name);
> > +                   if (access(fullname, R_OK) == 0) {
> > +                           font_found++;
> > +                           break;
> > +                   }
> > +           }
> > +           gdFree(path);
> > +           if (font_found) {
> > +                   break;
> > +           }
> > +   }
> > +
> > +   if (path) {
> > +           gdFree(path);
> > +   }
> > +
> > +   gdFree(fontlist);
> > +
> > +   if (!font_found) {
> > +           gdPFree(a->fontlist);
> > +           gdPFree(a);
> > +           *error = "Could not find/open font";
> > +           return NULL;
> > +   }
> > +
> > +   err = FT_New_Face (*b->library, fullname, 0, &a->face);
> > +   if (err) {
> > +           gdPFree(a->fontlist);
> > +           gdPFree(a);
> > +           *error = "Could not read font";
> > +           return NULL;
> > +   }
> > +   gdFree(fullname);
> > +
> > +   /* FIXME - This mapping stuff is imcomplete - where is the spec? */
> > +
> > +   a->have_char_map_unicode = 0;
> > +   a->have_char_map_big5 = 0;
> > +   a->have_char_map_sjis = 0;
> > +   a->have_char_map_apple_roman = 0;
> > +   for (n = 0; n < a->face->num_charmaps; n++) {
> > +           charmap = a->face->charmaps[n];
> > +           platform = charmap->platform_id;
> > +           encoding = charmap->encoding_id;
> > +           if ((platform == 3 && encoding == 1)            /* Windows Unicode */
> > +                   || (platform == 3 && encoding == 0)     /* Windows Symbol */
> > +                   || (platform == 2 && encoding == 1)     /* ISO Unicode */
> > +                   || (platform == 0))
> > +           {                                               /* Apple Unicode */
> > +                   a->have_char_map_unicode = 1;
> > +                   found = charmap;
> > +           } else if (platform == 3 && encoding == 4) {    /* Windows Big5 */
> > +                   a->have_char_map_big5 = 1;
> > +                   found = charmap;
> > +           } else if (platform == 3 && encoding == 2) {    /* Windows Sjis */
> > +                   a->have_char_map_sjis = 1;
> > +                   found = charmap;
> > +           } else if ((platform == 1 && encoding == 0)     /* Apple Roman */
> > +                   || (platform == 2 && encoding == 0))
> > +           {                                               /* ISO ASCII */
> > +                   a->have_char_map_apple_roman = 1;
> > +                   found = charmap;
> > +           }
> > +   }
> > +   if (!found) {
> > +           gdPFree(a->fontlist);
> > +           gdPFree(a);
> > +           *error = "Unable to find a CharMap that I can handle";
> > +           return NULL;
> > +   }
> >
> > -  return (void *) a;
> > +   return (void *) a;
> >  }
> >
> > -static void
> > -fontRelease (void *element)
> > +static void fontRelease (void *element)
> >  {
> > -  font_t *a = (font_t *) element;
> > +   font_t *a = (font_t *) element;
> >
> > -  FT_Done_Face (a->face);
> > -  gdFree (a->fontlist);
> > -  gdFree ((char *) element);
> > +   FT_Done_Face (a->face);
> > +   gdPFree(a->fontlist);
> > +   gdPFree((char *) element);
> >  }
> >
> >  /********************************************************************/
> >
> >
> >
> > --
> > PHP CVS Mailing List (http://www.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to