1132720Skan// -*- C++ -*- 2132720Skan/* Copyright (C) 2002, 2003, 2004 3169691Skan Free Software Foundation, Inc. 4132720Skan Written by Werner Lemberg (wl@gnu.org) 5132720Skan 6132720SkanThis file is part of groff. 7132720Skan 8132720Skangroff is free software; you can redistribute it and/or modify it under 9132720Skanthe terms of the GNU General Public License as published by the Free 10132720SkanSoftware Foundation; either version 2, or (at your option) any later 11132720Skanversion. 12132720Skan 13132720Skangroff is distributed in the hope that it will be useful, but WITHOUT ANY 14132720SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or 15132720SkanFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16132720Skanfor more details. 17132720Skan 18132720SkanYou should have received a copy of the GNU General Public License along 19169691Skanwith groff; see the file COPYING. If not, write to the Free Software 20132720SkanFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ 21132720Skan 22132720Skan#include "lib.h" 23132720Skan#include "paper.h" 24132720Skan 25132720Skanpaper papersizes[NUM_PAPERSIZES]; 26132720Skan 27132720Skan// length and width in mm 28132720Skanstatic void add_iso_paper(char series, int offset, 29132720Skan int start_length, int start_width) 30132720Skan{ 31169691Skan int length = start_length; 32169691Skan int width = start_width; 33169691Skan for (int i = 0; i < 8; i++) 34169691Skan { 35132720Skan char *p = new char[3]; 36132720Skan p[0] = series; 37132720Skan p[1] = '0' + i; 38132720Skan p[2] = '\0'; 39132720Skan papersizes[offset + i].name = p; 40132720Skan // convert mm to inch 41132720Skan papersizes[offset + i].length = (double)length / 25.4; 42169691Skan papersizes[offset + i].width = (double)width / 25.4; 43132720Skan // after division by two, values must be rounded down to the next 44169691Skan // integer (as specified by ISO) 45169691Skan int tmp = length; 46132720Skan length = width; 47132720Skan width = tmp / 2; 48132720Skan } 49132720Skan} 50132720Skan 51132720Skan// length and width in inch 52132720Skanstatic void add_american_paper(const char *name, int idx, 53132720Skan double length, double width ) 54132720Skan{ 55132720Skan char *p = new char[strlen(name) + 1]; 56132720Skan strcpy(p, name); 57132720Skan papersizes[idx].name = p; 58132720Skan papersizes[idx].length = length; 59132720Skan papersizes[idx].width = width; 60132720Skan} 61132720Skan 62169691Skanint papersize_init::initialised = 0; 63169691Skan 64132720Skanpapersize_init::papersize_init() 65132720Skan{ 66132720Skan if (initialised) 67132720Skan return; 68132720Skan initialised = 1; 69132720Skan add_iso_paper('a', 0, 1189, 841); 70132720Skan add_iso_paper('b', 8, 1414, 1000); 71132720Skan add_iso_paper('c', 16, 1297, 917); 72169691Skan add_iso_paper('d', 24, 1090, 771); 73169691Skan add_american_paper("letter", 32, 11, 8.5); 74132720Skan add_american_paper("legal", 33, 14, 8.5); 75132720Skan add_american_paper("tabloid", 34, 17, 11); 76132720Skan add_american_paper("ledger", 35, 11, 17); 77132720Skan add_american_paper("statement", 36, 8.5, 5.5); 78132720Skan add_american_paper("executive", 37, 10, 7.5); 79132720Skan // the next three entries are for grolj4 80132720Skan add_american_paper("com10", 38, 9.5, 4.125); 81132720Skan add_american_paper("monarch", 39, 7.5, 3.875); 82132720Skan // this is an ISO format, but it easier to use add_american_paper 83132720Skan add_american_paper("dl", 40, 220/25.4, 110/25.4); 84132720Skan} 85132720Skan