Main Page
Namespaces
Classes
Files
File List
File Members
MWAWFont.hxx
Go to the documentation of this file.
1
/* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
2
3
/* libmwaw
4
* Version: MPL 2.0 / LGPLv2+
5
*
6
* The contents of this file are subject to the Mozilla Public License Version
7
* 2.0 (the "License"); you may not use this file except in compliance with
8
* the License or as specified alternatively below. You may obtain a copy of
9
* the License at http://www.mozilla.org/MPL/
10
*
11
* Software distributed under the License is distributed on an "AS IS" basis,
12
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
* for the specific language governing rights and limitations under the
14
* License.
15
*
16
* Major Contributor(s):
17
* Copyright (C) 2002 William Lachance (wrlach@gmail.com)
18
* Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
19
* Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
20
* Copyright (C) 2006, 2007 Andrew Ziem
21
* Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
22
*
23
*
24
* All Rights Reserved.
25
*
26
* For minor contributions see the git repository.
27
*
28
* Alternatively, the contents of this file may be used under the terms of
29
* the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
30
* in which case the provisions of the LGPLv2+ are applicable
31
* instead of those above.
32
*/
33
34
#ifndef MWAW_FONT
35
# define MWAW_FONT
36
37
#include <assert.h>
38
#include <string>
39
#include <vector>
40
41
#include "
libmwaw_internal.hxx
"
42
43
class
MWAWFontConverter
;
44
class
WPXPropertyList;
45
47
class
MWAWFont
48
{
49
public
:
51
struct
Line
{
53
enum
Style
{
None
,
Simple
,
Dot
,
LargeDot
,
Dash
,
Wave
};
55
enum
Type
{
Single
,
Double
,
Triple
};
57
Line
(
Style
style=
None
,
Type
type=
Single
,
bool
wordFlag=
false
,
float
w=1.0) :
58
m_style
(style),
m_type
(type),
m_word
(wordFlag),
m_width
(w),
m_color
(
MWAWColor
::black()) { }
60
bool
isSet
()
const
{
61
return
m_style
!=
None
&&
m_width
>0;
62
}
64
void
addTo
(WPXPropertyList &propList, std::string
const
type)
const
;
66
friend
std::ostream &
operator<<
(std::ostream &o,
Line
const
&line);
68
bool
operator==
(
Line
const
&oth)
const
{
69
return
cmp
(oth)==0;
70
}
72
bool
operator!=
(
Line
const
&oth)
const
{
73
return
cmp
(oth)!=0;
74
}
76
int
cmp
(
Line
const
&oth)
const
{
77
if
(
m_style
!= oth.
m_style
)
return
int(
m_style
)-int(oth.
m_style
);
78
if
(
m_type
!= oth.
m_type
)
return
int(
m_type
)-int(oth.
m_type
);
79
if
(
m_word
!= oth.
m_word
)
return
m_word
? -1 : 1;
80
if
(
m_width
< oth.
m_width
)
return
-1;
81
if
(
m_width
> oth.
m_width
)
return
1;
82
if
(
m_color
.
isSet
() != oth.
m_color
.
isSet
())
83
return
m_color
.
isSet
();
84
if
(
m_color
.
get
() < oth.
m_color
.
get
())
return
-1;
85
if
(
m_color
.
get
() > oth.
m_color
.
get
())
return
1;
86
return
0;
87
}
89
Style
m_style
;
91
Type
m_type
;
93
bool
m_word
;
95
float
m_width
;
97
Variable<MWAWColor>
m_color
;
98
};
100
struct
Script
{
102
Script
(
float
delta=0, WPXUnit deltaUnit=WPX_PERCENT,
int
scale=100) :
103
m_delta
(delta),
m_deltaUnit
(deltaUnit),
m_scale
(scale) {
104
}
106
bool
isSet
()
const
{
107
return
*
this
!=
Script
();
108
}
110
static
Script
sub
() {
111
return
Script
(-33,WPX_PERCENT,58);
112
}
114
static
Script
sub100
() {
115
return
Script
(-20);
116
}
118
static
Script
super
() {
119
return
Script
(33,WPX_PERCENT,58);
120
}
122
static
Script
super100
() {
123
return
Script
(20);
124
}
126
std::string
str
(
float
fSize)
const
;
127
129
bool
operator==
(
Script
const
&oth)
const
{
130
return
cmp
(oth)==0;
131
}
133
bool
operator!=
(
Script
const
&oth)
const
{
134
return
cmp
(oth)!=0;
135
}
137
bool
operator<
(
Script
const
&oth)
const
{
138
return
cmp
(oth)<0;
139
}
141
bool
operator<=
(
Script
const
&oth)
const
{
142
return
cmp
(oth)<=0;
143
}
145
bool
operator>
(
Script
const
&oth)
const
{
146
return
cmp
(oth)>0;
147
}
149
bool
operator>=
(
Script
const
&oth)
const
{
150
return
cmp
(oth)>=0;
151
}
153
int
cmp
(
Script
const
&oth)
const
{
154
if
(
m_delta
> oth.
m_delta
)
return
-1;
155
if
(
m_delta
< oth.
m_delta
)
return
1;
156
if
(
m_deltaUnit
!= oth.
m_deltaUnit
)
return
int(
m_deltaUnit
)-int(oth.
m_deltaUnit
);
157
if
(
m_scale
!= oth.
m_scale
)
return
m_scale
-oth.
m_scale
;
158
return
0;
159
}
161
float
m_delta
;
163
WPXUnit
m_deltaUnit
;
165
int
m_scale
;
166
};
167
169
enum
FontBits
{
boldBit
=1,
italicBit
=2,
blinkBit
=4,
embossBit
=8,
engraveBit
=0x10,
170
hiddenBit
=0x20,
outlineBit
=0x40,
shadowBit
=0x80,
171
reverseVideoBit
=0x100,
smallCapsBit
=0x200,
allCapsBit
=0x400,
172
lowercaseBit
=0x800,
boxedBit
=0x1000,
boxedRoundedBit
=0x2000,
173
reverseWritingBit
=0x4000
174
};
180
MWAWFont
(
int
newId=-1,
float
sz=12, uint32_t f = 0) :
m_id
(newId),
m_size
(sz),
m_deltaSpacing
(0),
m_texteWidthScaling
(1.0),
m_scriptPosition
(),
181
m_flags
(f),
m_overline
(
Line
::None),
m_strikeoutline
(
Line
::None),
m_underline
(
Line
::None),
182
m_color
(
MWAWColor
::black()),
m_backgroundColor
(
MWAWColor
::white()),
m_language
(
""
),
m_extra
(
""
) {
183
resetColor
();
184
};
186
bool
isSet
()
const
{
187
return
m_id
.
isSet
();
188
}
190
void
insert
(
MWAWFont
const
&ft) {
191
m_id
.
insert
(ft.
m_id
);
192
m_size
.
insert
(ft.
m_size
);
193
m_deltaSpacing
.
insert
(ft.
m_deltaSpacing
);
194
m_texteWidthScaling
.
insert
(ft.
m_texteWidthScaling
);
195
m_scriptPosition
.insert(ft.
m_scriptPosition
);
196
if
(ft.
m_flags
.
isSet
()) {
197
if
(
m_flags
.
isSet
())
198
setFlags
(
flags
()| ft.
flags
());
199
else
200
m_flags
= ft.
m_flags
;
201
}
202
m_overline
.insert(ft.
m_overline
);
203
m_strikeoutline
.insert(ft.
m_strikeoutline
);
204
m_underline
.insert(ft.
m_underline
);
205
m_color
.
insert
(ft.
m_color
);
206
m_extra
+= ft.
m_extra
;
207
}
209
void
setFont
(
int
newId) {
210
resetColor
();
211
m_id
=newId;
212
}
213
215
int
id
()
const
{
216
return
m_id
.
get
();
217
}
219
void
setId
(
int
newId) {
220
m_id
= newId;
221
}
222
224
float
size
()
const
{
225
return
m_size
.
get
();
226
}
228
void
setSize
(
float
sz) {
229
m_size
= sz;
230
}
231
233
float
deltaLetterSpacing
()
const
{
234
return
m_deltaSpacing
.
get
();
235
}
237
void
setDeltaLetterSpacing
(
float
d) {
238
m_deltaSpacing
=d;
239
}
241
float
texteWidthScaling
()
const
{
242
return
m_texteWidthScaling
.
get
();
243
}
245
void
setTexteWidthScaling
(
float
scale=1.0) {
246
m_texteWidthScaling
= scale;
247
}
249
Script
const
&
script
()
const
{
250
return
m_scriptPosition
.get();
251
}
252
254
void
set
(
Script
const
&newscript) {
255
m_scriptPosition
= newscript;
256
}
257
259
uint32_t
flags
()
const
{
260
return
m_flags
.
get
();
261
}
263
void
setFlags
(uint32_t fl) {
264
m_flags
= fl;
265
}
266
268
bool
hasColor
()
const
{
269
return
m_color
.
isSet
() && !
m_color
.
get
().isBlack();
270
}
272
void
getColor
(
MWAWColor
&c)
const
{
273
c =
m_color
.
get
();
274
}
276
void
setColor
(
MWAWColor
color) {
277
m_color
= color;
278
}
279
281
void
getBackgroundColor
(
MWAWColor
&c)
const
{
282
c =
m_backgroundColor
.
get
();
283
}
285
void
setBackgroundColor
(
MWAWColor
color) {
286
m_backgroundColor
= color;
287
}
289
void
resetColor
() {
290
m_color
=
MWAWColor::black
();
291
m_backgroundColor
=
MWAWColor::white
();
292
}
293
295
bool
hasDecorationLines
()
const
{
296
return
(
m_overline
.isSet() &&
m_overline
->isSet()) ||
297
(
m_strikeoutline
.isSet() &&
m_strikeoutline
->isSet()) ||
298
(
m_underline
.isSet() &&
m_underline
->isSet());
299
}
301
void
resetDecorationLines
() {
302
if
(
m_overline
.isSet())
m_overline
=
Line
(
Line::None
);
303
if
(
m_strikeoutline
.isSet())
m_strikeoutline
=
Line
(
Line::None
);
304
if
(
m_underline
.isSet())
m_underline
=
Line
(
Line::None
);
305
}
307
Line
const
&
getOverline
()
const
{
308
return
m_overline
.get();
309
}
311
void
setOverline
(
Line
const
&line) {
312
m_overline
= line;
313
}
315
void
setOverlineStyle
(
Line::Style
style=
Line::None
,
bool
doReset=
true
) {
316
if
(doReset)
317
m_overline
=
Line
(style);
318
else
319
m_overline
->m_style = style;
320
}
322
void
setOverlineType
(
Line::Type
type=
Line::Single
) {
323
m_overline
->m_type = type;
324
}
326
void
setOverlineWordFlag
(
bool
wordFlag=
false
) {
327
m_overline
->m_word = wordFlag;
328
}
330
void
setOverlineWidth
(
float
w) {
331
m_overline
->m_width = w;
332
}
334
void
setOverlineColor
(
MWAWColor
const
&color) {
335
m_overline
->m_color = color;
336
}
337
339
Line
const
&
getStrikeOut
()
const
{
340
return
m_strikeoutline
.get();
341
}
343
void
setStrikeOut
(
Line
const
&line) {
344
m_strikeoutline
= line;
345
}
347
void
setStrikeOutStyle
(
Line::Style
style=
Line::None
,
bool
doReset=
true
) {
348
if
(doReset)
349
m_strikeoutline
=
Line
(style);
350
else
351
m_strikeoutline
->m_style = style;
352
}
354
void
setStrikeOutType
(
Line::Type
type=
Line::Single
) {
355
m_strikeoutline
->m_type = type;
356
}
358
void
setStrikeOutWordFlag
(
bool
wordFlag=
false
) {
359
m_strikeoutline
->m_word = wordFlag;
360
}
362
void
setStrikeOutWidth
(
float
w) {
363
m_strikeoutline
->m_width = w;
364
}
366
void
setStrikeOutColor
(
MWAWColor
const
&color) {
367
m_strikeoutline
->m_color = color;
368
}
369
371
Line
const
&
getUnderline
()
const
{
372
return
m_underline
.get();
373
}
375
void
setUnderline
(
Line
const
&line) {
376
m_underline
= line;
377
}
379
void
setUnderlineStyle
(
Line::Style
style=
Line::None
,
bool
doReset=
true
) {
380
if
(doReset)
381
m_underline
=
Line
(style);
382
else
383
m_underline
->m_style = style;
384
}
386
void
setUnderlineType
(
Line::Type
type=
Line::Single
) {
387
m_underline
->m_type = type;
388
}
390
void
setUnderlineWordFlag
(
bool
wordFlag=
false
) {
391
m_underline
->m_word = wordFlag;
392
}
394
void
setUnderlineWidth
(
float
w) {
395
m_underline
->m_width = w;
396
}
398
void
setUnderlineColor
(
MWAWColor
const
&color) {
399
m_underline
->m_color = color;
400
}
401
403
std::string
const
&
language
()
const
{
404
return
m_language
.
get
();
405
}
407
void
setLanguage
(std::string
const
&lang) {
408
m_language
=lang;
409
}
411
void
addTo
(WPXPropertyList &propList, shared_ptr<MWAWFontConverter> fontConverter)
const
;
412
414
std::string
getDebugString
(shared_ptr<MWAWFontConverter> &converter)
const
;
415
417
bool
operator==
(
MWAWFont
const
&f)
const
{
418
return
cmp
(f) == 0;
419
}
421
bool
operator!=
(
MWAWFont
const
&f)
const
{
422
return
cmp
(f) != 0;
423
}
424
426
int
cmp
(
MWAWFont
const
&oth)
const
{
427
int
diff =
id
() - oth.
id
();
428
if
(diff != 0)
return
diff;
429
if
(
size
() < oth.
size
())
return
-1;
430
if
(
size
() > oth.
size
())
return
-1;
431
if
(
flags
() < oth.
flags
())
return
-1;
432
if
(
flags
() > oth.
flags
())
return
1;
433
if
(
m_deltaSpacing
.
get
() < oth.
m_deltaSpacing
.
get
())
return
-1;
434
if
(
m_deltaSpacing
.
get
() > oth.
m_deltaSpacing
.
get
())
return
1;
435
if
(
m_texteWidthScaling
.
get
() < oth.
m_texteWidthScaling
.
get
())
return
-1;
436
if
(
m_texteWidthScaling
.
get
() > oth.
m_texteWidthScaling
.
get
())
return
1;
437
diff =
script
().
cmp
(oth.
script
());
438
if
(diff != 0)
return
diff;
439
diff =
m_overline
.get().cmp(oth.
m_overline
.get());
440
if
(diff != 0)
return
diff;
441
diff =
m_strikeoutline
.get().cmp(oth.
m_strikeoutline
.get());
442
if
(diff != 0)
return
diff;
443
diff =
m_underline
.get().cmp(oth.
m_underline
.get());
444
if
(diff != 0)
return
diff;
445
if
(
m_color
.
get
() < oth.
m_color
.
get
())
return
-1;
446
if
(
m_color
.
get
() > oth.
m_color
.
get
())
return
1;
447
if
(
m_backgroundColor
.
get
() < oth.
m_backgroundColor
.
get
())
return
-1;
448
if
(
m_backgroundColor
.
get
() > oth.
m_backgroundColor
.
get
())
return
1;
449
if
(
m_language
.
get
() < oth.
m_language
.
get
())
return
-1;
450
if
(
m_language
.
get
() > oth.
m_language
.
get
())
return
1;
451
return
diff;
452
}
453
454
protected
:
455
Variable<int>
m_id
;
456
Variable<float>
m_size
;
457
Variable<float>
m_deltaSpacing
;
458
Variable<float>
m_texteWidthScaling
;
459
Variable<Script>
m_scriptPosition
;
460
Variable<uint32_t>
m_flags
;
461
Variable<Line>
m_overline
;
462
Variable<Line>
m_strikeoutline
;
463
Variable<Line>
m_underline
;
464
Variable<MWAWColor>
m_color
;
465
Variable<MWAWColor>
m_backgroundColor
;
466
Variable<std::string>
m_language
;
467
public
:
469
std::string
m_extra
;
470
};
471
472
473
#endif
474
// vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
Generated on Tue Apr 30 2013 06:16:19 for libmwaw by
doxygen
1.8.3.1