tests/test_pdfbase_ttfonts.py
author rptlab
Tue, 30 Apr 2013 14:20:22 +0100
branchpy33
changeset 3721 0c93dd8ff567
parent 3457 47d2296b4a9f
child 3794 398ea04239b5
permissions -rw-r--r--
initial changes from 2to3-3.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     1
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     2
"""Test TrueType font subsetting & embedding code.
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     3
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
     4
This test uses a sample font (Vera.ttf) taken from Bitstream which is called Vera
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
     5
Serif Regular and is covered under the license in ../fonts/bitstream-vera-license.txt.
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     6
"""
2984
c63f149d55aa tests.utils --> reportlab.lib.testutils
rgbecker
parents: 2977
diff changeset
     7
from reportlab.lib.testutils import setOutDir,makeSuiteForClasses, outputfile, printLocation, NearTestCase
c63f149d55aa tests.utils --> reportlab.lib.testutils
rgbecker
parents: 2977
diff changeset
     8
setOutDir(__name__)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
     9
import string
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
    10
from io import StringIO
2966
c9df63ccabdf reportlab-2.2: major changes to make tests run
rgbecker
parents: 2963
diff changeset
    11
import unittest
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    12
from reportlab.pdfgen.canvas import Canvas
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    13
from reportlab.pdfbase import pdfmetrics
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    14
from reportlab.pdfbase.pdfdoc import PDFDocument, PDFError
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    15
from reportlab.pdfbase.ttfonts import TTFont, TTFontFace, TTFontFile, TTFOpenFile, \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    16
                                      TTFontParser, TTFontMaker, TTFError, \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    17
                                      parse_utf8, makeToUnicodeCMap, \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    18
                                      FF_SYMBOLIC, FF_NONSYMBOLIC, \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    19
                                      calcChecksum, add32
3457
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
    20
