783 lines
24 KiB
C
783 lines
24 KiB
C
|
/*
|
||
|
(c) Copyright 1996 Hewlett-Packard Company
|
||
|
(c) Copyright 1996 International Business Machines Corp.
|
||
|
(c) Copyright 1996 Sun Microsystems, Inc.
|
||
|
(c) Copyright 1996 Novell, Inc.
|
||
|
(c) Copyright 1996 Digital Equipment Corp.
|
||
|
(c) Copyright 1996 Fujitsu Limited
|
||
|
(c) Copyright 1996 Hitachi, Ltd.
|
||
|
|
||
|
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
|
||
|
COPYRIGHT HOLDERS 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 names of the copyright holders shall
|
||
|
not be used in advertising or otherwise to promote the sale, use or other
|
||
|
dealings in this Software without prior written authorization from said
|
||
|
copyright holders.
|
||
|
*/
|
||
|
/*******************************************************************
|
||
|
**
|
||
|
** *********************************************************
|
||
|
** *
|
||
|
** * File: mediaSizes.c
|
||
|
** *
|
||
|
** * Contents:
|
||
|
** * Routines to return the sizes associated
|
||
|
** * with particular media and particular printers.
|
||
|
** *
|
||
|
** * Created: 2/19/96
|
||
|
** *
|
||
|
** * Copyright: Copyright 1993,1995 Hewlett-Packard Company
|
||
|
** *
|
||
|
** *********************************************************
|
||
|
**
|
||
|
********************************************************************/
|
||
|
|
||
|
#ifdef HAVE_DIX_CONFIG_H
|
||
|
#include <dix-config.h>
|
||
|
#endif
|
||
|
|
||
|
#include <unistd.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <ctype.h>
|
||
|
#include <string.h>
|
||
|
#include <locale.h>
|
||
|
|
||
|
#include <X11/X.h>
|
||
|
#include "dixstruct.h"
|
||
|
#include "screenint.h"
|
||
|
#include "misc.h"
|
||
|
#include "scrnintstr.h"
|
||
|
#include <X11/fonts/fontstruct.h>
|
||
|
|
||
|
#include "DiPrint.h"
|
||
|
#include "attributes.h"
|
||
|
|
||
|
typedef struct {
|
||
|
XpOid page_size;
|
||
|
float width;
|
||
|
float height;
|
||
|
} PageDimensionsRec;
|
||
|
|
||
|
static PageDimensionsRec PageDimensions[] =
|
||
|
{
|
||
|
{xpoid_val_medium_size_na_letter, 215.9, 279.4},
|
||
|
{xpoid_val_medium_size_na_legal, 215.9, 355.6},
|
||
|
{xpoid_val_medium_size_executive, 184.15, 266.7},
|
||
|
{xpoid_val_medium_size_folio, 210.82, 330.2},
|
||
|
{xpoid_val_medium_size_invoice, 139.7, 215.9},
|
||
|
{xpoid_val_medium_size_ledger, 279.4, 431.8},
|
||
|
{xpoid_val_medium_size_quarto, 215.9, 275.082},
|
||
|
{xpoid_val_medium_size_a, 215.9, 279.4},
|
||
|
{xpoid_val_medium_size_b, 279.4, 431.8},
|
||
|
{xpoid_val_medium_size_c, 431.8, 558.8},
|
||
|
{xpoid_val_medium_size_d, 558.8, 863.6},
|
||
|
{xpoid_val_medium_size_e, 863.6, 1117.6},
|
||
|
{xpoid_val_medium_size_na_6x9_envelope, 152.4, 228.6},
|
||
|
{xpoid_val_medium_size_na_10x15_envelope, 254, 381},
|
||
|
{xpoid_val_medium_size_monarch_envelope, 98.298, 190.5},
|
||
|
{xpoid_val_medium_size_na_10x13_envelope, 254, 330.2},
|
||
|
{xpoid_val_medium_size_na_9x12_envelope, 228.6, 304.8},
|
||
|
{xpoid_val_medium_size_na_number_10_envelope, 104.775, 241.3},
|
||
|
{xpoid_val_medium_size_na_7x9_envelope, 177.8, 228.6},
|
||
|
{xpoid_val_medium_size_na_9x11_envelope, 228.6, 279.4},
|
||
|
{xpoid_val_medium_size_na_10x14_envelope, 254, 355.6},
|
||
|
{xpoid_val_medium_size_na_number_9_envelope, 98.425, 225.425},
|
||
|
{xpoid_val_medium_size_iso_a0, 841, 1189},
|
||
|
{xpoid_val_medium_size_iso_a1, 594, 841},
|
||
|
{xpoid_val_medium_size_iso_a2, 420, 594},
|
||
|
{xpoid_val_medium_size_iso_a3, 297, 420},
|
||
|
{xpoid_val_medium_size_iso_a4, 210, 297},
|
||
|
{xpoid_val_medium_size_iso_a5, 148, 210},
|
||
|
{xpoid_val_medium_size_iso_a6, 105, 148},
|
||
|
{xpoid_val_medium_size_iso_a7, 74, 105},
|
||
|
{xpoid_val_medium_size_iso_a8, 52, 74},
|
||
|
{xpoid_val_medium_size_iso_a9, 37, 52},
|
||
|
{xpoid_val_medium_size_iso_a10, 26, 37},
|
||
|
{xpoid_val_medium_size_iso_b0, 1000, 1414},
|
||
|
{xpoid_val_medium_size_iso_b1, 707, 1000},
|
||
|
{xpoid_val_medium_size_iso_b2, 500, 707},
|
||
|
{xpoid_val_medium_size_iso_b3, 353, 500},
|
||
|
{xpoid_val_medium_size_iso_b4, 250, 353},
|
||
|
{xpoid_val_medium_size_iso_b5, 176, 250},
|
||
|
{xpoid_val_medium_size_iso_b6, 125, 176},
|
||
|
{xpoid_val_medium_size_iso_b7, 88, 125},
|
||
|
{xpoid_val_medium_size_iso_b8, 62, 88},
|
||
|
{xpoid_val_medium_size_iso_b9, 44, 62},
|
||
|
{xpoid_val_medium_size_iso_b10, 31, 44},
|
||
|
{xpoid_val_medium_size_jis_b0, 1030, 1456},
|
||
|
{xpoid_val_medium_size_jis_b1, 728, 1030},
|
||
|
{xpoid_val_medium_size_jis_b2, 515, 728},
|
||
|
{xpoid_val_medium_size_jis_b3, 364, 515},
|
||
|
{xpoid_val_medium_size_jis_b4, 257, 364},
|
||
|
{xpoid_val_medium_size_jis_b5, 182, 257},
|
||
|
{xpoid_val_medium_size_jis_b6, 128, 182},
|
||
|
{xpoid_val_medium_size_jis_b7, 91, 128},
|
||
|
{xpoid_val_medium_size_jis_b8, 64, 91},
|
||
|
{xpoid_val_medium_size_jis_b9, 45, 64},
|
||
|
{xpoid_val_medium_size_jis_b10, 32, 45},
|
||
|
{xpoid_val_medium_size_hp_2x_postcard, 148, 200},
|
||
|
{xpoid_val_medium_size_hp_european_edp, 304.8, 355.6},
|
||
|
{xpoid_val_medium_size_hp_mini, 139.7, 215.9},
|
||
|
{xpoid_val_medium_size_hp_postcard, 100, 148},
|
||
|
{xpoid_val_medium_size_hp_tabloid, 279.4, 431.8},
|
||
|
{xpoid_val_medium_size_hp_us_edp, 279.4, 355.6},
|
||
|
{xpoid_val_medium_size_hp_us_government_legal, 203.2, 330.2},
|
||
|
{xpoid_val_medium_size_hp_us_government_letter, 203.2, 254},
|
||
|
{xpoid_val_medium_size_iso_c3, 324, 458},
|
||
|
{xpoid_val_medium_size_iso_c4, 229, 324},
|
||
|
{xpoid_val_medium_size_iso_c5, 162, 229},
|
||
|
{xpoid_val_medium_size_iso_c6, 114, 162},
|
||
|
{xpoid_val_medium_size_iso_designated_long, 110, 220}
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* XpGetResolution returns an integer representing the printer resolution
|
||
|
* in dots-per-inch for the specified print context.
|
||
|
*
|
||
|
* Note: This routine assumes the values found in the passed context's
|
||
|
* attributes pools have been validated.
|
||
|
*/
|
||
|
int
|
||
|
XpGetResolution(
|
||
|
XpContextPtr pContext)
|
||
|
{
|
||
|
unsigned long resolution;
|
||
|
|
||
|
resolution = XpGetCardAttr(pContext, XPPageAttr,
|
||
|
xpoid_att_default_printer_resolution,
|
||
|
(XpOidCardList*)NULL);
|
||
|
if(0 == resolution)
|
||
|
resolution = XpGetCardAttr(pContext, XPDocAttr,
|
||
|
xpoid_att_default_printer_resolution,
|
||
|
(XpOidCardList*)NULL);
|
||
|
if(0 == resolution)
|
||
|
{
|
||
|
XpOidCardList* resolutions_supported;
|
||
|
/*
|
||
|
* default-printer-resolution not specified; default to 1st entry
|
||
|
* in printer-resolutions-supported.
|
||
|
*/
|
||
|
resolutions_supported =
|
||
|
XpGetCardListAttr(pContext, XPPrinterAttr,
|
||
|
xpoid_att_printer_resolutions_supported,
|
||
|
(XpOidCardList*)NULL);
|
||
|
resolution = XpOidCardListGetCard(resolutions_supported, 0);
|
||
|
XpOidCardListDelete(resolutions_supported);
|
||
|
}
|
||
|
return (int)resolution;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetContentOrientation determines the content-orientation as
|
||
|
* determined by the passed context. The page and document pools are
|
||
|
* queried in turn for a specified content-orientation attribute. If none
|
||
|
* is found the first content-orientation in the
|
||
|
* content-orientations-supported printer attribute is taken as the
|
||
|
* default.
|
||
|
*
|
||
|
* Note: This routine assumes the values found in the passed context's
|
||
|
* attributes pools have been validated.
|
||
|
*/
|
||
|
XpOid
|
||
|
XpGetContentOrientation(
|
||
|
XpContextPtr pContext)
|
||
|
{
|
||
|
XpOid orientation;
|
||
|
|
||
|
orientation = XpGetOidAttr(pContext, XPPageAttr,
|
||
|
xpoid_att_content_orientation,
|
||
|
(XpOidList*)NULL);
|
||
|
if(xpoid_none == orientation)
|
||
|
orientation = XpGetOidAttr(pContext, XPDocAttr,
|
||
|
xpoid_att_content_orientation,
|
||
|
(XpOidList*)NULL);
|
||
|
if(xpoid_none == orientation)
|
||
|
{
|
||
|
XpOidList* content_orientations_supported;
|
||
|
|
||
|
content_orientations_supported =
|
||
|
XpGetListAttr(pContext, XPPrinterAttr,
|
||
|
xpoid_att_content_orientations_supported,
|
||
|
(XpOidList*)NULL);
|
||
|
orientation = XpOidListGetOid(content_orientations_supported, 0);
|
||
|
XpOidListDelete(content_orientations_supported);
|
||
|
}
|
||
|
return orientation;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetAvailableCompression determines the available-compression as
|
||
|
* determined by the passed context. The page and document pools are
|
||
|
* queried in turn for a specified content-orientation attribute. If none
|
||
|
* is found the first available-compression in the
|
||
|
* avaiable-compressions-supported printer attribute is taken as the
|
||
|
* default.
|
||
|
*
|
||
|
* Note: This routine assumes the values found in the passed context's
|
||
|
* attributes pools have been validated.
|
||
|
*/
|
||
|
XpOid
|
||
|
XpGetAvailableCompression(
|
||
|
XpContextPtr pContext)
|
||
|
{
|
||
|
XpOid compression;
|
||
|
|
||
|
compression = XpGetOidAttr(pContext, XPPageAttr,
|
||
|
xpoid_att_available_compression,
|
||
|
(XpOidList*)NULL);
|
||
|
if(xpoid_none == compression)
|
||
|
compression = XpGetOidAttr(pContext, XPDocAttr,
|
||
|
xpoid_att_available_compression,
|
||
|
(XpOidList*)NULL);
|
||
|
if(xpoid_none == compression)
|
||
|
{
|
||
|
XpOidList* available_compressions_supported;
|
||
|
|
||
|
available_compressions_supported =
|
||
|
XpGetListAttr(pContext, XPPrinterAttr,
|
||
|
xpoid_att_available_compressions_supported,
|
||
|
(XpOidList*)NULL);
|
||
|
compression = XpOidListGetOid(available_compressions_supported, 0);
|
||
|
XpOidListDelete(available_compressions_supported);
|
||
|
}
|
||
|
return compression;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetPlex determines the plex as determined by the passed context. The page
|
||
|
* and document pools are queried in turn for a specified plex attribute. If
|
||
|
* none is found the first plex in the plexes-supported printer attribute is
|
||
|
* taken as the default.
|
||
|
*
|
||
|
* Note: This routine assumes the values found in the passed context's
|
||
|
* attributes pools have been validated.
|
||
|
*/
|
||
|
XpOid
|
||
|
XpGetPlex(
|
||
|
XpContextPtr pContext)
|
||
|
{
|
||
|
XpOid plex;
|
||
|
|
||
|
plex = XpGetOidAttr(pContext, XPPageAttr, xpoid_att_plex,
|
||
|
(XpOidList*)NULL);
|
||
|
if(xpoid_none == plex)
|
||
|
plex = XpGetOidAttr(pContext, XPDocAttr, xpoid_att_plex,
|
||
|
(XpOidList*)NULL);
|
||
|
if(xpoid_none == plex)
|
||
|
{
|
||
|
XpOidList* plexes_supported;
|
||
|
|
||
|
plexes_supported =
|
||
|
XpGetListAttr(pContext, XPPrinterAttr,
|
||
|
xpoid_att_plexes_supported,
|
||
|
(XpOidList*)NULL);
|
||
|
plex = XpOidListGetOid(plexes_supported, 0);
|
||
|
XpOidListDelete(plexes_supported);
|
||
|
}
|
||
|
return plex;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetPageSize returns the XpOid of the current page size (medium names
|
||
|
* are page sizes in this implementation) as indicated by the passed
|
||
|
* context.
|
||
|
*
|
||
|
* The relevant input-tray is returned in pTray. This parm must not be
|
||
|
* NULL. If the input-tray is not indicated or irrelevant, xpoid_none
|
||
|
* will be returned.
|
||
|
*
|
||
|
* This function optionally takes a XpOidMediumSS representation of the
|
||
|
* medium-source-sizes-supported attribute in order to avoid parsing the
|
||
|
* string value twice for calling functions that need to parse m-s-s-s
|
||
|
* anyway (e.g. XpGetReproductionArea). If the caller has no other reason
|
||
|
* to parse medium-source-sizes-supported, it is recommended that NULL be
|
||
|
* passed. This function will obtain medium-source-sizes-supported if it
|
||
|
* needs to.
|
||
|
*
|
||
|
* Note: This routine assumes the values found in the passed context's
|
||
|
* attributes pools have been validated.
|
||
|
*/
|
||
|
XpOid
|
||
|
XpGetPageSize(XpContextPtr pContext,
|
||
|
XpOid* pTray,
|
||
|
const XpOidMediumSS* msss)
|
||
|
{
|
||
|
XpOid medium;
|
||
|
/*
|
||
|
* check to see if default-medium is specified
|
||
|
*/
|
||
|
medium = XpGetOidAttr(pContext, XPPageAttr, xpoid_att_default_medium,
|
||
|
(const XpOidList*)NULL);
|
||
|
if(medium == xpoid_none)
|
||
|
{
|
||
|
/*
|
||
|
* default-medium not in page pool; try the document pool
|
||
|
*/
|
||
|
medium = XpGetOidAttr(pContext, XPDocAttr, xpoid_att_default_medium,
|
||
|
(const XpOidList*)NULL);
|
||
|
}
|
||
|
if(medium == xpoid_none)
|
||
|
{
|
||
|
/*
|
||
|
* default-medium not specified; try default-input-tray
|
||
|
*/
|
||
|
*pTray = XpGetOidAttr(pContext, XPPageAttr,
|
||
|
xpoid_att_default_input_tray,
|
||
|
(const XpOidList*)NULL);
|
||
|
if(*pTray == xpoid_none)
|
||
|
{
|
||
|
/*
|
||
|
* default-input-tray not in page pool; try the document pool
|
||
|
*/
|
||
|
*pTray = XpGetOidAttr(pContext, XPDocAttr,
|
||
|
xpoid_att_default_input_tray,
|
||
|
(const XpOidList*)NULL);
|
||
|
}
|
||
|
if(*pTray != xpoid_none)
|
||
|
{
|
||
|
/*
|
||
|
* default-input-tray found; get corresponding medium from
|
||
|
* input-trays-medium
|
||
|
*/
|
||
|
XpOidTrayMediumList* input_trays_medium;
|
||
|
int i;
|
||
|
|
||
|
input_trays_medium =
|
||
|
XpGetTrayMediumListAttr(pContext, XPPrinterAttr,
|
||
|
xpoid_att_input_trays_medium,
|
||
|
(const XpOidList*)NULL,
|
||
|
(const XpOidMediumSS*)NULL);
|
||
|
for(i = 0; i < XpOidTrayMediumListCount(input_trays_medium); i++)
|
||
|
{
|
||
|
if(*pTray == XpOidTrayMediumListTray(input_trays_medium, i))
|
||
|
{
|
||
|
medium = XpOidTrayMediumListMedium(input_trays_medium, i);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
XpOidTrayMediumListDelete(input_trays_medium);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
*pTray = xpoid_none;
|
||
|
|
||
|
if(medium == xpoid_none)
|
||
|
{
|
||
|
XpOidMediumSS* local_msss = (XpOidMediumSS*)NULL;
|
||
|
int i_mss, i_ds;
|
||
|
XpOidMediumDiscreteSizeList* ds_list;
|
||
|
/*
|
||
|
* no medium specified; use 1st page size found in
|
||
|
* medium-source-sizes-supported
|
||
|
*/
|
||
|
if((XpOidMediumSS*)NULL == msss)
|
||
|
msss = local_msss =
|
||
|
XpGetMediumSSAttr(pContext, XPPrinterAttr,
|
||
|
xpoid_att_medium_source_sizes_supported,
|
||
|
(const XpOidList*)NULL,
|
||
|
(const XpOidList*)NULL);
|
||
|
for(i_mss = 0;
|
||
|
i_mss < XpOidMediumSSCount(msss) && xpoid_none == medium;
|
||
|
i_mss++)
|
||
|
{
|
||
|
if(XpOidMediumSS_DISCRETE == (msss->mss)[i_mss].mstag
|
||
|
&&
|
||
|
xpoid_none != (msss->mss)[i_mss].input_tray)
|
||
|
{
|
||
|
ds_list = (msss->mss)[i_mss].ms.discrete;
|
||
|
for(i_ds = 0; i_ds < ds_list->count; i_ds++)
|
||
|
{
|
||
|
if(xpoid_none != (ds_list->list)[i_ds].page_size)
|
||
|
{
|
||
|
medium = (ds_list->list)[i_ds].page_size;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
XpOidMediumSSDelete(local_msss);
|
||
|
}
|
||
|
return medium;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetMediumMillimeters returns into the supplied float pointers the
|
||
|
* width and height in millimeters of the passed page size identifier.
|
||
|
*/
|
||
|
void
|
||
|
XpGetMediumMillimeters(
|
||
|
XpOid page_size,
|
||
|
float *width, /* return */
|
||
|
float *height) /* return */
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
*width = *height = 0;
|
||
|
for(i = 0; i < XpNumber(PageDimensions); i++)
|
||
|
{
|
||
|
if(page_size == PageDimensions[i].page_size)
|
||
|
{
|
||
|
*width = PageDimensions[i].width;
|
||
|
*height = PageDimensions[i].height;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Converts a millimeter specification into pixels given a resolution in
|
||
|
* DPI.
|
||
|
*/
|
||
|
static float
|
||
|
MmToPixels(float mm, int resolution)
|
||
|
{
|
||
|
float f;
|
||
|
|
||
|
f = mm * resolution;
|
||
|
f /= 25.4;
|
||
|
return f;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetMediumDimensions returns into the supplied short pointers the
|
||
|
* width and height in pixels of the medium associated with the specified
|
||
|
* print context. It obtains the page size associated with the current
|
||
|
* medium by calling XpGetPageSize. It passes XpGetMediumMillimeters the
|
||
|
* page size, and converts the returned millimeter dimensions into pixels
|
||
|
* using the resolution returned by XpGetResolution.
|
||
|
*
|
||
|
* Note: This routine assumes the values found in the passed context's
|
||
|
* attributes pools have been validated.
|
||
|
*/
|
||
|
void
|
||
|
XpGetMediumDimensions(
|
||
|
XpContextPtr pContext,
|
||
|
unsigned short *width, /* return */
|
||
|
unsigned short *height) /* return */
|
||
|
{
|
||
|
XpOid page_size;
|
||
|
XpOid tray;
|
||
|
XpOid orientation;
|
||
|
|
||
|
int resolution;
|
||
|
float w_mm, h_mm;
|
||
|
|
||
|
page_size = XpGetPageSize(pContext, &tray, (XpOidMediumSS*)NULL);
|
||
|
if(page_size == xpoid_none)
|
||
|
{
|
||
|
/*
|
||
|
* fail-safe: if the pools have been validated, this defaulting logic
|
||
|
* isn't needed.
|
||
|
*/
|
||
|
page_size = xpoid_val_medium_size_na_letter;
|
||
|
}
|
||
|
XpGetMediumMillimeters(page_size, &w_mm, &h_mm);
|
||
|
resolution = XpGetResolution(pContext);
|
||
|
orientation = XpGetContentOrientation(pContext);
|
||
|
switch(orientation)
|
||
|
{
|
||
|
case xpoid_val_content_orientation_landscape:
|
||
|
case xpoid_val_content_orientation_reverse_landscape:
|
||
|
/*
|
||
|
* transpose width and height
|
||
|
*/
|
||
|
*height = MmToPixels(w_mm, resolution);
|
||
|
*width = MmToPixels(h_mm, resolution);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
*width = MmToPixels(w_mm, resolution);
|
||
|
*height = MmToPixels(h_mm, resolution);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XRectangleFromXpOidArea converts an XpOidArea area specification
|
||
|
* into an XRectangle. The passed resolution is used to convert from
|
||
|
* millimeters (XpOidArea) into pixels (XRectangle).
|
||
|
*/
|
||
|
static void
|
||
|
XRectangleFromXpOidArea(
|
||
|
xRectangle *pRect,
|
||
|
const XpOidArea* repro,
|
||
|
int resolution,
|
||
|
XpOid orientation)
|
||
|
{
|
||
|
switch(orientation)
|
||
|
{
|
||
|
case xpoid_val_content_orientation_landscape:
|
||
|
case xpoid_val_content_orientation_reverse_landscape:
|
||
|
/*
|
||
|
* transpose x and y, width and height
|
||
|
*/
|
||
|
pRect->y = MmToPixels(repro->minimum_x, resolution);
|
||
|
pRect->x = MmToPixels(repro->minimum_y, resolution);
|
||
|
pRect->height =
|
||
|
MmToPixels(repro->maximum_x - repro->minimum_x, resolution);
|
||
|
pRect->width =
|
||
|
MmToPixels(repro->maximum_y - repro->minimum_y, resolution);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
pRect->x = MmToPixels(repro->minimum_x, resolution);
|
||
|
pRect->y = MmToPixels(repro->minimum_y, resolution);
|
||
|
pRect->width =
|
||
|
MmToPixels(repro->maximum_x - repro->minimum_x, resolution);
|
||
|
pRect->height =
|
||
|
MmToPixels(repro->maximum_y - repro->minimum_y, resolution);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetReproductionArea queries the current pool attribute values in
|
||
|
* order to determine the reproduction area for the currently selected
|
||
|
* medium.
|
||
|
*
|
||
|
* First the current page size (equivalent to current medium) and tray
|
||
|
* (if specified) is retrieved via XpGetPageSize. The value of the
|
||
|
* medium-source-sizes-supported attribute is interrogated until a matching
|
||
|
* entry for the current page size and tray is found. The reproduction
|
||
|
* area defined for the current entry is converted into an XRectangle
|
||
|
* using XRectangleFromXpOidArea and returned to the caller.
|
||
|
*
|
||
|
* Note: This routine assumes the values found in the passed context's
|
||
|
* attributes pools have been validated.
|
||
|
*/
|
||
|
void
|
||
|
XpGetReproductionArea(XpContextPtr pContext,
|
||
|
xRectangle *pRect)
|
||
|
{
|
||
|
XpOid page_size;
|
||
|
XpOid tray;
|
||
|
XpOidMediumSS* msss;
|
||
|
int i_mss, i_ds;
|
||
|
XpOidMediumDiscreteSizeList* ds_list;
|
||
|
XpOidArea* repro;
|
||
|
BOOL done;
|
||
|
int resolution;
|
||
|
XpOid orientation;
|
||
|
/*
|
||
|
* find the appropriate assured reproduction area for the current
|
||
|
* tray and page size in the medium-source-sizes-supported attribute.
|
||
|
*/
|
||
|
msss = XpGetMediumSSAttr(pContext, XPPrinterAttr,
|
||
|
xpoid_att_medium_source_sizes_supported,
|
||
|
(const XpOidList*)NULL,
|
||
|
(const XpOidList*)NULL);
|
||
|
page_size = XpGetPageSize(pContext, &tray, msss);
|
||
|
resolution = XpGetResolution(pContext);
|
||
|
orientation = XpGetContentOrientation(pContext);
|
||
|
|
||
|
memset(pRect, 0, sizeof(xRectangle));
|
||
|
|
||
|
if(xpoid_none == tray)
|
||
|
{
|
||
|
/*
|
||
|
* no tray specified; use 1st matching page size
|
||
|
*/
|
||
|
for(i_mss = 0, done = xFalse;
|
||
|
i_mss < XpOidMediumSSCount(msss) && !done;
|
||
|
i_mss++)
|
||
|
{
|
||
|
if(XpOidMediumSS_DISCRETE == (msss->mss)[i_mss].mstag
|
||
|
&&
|
||
|
xpoid_none != (msss->mss)[i_mss].input_tray)
|
||
|
{
|
||
|
ds_list = (msss->mss)[i_mss].ms.discrete;
|
||
|
for(i_ds = 0; i_ds < ds_list->count; i_ds++)
|
||
|
{
|
||
|
if(page_size == (ds_list->list)[i_ds].page_size)
|
||
|
{
|
||
|
repro =
|
||
|
&(ds_list->list)[i_ds].assured_reproduction_area;
|
||
|
XRectangleFromXpOidArea(pRect, repro,
|
||
|
resolution, orientation);
|
||
|
done = xTrue;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
/*
|
||
|
* tray && page size specified; find matching entry
|
||
|
*/
|
||
|
for(i_mss = 0, done = xFalse;
|
||
|
i_mss < XpOidMediumSSCount(msss) && !done;
|
||
|
i_mss++)
|
||
|
{
|
||
|
if(XpOidMediumSS_DISCRETE == (msss->mss)[i_mss].mstag
|
||
|
&&
|
||
|
xpoid_none != (msss->mss)[i_mss].input_tray
|
||
|
&&
|
||
|
(tray == (msss->mss)[i_mss].input_tray
|
||
|
||
|
||
|
xpoid_unspecified == (msss->mss)[i_mss].input_tray)
|
||
|
)
|
||
|
{
|
||
|
ds_list = (msss->mss)[i_mss].ms.discrete;
|
||
|
for(i_ds = 0; i_ds < ds_list->count; i_ds++)
|
||
|
{
|
||
|
if(page_size == (ds_list->list)[i_ds].page_size)
|
||
|
{
|
||
|
repro =
|
||
|
&(ds_list->list)[i_ds].assured_reproduction_area;
|
||
|
XRectangleFromXpOidArea(pRect, repro,
|
||
|
resolution, orientation);
|
||
|
if(xpoid_unspecified != (msss->mss)[i_mss].input_tray)
|
||
|
{
|
||
|
/*
|
||
|
* exact match on tray takes precendence over
|
||
|
* unspecified tray entry in m-s-s-s
|
||
|
*/
|
||
|
done = xTrue;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
XpOidMediumSSDelete(msss);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* XpGetMaxWidthHeightRes returns into the supplied width and height
|
||
|
* unsigned short pointers the dimensions in millimeters of the largest
|
||
|
* supported media for a specific printer. It looks at the
|
||
|
* medium-source-sizes-supported attribute (if it exists) to determine
|
||
|
* the list of possible media, and calls XpGetMediumMillimeters to get the
|
||
|
* dimensions for each medium. If the m-s-s-s attribute is not defined,
|
||
|
* then the dimensions for the na-letter medium is returned.
|
||
|
*
|
||
|
* This function also returns the largest resolution in DPI defined in
|
||
|
* printer-resolutions-supported. If printer-resolutions-supported is not
|
||
|
* specified, the default is obtained from the passed XpValidatePoolsRec.
|
||
|
*
|
||
|
* The passed XpValidatePoolsRec is also used to determine valid values
|
||
|
* when parsing attribute values.
|
||
|
*/
|
||
|
void
|
||
|
XpGetMaxWidthHeightRes(
|
||
|
const char *printer_name,
|
||
|
const XpValidatePoolsRec* vpr,
|
||
|
float *width,
|
||
|
float *height,
|
||
|
int* resolution)
|
||
|
{
|
||
|
const char* value;
|
||
|
const char* attr_str;
|
||
|
XpOidMediumSS* pool_msss;
|
||
|
const XpOidMediumSS* msss;
|
||
|
int i_mss, i_ds;
|
||
|
XpOidMediumDiscreteSizeList* ds_list;
|
||
|
float w, h;
|
||
|
XpOidCardList* pool_resolutions_supported;
|
||
|
const XpOidCardList* resolutions_supported;
|
||
|
int i;
|
||
|
int res;
|
||
|
/*
|
||
|
* get the max medium width and height
|
||
|
*/
|
||
|
attr_str = XpOidString(xpoid_att_medium_source_sizes_supported);
|
||
|
value = XpGetPrinterAttribute(printer_name, attr_str);
|
||
|
pool_msss = XpOidMediumSSNew(value,
|
||
|
vpr->valid_input_trays,
|
||
|
vpr->valid_medium_sizes);
|
||
|
if(0 == XpOidMediumSSCount(pool_msss))
|
||
|
msss = XpGetDefaultMediumSS();
|
||
|
else
|
||
|
msss = pool_msss;
|
||
|
*width = *height = 0;
|
||
|
for(i_mss = 0; i_mss < XpOidMediumSSCount(msss); i_mss++)
|
||
|
{
|
||
|
if(XpOidMediumSS_DISCRETE == (msss->mss)[i_mss].mstag
|
||
|
&&
|
||
|
xpoid_none != (msss->mss)[i_mss].input_tray)
|
||
|
{
|
||
|
ds_list = (msss->mss)[i_mss].ms.discrete;
|
||
|
for(i_ds = 0; i_ds < ds_list->count; i_ds++)
|
||
|
{
|
||
|
if(xpoid_none != (ds_list->list)[i_ds].page_size)
|
||
|
{
|
||
|
XpGetMediumMillimeters((ds_list->list)[i_ds].page_size,
|
||
|
&w, &h);
|
||
|
if(w > *width) *width = w;
|
||
|
if(h > *height) *height = h;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
XpOidMediumSSDelete(pool_msss);
|
||
|
/*
|
||
|
* get the maximum resolution
|
||
|
*/
|
||
|
attr_str = XpOidString(xpoid_att_printer_resolutions_supported);
|
||
|
value = XpGetPrinterAttribute(printer_name, attr_str);
|
||
|
pool_resolutions_supported =
|
||
|
XpOidCardListNew(value, vpr->valid_printer_resolutions_supported);
|
||
|
if(0 == XpOidCardListCount(pool_resolutions_supported))
|
||
|
resolutions_supported = vpr->default_printer_resolutions_supported;
|
||
|
else
|
||
|
resolutions_supported = pool_resolutions_supported;
|
||
|
*resolution = 0;
|
||
|
for(i = 0; i < XpOidCardListCount(resolutions_supported); i++)
|
||
|
{
|
||
|
res = XpOidCardListGetCard(resolutions_supported, i);
|
||
|
if(res > *resolution) *resolution = res;
|
||
|
}
|
||
|
XpOidCardListDelete(pool_resolutions_supported);
|
||
|
}
|
||
|
|
||
|
FontResolutionPtr
|
||
|
XpGetClientResolutions(client, num)
|
||
|
ClientPtr client;
|
||
|
int *num;
|
||
|
{
|
||
|
static struct _FontResolution res;
|
||
|
int resolution = XpGetResolution(XpContextOfClient(client));
|
||
|
|
||
|
res.x_resolution = resolution;
|
||
|
res.y_resolution = resolution;
|
||
|
|
||
|
res.point_size = 120;
|
||
|
|
||
|
*num = 1;
|
||
|
|
||
|
return &res;
|
||
|
}
|
||
|
|
||
|
|
||
|
void XpSetFontResFunc(client)
|
||
|
ClientPtr client;
|
||
|
{
|
||
|
client->fontResFunc = XpGetClientResolutions;
|
||
|
}
|
||
|
|
||
|
|
||
|
void XpUnsetFontResFunc(client)
|
||
|
ClientPtr client;
|
||
|
{
|
||
|
client->fontResFunc = NULL;
|
||
|
}
|