Author: fschmid
Date: Sun Nov 24 10:46:40 2013
New Revision: 18596

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=18596
Log:
Adding a new function to ScFonts to load a font from a file temporary.

Modified:
    trunk/Scribus/scribus/scfonts.cpp
    trunk/Scribus/scribus/scfonts.h

Modified: trunk/Scribus/scribus/scfonts.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=18596&path=/trunk/Scribus/scribus/scfonts.cpp
==============================================================================
--- trunk/Scribus/scribus/scfonts.cpp (original)
+++ trunk/Scribus/scribus/scfonts.cpp Sun Nov 24 10:46:40 2013
@@ -302,6 +302,148 @@
                // TODO: CID or no
        }
 } 
+
+ScFace SCFonts::LoadScalableFont(const QString &filename)
+{
+       ScFace t;
+       if (filename.isEmpty())
+               return t;
+       FT_Library library = NULL;
+       bool error;
+       error = FT_Init_FreeType( &library );
+       QFileInfo fi(filename);
+       if (!fi.exists())
+               return t;
+       bool Subset = false;
+       char *buf[50];
+       QString glyName = "";
+       ScFace::FontFormat format;
+       ScFace::FontType   type;
+       FT_Face         face = NULL;
+       error = FT_New_Face(library, QFile::encodeName(filename), 0, &face);
+       if (error)
+       {
+               if (face != NULL)
+                       FT_Done_Face(face);
+               FT_Done_FreeType( library );
+               return t;
+       }
+       getFontFormat(face, format, type);
+       if (format == ScFace::UNKNOWN_FORMAT)
+       {
+               if (face != NULL)
+                       FT_Done_Face(face);
+               FT_Done_FreeType( library );
+               return t;
+       }
+       bool HasNames = FT_HAS_GLYPH_NAMES(face);
+       if (!error)
+       {
+               FT_UInt gindex = 0;
+               FT_ULong charcode = FT_Get_First_Char( face, &gindex );
+               while ( gindex != 0 )
+               {
+                       error = FT_Load_Glyph( face, gindex, FT_LOAD_NO_SCALE | 
FT_LOAD_NO_BITMAP );
+                       if (error)
+                       {
+                               if (face != NULL)
+                                       FT_Done_Face( face );
+                               FT_Done_FreeType( library );
+                               return t;
+                       }
+                       FT_Get_Glyph_Name(face, gindex, buf, 50);
+                       QString newName = QString(reinterpret_cast<char*>(buf));
+                       if (newName == glyName)
+                       {
+                               HasNames = false;
+                               Subset = true;
+                       }
+                       glyName = newName;
+                       charcode = FT_Get_Next_Char( face, charcode, &gindex );
+               }
+       }
+       int faceindex=0;
+       QString fam(face->family_name);
+       QString sty(face->style_name);
+       if (sty == "Regular")
+       {
+               switch (face->style_flags)
+               {
+                       case 0:
+                               break;
+                       case 1:
+                               sty = "Italic";
+                               break;
+                       case 2:
+                               sty = "Bold";
+                               break;
+                       case 3:
+                               sty = "Bold Italic";
+                               break;
+                       default:
+                               break;
+               }
+       }
+       QString ts(fam + " " + sty);
+       const char* psName = FT_Get_Postscript_Name(face);
+       QString qpsName;
+       if (psName)
+               qpsName = QString(psName);
+       else
+               qpsName = ts;
+       if (t.isNone())
+       {
+               switch (format)
+               {
+                       case ScFace::PFA:
+                               t = ScFace(new ScFace_pfa(fam, sty, "", ts, 
qpsName, filename, faceindex));
+                               t.subset(Subset);
+                               break;
+                       case ScFace::PFB:
+                               t = ScFace(new ScFace_pfb(fam, sty, "", ts, 
qpsName, filename, faceindex));
+                               t.subset(Subset);
+                               break;
+                       case ScFace::SFNT:
+                               t = ScFace(new ScFace_ttf(fam, sty, "", ts, 
qpsName, filename, faceindex));
+                               getSFontType(face, t.m->typeCode);
+                               if (t.type() == ScFace::OTF)
+                                       t.subset(true);
+                               else
+                                       t.subset(Subset);
+                               break;
+                       case ScFace::TTCF:
+                               t = ScFace(new ScFace_ttf(fam, sty, "", ts, 
qpsName, filename, faceindex));
+                               t.m->formatCode = ScFace::TTCF;
+                               t.m->typeCode = ScFace::TTF;
+                               if (t.type() == ScFace::OTF)
+                                       t.subset(true);
+                               else
+                                       t.subset(Subset);
+                               break;
+                       case ScFace::TYPE42:
+                               t = ScFace(new ScFace_ttf(fam, sty, "", ts, 
qpsName, filename, faceindex));
+                               getSFontType(face, t.m->typeCode);
+                               if (t.type() == ScFace::OTF)
+                                       t.subset(true);
+                               else
+                                       t.subset(Subset);
+                               break;
+                       default:
+                       /* catching any types not handled above to silence 
compiler */
+                               break;
+               }
+               t.m->hasNames = HasNames;
+               t.embedPs(true);
+               t.usable(true);
+               t.m->status = ScFace::UNKNOWN;
+               if (face->num_glyphs > 2048)
+                       t.subset(true);
+       }
+       setBestEncoding(face);
+       FT_Done_Face(face);
+       FT_Done_FreeType( library );
+       return t;
+}
 
 // Load a single font into the library from the passed filename. Returns true 
on error.
 bool SCFonts::AddScalableFont(QString filename, FT_Library &library, QString 
DocName)

Modified: trunk/Scribus/scribus/scfonts.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=18596&path=/trunk/Scribus/scribus/scfonts.h
==============================================================================
--- trunk/Scribus/scribus/scfonts.h (original)
+++ trunk/Scribus/scribus/scfonts.h Sun Nov 24 10:46:40 2013
@@ -40,6 +40,7 @@
                ~SCFonts();
                void updateFontMap();
                void GetFonts(QString pf, bool showFontInfo=false);
+               ScFace LoadScalableFont(const QString &filename);
                void AddScalableFonts(const QString& path, QString DocName = 
"");
                /// Returns a font with that name; creates a replacement font 
if not found
                const ScFace& findFont(const QString& fontName, ScribusDoc* doc 
= NULL);


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to