Ignore:
Timestamp:
Aug 27, 2010, 11:00:52 AM (11 years ago)
Author:
Silvan Scherrer
Message:

poppler update to 0.14.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/poppler/mypoppler/poppler/CairoFontEngine.cc

    r290 r461  
    1919// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
    2020// Copyright (C) 2005, 2009 Albert Astals Cid <aacid@kde.org>
    21 // Copyright (C) 2006, 2007 Carlos Garcia Campos <carlosgc@gnome.org>
     21// Copyright (C) 2006, 2007, 2010 Carlos Garcia Campos <carlosgc@gnome.org>
    2222// Copyright (C) 2007 Koji Otani <sho@bbr.jp>
    2323// Copyright (C) 2008, 2009 Chris Wilson <chris@chris-wilson.co.uk>
    2424// Copyright (C) 2008 Adrian Johnson <ajohnson@redneon.com>
    2525// Copyright (C) 2009 Darren Kenny <darren.kenny@sun.com>
     26// Copyright (C) 2010 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp>
     27// Copyright (C) 2010 Jan KÃŒmmel <jan+freedesktop@snorc.org>
    2628//
    2729// To see a description of the changes please see the Changelog file that
     
    165167_ft_new_face_uncached (FT_Library lib,
    166168                       const char *filename,
     169                       char *font_data,
     170                       int font_data_len,
    167171                       FT_Face *face_out,
    168172                       cairo_font_face_t **font_face_out)
     
    171175  cairo_font_face_t *font_face;
    172176
    173   if (FT_New_Face (lib, filename, 0, &face))
    174     return gFalse;
     177  if (font_data == NULL) {
     178    if (FT_New_Face (lib, filename, 0, &face))
     179      return gFalse;
     180  } else {
     181    if (FT_New_Memory_Face (lib, (unsigned char *)font_data, font_data_len, 0, &face))
     182      return gFalse;
     183  }
    175184
    176185  font_face = cairo_ft_font_face_create_for_ft_face (face,
     
    257266_ft_new_face (FT_Library lib,
    258267              const char *filename,
     268              char *font_data,
     269              int font_data_len,
    259270              FT_Face *face_out,
    260271              cairo_font_face_t **font_face_out)
     
    264275  struct _ft_face_data tmpl;
    265276
    266   /* if we fail to mmap the file, just pass it to FreeType instead */
    267   tmpl.fd = open (filename, O_RDONLY);
    268   if (tmpl.fd == -1)
    269     return _ft_new_face_uncached (lib, filename, face_out, font_face_out);
    270 
    271   if (fstat (tmpl.fd, &st) == -1) {
    272     close (tmpl.fd);
    273     return _ft_new_face_uncached (lib, filename, face_out, font_face_out);
    274   }
    275 
    276   tmpl.bytes = (unsigned char *) mmap (NULL, st.st_size,
    277                                        PROT_READ, MAP_PRIVATE,
    278                                        tmpl.fd, 0);
    279   if (tmpl.bytes == MAP_FAILED) {
    280     close (tmpl.fd);
    281     return _ft_new_face_uncached (lib, filename, face_out, font_face_out);
     277  tmpl.fd = -1;
     278
     279  if (font_data == NULL) {
     280    /* if we fail to mmap the file, just pass it to FreeType instead */
     281    tmpl.fd = open (filename, O_RDONLY);
     282    if (tmpl.fd == -1)
     283      return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out);
     284
     285    if (fstat (tmpl.fd, &st) == -1) {
     286      close (tmpl.fd);
     287      return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out);
     288    }
     289
     290    tmpl.bytes = (unsigned char *) mmap (NULL, st.st_size,
     291                                         PROT_READ, MAP_PRIVATE,
     292                                         tmpl.fd, 0);
     293    if (tmpl.bytes == MAP_FAILED) {
     294      close (tmpl.fd);
     295      return _ft_new_face_uncached (lib, filename, font_data, font_data_len, face_out, font_face_out);
     296    }
     297    tmpl.size = st.st_size;
     298  } else {
     299    tmpl.bytes = (unsigned char*) font_data;
     300    tmpl.size = font_data_len;
    282301  }
    283302
    284303  /* check to see if this is a duplicate of any of the currently open fonts */
    285304  tmpl.lib = lib;
    286   tmpl.size = st.st_size;
    287305  tmpl.hash = _djb_hash (tmpl.bytes, tmpl.size);
    288306
    289307  for (l = _ft_open_faces; l; l = l->next) {
    290308    if (_ft_face_data_equal (l, &tmpl)) {
     309      if (tmpl.fd != -1) {
     310#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4)
     311        munmap ((char*)tmpl.bytes, tmpl.size);
     312#else
     313        munmap (tmpl.bytes, tmpl.size);
     314#endif
     315        close (tmpl.fd);
     316      }
     317      *face_out = l->face;
     318      *font_face_out = cairo_font_face_reference (l->font_face);
     319      return gTrue;
     320    }
     321  }
     322
     323  /* not a dup, open and insert into list */
     324  if (FT_New_Memory_Face (lib,
     325                          (FT_Byte *) tmpl.bytes, tmpl.size,
     326                          0, &tmpl.face))
     327  {
     328    if (tmpl.fd != -1) {
    291329#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4)
    292330      munmap ((char*)tmpl.bytes, tmpl.size);
     
    294332      munmap (tmpl.bytes, tmpl.size);
    295333#endif
     334
    296335      close (tmpl.fd);
    297       *face_out = l->face;
    298       *font_face_out = cairo_font_face_reference (l->font_face);
    299       return gTrue;
    300     }
    301   }
    302 
    303   /* not a dup, open and insert into list */
    304   if (FT_New_Memory_Face (lib,
    305                           (FT_Byte *) tmpl.bytes, tmpl.size,
    306                           0, &tmpl.face))
    307   {
    308 #if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4)
    309     munmap ((char*)tmpl.bytes, tmpl.size);
    310 #else
    311     munmap (tmpl.bytes, tmpl.size);
    312 #endif
    313 
    314     close (tmpl.fd);
     336    }
    315337    return gFalse;
    316338  }
     
    347369CairoFreeTypeFont::CairoFreeTypeFont(Ref ref,
    348370                                     cairo_font_face_t *cairo_font_face,
    349                                      FT_Face face,
    350371                                     Gushort *codeToGID,
    351372                                     int codeToGIDLen,
     
    355376                                                                   codeToGIDLen,
    356377                                                                   substitute,
    357                                                                    gTrue),
    358                                                          face(face) { }
     378                                                                   gTrue) { }
    359379
    360380CairoFreeTypeFont::~CairoFreeTypeFont() { }
     
    364384  Ref embRef;
    365385  Object refObj, strObj;
    366   GooString *tmpFileName, *fileName;
     386  GooString *fileName;
     387  char *fileNameC;
     388  char *font_data;
     389  int font_data_len;
    367390  DisplayFontParam *dfp;
    368   FILE *tmpFile;
    369   int c, i, n;
     391  int i, n;
    370392  GfxFontType fontType;
    371393  char **enc;
     
    383405  codeToGID = NULL;
    384406  codeToGIDLen = 0;
     407  font_data = NULL;
     408  font_data_len = 0;
     409  fileName = NULL;
     410  fileNameC = NULL;
    385411
    386412  GBool substitute = gFalse;
     
    389415  fontType = gfxFont->getType();
    390416
    391   tmpFileName = NULL;
    392 
    393417  if (gfxFont->getEmbeddedFontID(&embRef)) {
    394     if (!openTempFile(&tmpFileName, &tmpFile, "wb")) {
    395       error(-1, "Couldn't create temporary font file");
     418    font_data = gfxFont->readEmbFontFile(xref, &font_data_len);
     419    if (NULL == font_data)
    396420      goto err2;
    397     }
    398    
    399     refObj.initRef(embRef.num, embRef.gen);
    400     refObj.fetch(xref, &strObj);
    401     refObj.free();
    402     if (!strObj.isStream()) {
    403       error(-1, "Embedded font object is wrong type");
    404       strObj.free();
    405       fclose(tmpFile);
    406       goto err2;
    407     }
    408     strObj.streamReset();
    409     while ((c = strObj.streamGetChar()) != EOF) {
    410       fputc(c, tmpFile);
    411     }
    412     strObj.streamClose();
    413     strObj.free();
    414     fclose(tmpFile);
    415     fileName = tmpFileName;
    416    
    417421  } else if (!(fileName = gfxFont->getExtFontFile())) {
    418422    // look for a display font mapping or a substitute font
     
    440444  }
    441445
     446  if (fileName != NULL) {
     447    fileNameC = fileName->getCString();
     448  }
     449
    442450  switch (fontType) {
    443451  case fontType1:
    444452  case fontType1C:
    445453  case fontType1COT:
    446     if (! _ft_new_face (lib, fileName->getCString(), &face, &font_face)) {
     454    if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) {
    447455      error(-1, "could not create type1 face");
    448456      goto err2;
     
    472480      }
    473481    } else {
    474       ff = FoFiTrueType::load(fileName->getCString());
     482      if (font_data != NULL) {
     483        ff = FoFiTrueType::make(font_data, font_data_len);
     484      } else {
     485        ff = FoFiTrueType::load(fileNameC);
     486      }
    475487      if (! ff)
    476488        goto err2;
     
    481493    /* Fall through */
    482494  case fontTrueType:
    483     if (!(ff = FoFiTrueType::load(fileName->getCString()))) {
     495    if (font_data != NULL) {
     496      ff = FoFiTrueType::make(font_data, font_data_len);
     497    } else {
     498      ff = FoFiTrueType::load(fileNameC);
     499    }
     500    if (! ff) {
    484501      error(-1, "failed to load truetype font\n");
    485502      goto err2;
     
    491508    }
    492509    delete ff;
    493     if (! _ft_new_face (lib, fileName->getCString(), &face, &font_face)) {
     510    if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) {
    494511      error(-1, "could not create truetype face\n");
    495512      goto err2;
     
    505522    if (!useCIDs)
    506523    {
    507       if ((ff1c = FoFiType1C::load(fileName->getCString()))) {
     524      if (font_data != NULL) {
     525        ff1c = FoFiType1C::make(font_data, font_data_len);
     526      } else {
     527        ff1c = FoFiType1C::load(fileNameC);
     528      }
     529      if (ff1c) {
    508530        codeToGID = ff1c->getCIDToGIDMap(&codeToGIDLen);
    509531        delete ff1c;
     
    511533    }
    512534
    513     if (! _ft_new_face (lib, fileName->getCString(), &face, &font_face)) {
     535    if (! _ft_new_face (lib, fileNameC, font_data, font_data_len, &face, &font_face)) {
    514536      gfree(codeToGID);
    515537      codeToGID = NULL;
     
    520542   
    521543  default:
    522     printf ("font type %d not handled\n", (int)fontType);
     544    fprintf (stderr, "font type %d not handled\n", (int)fontType);
    523545    goto err2;
    524546    break;
    525547  }
    526548
    527   // delete the (temporary) font file -- with Unix hard link
    528   // semantics, this will remove the last link; otherwise it will
    529   // return an error, leaving the file to be deleted later
    530   if (fileName == tmpFileName) {
    531     unlink (fileName->getCString());
    532     delete tmpFileName;
    533   }
    534 
    535549  return new CairoFreeTypeFont(ref,
    536                        font_face, face,
     550                       font_face,
    537551                       codeToGID, codeToGIDLen,
    538552                       substitute);
     
    540554 err2:
    541555  /* hmm? */
    542   printf ("some font thing failed\n");
     556  fprintf (stderr, "some font thing failed\n");
    543557  return NULL;
    544558}
Note: See TracChangeset for help on using the changeset viewer.