/* * $Id: OS2Writer.java,v 1.11 2004/10/04 02:25:39 eed3si9n Exp $ * * $Copyright: copyright (c) 2003, e.e d3si9n $ * $License: * This source code is part of DoubleType. * DoubleType is a graphical typeface designer. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * In addition, as a special exception, e.e d3si9n gives permission to * link the code of this program with any Java Platform that is available * to public with free of charge, including but not limited to * Sun Microsystem's JAVA(TM) 2 RUNTIME ENVIRONMENT (J2RE), * and distribute linked combinations including the two. * You must obey the GNU General Public License in all respects for all * of the code used other than Java Platform. If you modify this file, * you may extend this exception to your version of the file, but you are not * obligated to do so. If you do not wish to do so, delete this exception * statement from your version. * $ */ package org.doubletype.ossa.truetype; import java.io.IOException; /** * @author e.e */ public class OS2Writer extends FontFormatWriter { final int FW_THIN = 100; final int FW_EXTRALIGHT = 200; final int FW_LIGHT = 300; final int FW_NORMAL = 400; final int FW_MEDIUM = 500; final int FW_SEMIBOLD = 600; final int FW_BOLD = 700; final int FW_EXTRABOLD = 800; final int FW_BLACK = 900; final int FWIDTH_NORMAL = 5; final int k_editableEmbedding = 0x0008; final int k_sansSerif = 0x0800; // unicode final int k_basicLatin = 0x0001; final int k_latin1Supplement = 0x0002; final int k_regular = 0x40; final int k_basicLatinStart = 0x0020; final int k_basciLatinEnd = 0x007e; private HeadWriter m_head; int m_xAvgCharWidth = 512; int m_usWeightClass = FW_NORMAL; int m_usWidthClass = FWIDTH_NORMAL; int m_fsType = 0; int m_ySubscriptXSize = 128; int m_ySubscriptYSize = 128; int m_ySubscriptXOffset = 0; int m_ySubscriptYOffset = -64; int m_ySuperscriptXSize = 128; int m_ySuperscriptYSize = 128; int m_ySuperscriptXOffset = 0; int m_ySuperscriptYOffset = 64; int m_yStrikeoutSize = 51; int m_yStrikeoutPosition = 512; int m_sFamilyClass = k_sansSerif; long m_ulUnicodeRange1 = k_basicLatin | k_latin1Supplement; long m_ulUnicodeRange2 = 0; long m_ulUnicodeRange3 = 0; long m_ulUnicodeRange4 = 0; String m_vendId = "dtyp"; int m_fsSelection = k_regular; int m_usFirstCharIndex = k_basicLatinStart; int m_usLastCharIndex = k_basciLatinEnd; private int m_sTypoAscender = 1024; private int m_sTypoDescender = 0; private int m_sTypoLineGap = 0; private int m_usWinAscent = 1024; private int m_usWinDescent = 0; long m_ulCodePageRange1 = 0; long m_ulCodePageRange2 = 0; private int m_sxHeight = 512; private int m_sCapHeight = 1024; int m_usDefaultChar = 0x0; int m_usBreakChar = 0x20; int m_usMaxContext = 1; public OS2Writer(HeadWriter a_head) { super(); m_head = a_head; } public void setCapHeight(int a_value) { m_sCapHeight = a_value; } public void setXHeight(int a_value) { m_sxHeight = a_value; } public void setTypoAscender(int a_value) { m_sTypoAscender = a_value; } public void setTypoDescender(int a_value) { m_sTypoDescender = a_value; } public void setTypoLineGap(int a_value) { m_sTypoLineGap = a_value; } public void setUnicodeRangeFlag(int a_pos) { int which = a_pos / 32; int where = a_pos % 32; long what = 0x1 << where; switch (which) { case 0: { m_ulUnicodeRange1 |= what; } break; case 1: { m_ulUnicodeRange2 |= what; } break; case 2: { m_ulUnicodeRange3 |= what; } break; case 3: { m_ulUnicodeRange4 |= what; } break; } // switch } public void setCodePageRangeFlag(int a_pos) { int which = a_pos / 32; int where = a_pos % 32; long what = 0x1 << where; switch (which) { case 0: { m_ulCodePageRange1 |= what; } break; case 1: { m_ulCodePageRange2 |= what; } break; } // switch } public void write() throws IOException { m_usWinAscent = m_head.getMax().y; m_usWinDescent = 0; if (m_head.getMin().y < 0) { m_usWinDescent = -m_head.getMin().y; } // table version number writeUInt16(0x02); writeInt16(m_xAvgCharWidth); writeUInt16(m_usWeightClass); writeUInt16(m_usWidthClass); writeInt16(m_fsType); writeInt16(m_ySubscriptXSize); writeInt16(m_ySubscriptYSize); writeInt16(m_ySubscriptXOffset); writeInt16(m_ySubscriptYOffset); writeInt16(m_ySuperscriptXSize); writeInt16(m_ySuperscriptYSize); writeInt16(m_ySuperscriptXOffset); writeInt16(m_ySuperscriptYOffset); writeInt16(m_yStrikeoutSize); writeInt16(m_yStrikeoutPosition); writeInt16(m_sFamilyClass); writePanose(); writeUInt32(m_ulUnicodeRange1); writeUInt32(m_ulUnicodeRange2); writeUInt32(m_ulUnicodeRange3); writeUInt32(m_ulUnicodeRange4); writeTag(m_vendId); writeUInt16(m_fsSelection); writeUInt16(m_usFirstCharIndex); writeUInt16(m_usLastCharIndex); writeUInt16(m_sTypoAscender); writeUInt16(m_sTypoDescender); writeUInt16(m_sTypoLineGap); writeUInt16(m_usWinAscent); writeUInt16(m_usWinDescent); writeUInt32(m_ulCodePageRange1); writeUInt32(m_ulCodePageRange2); writeInt16(m_sxHeight); writeInt16(m_sCapHeight); writeUInt16(m_usDefaultChar); writeUInt16(m_usBreakChar); writeUInt16(m_usMaxContext); pad(); } private void writePanose() throws IOException { writeUInt8(0); // family writeUInt8(0); // serif writeUInt8(0); // weight writeUInt8(0); // proportion writeUInt8(0); // contrast writeUInt8(0); // stroke writeUInt8(0); // arm style writeUInt8(0); // letterform writeUInt8(0); // midline writeUInt8(0); // x-height } protected String getTag() { return "OS/2 "; } }