File size: 4,366 Bytes
5cee033
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//========================================================================
//
// This file comes from pdftohtml project
// http://pdftohtml.sourceforge.net
//
// Copyright from:
// Gueorgui Ovtcharov
// Rainer Dorsch <http://www.ra.informatik.uni-stuttgart.de/~rainer/>
// Mikhail Kruk <[email protected]>
//
//========================================================================

//========================================================================
//
// Modified under the Poppler project - http://poppler.freedesktop.org
//
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
// Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey ([email protected]) and Onkar Potdar ([email protected])
// Copyright (C) 2010, 2012, 2017, 2018, 2020 Albert Astals Cid <[email protected]>
// Copyright (C) 2011 Steven Murdoch <[email protected]>
// Copyright (C) 2011 Joshua Richardson <[email protected]>
// Copyright (C) 2012 Igor Slepchin <[email protected]>
// Copyright (C) 2018 Adam Reichold <[email protected]>
// Copyright (C) 2020 Eddie Kohler <[email protected]>
// Copyright (C) 2022 Oliver Sander <[email protected]>
// Copyright (C) 2024 g10 Code GmbH, Author: Sune Stolborg Vuorela <[email protected]>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
//
//========================================================================

#ifndef _HTML_FONTS_H
#define _HTML_FONTS_H
#include "goo/GooString.h"
#include "GfxState.h"
#include "CharTypes.h"
#include <vector>

class HtmlFontColor
{
private:
    unsigned int r;
    unsigned int g;
    unsigned int b;
    unsigned int opacity;
    bool Ok(unsigned int xcol) { return xcol <= 255; }
    GooString *convtoX(unsigned int xcol) const;

public:
    HtmlFontColor() : r(0), g(0), b(0), opacity(255) { }
    HtmlFontColor(GfxRGB rgb, double opacity);
    HtmlFontColor(const HtmlFontColor &x)
    {
        r = x.r;
        g = x.g;
        b = x.b;
        opacity = x.opacity;
    }
    HtmlFontColor &operator=(const HtmlFontColor &x)
    {
        r = x.r;
        g = x.g;
        b = x.b;
        opacity = x.opacity;
        return *this;
    }
    ~HtmlFontColor() {};
    GooString *toString() const;
    double getOpacity() const { return opacity / 255.0; }
    bool isEqual(const HtmlFontColor &col) const { return ((r == col.r) && (g == col.g) && (b == col.b) && (opacity == col.opacity)); }
};

class HtmlFont
{
private:
    int size;
    int lineSize;
    bool italic;
    bool bold;
    bool rotOrSkewed;
    std::string familyName;
    GooString *FontName;
    HtmlFontColor color;
    double rotSkewMat[4]; // only four values needed for rotation and skew
public:
    HtmlFont(const GfxFont &font, int _size, GfxRGB rgb, double opacity);
    HtmlFont(const HtmlFont &x);
    HtmlFont &operator=(const HtmlFont &x);
    HtmlFontColor getColor() const { return color; }
    ~HtmlFont();
    GooString *getFullName();
    bool isItalic() const { return italic; }
    bool isBold() const { return bold; }
    bool isRotOrSkewed() const { return rotOrSkewed; }
    int getSize() const { return size; }
    int getLineSize() const { return lineSize; }
    void setLineSize(int _lineSize) { lineSize = _lineSize; }
    void setRotMat(const double *const mat)
    {
        rotOrSkewed = true;
        memcpy(rotSkewMat, mat, sizeof(rotSkewMat));
    }
    const double *getRotMat() const { return rotSkewMat; }
    GooString *getFontName();
    static std::unique_ptr<GooString> HtmlFilter(const Unicode *u, int uLen); // char* s);
    bool isEqual(const HtmlFont &x) const;
    bool isEqualIgnoreBold(const HtmlFont &x) const;
    void print() const { printf("font: %s (%s) %d %s%s\n", FontName->c_str(), familyName.c_str(), size, bold ? "bold " : "", italic ? "italic " : ""); };
};

class HtmlFontAccu
{
private:
    std::vector<HtmlFont> accu;

public:
    HtmlFontAccu();
    ~HtmlFontAccu();
    HtmlFontAccu(const HtmlFontAccu &) = delete;
    HtmlFontAccu &operator=(const HtmlFontAccu &) = delete;
    int AddFont(const HtmlFont &font);
    const HtmlFont *Get(int i) const { return &accu[i]; }
    GooString *CSStyle(int i, int j = 0);
    int size() const { return accu.size(); }
};
#endif