1 /*
2 
3 Copyright 1991, 1998  The Open Group
4 
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
9 documentation.
10 
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 
21 Except as contained in this notice, the name of The Open Group shall not be
22 used in advertising or otherwise to promote the sale, use or other dealings
23 in this Software without prior written authorization from The Open Group.
24 
25 */
26 
27 /*
28  * Author:  Keith Packard, MIT X Consortium
29  */
30 
31 #ifdef HAVE_CONFIG_H
32 #include <config.h>
33 #endif
34 #include "libxfontint.h"
35 #include "src/util/replace.h"
36 #include <X11/fonts/fntfilst.h>
37 
38 BitmapSourcesRec	FontFileBitmapSources;
39 
40 Bool
FontFileRegisterBitmapSource(FontPathElementPtr fpe)41 FontFileRegisterBitmapSource (FontPathElementPtr fpe)
42 {
43     FontPathElementPtr	*new;
44     int			i;
45     int			newsize;
46 
47     for (i = 0; i < FontFileBitmapSources.count; i++)
48 	if (FontFileBitmapSources.fpe[i] == fpe)
49 	    return TRUE;
50     if (FontFileBitmapSources.count == FontFileBitmapSources.size)
51     {
52 	newsize = FontFileBitmapSources.size + 4;
53 	new = reallocarray (FontFileBitmapSources.fpe, newsize, sizeof *new);
54 	if (!new)
55 	    return FALSE;
56 	FontFileBitmapSources.size = newsize;
57 	FontFileBitmapSources.fpe = new;
58     }
59     FontFileBitmapSources.fpe[FontFileBitmapSources.count++] = fpe;
60     return TRUE;
61 }
62 
63 void
FontFileUnregisterBitmapSource(FontPathElementPtr fpe)64 FontFileUnregisterBitmapSource (FontPathElementPtr fpe)
65 {
66     int	    i;
67 
68     for (i = 0; i < FontFileBitmapSources.count; i++)
69 	if (FontFileBitmapSources.fpe[i] == fpe)
70 	{
71 	    FontFileBitmapSources.count--;
72 	    if (FontFileBitmapSources.count == 0)
73 	    {
74 		FontFileBitmapSources.size = 0;
75 		free (FontFileBitmapSources.fpe);
76 		FontFileBitmapSources.fpe = 0;
77 	    }
78 	    else
79 	    {
80 	    	for (; i < FontFileBitmapSources.count; i++)
81 		    FontFileBitmapSources.fpe[i] = FontFileBitmapSources.fpe[i+1];
82 	    }
83 	    break;
84 	}
85 }
86 
87 /*
88  * Our set_path_hook: unregister all bitmap sources.
89  * This is necessary because already open fonts will keep their FPEs
90  * allocated, but they may not be on the new font path.
91  * The bitmap sources in the new path will be registered by the init_func.
92  */
93 void
FontFileEmptyBitmapSource(void)94 FontFileEmptyBitmapSource(void)
95 {
96     if (FontFileBitmapSources.count == 0)
97 	return;
98 
99     FontFileBitmapSources.count = 0;
100     FontFileBitmapSources.size = 0;
101     free (FontFileBitmapSources.fpe);
102     FontFileBitmapSources.fpe = 0;
103 }
104 
105 int
FontFileMatchBitmapSource(FontPathElementPtr fpe,FontPtr * pFont,int flags,FontEntryPtr entry,FontNamePtr zeroPat,FontScalablePtr vals,fsBitmapFormat format,fsBitmapFormatMask fmask,Bool noSpecificSize)106 FontFileMatchBitmapSource (FontPathElementPtr fpe,
107 			   FontPtr *pFont,
108 			   int flags,
109 			   FontEntryPtr entry,
110 			   FontNamePtr zeroPat,
111 			   FontScalablePtr vals,
112 			   fsBitmapFormat format,
113 			   fsBitmapFormatMask fmask,
114 			   Bool noSpecificSize)
115 {
116     int			source;
117     FontEntryPtr	zero;
118     FontBitmapEntryPtr	bitmap;
119     int			ret;
120     FontDirectoryPtr	dir;
121     FontScaledPtr	scaled;
122 
123     /*
124      * Look through all the registered bitmap sources for
125      * the same zero name as ours; entries along that one
126      * can be scaled as desired.
127      */
128     ret = BadFontName;
129     for (source = 0; source < FontFileBitmapSources.count; source++)
130     {
131     	if (FontFileBitmapSources.fpe[source] == fpe)
132 	    continue;
133 	dir = (FontDirectoryPtr) FontFileBitmapSources.fpe[source]->private;
134 	zero = FontFileFindNameInDir (&dir->scalable, zeroPat);
135 	if (!zero)
136 	    continue;
137     	scaled = FontFileFindScaledInstance (zero, vals, noSpecificSize);
138     	if (scaled)
139     	{
140 	    if (scaled->pFont)
141 	    {
142 		*pFont = scaled->pFont;
143 		(*pFont)->fpe = FontFileBitmapSources.fpe[source];
144 		ret = Successful;
145 	    }
146 	    else if (scaled->bitmap)
147 	    {
148 		entry = scaled->bitmap;
149 		bitmap = &entry->u.bitmap;
150 		if (bitmap->pFont)
151 		{
152 		    *pFont = bitmap->pFont;
153 		    (*pFont)->fpe = FontFileBitmapSources.fpe[source];
154 		    ret = Successful;
155 		}
156 		else
157 		{
158 		    ret = FontFileOpenBitmap (
159 				FontFileBitmapSources.fpe[source],
160 				pFont, flags, entry, format, fmask);
161 		    if (ret == Successful && *pFont)
162 			(*pFont)->fpe = FontFileBitmapSources.fpe[source];
163 		}
164 	    }
165 	    else /* "cannot" happen */
166 	    {
167 		ret = BadFontName;
168 	    }
169 	    break;
170     	}
171     }
172     return ret;
173 }
174