]> git.sesse.net Git - rdpsrv/blobdiff - Xserver/lib/font/fontfile/bitsource.c
Import X server from vnc-3.3.7.
[rdpsrv] / Xserver / lib / font / fontfile / bitsource.c
diff --git a/Xserver/lib/font/fontfile/bitsource.c b/Xserver/lib/font/fontfile/bitsource.c
new file mode 100644 (file)
index 0000000..83ec51c
--- /dev/null
@@ -0,0 +1,173 @@
+/* $XConsortium: bitsource.c,v 1.9 94/04/17 20:16:59 gildea Exp $ */
+
+/*
+
+Copyright (c) 1991  X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the X Consortium.
+
+*/
+
+/*
+ * Author:  Keith Packard, MIT X Consortium
+ */
+
+#include "fntfilst.h"
+
+BitmapSourcesRec       FontFileBitmapSources;
+
+Bool
+FontFileRegisterBitmapSource (fpe)
+    FontPathElementPtr fpe;
+{
+    FontPathElementPtr *new;
+    int                        i;
+    int                        newsize;
+
+    for (i = 0; i < FontFileBitmapSources.count; i++)
+       if (FontFileBitmapSources.fpe[i] == fpe)
+           return TRUE;
+    if (FontFileBitmapSources.count == FontFileBitmapSources.size)
+    {
+       newsize = FontFileBitmapSources.size + 4;
+       new = (FontPathElementPtr *) xrealloc (FontFileBitmapSources.fpe, newsize * sizeof *new);
+       if (!new)
+           return FALSE;
+       FontFileBitmapSources.size = newsize;
+       FontFileBitmapSources.fpe = new;
+    }
+    FontFileBitmapSources.fpe[FontFileBitmapSources.count++] = fpe;
+    return TRUE;
+}
+
+void
+FontFileUnregisterBitmapSource (fpe)
+    FontPathElementPtr fpe;
+{
+    int            i;
+
+    for (i = 0; i < FontFileBitmapSources.count; i++)
+       if (FontFileBitmapSources.fpe[i] == fpe)
+       {
+           FontFileBitmapSources.count--;
+           if (FontFileBitmapSources.count == 0)
+           {
+               FontFileBitmapSources.size = 0;
+               xfree (FontFileBitmapSources.fpe);
+               FontFileBitmapSources.fpe = 0;
+           }
+           else
+           {
+               for (; i < FontFileBitmapSources.count; i++)
+                   FontFileBitmapSources.fpe[i] = FontFileBitmapSources.fpe[i+1];
+           }
+           break;
+       }
+}
+
+/*
+ * Our set_path_hook: unregister all bitmap sources.
+ * This is necessary because already open fonts will keep their FPEs
+ * allocated, but they may not be on the new font path.
+ * The bitmap sources in the new path will be registered by the init_func.
+ */
+void
+FontFileEmptyBitmapSource()
+{
+    if (FontFileBitmapSources.count == 0)
+       return;
+
+    FontFileBitmapSources.count = 0;
+    FontFileBitmapSources.size = 0;
+    xfree (FontFileBitmapSources.fpe);
+    FontFileBitmapSources.fpe = 0;
+}
+
+FontFileMatchBitmapSource (fpe, pFont, flags, entry, zeroPat, vals, format, fmask, noSpecificSize)
+    FontPathElementPtr fpe;
+    FontPtr            *pFont;
+    int                        flags;
+    FontEntryPtr       entry;
+    FontNamePtr                zeroPat;
+    FontScalablePtr    vals;
+    fsBitmapFormat     format;
+    fsBitmapFormatMask fmask;
+    Bool               noSpecificSize;
+{
+    int                        source;
+    FontEntryPtr       zero;
+    FontBitmapEntryPtr bitmap;
+    int                        ret;
+    FontDirectoryPtr   dir;
+    FontScaledPtr      scaled;
+
+    /*
+     * Look through all the registered bitmap sources for
+     * the same zero name as ours; entries along that one
+     * can be scaled as desired.
+     */
+    ret = BadFontName;
+    for (source = 0; source < FontFileBitmapSources.count; source++)
+    {
+       if (FontFileBitmapSources.fpe[source] == fpe)
+           continue;
+       dir = (FontDirectoryPtr) FontFileBitmapSources.fpe[source]->private;
+       zero = FontFileFindNameInDir (&dir->scalable, zeroPat);
+       if (!zero)
+           continue;
+       scaled = FontFileFindScaledInstance (zero, vals, noSpecificSize);
+       if (scaled)
+       {
+           if (scaled->pFont)
+           {
+               *pFont = scaled->pFont;
+               (*pFont)->fpe = FontFileBitmapSources.fpe[source];
+               ret = Successful;
+           }
+           else if (scaled->bitmap)
+           {
+               entry = scaled->bitmap;
+               bitmap = &entry->u.bitmap;
+               if (bitmap->pFont)
+               {
+                   *pFont = bitmap->pFont;
+                   (*pFont)->fpe = FontFileBitmapSources.fpe[source];
+                   ret = Successful;
+               }
+               else
+               {
+                   ret = FontFileOpenBitmap (
+                               FontFileBitmapSources.fpe[source],
+                               pFont, flags, entry, format, fmask);
+                   if (ret == Successful && *pFont)
+                       (*pFont)->fpe = FontFileBitmapSources.fpe[source];
+               }
+           }
+           else /* "cannot" happen */
+           {
+               ret = BadFontName;
+           }
+           break;
+       }
+    }
+    return ret;
+}