from reportlab import rl_config
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    21
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    22
def utf8(code):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    23
    "Convert a given UCS character index into UTF-8"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    24
    if code < 0 or code > 0x7FFFFFFF:
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
    25
        raise ValueError('Invalid UCS character 0x%x' % code)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    26
    elif code < 0x00000080:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    27
        return chr(code)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    28
    elif code < 0x00000800:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    29
        return '%c%c' % \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    30
                 (0xC0 + (code >> 6),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    31
                  0x80 + (code & 0x3F))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    32
    elif code < 0x00010000:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    33
        return '%c%c%c' % \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    34
                 (0xE0 + (code >> 12),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    35
                  0x80 + ((code >> 6) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    36
                  0x80 + (code & 0x3F))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    37
    elif code < 0x00200000:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    38
        return '%c%c%c%c' % \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    39
                 (0xF0 + (code >> 18),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    40
                  0x80 + ((code >> 12) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    41
                  0x80 + ((code >> 6) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    42
                  0x80 + (code & 0x3F))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    43
    elif code < 0x04000000:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    44
        return '%c%c%c%c%c' % \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    45
                 (0xF8 + (code >> 24),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    46
                  0x80 + ((code >> 18) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    47
                  0x80 + ((code >> 12) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    48
                  0x80 + ((code >> 6) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    49
                  0x80 + (code & 0x3F))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    50
    else:
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    51
        return '%c%c%c%c%c%c' % \
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    52
                 (0xFC + (code >> 30),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    53
                  0x80 + ((code >> 24) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    54
                  0x80 + ((code >> 18) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    55
                  0x80 + ((code >> 12) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    56
                  0x80 + ((code >> 6) & 0x3F),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    57
                  0x80 + (code & 0x3F))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    58
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    59
def _simple_subset_generation(fn,npages,alter=0):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    60
    c = Canvas(outputfile(fn))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    61
    c.setFont('Helvetica', 30)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    62
    c.drawString(100,700, 'Unicode TrueType Font Test %d pages' % npages)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    63
    # Draw a table of Unicode characters
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
    64
    for p in range(npages):
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
    65
        for fontName in ('Vera','VeraBI'):
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    66
            c.setFont(fontName, 10)
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
    67
            for i in range(32):
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
    68
                for j in range(32):
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    69
                    ch = utf8(i * 32 + j+p*alter)
3326
ce725978d11c Initial Python3 compatibility fixes
damian
parents: 2984
diff changeset
    70
                    c.drawString(80 + j * 13 + int(j / 16.0) * 4, 600 - i * 13 - int(i / 8.0) * 8, ch)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    71
        c.showPage()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    72
    c.save()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    73
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    74
class TTFontsTestCase(unittest.TestCase):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    75
    "Make documents with TrueType fonts"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    76
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    77
    def testTTF(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    78
        "Test PDF generation with TrueType fonts"
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
    79
        pdfmetrics.registerFont(TTFont("Vera", "Vera.ttf"))
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
    80
        pdfmetrics.registerFont(TTFont("VeraBI", "VeraBI.ttf"))
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    81
        _simple_subset_generation('test_pdfbase_ttfonts1.pdf',1)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    82
        _simple_subset_generation('test_pdfbase_ttfonts3.pdf',3)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    83
        _simple_subset_generation('test_pdfbase_ttfonts35.pdf',3,5)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    84
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    85
        # Do it twice with the same font object
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    86
        c = Canvas(outputfile('test_pdfbase_ttfontsadditional.pdf'))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    87
        # Draw a table of Unicode characters
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
    88
        c.setFont('Vera', 10)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    89
        c.drawString(100, 700, 'Hello, ' + utf8(0xffee))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    90
        c.save()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    91
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    92
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    93
class TTFontFileTestCase(NearTestCase):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    94
    "Tests TTFontFile, TTFontParser and TTFontMaker classes"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    95
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    96
    def testFontFileFailures(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    97
        "Tests TTFontFile constructor error checks"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    98
        self.assertRaises(TTFError, TTFontFile, "nonexistent file")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
    99
        self.assertRaises(TTFError, TTFontFile, StringIO(""))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   100
        self.assertRaises(TTFError, TTFontFile, StringIO("invalid signature"))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   101
        self.assertRaises(TTFError, TTFontFile, StringIO("OTTO - OpenType not supported yet"))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   102
        self.assertRaises(TTFError, TTFontFile, StringIO("\0\1\0\0"))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   103
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   104
    def testFontFileReads(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   105
        "Tests TTFontParset.read_xxx"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   106
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   107
        class FakeTTFontFile(TTFontParser):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   108
            def __init__(self, data):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   109
                self._ttf_data = data
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   110
                self._pos = 0
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   111
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   112
        ttf = FakeTTFontFile("\x81\x02\x03\x04" "\x85\x06" "ABCD" "\x7F\xFF" "\x80\x00" "\xFF\xFF")
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   113
        self.assertEquals(ttf.read_ulong(), 0x81020304) # big-endian
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   114
        self.assertEquals(ttf._pos, 4)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   115
        self.assertEquals(ttf.read_ushort(), 0x8506)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   116
        self.assertEquals(ttf._pos, 6)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   117
        self.assertEquals(ttf.read_tag(), 'ABCD')
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   118
        self.assertEquals(ttf._pos, 10)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   119
        self.assertEquals(ttf.read_short(), 0x7FFF)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   120
        self.assertEquals(ttf.read_short(), -0x8000)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   121
        self.assertEquals(ttf.read_short(), -1)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   122
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   123
    def testFontFile(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   124
        "Tests TTFontFile and TTF parsing code"
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   125
        ttf = TTFontFile("Vera.ttf")
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   126
        self.assertEquals(ttf.name, "BitstreamVeraSans-Roman")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   127
        self.assertEquals(ttf.flags, FF_SYMBOLIC)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   128
        self.assertEquals(ttf.italicAngle, 0.0)
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   129
        self.assertNear(ttf.ascent,759.765625)
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   130
        self.assertNear(ttf.descent,-240.234375)
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   131
        self.assertEquals(ttf.capHeight, 759.765625)
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   132
        self.assertNear(ttf.bbox, [-183.10546875, -235.83984375, 1287.109375, 928.22265625])
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   133
        self.assertEquals(ttf.stemV, 87)
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   134
        self.assertEquals(ttf.defaultWidth, 600.09765625)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   135
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   136
    def testAdd32(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   137
        "Test add32"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   138
        self.assertEquals(add32(10, -6), 4)
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   139
        self.assertEquals(add32(6, -10), -4&0xFFFFFFFF)
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   140
        self.assertEquals(add32(0x80000000, -1), 0x7FFFFFFF)
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   141
        self.assertEquals(add32(0x7FFFFFFF, 1), 0x80000000)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   142
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   143
    def testChecksum(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   144
        "Test calcChecksum function"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   145
        self.assertEquals(calcChecksum(""), 0)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   146
        self.assertEquals(calcChecksum("\1"), 0x01000000)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   147
        self.assertEquals(calcChecksum("\x01\x02\x03\x04\x10\x20\x30\x40"), 0x11223344)
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   148
        self.assertEquals(calcChecksum("\x81"), 0x81000000)
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   149
        self.assertEquals(calcChecksum("\x81\x02"), 0x81020000)
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   150
        self.assertEquals(calcChecksum("\x81\x02\x03"), 0x81020300)
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   151
        self.assertEquals(calcChecksum("\x81\x02\x03\x04"), 0x81020304)
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   152
        self.assertEquals(calcChecksum("\x81\x02\x03\x04\x05"), 0x86020304)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   153
        self.assertEquals(calcChecksum("\x41\x02\x03\x04\xD0\x20\x30\x40"), 0x11223344)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   154
        self.assertEquals(calcChecksum("\xD1\x02\x03\x04\x40\x20\x30\x40"), 0x11223344)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   155
        self.assertEquals(calcChecksum("\x81\x02\x03\x04\x90\x20\x30\x40"), 0x11223344)
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   156
        self.assertEquals(calcChecksum("\x7F\xFF\xFF\xFF\x00\x00\x00\x01"), 0x80000000)
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   157
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   158
    def testFontFileChecksum(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   159
        "Tests TTFontFile and TTF parsing code"
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   160
        file = TTFOpenFile("Vera.ttf")[1].read()
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   161
        TTFontFile(StringIO(file), validate=1) # should not fail
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   162
        file1 = file[:12345] + "\xFF" + file[12346:] # change one byte
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   163
        self.assertRaises(TTFError, TTFontFile, StringIO(file1), validate=1)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   164
        file1 = file[:8] + "\xFF" + file[9:] # change one byte
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   165
        self.assertRaises(TTFError, TTFontFile, StringIO(file1), validate=1)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   166
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   167
    def testSubsetting(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   168
        "Tests TTFontFile and TTF parsing code"
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   169
        ttf = TTFontFile("Vera.ttf")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   170
        subset = ttf.makeSubset([0x41, 0x42])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   171
        subset = TTFontFile(StringIO(subset), 0)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   172
        for tag in ('cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2',
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   173
                    'post', 'cvt ', 'fpgm', 'glyf', 'loca', 'prep'):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   174
            self.assert_(subset.get_table(tag))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   175
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   176
        subset.seek_table('loca')
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   177
        for n in range(4):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   178
            pos = subset.read_ushort()    # this is actually offset / 2
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   179
            self.failIf(pos % 2 != 0, "glyph %d at +%d should be long aligned" % (n, pos * 2))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   180
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   181
        self.assertEquals(subset.name, "BitstreamVeraSans-Roman")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   182
        self.assertEquals(subset.flags, FF_SYMBOLIC)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   183
        self.assertEquals(subset.italicAngle, 0.0)
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   184
        self.assertNear(subset.ascent,759.765625)
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   185
        self.assertNear(subset.descent,-240.234375)
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   186
        self.assertEquals(subset.capHeight, 759.765625)
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   187
        self.assertNear(subset.bbox, [-183.10546875, -235.83984375, 1287.109375, 928.22265625])
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   188
        self.assertEquals(subset.stemV, 87)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   189
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   190
    def testFontMaker(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   191
        "Tests TTFontMaker class"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   192
        ttf = TTFontMaker()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   193
        ttf.add("ABCD", "xyzzy")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   194
        ttf.add("QUUX", "123")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   195
        ttf.add("head", "12345678xxxx")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   196
        stm = ttf.makeStream()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   197
        ttf = TTFontParser(StringIO(stm), 0)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   198
        self.assertEquals(ttf.get_table("ABCD"), "xyzzy")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   199
        self.assertEquals(ttf.get_table("QUUX"), "123")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   200
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   201
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   202
class TTFontFaceTestCase(unittest.TestCase):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   203
    "Tests TTFontFace class"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   204
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   205
    def testAddSubsetObjects(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   206
        "Tests TTFontFace.addSubsetObjects"
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   207
        face = TTFontFace("Vera.ttf")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   208
        doc = PDFDocument()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   209
        fontDescriptor = face.addSubsetObjects(doc, "TestFont", [ 0x78, 0x2017 ])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   210
        fontDescriptor = doc.idToObject[fontDescriptor.name].dict
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   211
        self.assertEquals(fontDescriptor['Type'], '/FontDescriptor')
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   212
        self.assertEquals(fontDescriptor['Ascent'], face.ascent)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   213
        self.assertEquals(fontDescriptor['CapHeight'], face.capHeight)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   214
        self.assertEquals(fontDescriptor['Descent'], face.descent)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   215
        self.assertEquals(fontDescriptor['Flags'], (face.flags & ~FF_NONSYMBOLIC) | FF_SYMBOLIC)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   216
        self.assertEquals(fontDescriptor['FontName'], "/TestFont")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   217
        self.assertEquals(fontDescriptor['FontBBox'].sequence, face.bbox)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   218
        self.assertEquals(fontDescriptor['ItalicAngle'], face.italicAngle)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   219
        self.assertEquals(fontDescriptor['StemV'], face.stemV)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   220
        fontFile = fontDescriptor['FontFile2']
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   221
        fontFile = doc.idToObject[fontFile.name]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   222
        self.assert_(fontFile.content != "")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   223
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   224
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   225
class TTFontTestCase(NearTestCase):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   226
    "Tests TTFont class"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   227
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   228
    def testParseUTF8(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   229
        "Tests parse_utf8"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   230
        self.assertEquals(parse_utf8(""), [])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   231
        for i in range(0, 0x80):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   232
            self.assertEquals(parse_utf8(chr(i)), [i])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   233
        for i in range(0x80, 0xA0):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   234
            self.assertRaises(ValueError, parse_utf8, chr(i))
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   235
        self.assertEquals(parse_utf8("abc"), [0x61, 0x62, 0x63])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   236
        self.assertEquals(parse_utf8("\xC2\xA9x"), [0xA9, 0x78])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   237
        self.assertEquals(parse_utf8("\xE2\x89\xA0x"), [0x2260, 0x78])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   238
        self.assertRaises(ValueError, parse_utf8, "\xE2\x89x")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   239
        # for i in range(0, 0xFFFF): - overkill
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   240
        for i in list(range(0x80, 0x200)) + list(range(0x300, 0x400)) + [0xFFFE, 0xFFFF]:
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   241
            self.assertEquals(parse_utf8(utf8(i)), [i])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   242
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   243
    def testStringWidth(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   244
        "Test TTFont.stringWidth"
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   245
        font = TTFont("Vera", "Vera.ttf")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   246
        self.assert_(font.stringWidth("test", 10) > 0)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   247
        width = font.stringWidth(utf8(0x2260) * 2, 1000)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   248
        expected = font.face.getCharWidth(0x2260) * 2
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   249
        self.assertNear(width,expected)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   250
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   251
    def testSplitString(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   252
        "Tests TTFont.splitString"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   253
        doc = PDFDocument()
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   254
        font = TTFont("Vera", "Vera.ttf")
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   255
        text = string.join(list(map(utf8, range(0, 511))), "")
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   256
        allchars = string.join(list(map(chr, range(0, 256))), "")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   257
        nospace = allchars[:32] + allchars[33:]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   258
        chunks = [(0, allchars), (1, nospace)]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   259
        self.assertEquals(font.splitString(text, doc), chunks)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   260
        # Do it twice
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   261
        self.assertEquals(font.splitString(text, doc), chunks)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   262
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   263
        text = string.join(list(map(utf8, list(range(510, -1, -1)))), "")
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   264
        allchars = string.join(list(map(chr, list(range(255, -1, -1)))), "")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   265
        nospace = allchars[:223] + allchars[224:]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   266
        chunks = [(1, nospace), (0, allchars)]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   267
        self.assertEquals(font.splitString(text, doc), chunks)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   268
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   269
    def testSplitStringSpaces(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   270
        # In order for justification (word spacing) to work, the space
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   271
        # glyph must have a code 32, and no other character should have
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   272
        # that code in any subset, or word spacing will be applied to it.
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   273
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   274
        doc = PDFDocument()
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   275
        font = TTFont("Vera", "Vera.ttf")
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   276
        text = string.join(list(map(utf8, list(range(512, -1, -1)))), "")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   277
        chunks = font.splitString(text, doc)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   278
        state = font.state[doc]
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   279
        self.assertEquals(state.assignments[32], 32)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   280
        self.assertEquals(state.subsets[0][32], 32)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   281
        self.assertEquals(state.subsets[1][32], 32)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   282
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   283
    def testSubsetInternalName(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   284
        "Tests TTFont.getSubsetInternalName"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   285
        doc = PDFDocument()
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   286
        font = TTFont("Vera", "Vera.ttf")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   287
        # Actually generate some subsets
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   288
        text = string.join(list(map(utf8, list(range(0, 513)))), "")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   289
        font.splitString(text, doc)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   290
        self.assertRaises(IndexError, font.getSubsetInternalName, -1, doc)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   291
        self.assertRaises(IndexError, font.getSubsetInternalName, 3, doc)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   292
        self.assertEquals(font.getSubsetInternalName(0, doc), "/F1+0")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   293
        self.assertEquals(font.getSubsetInternalName(1, doc), "/F1+1")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   294
        self.assertEquals(font.getSubsetInternalName(2, doc), "/F1+2")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   295
        self.assertEquals(doc.delayedFonts, [font])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   296
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   297
    def testAddObjectsEmpty(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   298
        "TTFont.addObjects should not fail when no characters were used"
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   299
        font = TTFont("Vera", "Vera.ttf")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   300
        doc = PDFDocument()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   301
        font.addObjects(doc)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   302
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   303
    def no_longer_testAddObjectsResets(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   304
        "Test that TTFont.addObjects resets the font"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   305
        # Actually generate some subsets
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   306
        doc = PDFDocument()
2977
beca8d75f400 reportlab: remove LetErrorRobot-Chrome, rina & luxi. Add DarkGardenMK and fix tests
rgbecker
parents: 2966
diff changeset
   307
        font = TTFont("Vera", "Vera.ttf")
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   308
        font.splitString('a', doc)            # create some subset
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   309
        doc = PDFDocument()
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   310
        font.addObjects(doc)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   311
        self.assertEquals(font.frozen, 0)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   312
        self.assertEquals(font.nextCode, 0)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   313
        self.assertEquals(font.subsets, [])
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   314
        self.assertEquals(font.assignments, {})
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   315
        font.splitString('ba', doc)           # should work
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   316
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   317
    def testParallelConstruction(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   318
        "Test that TTFont can be used for different documents at the same time"
3457
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   319
        ttfAsciiReadable = rl_config.ttfAsciiReadable
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   320
        try:
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   321
            rl_config.ttfAsciiReadable = 1
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   322
            doc1 = PDFDocument()
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   323
            doc2 = PDFDocument()
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   324
            font = TTFont("Vera", "Vera.ttf")
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   325
            self.assertEquals(font.splitString('hello ', doc1), [(0, 'hello ')])
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   326
            self.assertEquals(font.splitString('hello ', doc2), [(0, 'hello ')])
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   327
            self.assertEquals(font.splitString('\u0410\u0411'.encode('UTF-8'), doc1), [(0, '\x80\x81')])
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   328
            self.assertEquals(font.splitString('\u0412'.encode('UTF-8'), doc2), [(0, '\x80')])
3457
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   329
            font.addObjects(doc1)
3721
0c93dd8ff567 initial changes from 2to3-3.3
rptlab
parents: 3457
diff changeset
   330
            self.assertEquals(font.splitString('\u0413'.encode('UTF-8'), doc2), [(0, '\x81')])
3457
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   331
            font.addObjects(doc2)
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   332
        finally:
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   333
            rl_config.ttfAsciiReadable = ttfAsciiReadable
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   334
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   335
    def testAddObjects(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   336
        "Test TTFont.addObjects"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   337
        # Actually generate some subsets
3457
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   338
        ttfAsciiReadable = rl_config.ttfAsciiReadable
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   339
        try:
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   340
            rl_config.ttfAsciiReadable = 1
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   341
            doc = PDFDocument()
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   342
            font = TTFont("Vera", "Vera.ttf")
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   343
            font.splitString('a', doc)            # create some subset
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   344
            internalName = font.getSubsetInternalName(0, doc)[1:]
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   345
            font.addObjects(doc)
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   346
            pdfFont = doc.idToObject[internalName]
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   347
            self.assertEquals(doc.idToObject['BasicFonts'].dict[internalName], pdfFont)
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   348
            self.assertEquals(pdfFont.Name, internalName)
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   349
            self.assertEquals(pdfFont.BaseFont, "AAAAAA+BitstreamVeraSans-Roman")
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   350
            self.assertEquals(pdfFont.FirstChar, 0)
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   351
            self.assertEquals(pdfFont.LastChar, 127)
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   352
            self.assertEquals(len(pdfFont.Widths.sequence), 128)
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   353
            toUnicode = doc.idToObject[pdfFont.ToUnicode.name]
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   354
            self.assert_(toUnicode.content != "")
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   355
            fontDescriptor = doc.idToObject[pdfFont.FontDescriptor.name]
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   356
            self.assertEquals(fontDescriptor.dict['Type'], '/FontDescriptor')
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   357
        finally:
47d2296b4a9f text_pddfbase_ttfonts.py: fix against ttfAsciiReadable=0
rgbecker
parents: 3326
diff changeset
   358
            rl_config.ttfAsciiReadable = ttfAsciiReadable
2963
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   359
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   360
    def testMakeToUnicodeCMap(self):
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   361
        "Test makeToUnicodeCMap"
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   362
        self.assertEquals(makeToUnicodeCMap("TestFont", [ 0x1234, 0x4321, 0x4242 ]),
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   363
"""/CIDInit /ProcSet findresource begin
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   364
12 dict begin
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   365
begincmap
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   366
/CIDSystemInfo
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   367
<< /Registry (TestFont)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   368
/Ordering (TestFont)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   369
/Supplement 0
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   370
>> def
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   371
/CMapName /TestFont def
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   372
/CMapType 2 def
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   373
1 begincodespacerange
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   374
<00> <02>
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   375
endcodespacerange
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   376
3 beginbfchar
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   377
<00> <1234>
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   378
<01> <4321>
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   379
<02> <4242>
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   380
endbfchar
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   381
endcmap
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   382
CMapName currentdict /CMap defineresource pop
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   383
end
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   384
end""")
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   385
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   386
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   387
def makeSuite():
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   388
    suite = makeSuiteForClasses(
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   389
        TTFontsTestCase,
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   390
        TTFontFileTestCase,
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   391
        TTFontFaceTestCase,
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   392
        TTFontTestCase)
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   393
    return suite
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   394
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   395
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   396
#noruntests
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   397
if __name__ == "__main__":
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   398
    unittest.TextTestRunner().run(makeSuite())
c414c0ab69e7 reportlab-2.2: first stage of major re-org
rgbecker
parents:
diff changeset
   399
    printLocation()