mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 05:15:45 +00:00
Bug 175879. Display ISO paper sizes in mm & remove extraneous 1/4-inch
margin from printouts. r=tor, sr=roc
This commit is contained in:
parent
64209ceda0
commit
17802f01e7
@ -131,6 +131,15 @@ EXPORTS += \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
ifdef MOZ_ENABLE_POSTSCRIPT
|
||||
CPPSRCS += \
|
||||
ps/nsPaperPS.cpp \
|
||||
$(NULL)
|
||||
EXPORTS += \
|
||||
ps/nsPaperPS.h \
|
||||
$(NULL)
|
||||
endif
|
||||
|
||||
EXTRA_DSO_LDOPTS = \
|
||||
$(DIST)/lib/$(LIB_PREFIX)mozutil_s.$(LIB_SUFFIX) \
|
||||
$(MOZ_UNICHARUTIL_LIBS) \
|
||||
|
@ -63,8 +63,7 @@
|
||||
#endif /* USE_XPRINT */
|
||||
|
||||
#ifdef USE_POSTSCRIPT
|
||||
/* Fetch |postscript_module_paper_sizes| */
|
||||
#include "nsPostScriptObj.h"
|
||||
#include "nsPaperPS.h" /* Paper size list */
|
||||
#endif /* USE_POSTSCRIPT */
|
||||
|
||||
/* Ensure that the result is always equal to either PR_TRUE or PR_FALSE */
|
||||
@ -948,13 +947,9 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter(const PRUnich
|
||||
}
|
||||
|
||||
#ifdef SET_PRINTER_FEATURES_VIA_PREFS
|
||||
int i;
|
||||
for( i = 0 ; postscript_module_orientations[i].orientation != nsnull ; i++ )
|
||||
{
|
||||
const PSOrientationRec *curr = &postscript_module_orientations[i];
|
||||
printerFeatures.SetOrientationRecord(i, curr->orientation);
|
||||
}
|
||||
printerFeatures.SetNumOrientationRecords(i);
|
||||
printerFeatures.SetOrientationRecord(0, "portrait");
|
||||
printerFeatures.SetOrientationRecord(1, "landscape");
|
||||
printerFeatures.SetNumOrientationRecords(2);
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
|
||||
/* PostScript module does not support changing the plex mode... */
|
||||
@ -973,44 +968,31 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter(const PRUnich
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
nsXPIDLCString papername;
|
||||
if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "paper_size", getter_Copies(papername)))) {
|
||||
int i;
|
||||
const PSPaperSizeRec *default_paper = nsnull;
|
||||
|
||||
for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ )
|
||||
{
|
||||
const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i];
|
||||
nsPaperSizePS paper;
|
||||
|
||||
if (!PL_strcasecmp(papername, curr->name)) {
|
||||
default_paper = curr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (default_paper) {
|
||||
DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g inch/%g inch)\n",
|
||||
default_paper->name,
|
||||
PSPaperSizeRec_FullPaperWidth(default_paper),
|
||||
PSPaperSizeRec_FullPaperHeight(default_paper)));
|
||||
aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined);
|
||||
aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeInches);
|
||||
aPrintSettings->SetPaperWidth(PSPaperSizeRec_FullPaperWidth(default_paper));
|
||||
aPrintSettings->SetPaperHeight(PSPaperSizeRec_FullPaperHeight(default_paper));
|
||||
aPrintSettings->SetPaperName(NS_ConvertUTF8toUCS2(default_paper->name).get());
|
||||
if (paper.Find(papername)) {
|
||||
DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g mm/%g mm)\n",
|
||||
paper.Name(), paper.Width_mm(), paper.Height_mm()));
|
||||
aPrintSettings->SetPaperSizeUnit(paper.IsMetric() ?
|
||||
(int)nsIPrintSettings::kPaperSizeMillimeters :
|
||||
(int)nsIPrintSettings::kPaperSizeInches);
|
||||
aPrintSettings->SetPaperWidth(paper.Width_mm());
|
||||
aPrintSettings->SetPaperHeight(paper.Height_mm());
|
||||
aPrintSettings->SetPaperName(NS_ConvertASCIItoUCS2(paper.Name()).get());
|
||||
}
|
||||
else {
|
||||
DO_PR_DEBUG_LOG(("Unknown paper size '%s' given.\n", papername.get()));
|
||||
}
|
||||
#ifdef SET_PRINTER_FEATURES_VIA_PREFS
|
||||
for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ )
|
||||
paper.First();
|
||||
int count = 0;
|
||||
while (!paper.AtEnd())
|
||||
{
|
||||
const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i];
|
||||
#define CONVERT_INCH_TO_MILLIMETERS(inch) ((inch) * 25.4)
|
||||
double total_width = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperWidth(curr)),
|
||||
total_height = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperHeight(curr));
|
||||
|
||||
printerFeatures.SetPaperRecord(i, curr->name, PRInt32(total_width), PRInt32(total_height), PR_TRUE);
|
||||
printerFeatures.SetPaperRecord(count++, paper.Name(),
|
||||
(int)paper.Width_mm(), (int)paper.Height_mm(), !paper.IsMetric());
|
||||
paper.Next();
|
||||
}
|
||||
printerFeatures.SetNumPaperSizeRecords(i);
|
||||
printerFeatures.SetNumPaperSizeRecords(count);
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
}
|
||||
|
||||
|
72
gfx/src/ps/nsPaperPS.cpp
Normal file
72
gfx/src/ps/nsPaperPS.cpp
Normal file
@ -0,0 +1,72 @@
|
||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ex: set tabstop=8 softtabstop=4 shiftwidth=4 expandtab: */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is developed for mozilla. The tables of paper sizes
|
||||
* and paper orientations are based on tables from nsPostScriptObj.h.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Kenneth Herron <kherron@newsguy.com>.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
#include "nsPaperPS.h"
|
||||
#include "plstr.h"
|
||||
|
||||
#define COUNTOF(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
const nsPaperSizePS_ nsPaperSizePS::mList[] =
|
||||
{
|
||||
#define SIZE_MM(x) (x)
|
||||
#define SIZE_INCH(x) ((x) * 25.4)
|
||||
{ "A5", SIZE_MM(148), SIZE_MM(210), PR_TRUE },
|
||||
{ "A4", SIZE_MM(210), SIZE_MM(297), PR_TRUE },
|
||||
{ "A3", SIZE_MM(297), SIZE_MM(420), PR_TRUE },
|
||||
{ "Letter", SIZE_INCH(8.5), SIZE_INCH(11), PR_FALSE },
|
||||
{ "Legal", SIZE_INCH(8.5), SIZE_INCH(14), PR_FALSE },
|
||||
{ "Executive", SIZE_INCH(7.5), SIZE_INCH(10), PR_FALSE },
|
||||
#undef SIZE_INCH
|
||||
#undef SIZE_MM
|
||||
};
|
||||
|
||||
const unsigned int nsPaperSizePS::mCount = COUNTOF(mList);
|
||||
|
||||
PRBool
|
||||
nsPaperSizePS::Find(const char *aName)
|
||||
{
|
||||
for (int i = mCount; i--; ) {
|
||||
if (!PL_strcasecmp(aName, mList[i].name)) {
|
||||
mCurrent = i;
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
return PR_FALSE;
|
||||
}
|
126
gfx/src/ps/nsPaperPS.h
Normal file
126
gfx/src/ps/nsPaperPS.h
Normal file
@ -0,0 +1,126 @@
|
||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* ex: set tabstop=8 softtabstop=4 shiftwidth=4 expandtab: */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is developed for mozilla.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Kenneth Herron <kherron@newsguy.com>.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2004
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
#ifndef _PAPERPS_H_
|
||||
#define _PAPERPS_H_
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "nsDebug.h"
|
||||
|
||||
struct nsPaperSizePS_ {
|
||||
const char *name;
|
||||
float width_mm;
|
||||
float height_mm;
|
||||
PRBool isMetric; // Present to the user in metric, if possible
|
||||
};
|
||||
|
||||
class nsPaperSizePS {
|
||||
public:
|
||||
/** ---------------------------------------------------
|
||||
* Constructor
|
||||
*/
|
||||
nsPaperSizePS() { mCurrent = 0; }
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* @return PR_TRUE if the cursor points past the last item.
|
||||
*/
|
||||
PRBool AtEnd() { return mCurrent >= mCount; }
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* Position the cursor at the beginning of the paper size list.
|
||||
* @return VOID
|
||||
*/
|
||||
void First() { mCurrent = 0; }
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* Advance the cursor to the next item.
|
||||
* @return VOID
|
||||
*/
|
||||
void Next() {
|
||||
NS_WARN_IF_FALSE(!AtEnd(), "Invalid current item");
|
||||
mCurrent++;
|
||||
}
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* Point the cursor to the entry with the given paper name.
|
||||
* @return PR_TRUE if pointing to a valid entry.
|
||||
*/
|
||||
PRBool Find(const char *aName);
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* @return a pointer to the name of the current paper size
|
||||
*/
|
||||
const char *Name() {
|
||||
NS_PRECONDITION(!AtEnd(), "Invalid current item");
|
||||
return mList[mCurrent].name;
|
||||
}
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* @return the width of the page in millimeters
|
||||
*/
|
||||
float Width_mm() {
|
||||
NS_PRECONDITION(!AtEnd(), "Invalid current item");
|
||||
return mList[mCurrent].width_mm;
|
||||
}
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* @return the height of the page in millimeters
|
||||
*/
|
||||
float Height_mm() {
|
||||
NS_PRECONDITION(!AtEnd(), "Invalid current item");
|
||||
return mList[mCurrent].height_mm;
|
||||
}
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* @return PR_TRUE if the paper should be presented to
|
||||
* the user in metric units.
|
||||
*/
|
||||
PRBool IsMetric() {
|
||||
NS_PRECONDITION(!AtEnd(), "Invalid current item");
|
||||
return mList[mCurrent].isMetric;
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned int mCurrent;
|
||||
static const nsPaperSizePS_ mList[];
|
||||
static const unsigned int mCount;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -19,6 +19,7 @@
|
||||
*
|
||||
* Contributor(s):
|
||||
* Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
|
||||
* Ken Herron <kherron@newsguy.com>
|
||||
*
|
||||
* This Original Code has been modified by IBM Corporation. Modifications made by IBM
|
||||
* described herein are Copyright (c) International Business Machines Corporation, 2000.
|
||||
@ -54,6 +55,7 @@
|
||||
#include "nsIPersistentProperties2.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsFontMetricsPS.h"
|
||||
#include "nsPaperPS.h"
|
||||
|
||||
#ifndef NS_BUILD_ID
|
||||
#include "nsBuildID.h"
|
||||
@ -261,25 +263,9 @@ nsPostScriptObj::settitle(PRUnichar * aTitle)
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
const PSPaperSizeRec *paper_name_to_PSPaperSizeRec(const char *paper_name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ )
|
||||
{
|
||||
const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i];
|
||||
|
||||
if (!PL_strcasecmp(paper_name, curr->name))
|
||||
return curr;
|
||||
}
|
||||
|
||||
return nsnull;
|
||||
}
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* See documentation in nsPostScriptObj.h
|
||||
* @update 2/1/99 dwc
|
||||
* @update 2/20/2004 kherron
|
||||
*/
|
||||
nsresult
|
||||
nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec )
|
||||
@ -288,7 +274,6 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec )
|
||||
isAPrinter,
|
||||
isFirstPageFirst;
|
||||
int landscape;
|
||||
float fwidth, fheight;
|
||||
const char *printername;
|
||||
nsresult rv;
|
||||
|
||||
@ -313,14 +298,6 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec )
|
||||
if ( isFirstPageFirst == PR_FALSE )
|
||||
mPrintSetup->reverse = 1;
|
||||
|
||||
/* Find PS paper size record by name */
|
||||
const char *paper_name = nsnull;
|
||||
aSpec->GetPaperName(&paper_name);
|
||||
mPrintSetup->paper_size = paper_name_to_PSPaperSizeRec(paper_name);
|
||||
|
||||
if (!mPrintSetup->paper_size)
|
||||
return NS_ERROR_GFX_PRINTER_PAPER_SIZE_NOT_SUPPORTED;
|
||||
|
||||
// Clean up tempfile remnants of any previous print job
|
||||
if (mDocProlog)
|
||||
mDocProlog->Remove(PR_FALSE);
|
||||
@ -425,34 +402,26 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec )
|
||||
memset(mPrintContext, 0, sizeof(struct PSContext_));
|
||||
memset(pi, 0, sizeof(struct PrintInfo_));
|
||||
|
||||
mPrintSetup->dpi = 72.0f; // dpi for externally sized items
|
||||
/* Find PS paper size record by name */
|
||||
aSpec->GetPaperName(&(mPrintSetup->paper_name));
|
||||
nsPaperSizePS paper;
|
||||
if (!paper.Find(mPrintSetup->paper_name))
|
||||
return NS_ERROR_GFX_PRINTER_PAPER_SIZE_NOT_SUPPORTED;
|
||||
|
||||
aSpec->GetLandscape( landscape );
|
||||
fwidth = mPrintSetup->paper_size->width;
|
||||
fheight = mPrintSetup->paper_size->height;
|
||||
mPrintSetup->width = NS_MILLIMETERS_TO_TWIPS(paper.Width_mm());
|
||||
mPrintSetup->height = NS_MILLIMETERS_TO_TWIPS(paper.Height_mm());
|
||||
|
||||
if (landscape) {
|
||||
float temp;
|
||||
temp = fwidth;
|
||||
fwidth = fheight;
|
||||
fheight = temp;
|
||||
nscoord temp = mPrintSetup->width;
|
||||
mPrintSetup->width = mPrintSetup->height;
|
||||
mPrintSetup->height = temp;
|
||||
}
|
||||
|
||||
mPrintSetup->left = NSToCoordRound(mPrintSetup->paper_size->left
|
||||
* mPrintSetup->dpi * TWIPS_PER_POINT_FLOAT);
|
||||
mPrintSetup->top = NSToCoordRound(mPrintSetup->paper_size->top
|
||||
* mPrintSetup->dpi * TWIPS_PER_POINT_FLOAT);
|
||||
mPrintSetup->bottom = NSToCoordRound(mPrintSetup->paper_size->bottom
|
||||
* mPrintSetup->dpi * TWIPS_PER_POINT_FLOAT);
|
||||
mPrintSetup->right = NSToCoordRound(mPrintSetup->paper_size->right
|
||||
* mPrintSetup->dpi * TWIPS_PER_POINT_FLOAT);
|
||||
|
||||
mPrintSetup->width = NSToCoordRound(fwidth
|
||||
* mPrintSetup->dpi * TWIPS_PER_POINT_FLOAT);
|
||||
mPrintSetup->height = NSToCoordRound(fheight
|
||||
* mPrintSetup->dpi * TWIPS_PER_POINT_FLOAT);
|
||||
#ifdef DEBUG
|
||||
printf("\nPreWidth = %f PreHeight = %f\n",fwidth,fheight);
|
||||
printf("\nWidth = %d Height = %d\n",mPrintSetup->width,mPrintSetup->height);
|
||||
printf("\nPaper Width = %d twips (%gmm) Height = %d twips (%gmm)\n",
|
||||
mPrintSetup->width, paper.Width_mm(),
|
||||
mPrintSetup->height, paper.Height_mm());
|
||||
#endif
|
||||
mPrintSetup->header = "header";
|
||||
mPrintSetup->footer = "footer";
|
||||
@ -464,10 +433,7 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec )
|
||||
mPrintSetup->underline = PR_TRUE; // underline links
|
||||
mPrintSetup->scale_images = PR_TRUE; // Scale unsized images which are too big
|
||||
mPrintSetup->scale_pre = PR_FALSE; // do the pre-scaling thing
|
||||
// scale margins (specified in inches) to dots.
|
||||
|
||||
PR_LOG(nsPostScriptObjLM, PR_LOG_DEBUG, ("dpi %g top %d bottom %d left %d right %d\n",
|
||||
mPrintSetup->dpi, mPrintSetup->top, mPrintSetup->bottom, mPrintSetup->left, mPrintSetup->right));
|
||||
|
||||
mPrintSetup->rules = 1.0f; // Scale factor for rulers
|
||||
mPrintSetup->n_up = 0; // cool page combining
|
||||
@ -487,23 +453,9 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec )
|
||||
mPrintSetup->carg = nsnull; // Data saved for completion routine
|
||||
mPrintSetup->status = 0; // Status of URL on completion
|
||||
|
||||
pi->page_height = mPrintSetup->height; // Size of printable area on page
|
||||
pi->page_width = mPrintSetup->width; // Size of printable area on page
|
||||
pi->page_break = 0; // Current page bottom
|
||||
pi->page_topy = 0; // Current page top
|
||||
pi->phase = 0;
|
||||
|
||||
|
||||
pi->pages = nsnull; // Contains extents of each page
|
||||
|
||||
pi->pt_size = 0; // Size of above table
|
||||
pi->n_pages = 0; // # of valid entries in above table
|
||||
|
||||
mTitle = nsnull;
|
||||
|
||||
pi->doc_title = mTitle;
|
||||
pi->doc_width = 0; // Total document width
|
||||
pi->doc_height = 0; // Total document height
|
||||
|
||||
mPrintContext->prInfo = pi;
|
||||
|
||||
@ -553,10 +505,8 @@ nsPostScriptObj::begin_document()
|
||||
int i;
|
||||
FILE *f;
|
||||
|
||||
nscoord paper_width = mPrintContext->prSetup->left
|
||||
+ mPrintContext->prSetup->width + mPrintContext->prSetup->right;
|
||||
nscoord paper_height = mPrintContext->prSetup->bottom
|
||||
+ mPrintContext->prSetup->height + mPrintContext->prSetup->top;
|
||||
nscoord paper_width = mPrintContext->prSetup->width;
|
||||
nscoord paper_height = mPrintContext->prSetup->height;
|
||||
const char *orientation;
|
||||
|
||||
if (paper_height < paper_width) {
|
||||
@ -573,16 +523,14 @@ FILE *f;
|
||||
|
||||
f = mPrintContext->prSetup->out;
|
||||
fprintf(f, "%%!PS-Adobe-3.0\n");
|
||||
fprintf(f, "%%%%BoundingBox: %s %s %s %s\n",
|
||||
fpCString(NSTwipsToFloatPoints(mPrintContext->prSetup->left)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(mPrintContext->prSetup->bottom)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(paper_width - mPrintContext->prSetup->right)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(paper_height - mPrintContext->prSetup->top)).get());
|
||||
fprintf(f, "%%%%BoundingBox: 0 0 %s %s\n",
|
||||
fpCString(NSTwipsToFloatPoints(paper_width)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(paper_height)).get());
|
||||
|
||||
fprintf(f, "%%%%Creator: Mozilla PostScript module (%s/%lu)\n",
|
||||
"rv:" MOZILLA_VERSION, (unsigned long)NS_BUILD_ID);
|
||||
fprintf(f, "%%%%DocumentData: Clean8Bit\n");
|
||||
fprintf(f, "%%%%DocumentPaperSizes: %s\n", mPrintSetup->paper_size->name);
|
||||
fprintf(f, "%%%%DocumentPaperSizes: %s\n", mPrintSetup->paper_name);
|
||||
fprintf(f, "%%%%Orientation: %s\n", orientation);
|
||||
|
||||
// hmm, n_pages is always zero so don't use it
|
||||
@ -621,17 +569,12 @@ FILE *f;
|
||||
// Tell the printer what size paper it should use
|
||||
fprintf(f,
|
||||
"/setpagedevice where\n" // Test for the feature
|
||||
"{ pop 2 dict\n" // Set up a dictionary
|
||||
"{ pop 1 dict\n" // Set up a dictionary
|
||||
" dup /PageSize [ %s %s ] put\n" // Paper dimensions
|
||||
" dup /ImagingBBox [ %s %s %s %s ] put\n" // Bounding box
|
||||
" setpagedevice\n" // Install settings
|
||||
"} if\n",
|
||||
fpCString(NSTwipsToFloatPoints(paper_width)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(paper_height)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(mPrintContext->prSetup->left)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(mPrintContext->prSetup->bottom)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(paper_width - mPrintContext->prSetup->right)).get(),
|
||||
fpCString(NSTwipsToFloatPoints(paper_height - mPrintContext->prSetup->top)).get());
|
||||
fpCString(NSTwipsToFloatPoints(paper_height)).get());
|
||||
|
||||
fprintf(f, "[");
|
||||
for (i = 0; i < 256; i++){
|
||||
@ -2003,26 +1946,14 @@ FILE *f;
|
||||
fprintf(f,"/pagelevel save def\n");
|
||||
// Rescale the coordinate system from points to twips.
|
||||
scale(1.0 / TWIPS_PER_POINT_FLOAT, 1.0 / TWIPS_PER_POINT_FLOAT);
|
||||
// Move the origin to the bottom left of the printable region.
|
||||
// Rotate and shift the coordinate system for landscape
|
||||
if (mPrintContext->prSetup->landscape){
|
||||
fprintf(f, "90 rotate %d -%d translate\n",
|
||||
mPrintContext->prSetup->left,
|
||||
mPrintContext->prSetup->height + mPrintContext->prSetup->top);
|
||||
}
|
||||
else {
|
||||
fprintf(f, "%d %d translate\n",
|
||||
mPrintContext->prSetup->left,
|
||||
mPrintContext->prSetup->bottom);
|
||||
fprintf(f, "90 rotate 0 -%d translate\n", mPrintContext->prSetup->height);
|
||||
}
|
||||
|
||||
// Try to turn on automatic stroke adjust
|
||||
fputs("true Msetstrokeadjust\n", f);
|
||||
fprintf(f, "%%%%EndPageSetup\n");
|
||||
#if 0
|
||||
annotate_page( mPrintContext->prSetup->header, 0, -1, pn);
|
||||
#endif
|
||||
// Set up a clipping rectangle around the printable area.
|
||||
fprintf(f, "0 0 %d %d Mrect closepath clip newpath\n",
|
||||
mPrintContext->prInfo->page_width, mPrintContext->prInfo->page_height);
|
||||
|
||||
// need to reset all U2Ntable
|
||||
gLangGroups->Enumerate(ResetU2Ntable, nsnull);
|
||||
@ -2035,18 +1966,7 @@ FILE *f;
|
||||
void
|
||||
nsPostScriptObj::end_page()
|
||||
{
|
||||
#if 0
|
||||
annotate_page( mPrintContext->prSetup->footer,
|
||||
mPrintContext->prSetup->height-mPrintContext->prSetup->bottom-mPrintContext->prSetup->top,
|
||||
1, pn);
|
||||
fprintf(mPrintContext->prSetup->out, "pagelevel restore\nshowpage\n");
|
||||
#endif
|
||||
|
||||
fprintf(mPrintContext->prSetup->tmpBody, "pagelevel restore\n");
|
||||
annotate_page(mPrintContext->prSetup->header, mPrintContext->prSetup->top/2, -1, mPageNumber);
|
||||
annotate_page( mPrintContext->prSetup->footer,
|
||||
mPrintContext->prSetup->height - mPrintContext->prSetup->bottom/2,
|
||||
1, mPageNumber);
|
||||
fprintf(mPrintContext->prSetup->tmpBody, "showpage\n");
|
||||
mPageNumber++;
|
||||
}
|
||||
@ -2163,17 +2083,6 @@ nsPostScriptObj::end_document()
|
||||
return rv;
|
||||
}
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* See documentation in nsPostScriptObj.h
|
||||
* @update 2/1/99 dwc
|
||||
*/
|
||||
void
|
||||
nsPostScriptObj::annotate_page(const char *aTemplate,
|
||||
int y, int delta_dir, int pn)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/** ---------------------------------------------------
|
||||
* See documentation in nsPostScriptObj.h
|
||||
* @update 2/1/99 dwc. Updated 3/22/2000 to deal with only non-Unicode chars. yueheng.xu@intel.com
|
||||
|
@ -21,6 +21,7 @@
|
||||
*
|
||||
* Contributor(s):
|
||||
* Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
|
||||
* Ken Herron <kherron@newsguy.com>
|
||||
*
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
@ -67,46 +68,6 @@ class nsIImage;
|
||||
|
||||
typedef int XP_Bool;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
float left,
|
||||
top,
|
||||
right,
|
||||
bottom,
|
||||
width,
|
||||
height;
|
||||
} PSPaperSizeRec;
|
||||
|
||||
|
||||
static const
|
||||
PSPaperSizeRec postscript_module_paper_sizes[] =
|
||||
{
|
||||
{ "A5", 0.25f, 0.25f, 0.25f, 0.25f, 5.33f, 7.77f }, /* 148mm X 210mm ( 5.83in X 8.27in) */
|
||||
{ "A4", 0.25f, 0.25f, 0.25f, 0.25f, 7.77f, 11.19f }, /* 210mm X 297mm ( 8.27in X 11.69in) */
|
||||
{ "A3", 0.25f, 0.25f, 0.25f, 0.25f, 11.19f, 16.03f }, /* 297mm X 420mm (11.69in X 16.53in) */
|
||||
{ "Letter", 0.25f, 0.25f, 0.25f, 0.25f, 8.00f, 10.50f }, /* 8.50in X 11.0in */
|
||||
{ "Legal", 0.25f, 0.25f, 0.25f, 0.25f, 8.00f, 13.50f }, /* 8.50in X 14.0in */
|
||||
{ "Executive", 0.25f, 0.25f, 0.25f, 0.25f, 7.00f, 9.50f }, /* 7.50in X 10.0in */
|
||||
{ 0, 0.25f, 0.25f, 0.25f, 0.25f, 0.00f, 0.0f }
|
||||
};
|
||||
|
||||
#define PSPaperSizeRec_FullPaperWidth(rec) ((rec)->left + (rec)->right + (rec)->width)
|
||||
#define PSPaperSizeRec_FullPaperHeight(rec) ((rec)->top + (rec)->bottom + (rec)->height)
|
||||
|
||||
/* This will be extended some day... */
|
||||
typedef struct {
|
||||
const char *orientation;
|
||||
} PSOrientationRec;
|
||||
|
||||
/* This will be extended some day... */
|
||||
static const
|
||||
PSOrientationRec postscript_module_orientations[] =
|
||||
{
|
||||
{ "portrait" },
|
||||
{ "landscape" },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
typedef void (*XL_CompletionRoutine)(void*);
|
||||
|
||||
typedef struct page_breaks {
|
||||
@ -127,21 +88,7 @@ typedef struct LineRecord_struct LineRecord;
|
||||
** Used to store state needed while translation is in progress
|
||||
*/
|
||||
struct PrintInfo_ {
|
||||
/* for table printing */
|
||||
int32 page_height; /* Size of printable area on page */
|
||||
int32 page_width; /* Size of printable area on page */
|
||||
int32 page_break; /* Current page bottom */
|
||||
int32 page_topy; /* Current page top */
|
||||
int phase;
|
||||
|
||||
PageBreaks *pages; /* Contains extents of each page */
|
||||
|
||||
int pt_size; /* Size of above table */
|
||||
int n_pages; /* # of valid entries in above table */
|
||||
|
||||
const char *doc_title; /* best guess at title */
|
||||
int32 doc_width; /* Total document width */
|
||||
int32 doc_height; /* Total document height */
|
||||
|
||||
#ifdef LATER
|
||||
THIS IS GOING TO BE DELETED XXXXX
|
||||
@ -168,16 +115,12 @@ typedef struct PrintInfo_ PrintInfo;
|
||||
** Used to pass info into text and/or postscript translation
|
||||
*/
|
||||
struct PrintSetup_ {
|
||||
nscoord top; /* Margins -- distance from the edge */
|
||||
nscoord bottom; /* of the printable region to the */
|
||||
nscoord left; /* edge of the paper. Measured in twips. */
|
||||
nscoord right;
|
||||
|
||||
nscoord width; /* Paper size, in twips. */
|
||||
nscoord height;
|
||||
nscoord width; /* Page size, in twips, as oriented for */
|
||||
nscoord height; /* this print job. */
|
||||
|
||||
const char* header;
|
||||
const char* footer;
|
||||
const char* paper_name;
|
||||
|
||||
int *sizes;
|
||||
XP_Bool reverse; /* Output order */
|
||||
@ -187,11 +130,9 @@ struct PrintSetup_ {
|
||||
XP_Bool underline; /* underline links */
|
||||
XP_Bool scale_images; /* Scale unsized images which are too big */
|
||||
XP_Bool scale_pre; /* do the pre-scaling thing */
|
||||
float dpi; /* dpi for externally sized items */
|
||||
float rules; /* Scale factor for rulers */
|
||||
int n_up; /* cool page combining */
|
||||
int bigger; /* Used to init sizes if sizesin NULL */
|
||||
const PSPaperSizeRec *paper_size; /* Paper size record */
|
||||
const char* prefix; /* For text xlate, prepended to each line */
|
||||
const char* eol; /* For text translation, line terminator */
|
||||
const char* bullet; /* What char to use for bullets */
|
||||
@ -373,11 +314,6 @@ public:
|
||||
* @update 2/1/99 dwc
|
||||
*/
|
||||
void finalize_translation();
|
||||
/** ---------------------------------------------------
|
||||
* ???
|
||||
* @update 2/1/99 dwc
|
||||
*/
|
||||
void annotate_page( const char*, int, int, int);
|
||||
/** ---------------------------------------------------
|
||||
* Output postscript to scale the current coordinate system
|
||||
* @param aX X scale factor
|
||||
|
@ -63,8 +63,7 @@
|
||||
#endif /* USE_XPRINT */
|
||||
|
||||
#ifdef USE_POSTSCRIPT
|
||||
/* Fetch |postscript_module_paper_sizes| */
|
||||
#include "nsPostScriptObj.h"
|
||||
#include "nsPaperPS.h" /* Paper size list */
|
||||
#endif /* USE_POSTSCRIPT */
|
||||
|
||||
/* Ensure that the result is always equal to either PR_TRUE or PR_FALSE */
|
||||
@ -948,13 +947,9 @@ NS_IMETHODIMP nsPrinterEnumeratorXlib::InitPrintSettingsFromPrinter(const PRUnic
|
||||
}
|
||||
|
||||
#ifdef SET_PRINTER_FEATURES_VIA_PREFS
|
||||
int i;
|
||||
for( i = 0 ; postscript_module_orientations[i].orientation != nsnull ; i++ )
|
||||
{
|
||||
const PSOrientationRec *curr = &postscript_module_orientations[i];
|
||||
printerFeatures.SetOrientationRecord(i, curr->orientation);
|
||||
}
|
||||
printerFeatures.SetNumOrientationRecords(i);
|
||||
printerFeatures.SetOrientationRecord(0, "portrait");
|
||||
printerFeatures.SetOrientationRecord(1, "landscape");
|
||||
printerFeatures.SetNumOrientationRecords(2);
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
|
||||
/* PostScript module does not support changing the plex mode... */
|
||||
@ -973,44 +968,32 @@ NS_IMETHODIMP nsPrinterEnumeratorXlib::InitPrintSettingsFromPrinter(const PRUnic
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
nsXPIDLCString papername;
|
||||
if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "paper_size", getter_Copies(papername)))) {
|
||||
int i;
|
||||
const PSPaperSizeRec *default_paper = nsnull;
|
||||
nsPaperSizePS paper;
|
||||
|
||||
for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ )
|
||||
{
|
||||
const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i];
|
||||
|
||||
if (!PL_strcasecmp(papername, curr->name)) {
|
||||
default_paper = curr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (default_paper) {
|
||||
DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g inch/%g inch)\n",
|
||||
default_paper->name,
|
||||
PSPaperSizeRec_FullPaperWidth(default_paper),
|
||||
PSPaperSizeRec_FullPaperHeight(default_paper)));
|
||||
if (paper.Find(papername)) {
|
||||
DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g mm/%g mm)\n",
|
||||
paper.Name(), paper.Width_mm(), paper.Height_mm()));
|
||||
aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined);
|
||||
aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeInches);
|
||||
aPrintSettings->SetPaperWidth(PSPaperSizeRec_FullPaperWidth(default_paper));
|
||||
aPrintSettings->SetPaperHeight(PSPaperSizeRec_FullPaperHeight(default_paper));
|
||||
aPrintSettings->SetPaperName(NS_ConvertUTF8toUCS2(default_paper->name).get());
|
||||
aPrintSettings->SetPaperSizeUnit(paper.IsMetric() ?
|
||||
(int)nsIPrintSettings::kPaperSizeMillimeters :
|
||||
(int)nsIPrintSettings::kPaperSizeInches);
|
||||
aPrintSettings->SetPaperWidth(paper.Width_mm());
|
||||
aPrintSettings->SetPaperHeight(paper.Height_mm());
|
||||
aPrintSettings->SetPaperName(NS_ConvertASCIItoUCS2(paper.Name()).get());
|
||||
}
|
||||
else {
|
||||
DO_PR_DEBUG_LOG(("Unknown paper size '%s' given.\n", papername.get()));
|
||||
}
|
||||
#ifdef SET_PRINTER_FEATURES_VIA_PREFS
|
||||
for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ )
|
||||
paper.First();
|
||||
int count = 0;
|
||||
while (!paper.AtEnd())
|
||||
{
|
||||
const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i];
|
||||
#define CONVERT_INCH_TO_MILLIMETERS(inch) ((inch) * 25.4)
|
||||
double total_width = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperWidth(curr)),
|
||||
total_height = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperHeight(curr));
|
||||
|
||||
printerFeatures.SetPaperRecord(i, curr->name, PRInt32(total_width), PRInt32(total_height), PR_TRUE);
|
||||
printerFeatures.SetPaperRecord(count++, paper.Name(),
|
||||
(int)paper.Width_mm(), (int)paper.Height_mm(), !paper.IsMetric());
|
||||
paper.Next();
|
||||
}
|
||||
printerFeatures.SetNumPaperSizeRecords(i);
|
||||
printerFeatures.SetNumPaperSizeRecords(count);
|
||||
#endif /* SET_PRINTER_FEATURES_VIA_PREFS */
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user