1078 lines
39 KiB
C
1078 lines
39 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these librararies and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: Font.c /main/11 1996/04/13 11:54:17 ageorge $ */
|
|
/************************************<+>*************************************
|
|
****************************************************************************
|
|
**
|
|
** (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 Hewlett-Packard Company
|
|
**
|
|
** (c) Copyright 1993, 1994 Hewlett-Packard Company
|
|
** (c) Copyright 1993, 1994 International Business Machines Corp.
|
|
** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
|
|
** (c) Copyright 1993, 1994 Novell, Inc.
|
|
**
|
|
****************************************************************************
|
|
************************************<+>*************************************/
|
|
|
|
/*
|
|
* system includes
|
|
*/
|
|
#include <stdlib.h>
|
|
#include <X11/Xlib.h>
|
|
#include <X11/Xlibint.h>
|
|
#include <X11/Xresource.h>
|
|
#include <Xm/Xm.h>
|
|
|
|
/*
|
|
* private includes
|
|
*/
|
|
#include "DisplayAreaP.h"
|
|
#include "FontI.h"
|
|
#include "Lock.h"
|
|
|
|
/*
|
|
* private core engine
|
|
*/
|
|
#include "StringFuncsI.h"
|
|
|
|
#ifdef NLS16
|
|
#endif
|
|
|
|
/******** Private Function Declarations ********/
|
|
/******** End Public Function Declarations ********/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Private variables and defines.
|
|
*
|
|
*****************************************************************************/
|
|
static const char *FontResources[] =
|
|
{
|
|
/*! The serif proportional family */
|
|
/*! medium upright */
|
|
"*p.6.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.roman.medium.serif.*.ISO-8859-1: -dt-application-medium-r-normal-serif-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*! bold upright */
|
|
"*p.6.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.roman.bold.serif.*.ISO-8859-1: -dt-application-bold-r-normal-serif-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*! medium italic */
|
|
"*p.6.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.italic.medium.serif.*.ISO-8859-1: -dt-application-medium-i-normal-serif-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*! bold italic */
|
|
"*p.6.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.italic.bold.serif.*.ISO-8859-1: -dt-application-bold-i-normal-serif-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*! The sans serif proportional family */
|
|
/*! medium upright */
|
|
"*p.6.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.roman.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-r-normal-sans-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*!bold upright */
|
|
"*p.6.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.roman.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-r-normal-sans-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*! medium italic */
|
|
"*p.6.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.italic.medium.sans_serif.*.ISO-8859-1: -dt-application-medium-i-normal-sans-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*! bold italic */
|
|
"*p.6.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-80-*-*-p-*-iso8859-1",
|
|
"*p.8.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-100-*-*-p-*-iso8859-1",
|
|
"*p.10.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-120-*-*-p-*-iso8859-1",
|
|
"*p.12.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-140-*-*-p-*-iso8859-1",
|
|
"*p.14.italic.bold.sans_serif.*.ISO-8859-1: -dt-application-bold-i-normal-sans-*-180-*-*-p-*-iso8859-1",
|
|
|
|
/*! The monospace family - lump serif & sans serif together */
|
|
/*! medium upright */
|
|
"*m.6.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-80-*-*-m-*-iso8859-1",
|
|
"*m.8.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-100-*-*-m-*-iso8859-1",
|
|
"*m.10.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-120-*-*-m-*-iso8859-1",
|
|
"*m.12.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-140-*-*-m-*-iso8859-1",
|
|
"*m.14.roman.medium.*.*.ISO-8859-1: -dt-application-medium-r-normal-*-*-180-*-*-m-*-iso8859-1",
|
|
|
|
/*! bold upright */
|
|
"*m.6.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-80-*-*-m-*-iso8859-1",
|
|
"*m.8.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-100-*-*-m-*-iso8859-1",
|
|
"*m.10.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-120-*-*-m-*-iso8859-1",
|
|
"*m.12.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-140-*-*-m-*-iso8859-1",
|
|
"*m.14.roman.bold.*.*.ISO-8859-1: -dt-application-bold-r-normal-*-*-180-*-*-m-*-iso8859-1",
|
|
|
|
/*! medium italic */
|
|
"*m.6.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-80-*-*-m-*-iso8859-1",
|
|
"*m.8.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-100-*-*-m-*-iso8859-1",
|
|
"*m.10.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-120-*-*-m-*-iso8859-1",
|
|
"*m.12.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-140-*-*-m-*-iso8859-1",
|
|
"*m.14.italic.medium.*.*.ISO-8859-1: -dt-application-medium-i-normal-*-*-180-*-*-m-*-iso8859-1",
|
|
|
|
/*! bold italic */
|
|
"*m.6.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-80-*-*-m-*-iso8859-1",
|
|
"*m.8.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-100-*-*-m-*-iso8859-1",
|
|
"*m.10.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-120-*-*-m-*-iso8859-1",
|
|
"*m.12.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-140-*-*-m-*-iso8859-1",
|
|
"*m.14.italic.bold.*.*.ISO-8859-1: -dt-application-bold-i-normal-*-*-180-*-*-m-*-iso8859-1",
|
|
|
|
/*! SYMBOL */
|
|
"*6.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-80-*-*-*-*-dtsymbol-1",
|
|
"*8.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-100-*-*-*-*-dtsymbol-1",
|
|
"*10.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-120-*-*-*-*-dtsymbol-1",
|
|
"*12.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-140-*-*-*-*-dtsymbol-1",
|
|
"*14.*.*.*.*.DT-SYMBOL-1: -dt-application-medium-r-normal-*-*-180-*-*-*-*-dtsymbol-1",
|
|
|
|
/* for ISO-8859-2 */
|
|
"*.6.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.ISO-8859-2: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for ISO-8859-5 */
|
|
"*.6.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.ISO-8859-5: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for ISO-8859-6 */
|
|
"*.6.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.ISO-8859-6: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for ISO-8859-7 */
|
|
"*.6.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.ISO-8859-7: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for ISO-8859-8 */
|
|
"*.6.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.ISO-8859-8: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for ISO-8859-9 */
|
|
"*.6.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.ISO-8859-9: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for EUC-KR */
|
|
"*.6.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.EUC-KR: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for EUC-JP */
|
|
"*.6.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.EUC-JP: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for EUC-TW */
|
|
"*.6.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.EUC-TW: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for EUC-CN */
|
|
"*.6.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.EUC-CN: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for IBM-437 */
|
|
"*.6.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.IBM-437: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for IBM-850 */
|
|
"*.6.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.IBM-850: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for IBM-856 */
|
|
"*.6.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.IBM-856: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for IBM-932 */
|
|
"*.6.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.IBM-932: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for IBM-1046 */
|
|
"*.6.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.IBM-1046: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
/* for UTF-8 */
|
|
"*.6.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-xs*-*-*-*-*-*-*-*-*:",
|
|
"*.8.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-s*-*-*-*-*-*-*-*-*:",
|
|
"*.10.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-m*-*-*-*-*-*-*-*-*:",
|
|
"*.12.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-l*-*-*-*-*-*-*-*-*:",
|
|
"*.14.*.*.*.*.UTF-8: -dt-interface user-medium-r-normal-xl*-*-*-*-*-*-*-*-*:",
|
|
NULL,
|
|
};
|
|
|
|
#define GROW_SIZE 5
|
|
|
|
static Boolean QuarksInited = FALSE;
|
|
static XrmQuark StringFontQuark = 0;
|
|
static XrmName DefaultFontQuarks[_DtHelpFontQuarkNumber];
|
|
static XrmBinding FontBindings[_DtHelpFontQuarkNumber] =
|
|
{ XrmBindLoosely, XrmBindLoosely, XrmBindLoosely, XrmBindLoosely,
|
|
XrmBindLoosely, XrmBindLoosely, XrmBindLoosely };
|
|
|
|
static DtHelpDAFSMetrics DefaultMetrics = { FALSE, { 0, 0 } };
|
|
static DtHelpDAFontInfo DefFontInfo = { NULL, NULL, NULL, NULL, NULL,
|
|
NULL, 0, NULL, 0, 0, 0, 0, 0};
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Semi Public variables.
|
|
*
|
|
*****************************************************************************/
|
|
/******************************************************************************
|
|
*
|
|
* Private Functions
|
|
*
|
|
*****************************************************************************/
|
|
/******************************************************************************
|
|
* Function: SaveFontStruct (font_struct)
|
|
*
|
|
*****************************************************************************/
|
|
static int
|
|
SaveFontStruct (
|
|
XFontStruct *font_struct,
|
|
DtHelpDAFontInfo *font_info)
|
|
{
|
|
int fontIndex;
|
|
|
|
fontIndex = font_info->struct_cnt++;
|
|
if (font_info->struct_cnt >= font_info->max_structs)
|
|
{
|
|
font_info->max_structs += GROW_SIZE;
|
|
if (font_info->font_structs != NULL)
|
|
font_info->font_structs = (XFontStruct **) realloc (
|
|
((char *) font_info->font_structs),
|
|
(sizeof (XFontStruct *) * font_info->max_structs));
|
|
else
|
|
font_info->font_structs = (XFontStruct **) malloc (
|
|
sizeof (XFontStruct *) * font_info->max_structs);
|
|
}
|
|
|
|
font_info->font_structs[fontIndex] = font_struct;
|
|
|
|
return (fontIndex);
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: SaveFontSet (font_set)
|
|
*
|
|
*****************************************************************************/
|
|
static int
|
|
SaveFontSet (
|
|
XFontSet font_set,
|
|
DtHelpDAFontInfo *font_info)
|
|
{
|
|
int fontIndex = 0;
|
|
|
|
fontIndex = font_info->set_cnt++;
|
|
if (font_info->set_cnt >= font_info->max_sets)
|
|
{
|
|
font_info->max_sets += GROW_SIZE;
|
|
if (font_info->font_sets != NULL)
|
|
{
|
|
font_info->font_sets = (XFontSet *) realloc (
|
|
((char *) font_info->font_sets),
|
|
(sizeof (XFontSet) * font_info->max_sets));
|
|
font_info->fs_metrics = (DtHelpDAFSMetrics *) realloc (
|
|
((char *) font_info->fs_metrics),
|
|
(sizeof (DtHelpDAFSMetrics) * font_info->max_sets));
|
|
}
|
|
else
|
|
{
|
|
font_info->font_sets = (XFontSet *) malloc (
|
|
sizeof(XFontSet) * font_info->max_sets);
|
|
font_info->fs_metrics = (DtHelpDAFSMetrics *) malloc (
|
|
sizeof (DtHelpDAFSMetrics) * font_info->max_sets);
|
|
}
|
|
}
|
|
|
|
font_info->font_sets[fontIndex] = font_set;
|
|
font_info->fs_metrics[fontIndex] = DefaultMetrics;
|
|
|
|
/*
|
|
* want the font sets to go from -1 to -n because negative numbers
|
|
* indicate a font set.
|
|
*/
|
|
fontIndex++;
|
|
return (-fontIndex);
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: LoadFont (char *font_string, int *ret_index)
|
|
*
|
|
*****************************************************************************/
|
|
static short
|
|
LoadFont (
|
|
Display *dpy,
|
|
DtHelpDAFontInfo *font_info,
|
|
char *font_string,
|
|
long *ret_index)
|
|
{
|
|
short found = False;
|
|
short colon = False;
|
|
int len;
|
|
char *junk;
|
|
char *strPtr;
|
|
char **missingFontSet = NULL;
|
|
XFontStruct *fontStruct = NULL;
|
|
XFontSet fontSet;
|
|
|
|
strPtr = font_string;
|
|
|
|
/*
|
|
* if working with one byte environment, do it the fast, cheap way.
|
|
*/
|
|
if (MB_CUR_MAX == 1)
|
|
{
|
|
len = strlen(strPtr);
|
|
if (len > 0)
|
|
len--;
|
|
|
|
while (len > 0 && strPtr[len] == ' ')
|
|
len--;
|
|
|
|
if (strPtr[len] == ':')
|
|
{
|
|
colon = True;
|
|
junk = strPtr + len;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* Multibyte environment, have to go through the characters one at
|
|
* a time.
|
|
*/
|
|
while (*strPtr != '\0')
|
|
{
|
|
/*
|
|
* Process looking for a colon.
|
|
*/
|
|
len = mblen(strPtr, MB_CUR_MAX);
|
|
|
|
if (len == -1)
|
|
len = 1;
|
|
else if (len == 1 && *strPtr == ':')
|
|
{
|
|
colon = True;
|
|
junk = strPtr;
|
|
}
|
|
else if (len != 1 || *strPtr != ' ')
|
|
colon = False;
|
|
|
|
strPtr += len;
|
|
}
|
|
}
|
|
|
|
if (colon == False)
|
|
{
|
|
fontStruct = XLoadQueryFont (dpy, font_string);
|
|
if (fontStruct != NULL)
|
|
{
|
|
*ret_index = SaveFontStruct (fontStruct, font_info);
|
|
found = True;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*junk = '\0';
|
|
fontSet = XCreateFontSet (dpy, font_string, &missingFontSet,
|
|
&len, NULL);
|
|
if (fontSet != NULL)
|
|
{
|
|
/*
|
|
* want the font sets to go from -1 to -n because 0 is
|
|
* the default font.
|
|
*/
|
|
*ret_index = SaveFontSet (fontSet, font_info);
|
|
found = True;
|
|
}
|
|
|
|
if (len)
|
|
XFreeStringList (missingFontSet);
|
|
|
|
/*
|
|
* restore colon
|
|
*/
|
|
*junk = ':';
|
|
}
|
|
|
|
return found;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Semi Public Functions
|
|
*
|
|
*****************************************************************************/
|
|
/******************************************************************************
|
|
* Function: int __DtHelpFontIndexGet (Display dpy, XrmQuarkList xrm_list)
|
|
*
|
|
* Parameters: xrm_list Specifies the quark list for the font desired.
|
|
*
|
|
* Return Value: 0 if successful, -1 if using default font index.
|
|
*
|
|
* Purpose: Find the appropriate font to use for a quark set.
|
|
*
|
|
*****************************************************************************/
|
|
int
|
|
__DtHelpFontIndexGet (
|
|
DtHelpDispAreaStruct *pDAS,
|
|
XrmQuarkList xrm_list,
|
|
long *ret_idx)
|
|
{
|
|
int result = -1;
|
|
long fontIndex = pDAS->font_info.def_idx;
|
|
XrmRepresentation retType;
|
|
XrmValue retValue;
|
|
char buffer[10];
|
|
char *fontSpec;
|
|
XrmName xrmList[3];
|
|
DtHelpDAFontInfo *fontInfo = &(pDAS->font_info);
|
|
Display *dpy = XtDisplay(pDAS->dispWid);
|
|
|
|
/*
|
|
* look in my font data base to see if I've already processed
|
|
* this sequence of quarks.
|
|
*/
|
|
if (XrmQGetResource (fontInfo->font_idx_db, xrm_list, xrm_list, &retType,
|
|
&retValue))
|
|
{
|
|
fontIndex = *((int *)retValue.addr);
|
|
result = 0;
|
|
}
|
|
else
|
|
{
|
|
/*
|
|
* Check my parent's data base for an XLFD spec.
|
|
*/
|
|
fontSpec = NULL;
|
|
if (XrmQGetResource (XrmGetDatabase(dpy), xrm_list, xrm_list,
|
|
&retType, &retValue))
|
|
{
|
|
fontSpec = ((char *) retValue.addr);
|
|
if (LoadFont (dpy, fontInfo, fontSpec, &fontIndex))
|
|
result = 0;
|
|
}
|
|
|
|
/*
|
|
* If my parent didn't have anything, check my private database.
|
|
*/
|
|
if (result != 0 &&
|
|
XrmQGetResource (fontInfo->def_font_db, xrm_list, xrm_list,
|
|
&retType, &retValue))
|
|
{
|
|
fontSpec = ((char *) retValue.addr);
|
|
if (LoadFont (dpy, fontInfo, fontSpec, &fontIndex))
|
|
result = 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* if unsuccessful on finding a font for this quark list.
|
|
* save out using the default font
|
|
*/
|
|
retValue.size = sizeof (int);
|
|
retValue.addr = (XtPointer) &fontIndex;
|
|
XrmQPutResource (&(fontInfo->font_idx_db),
|
|
((XrmBindingList) FontBindings),
|
|
xrm_list, _DtHelpXrmInt, &retValue);
|
|
|
|
/*
|
|
* remember the character set for this font.
|
|
*/
|
|
sprintf (buffer, "%ld", fontIndex);
|
|
retValue.size = sizeof (XrmQuark);
|
|
retValue.addr = (XtPointer) &xrm_list[_DT_HELP_FONT_CHAR_SET];
|
|
xrmList[0] = XrmStringToQuark (buffer);
|
|
xrmList[1] = XrmStringToQuark ("code_set");
|
|
xrmList[2] = 0;
|
|
XrmQPutResource (&(fontInfo->font_idx_db),
|
|
((XrmBindingList) FontBindings),
|
|
xrmList, _DtHelpXrmQuark, &retValue);
|
|
|
|
/*
|
|
* remember the language for this font.
|
|
*/
|
|
retValue.addr = (XtPointer) &xrm_list[_DT_HELP_FONT_LANG_TER];
|
|
xrmList[1] = XrmStringToQuark ("language");
|
|
XrmQPutResource (&(fontInfo->font_idx_db),
|
|
((XrmBindingList) FontBindings),
|
|
xrmList, _DtHelpXrmQuark, &retValue);
|
|
|
|
}
|
|
|
|
*ret_idx = fontIndex;
|
|
return result;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: int __DtHelpFontCharSetQuarkGet (font_index, XrmQuark *ret_quark)
|
|
*
|
|
* Parameters: font_index Specifies the font in the font table.
|
|
* ret_quark Returns the quark specifying the character
|
|
* set of the font.
|
|
*
|
|
* Return Value: Returns 0 if successful, -1 if failed.
|
|
*
|
|
* Purpose: Gets the character set associated with a font.
|
|
*
|
|
*****************************************************************************/
|
|
int
|
|
__DtHelpFontCharSetQuarkGet (
|
|
DtHelpDispAreaStruct *pDAS,
|
|
long font_index,
|
|
XrmQuark *ret_quark )
|
|
{
|
|
XrmRepresentation retType;
|
|
XrmValue retValue;
|
|
char buffer[10];
|
|
XrmName xrmList[3];
|
|
int result = 0;
|
|
|
|
/*
|
|
* quarkize the font index
|
|
*/
|
|
sprintf (buffer, "%ld", font_index);
|
|
xrmList[0] = XrmStringToQuark (buffer);
|
|
xrmList[1] = XrmStringToQuark ("code_set");
|
|
xrmList[2] = 0;
|
|
|
|
/*
|
|
* look in my font data base for the quark.
|
|
*/
|
|
if (XrmQGetResource (pDAS->font_info.font_idx_db, xrmList, xrmList,
|
|
&retType, &retValue))
|
|
*ret_quark = *((XrmQuark *)retValue.addr);
|
|
else
|
|
result = -1;
|
|
|
|
return result;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: int __DtHelpFontLangQuarkGet (font_index, XrmQuark *ret_quark)
|
|
*
|
|
* Parameters: font_index Specifies the font in the font table.
|
|
* ret_quark Returns the quark specifying the character
|
|
* set of the font.
|
|
*
|
|
* Return Value: Returns 0 if successful, -1 if failed.
|
|
*
|
|
* Purpose: Gets the character set associated with a font.
|
|
*
|
|
*****************************************************************************/
|
|
int
|
|
__DtHelpFontLangQuarkGet (
|
|
DtHelpDispAreaStruct *pDAS,
|
|
long font_index,
|
|
XrmQuark *ret_quark )
|
|
{
|
|
XrmRepresentation retType;
|
|
XrmValue retValue;
|
|
char buffer[10];
|
|
XrmName xrmList[3];
|
|
int result = 0;
|
|
|
|
/*
|
|
* quarkize the font index
|
|
*/
|
|
sprintf (buffer, "%ld", font_index);
|
|
xrmList[0] = XrmStringToQuark (buffer);
|
|
xrmList[1] = XrmStringToQuark ("language");
|
|
xrmList[2] = 0;
|
|
|
|
/*
|
|
* look in my font data base for the quark.
|
|
*/
|
|
if (XrmQGetResource (pDAS->font_info.font_idx_db, xrmList, xrmList,
|
|
&retType, &retValue))
|
|
*ret_quark = *((XrmQuark *)retValue.addr);
|
|
else
|
|
result = -1;
|
|
|
|
return result;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: void _DtHelpCopyDefaultList (xrm_name)
|
|
*
|
|
* Parameters: xrm_name The quark list to fill out.
|
|
*
|
|
* Return Value: void
|
|
*
|
|
* Purpose: Initializes the font data base.
|
|
*****************************************************************************/
|
|
void
|
|
_DtHelpCopyDefaultList (
|
|
XrmName *xrm_list)
|
|
{
|
|
int n;
|
|
|
|
for (n = 0; n < _DT_HELP_FONT_END + 1; n++)
|
|
xrm_list[n] = DefaultFontQuarks[n];
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: void _DtHelpGetStringQuarks (xrm_name)
|
|
*
|
|
* Parameters: xrm_name The quark list to fill out.
|
|
*
|
|
* Return Value: void
|
|
*
|
|
* Purpose: Initializes the font data base.
|
|
*****************************************************************************/
|
|
void
|
|
_DtHelpGetStringQuarks (
|
|
XrmName *xrm_list)
|
|
{
|
|
_DtHelpCopyDefaultList(xrm_list);
|
|
|
|
xrm_list[_DT_HELP_FONT_CHAR_SET] = StringFontQuark;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: void __DtHelpFontDatabaseInit (dpy, default_font, type, tmp)
|
|
*
|
|
* Parameters: dpy Specifies the connection to the display server.
|
|
* default_font Specifies the base font.
|
|
* type Specifies the type of font 'default_font' is.
|
|
*
|
|
* Return Value: void
|
|
*
|
|
* Purpose: Initializes the font data base.
|
|
*
|
|
*****************************************************************************/
|
|
void
|
|
__DtHelpFontDatabaseInit (
|
|
DtHelpDispAreaStruct *pDAS,
|
|
XtPointer string_font,
|
|
XmFontType type,
|
|
XFontStruct *user_font)
|
|
{
|
|
int n;
|
|
int strIdx;
|
|
int found = FALSE;
|
|
|
|
Display *dpy = XtDisplay(pDAS->dispWid);
|
|
DtHelpDAFontInfo *fontInfo = &(pDAS->font_info);
|
|
XrmValue retValue;
|
|
XrmRepresentation retType;
|
|
XrmName xrmList[_DtHelpFontQuarkNumber];
|
|
|
|
/*
|
|
* build our default data base
|
|
*/
|
|
*fontInfo = DefFontInfo;
|
|
for (n = 0; FontResources[n]; n++)
|
|
XrmPutLineResource (&(fontInfo->def_font_db), FontResources[n]);
|
|
|
|
/*
|
|
* build the default quark set.
|
|
*/
|
|
_DtHelpProcessLock();
|
|
if (QuarksInited == False)
|
|
{
|
|
StringFontQuark = XrmStringToQuark ("String");
|
|
DefaultFontQuarks[_DT_HELP_FONT_SPACING] = XrmStringToQuark ("p");
|
|
DefaultFontQuarks[_DT_HELP_FONT_SIZE] = XrmStringToQuark ("10");
|
|
DefaultFontQuarks[_DT_HELP_FONT_ANGLE] = XrmStringToQuark ("roman");
|
|
DefaultFontQuarks[_DT_HELP_FONT_WEIGHT] = XrmStringToQuark ("medium");
|
|
DefaultFontQuarks[_DT_HELP_FONT_TYPE] =
|
|
XrmStringToQuark ("sans_serif");
|
|
DefaultFontQuarks[_DT_HELP_FONT_LANG_TER] = XrmStringToQuark ("C");
|
|
DefaultFontQuarks[_DT_HELP_FONT_CHAR_SET] =
|
|
XrmStringToQuark ("ISO-8859-1");
|
|
DefaultFontQuarks[_DT_HELP_FONT_END] = 0;
|
|
QuarksInited = True;
|
|
}
|
|
_DtHelpProcessUnlock();
|
|
|
|
/*
|
|
* if the string_font is null, used the default user's font for strings.
|
|
*/
|
|
if (string_font == NULL)
|
|
{
|
|
/*
|
|
* WARNING...what if the user_font is null? And what type is it?
|
|
*/
|
|
string_font = (XtPointer) user_font;
|
|
type = XmFONT_IS_FONT;
|
|
}
|
|
|
|
/*
|
|
* save the string font in the lists
|
|
*/
|
|
if (type == XmFONT_IS_FONTSET)
|
|
strIdx = SaveFontSet ((XFontSet) string_font, fontInfo);
|
|
else
|
|
strIdx = SaveFontStruct ((XFontStruct *) string_font, fontInfo);
|
|
|
|
/*
|
|
* Save this idx font for ascii files and strings.
|
|
*/
|
|
_DtHelpGetStringQuarks(xrmList);
|
|
|
|
retValue.size = sizeof (int);
|
|
retValue.addr = (XtPointer) &(strIdx);
|
|
XrmQPutResource (&(fontInfo->font_idx_db), ((XrmBindingList) FontBindings),
|
|
xrmList, _DtHelpXrmInt, &retValue);
|
|
|
|
/*
|
|
* try to get the default font for help information
|
|
* from the parent's database.
|
|
*/
|
|
if (XrmQGetResource (XrmGetDatabase(dpy), DefaultFontQuarks,
|
|
DefaultFontQuarks, &retType, &retValue))
|
|
found = LoadFont (dpy, fontInfo, ((char *) retValue.addr),
|
|
&(fontInfo->def_idx));
|
|
|
|
/*
|
|
* If the XLFD font spec wasn't in the parent's database,
|
|
* look at my private database.
|
|
*/
|
|
if (found == False &&
|
|
XrmQGetResource (fontInfo->def_font_db,
|
|
DefaultFontQuarks, DefaultFontQuarks,
|
|
&retType, &retValue))
|
|
found = LoadFont (dpy, fontInfo, ((char *) retValue.addr),
|
|
&(fontInfo->def_idx));
|
|
|
|
/*
|
|
* If still no luck, use the string font passed in.
|
|
*/
|
|
if (found == False)
|
|
fontInfo->def_idx = strIdx;
|
|
|
|
/*
|
|
* Remember we got this font for this quark string.
|
|
*/
|
|
retValue.size = sizeof (int);
|
|
retValue.addr = (XtPointer) &(fontInfo->def_idx);
|
|
XrmQPutResource (&(fontInfo->font_idx_db), ((XrmBindingList) FontBindings),
|
|
DefaultFontQuarks, _DtHelpXrmInt, &retValue);
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: XFontStruct *__DtHelpFontStructGet (long font_index );
|
|
*
|
|
* Parameters: font_index Specifies an index into the Font Structure
|
|
* List.
|
|
*
|
|
* Return Value: Returns the font structure.
|
|
*
|
|
* Purpose:
|
|
*
|
|
*****************************************************************************/
|
|
XFontStruct *
|
|
__DtHelpFontStructGet (
|
|
DtHelpDAFontInfo font_info,
|
|
long font_index)
|
|
{
|
|
|
|
if (font_index > -1 && font_index < font_info.struct_cnt)
|
|
return font_info.font_structs[font_index];
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: XFontSet __DtHelpFontSetGet (long font_index);
|
|
*
|
|
* Parameters: font_index Specifies an index into the Font Set List.
|
|
*
|
|
* Return Value: Returns the font structure.
|
|
*
|
|
* Purpose:
|
|
*
|
|
*****************************************************************************/
|
|
XFontSet
|
|
__DtHelpFontSetGet (
|
|
DtHelpDAFontInfo font_info,
|
|
long font_index)
|
|
{
|
|
|
|
if (font_index < 0)
|
|
{
|
|
font_index = -font_index;
|
|
font_index--;
|
|
if (font_index < font_info.set_cnt)
|
|
return font_info.font_sets[font_index];
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: long __DtHelpDefaultFontIndexGet ();
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return Value: Returns the index for the default font set/structure.
|
|
*
|
|
* Purpose:
|
|
*
|
|
*****************************************************************************/
|
|
long
|
|
__DtHelpDefaultFontIndexGet (
|
|
DtHelpDispAreaStruct *pDAS)
|
|
{
|
|
return (pDAS->font_info.def_idx);
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: int __DtHelpFontMetrics (int font_index, int &ret_ascent,
|
|
* &ret_descent);
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return Value: Returns the index for the default font set/structure.
|
|
*
|
|
* Purpose:
|
|
*
|
|
*****************************************************************************/
|
|
void
|
|
__DtHelpFontMetrics (
|
|
DtHelpDAFontInfo font_info,
|
|
long font_index,
|
|
_DtCvUnit *ret_ascent,
|
|
_DtCvUnit *ret_descent,
|
|
_DtCvUnit *ret_char_width,
|
|
_DtCvUnit *ret_super,
|
|
_DtCvUnit *ret_sub)
|
|
{
|
|
XFontStruct **fontList;
|
|
char **fontNames;
|
|
int fontCount;
|
|
_DtCvUnit maxAscent = -1;
|
|
_DtCvUnit maxDescent = -1;
|
|
_DtCvUnit maxCharW = -1;
|
|
_DtCvUnit superOffset = 0;
|
|
_DtCvUnit subOffset = 0;
|
|
int i;
|
|
|
|
if (font_index < 0)
|
|
{
|
|
font_index = -font_index;
|
|
font_index--;
|
|
if (font_index < font_info.set_cnt)
|
|
{
|
|
if (font_info.fs_metrics[font_index].inited == True)
|
|
{
|
|
maxAscent = font_info.fs_metrics[font_index].fm.ascent;
|
|
maxDescent = font_info.fs_metrics[font_index].fm.descent;
|
|
maxCharW = font_info.fs_metrics[font_index].fm.average_width;
|
|
}
|
|
else /* if (font_info.fs_metrics[font_index].inited == False) */
|
|
{
|
|
fontCount = XFontsOfFontSet(font_info.font_sets[font_index],
|
|
&fontList, &fontNames);
|
|
for (i = 0; i < fontCount; i++)
|
|
{
|
|
if (fontList[i]->ascent > maxAscent)
|
|
maxAscent = fontList[i]->ascent;
|
|
|
|
if (fontList[i]->descent > maxDescent)
|
|
maxDescent = fontList[i]->descent;
|
|
|
|
if (fontList[i]->max_bounds.width > maxCharW)
|
|
maxCharW = fontList[i]->max_bounds.width;
|
|
}
|
|
font_info.fs_metrics[font_index].fm.ascent = maxAscent;
|
|
font_info.fs_metrics[font_index].fm.descent = maxDescent;
|
|
font_info.fs_metrics[font_index].fm.average_width = maxCharW;
|
|
font_info.fs_metrics[font_index].inited = True;
|
|
}
|
|
}
|
|
}
|
|
else if (font_index < font_info.struct_cnt)
|
|
{
|
|
maxAscent = font_info.font_structs[font_index]->ascent;
|
|
maxDescent = font_info.font_structs[font_index]->descent;
|
|
maxCharW = font_info.font_structs[font_index]->max_bounds.width;
|
|
}
|
|
|
|
superOffset = (maxAscent * 40) / 100 + ((maxAscent % 40) > 19 ? 1 : 0);
|
|
subOffset = superOffset;
|
|
|
|
if (ret_ascent)
|
|
*ret_ascent = maxAscent;
|
|
if (ret_descent)
|
|
*ret_descent = maxDescent;
|
|
if (ret_char_width)
|
|
*ret_char_width = maxCharW;
|
|
if (ret_super)
|
|
*ret_super = superOffset;
|
|
if (ret_sub)
|
|
*ret_sub = subOffset;
|
|
}
|
|
|
|
/******************************************************************************
|
|
* Function: int _DtHelpGetExactFontIndex(Display dpy, char *xlfd_spec)
|
|
*
|
|
* Parameters:
|
|
*
|
|
* Return Value: 0 if successful, -1 if using default font index.
|
|
*
|
|
* Purpose: Try to load the specified font.
|
|
*
|
|
*****************************************************************************/
|
|
int
|
|
_DtHelpGetExactFontIndex (
|
|
DtHelpDispAreaStruct *pDAS,
|
|
const char *lang,
|
|
const char *char_set,
|
|
char *xlfd_spec,
|
|
long *ret_idx)
|
|
{
|
|
int i = 0;
|
|
int result = -1;
|
|
long fontIndex = pDAS->font_info.def_idx;
|
|
char **nameList;
|
|
DtHelpDAFontInfo *fontInfo = &(pDAS->font_info);
|
|
Display *dpy = XtDisplay(pDAS->dispWid);
|
|
|
|
/*
|
|
* look in my font data base to see if I've already processed
|
|
* this xlfd_spec.
|
|
*/
|
|
#ifndef REALLOC_INCR
|
|
#define REALLOC_INCR 10
|
|
#endif
|
|
nameList = fontInfo->exact_fonts;
|
|
if (NULL != nameList)
|
|
{
|
|
for (i = 0; NULL != *nameList && strcmp(*nameList, xlfd_spec); i++)
|
|
nameList++;
|
|
}
|
|
|
|
if (NULL != nameList && NULL != *nameList)
|
|
{
|
|
fontIndex = fontInfo->exact_idx[i];
|
|
result = 0;
|
|
}
|
|
else if (LoadFont(dpy, fontInfo, xlfd_spec, &fontIndex))
|
|
{
|
|
/*
|
|
* make a copy of the font spec
|
|
*/
|
|
xlfd_spec = strdup(xlfd_spec);
|
|
if (NULL != xlfd_spec)
|
|
{
|
|
/*
|
|
* now save it away for later tests.
|
|
*/
|
|
fontInfo->exact_fonts = (char **) _DtHelpCeAddPtrToArray(
|
|
(void **)fontInfo->exact_fonts,
|
|
(void *) xlfd_spec);
|
|
if (NULL != fontInfo->exact_fonts)
|
|
{
|
|
if (NULL == fontInfo->exact_idx)
|
|
fontInfo->exact_idx = (int *) malloc(
|
|
sizeof(int)*REALLOC_INCR);
|
|
else if ((i + 1) % REALLOC_INCR == 0)
|
|
fontInfo->exact_idx = (int *) realloc(fontInfo->exact_idx,
|
|
sizeof(int) * (i + 1 + REALLOC_INCR));
|
|
|
|
if (NULL != fontInfo->exact_idx)
|
|
{
|
|
char buffer[10];
|
|
XrmValue retValue;
|
|
XrmName xrmList[3];
|
|
XrmQuark myQuark;
|
|
|
|
fontInfo->exact_idx[i] = fontIndex;
|
|
result = 0;
|
|
|
|
/*
|
|
* remember the character set for this font.
|
|
*/
|
|
myQuark = XrmStringToQuark(char_set);
|
|
sprintf (buffer, "%ld", fontIndex);
|
|
retValue.size = sizeof (XrmQuark);
|
|
retValue.addr = (XtPointer) &myQuark;
|
|
xrmList[0] = XrmStringToQuark (buffer);
|
|
xrmList[1] = XrmStringToQuark ("code_set");
|
|
xrmList[2] = 0;
|
|
XrmQPutResource (&(fontInfo->font_idx_db),
|
|
((XrmBindingList) FontBindings),
|
|
xrmList, _DtHelpXrmQuark, &retValue);
|
|
|
|
/*
|
|
* remember the language for this font.
|
|
*/
|
|
myQuark = XrmStringToQuark(lang);
|
|
xrmList[1] = XrmStringToQuark ("language");
|
|
XrmQPutResource (&(fontInfo->font_idx_db),
|
|
((XrmBindingList) FontBindings),
|
|
xrmList, _DtHelpXrmQuark, &retValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
*ret_idx = fontIndex;
|
|
return result;
|
|
}
|
|
|