mathematical 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +52 -10
- data/Rakefile +42 -3
- data/lib/mathematical.rb +5 -4
- data/lib/mathematical/mathematical.bundle +0 -0
- data/lib/mathematical/render.rb +6 -5
- data/lib/mathematical/version.rb +1 -1
- data/mathematical.gemspec +5 -5
- metadata +14 -296
- data/.gitignore +0 -24
- data/.gitmodules +0 -0
- data/Gemfile +0 -4
- data/ext/mathematical/README.itex2MML.md +0 -11
- data/ext/mathematical/README.lasem.md +0 -11
- data/ext/mathematical/extconf.rb +0 -51
- data/ext/mathematical/itex2MML.h +0 -63
- data/ext/mathematical/lasemrender.c +0 -257
- data/ext/mathematical/lex.yy.c +0 -6548
- data/ext/mathematical/lsm.c +0 -30
- data/ext/mathematical/lsm.h +0 -36
- data/ext/mathematical/lsmattributes.c +0 -279
- data/ext/mathematical/lsmattributes.h +0 -75
- data/ext/mathematical/lsmcairo.c +0 -598
- data/ext/mathematical/lsmcairo.h +0 -51
- data/ext/mathematical/lsmdebug.c +0 -179
- data/ext/mathematical/lsmdebug.h +0 -76
- data/ext/mathematical/lsmdom.h +0 -43
- data/ext/mathematical/lsmdomcharacterdata.c +0 -114
- data/ext/mathematical/lsmdomcharacterdata.h +0 -59
- data/ext/mathematical/lsmdomdocument.c +0 -292
- data/ext/mathematical/lsmdomdocument.h +0 -82
- data/ext/mathematical/lsmdomdocumentfragment.c +0 -81
- data/ext/mathematical/lsmdomdocumentfragment.h +0 -55
- data/ext/mathematical/lsmdomelement.c +0 -148
- data/ext/mathematical/lsmdomelement.h +0 -62
- data/ext/mathematical/lsmdomentities.c +0 -2155
- data/ext/mathematical/lsmdomentities.h +0 -35
- data/ext/mathematical/lsmdomenumtypes.c +0 -99
- data/ext/mathematical/lsmdomenumtypes.c.template +0 -39
- data/ext/mathematical/lsmdomenumtypes.h +0 -26
- data/ext/mathematical/lsmdomenumtypes.h.template +0 -26
- data/ext/mathematical/lsmdomimplementation.c +0 -82
- data/ext/mathematical/lsmdomimplementation.h +0 -41
- data/ext/mathematical/lsmdomnamednodemap.c +0 -118
- data/ext/mathematical/lsmdomnamednodemap.h +0 -64
- data/ext/mathematical/lsmdomnode.c +0 -725
- data/ext/mathematical/lsmdomnode.h +0 -120
- data/ext/mathematical/lsmdomnodelist.c +0 -70
- data/ext/mathematical/lsmdomnodelist.h +0 -58
- data/ext/mathematical/lsmdomparser.c +0 -461
- data/ext/mathematical/lsmdomparser.h +0 -54
- data/ext/mathematical/lsmdomtext.c +0 -82
- data/ext/mathematical/lsmdomtext.h +0 -55
- data/ext/mathematical/lsmdomtypes.h +0 -44
- data/ext/mathematical/lsmdomview.c +0 -422
- data/ext/mathematical/lsmdomview.h +0 -94
- data/ext/mathematical/lsmmathml.h +0 -66
- data/ext/mathematical/lsmmathmlactionelement.c +0 -93
- data/ext/mathematical/lsmmathmlactionelement.h +0 -57
- data/ext/mathematical/lsmmathmlaligngroupelement.c +0 -102
- data/ext/mathematical/lsmmathmlaligngroupelement.h +0 -56
- data/ext/mathematical/lsmmathmlalignmarkelement.c +0 -102
- data/ext/mathematical/lsmmathmlalignmarkelement.h +0 -56
- data/ext/mathematical/lsmmathmlattributes.c +0 -197
- data/ext/mathematical/lsmmathmlattributes.h +0 -126
- data/ext/mathematical/lsmmathmldocument.c +0 -306
- data/ext/mathematical/lsmmathmldocument.h +0 -61
- data/ext/mathematical/lsmmathmlelement.c +0 -491
- data/ext/mathematical/lsmmathmlelement.h +0 -107
- data/ext/mathematical/lsmmathmlenums.c +0 -429
- data/ext/mathematical/lsmmathmlenums.h +0 -182
- data/ext/mathematical/lsmmathmlenumtypes.c +0 -666
- data/ext/mathematical/lsmmathmlenumtypes.c.template +0 -39
- data/ext/mathematical/lsmmathmlenumtypes.h +0 -90
- data/ext/mathematical/lsmmathmlenumtypes.h.template +0 -26
- data/ext/mathematical/lsmmathmlerrorelement.c +0 -58
- data/ext/mathematical/lsmmathmlerrorelement.h +0 -56
- data/ext/mathematical/lsmmathmlfencedelement.c +0 -178
- data/ext/mathematical/lsmmathmlfencedelement.h +0 -65
- data/ext/mathematical/lsmmathmlfractionelement.c +0 -253
- data/ext/mathematical/lsmmathmlfractionelement.h +0 -62
- data/ext/mathematical/lsmmathmlglyphtableams.c +0 -597
- data/ext/mathematical/lsmmathmlglyphtableams.h +0 -45
- data/ext/mathematical/lsmmathmlitexelement.c +0 -187
- data/ext/mathematical/lsmmathmlitexelement.h +0 -60
- data/ext/mathematical/lsmmathmllayoututils.c +0 -191
- data/ext/mathematical/lsmmathmllayoututils.h +0 -58
- data/ext/mathematical/lsmmathmlmathelement.c +0 -204
- data/ext/mathematical/lsmmathmlmathelement.h +0 -81
- data/ext/mathematical/lsmmathmloperatordictionary.c +0 -3332
- data/ext/mathematical/lsmmathmloperatordictionary.h +0 -54
- data/ext/mathematical/lsmmathmloperatorelement.c +0 -307
- data/ext/mathematical/lsmmathmloperatorelement.h +0 -73
- data/ext/mathematical/lsmmathmlpaddedelement.c +0 -58
- data/ext/mathematical/lsmmathmlpaddedelement.h +0 -56
- data/ext/mathematical/lsmmathmlphantomelement.c +0 -71
- data/ext/mathematical/lsmmathmlphantomelement.h +0 -56
- data/ext/mathematical/lsmmathmlpresentationcontainer.c +0 -43
- data/ext/mathematical/lsmmathmlpresentationcontainer.h +0 -54
- data/ext/mathematical/lsmmathmlpresentationtoken.c +0 -303
- data/ext/mathematical/lsmmathmlpresentationtoken.h +0 -83
- data/ext/mathematical/lsmmathmlradicalelement.c +0 -266
- data/ext/mathematical/lsmmathmlradicalelement.h +0 -71
- data/ext/mathematical/lsmmathmlrowelement.c +0 -58
- data/ext/mathematical/lsmmathmlrowelement.h +0 -56
- data/ext/mathematical/lsmmathmlscriptelement.c +0 -282
- data/ext/mathematical/lsmmathmlscriptelement.h +0 -78
- data/ext/mathematical/lsmmathmlsemanticselement.c +0 -82
- data/ext/mathematical/lsmmathmlsemanticselement.h +0 -56
- data/ext/mathematical/lsmmathmlspaceelement.c +0 -142
- data/ext/mathematical/lsmmathmlspaceelement.h +0 -60
- data/ext/mathematical/lsmmathmlstringelement.c +0 -123
- data/ext/mathematical/lsmmathmlstringelement.h +0 -58
- data/ext/mathematical/lsmmathmlstyle.c +0 -130
- data/ext/mathematical/lsmmathmlstyle.h +0 -81
- data/ext/mathematical/lsmmathmlstyleelement.c +0 -307
- data/ext/mathematical/lsmmathmlstyleelement.h +0 -87
- data/ext/mathematical/lsmmathmltablecellelement.c +0 -122
- data/ext/mathematical/lsmmathmltablecellelement.h +0 -62
- data/ext/mathematical/lsmmathmltableelement.c +0 -545
- data/ext/mathematical/lsmmathmltableelement.h +0 -78
- data/ext/mathematical/lsmmathmltablerowelement.c +0 -120
- data/ext/mathematical/lsmmathmltablerowelement.h +0 -64
- data/ext/mathematical/lsmmathmltraits.c +0 -819
- data/ext/mathematical/lsmmathmltraits.h +0 -119
- data/ext/mathematical/lsmmathmltypes.h +0 -66
- data/ext/mathematical/lsmmathmlunderoverelement.c +0 -485
- data/ext/mathematical/lsmmathmlunderoverelement.h +0 -82
- data/ext/mathematical/lsmmathmlutils.c +0 -170
- data/ext/mathematical/lsmmathmlutils.h +0 -50
- data/ext/mathematical/lsmmathmlview.c +0 -1048
- data/ext/mathematical/lsmmathmlview.h +0 -164
- data/ext/mathematical/lsmproperties.c +0 -418
- data/ext/mathematical/lsmproperties.h +0 -85
- data/ext/mathematical/lsmstr.c +0 -231
- data/ext/mathematical/lsmstr.h +0 -114
- data/ext/mathematical/lsmsvg.h +0 -67
- data/ext/mathematical/lsmsvgaelement.c +0 -73
- data/ext/mathematical/lsmsvgaelement.h +0 -55
- data/ext/mathematical/lsmsvgattributes.h +0 -113
- data/ext/mathematical/lsmsvgcircleelement.c +0 -153
- data/ext/mathematical/lsmsvgcircleelement.h +0 -59
- data/ext/mathematical/lsmsvgclippathelement.c +0 -134
- data/ext/mathematical/lsmsvgclippathelement.h +0 -59
- data/ext/mathematical/lsmsvgcolors.c +0 -212
- data/ext/mathematical/lsmsvgcolors.h +0 -39
- data/ext/mathematical/lsmsvgdefselement.c +0 -74
- data/ext/mathematical/lsmsvgdefselement.h +0 -55
- data/ext/mathematical/lsmsvgdocument.c +0 -230
- data/ext/mathematical/lsmsvgdocument.h +0 -58
- data/ext/mathematical/lsmsvgelement.c +0 -367
- data/ext/mathematical/lsmsvgelement.h +0 -81
- data/ext/mathematical/lsmsvgellipseelement.c +0 -158
- data/ext/mathematical/lsmsvgellipseelement.h +0 -60
- data/ext/mathematical/lsmsvgenums.c +0 -544
- data/ext/mathematical/lsmsvgenums.h +0 -357
- data/ext/mathematical/lsmsvgenumtypes.c +0 -1083
- data/ext/mathematical/lsmsvgenumtypes.c.template +0 -39
- data/ext/mathematical/lsmsvgenumtypes.h +0 -111
- data/ext/mathematical/lsmsvgenumtypes.h.template +0 -26
- data/ext/mathematical/lsmsvgfilterblend.c +0 -105
- data/ext/mathematical/lsmsvgfilterblend.h +0 -58
- data/ext/mathematical/lsmsvgfiltercomposite.c +0 -109
- data/ext/mathematical/lsmsvgfiltercomposite.h +0 -58
- data/ext/mathematical/lsmsvgfilterelement.c +0 -266
- data/ext/mathematical/lsmsvgfilterelement.h +0 -66
- data/ext/mathematical/lsmsvgfilterflood.c +0 -86
- data/ext/mathematical/lsmsvgfilterflood.h +0 -55
- data/ext/mathematical/lsmsvgfiltergaussianblur.c +0 -114
- data/ext/mathematical/lsmsvgfiltergaussianblur.h +0 -57
- data/ext/mathematical/lsmsvgfiltermerge.c +0 -98
- data/ext/mathematical/lsmsvgfiltermerge.h +0 -55
- data/ext/mathematical/lsmsvgfiltermergenode.c +0 -87
- data/ext/mathematical/lsmsvgfiltermergenode.h +0 -57
- data/ext/mathematical/lsmsvgfilteroffset.c +0 -112
- data/ext/mathematical/lsmsvgfilteroffset.h +0 -58
- data/ext/mathematical/lsmsvgfilterprimitive.c +0 -168
- data/ext/mathematical/lsmsvgfilterprimitive.h +0 -66
- data/ext/mathematical/lsmsvgfilterspecularlighting.c +0 -127
- data/ext/mathematical/lsmsvgfilterspecularlighting.h +0 -60
- data/ext/mathematical/lsmsvgfiltersurface.c +0 -455
- data/ext/mathematical/lsmsvgfiltersurface.h +0 -66
- data/ext/mathematical/lsmsvgfiltertile.c +0 -102
- data/ext/mathematical/lsmsvgfiltertile.h +0 -57
- data/ext/mathematical/lsmsvggelement.c +0 -73
- data/ext/mathematical/lsmsvggelement.h +0 -55
- data/ext/mathematical/lsmsvggradientelement.c +0 -151
- data/ext/mathematical/lsmsvggradientelement.h +0 -68
- data/ext/mathematical/lsmsvgimageelement.c +0 -261
- data/ext/mathematical/lsmsvgimageelement.h +0 -67
- data/ext/mathematical/lsmsvglength.c +0 -93
- data/ext/mathematical/lsmsvglength.h +0 -59
- data/ext/mathematical/lsmsvglineargradientelement.c +0 -271
- data/ext/mathematical/lsmsvglineargradientelement.h +0 -60
- data/ext/mathematical/lsmsvglineelement.c +0 -153
- data/ext/mathematical/lsmsvglineelement.h +0 -60
- data/ext/mathematical/lsmsvgmarkerelement.c +0 -266
- data/ext/mathematical/lsmsvgmarkerelement.h +0 -74
- data/ext/mathematical/lsmsvgmaskelement.c +0 -232
- data/ext/mathematical/lsmsvgmaskelement.h +0 -64
- data/ext/mathematical/lsmsvgmatrix.c +0 -205
- data/ext/mathematical/lsmsvgmatrix.h +0 -59
- data/ext/mathematical/lsmsvgpathelement.c +0 -115
- data/ext/mathematical/lsmsvgpathelement.h +0 -59
- data/ext/mathematical/lsmsvgpatternelement.c +0 -398
- data/ext/mathematical/lsmsvgpatternelement.h +0 -69
- data/ext/mathematical/lsmsvgpolygonelement.c +0 -106
- data/ext/mathematical/lsmsvgpolygonelement.h +0 -57
- data/ext/mathematical/lsmsvgpolylineelement.c +0 -106
- data/ext/mathematical/lsmsvgpolylineelement.h +0 -57
- data/ext/mathematical/lsmsvgradialgradientelement.c +0 -323
- data/ext/mathematical/lsmsvgradialgradientelement.h +0 -61
- data/ext/mathematical/lsmsvgrectelement.c +0 -184
- data/ext/mathematical/lsmsvgrectelement.h +0 -62
- data/ext/mathematical/lsmsvgstopelement.c +0 -106
- data/ext/mathematical/lsmsvgstopelement.h +0 -57
- data/ext/mathematical/lsmsvgstyle.c +0 -558
- data/ext/mathematical/lsmsvgstyle.h +0 -217
- data/ext/mathematical/lsmsvgsvgelement.c +0 -260
- data/ext/mathematical/lsmsvgsvgelement.h +0 -71
- data/ext/mathematical/lsmsvgswitchelement.c +0 -103
- data/ext/mathematical/lsmsvgswitchelement.h +0 -55
- data/ext/mathematical/lsmsvgsymbolelement.c +0 -74
- data/ext/mathematical/lsmsvgsymbolelement.h +0 -55
- data/ext/mathematical/lsmsvgtextelement.c +0 -170
- data/ext/mathematical/lsmsvgtextelement.h +0 -58
- data/ext/mathematical/lsmsvgtraits.c +0 -1158
- data/ext/mathematical/lsmsvgtraits.h +0 -103
- data/ext/mathematical/lsmsvgtransformable.c +0 -106
- data/ext/mathematical/lsmsvgtransformable.h +0 -54
- data/ext/mathematical/lsmsvgtspanelement.c +0 -143
- data/ext/mathematical/lsmsvgtspanelement.h +0 -58
- data/ext/mathematical/lsmsvgtypes.h +0 -77
- data/ext/mathematical/lsmsvguseelement.c +0 -237
- data/ext/mathematical/lsmsvguseelement.h +0 -69
- data/ext/mathematical/lsmsvgview.c +0 -2400
- data/ext/mathematical/lsmsvgview.h +0 -168
- data/ext/mathematical/lsmtraits.c +0 -119
- data/ext/mathematical/lsmtraits.h +0 -49
- data/ext/mathematical/lsmtypes.h +0 -36
- data/ext/mathematical/lsmutils.c +0 -54
- data/ext/mathematical/lsmutils.h +0 -56
- data/ext/mathematical/mathematical.c +0 -122
- data/ext/mathematical/y.tab.c +0 -6179
- data/ext/mathematical/y.tab.h +0 -389
- data/script/bench +0 -21
- data/script/bootstrap +0 -9
- data/script/single_test +0 -7
- data/test/mathematical/basic_test.rb +0 -38
- data/test/mathematical/fixtures/after/brackets_display.html +0 -1
- data/test/mathematical/fixtures/after/dollar_sign_inline.html +0 -1
- data/test/mathematical/fixtures/after/equation_display.html +0 -1
- data/test/mathematical/fixtures/after/multiple_dollar_inline.html +0 -1
- data/test/mathematical/fixtures/after/parens_inline.html +0 -1
- data/test/mathematical/fixtures/before/brackets_display.text +0 -1
- data/test/mathematical/fixtures/before/dollar_sign_inline.text +0 -1
- data/test/mathematical/fixtures/before/equation_display.text +0 -1
- data/test/mathematical/fixtures/before/multiple_dollar_inline.text +0 -1
- data/test/mathematical/fixtures/before/parens_inline.text +0 -1
- data/test/mathematical/fixtures/performance/big_file.text +0 -1767
- data/test/mathematical/fixtures_test.rb +0 -31
- data/test/mathematical/performance_test.rb +0 -13
- data/test/test_helper.rb +0 -4
data/ext/mathematical/lsm.c
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
/* Lasem - SVG and Mathml library
|
2
|
-
*
|
3
|
-
* Copyright © 2010 Emmanuel Pacaud
|
4
|
-
*
|
5
|
-
* This library is free software; you can redistribute it and/or
|
6
|
-
* modify it under the terms of the GNU Lesser General Public
|
7
|
-
* License as published by the Free Software Foundation; either
|
8
|
-
* version 2 of the License, or (at your option) any later version.
|
9
|
-
*
|
10
|
-
* This library is distributed in the hope that it will be useful,
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
-
* Lesser General Public License for more details.
|
14
|
-
*
|
15
|
-
* You should have received a copy of the GNU Lesser General
|
16
|
-
* Public License along with this library; if not, write to the
|
17
|
-
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
18
|
-
* Boston, MA 02111-1307, USA.
|
19
|
-
*
|
20
|
-
* Author:
|
21
|
-
* Emmanuel Pacaud <emmanuel@gnome.org>
|
22
|
-
*/
|
23
|
-
|
24
|
-
#include <lsmdomimplementation.h>
|
25
|
-
|
26
|
-
void
|
27
|
-
lsm_shutdown (void)
|
28
|
-
{
|
29
|
-
lsm_dom_implementation_cleanup ();
|
30
|
-
}
|
data/ext/mathematical/lsm.h
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
/* Lasem - SVG and Mathml library
|
2
|
-
*
|
3
|
-
* Copyright © 2009 Emmanuel Pacaud
|
4
|
-
*
|
5
|
-
* This library is free software; you can redistribute it and/or
|
6
|
-
* modify it under the terms of the GNU Lesser General Public
|
7
|
-
* License as published by the Free Software Foundation; either
|
8
|
-
* version 2 of the License, or (at your option) any later version.
|
9
|
-
*
|
10
|
-
* This library is distributed in the hope that it will be useful,
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
-
* Lesser General Public License for more details.
|
14
|
-
*
|
15
|
-
* You should have received a copy of the GNU Lesser General
|
16
|
-
* Public License along with this library; if not, write to the
|
17
|
-
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
18
|
-
* Boston, MA 02111-1307, USA.
|
19
|
-
*
|
20
|
-
* Author:
|
21
|
-
* Emmanuel Pacaud <emmanuel@gnome.org>
|
22
|
-
*/
|
23
|
-
|
24
|
-
#ifndef LSM_H
|
25
|
-
#define LSM_H
|
26
|
-
|
27
|
-
#include <lsmtypes.h>
|
28
|
-
|
29
|
-
#include <lsmcairo.h>
|
30
|
-
#include <lsmstr.h>
|
31
|
-
#include <lsmdebug.h>
|
32
|
-
#include <lsmtraits.h>
|
33
|
-
#include <lsmattributes.h>
|
34
|
-
#include <lsmproperties.h>
|
35
|
-
|
36
|
-
#endif
|
@@ -1,279 +0,0 @@
|
|
1
|
-
/* Lasem
|
2
|
-
*
|
3
|
-
* Copyright © 2007-2009 Emmanuel Pacaud
|
4
|
-
*
|
5
|
-
* This library is free software; you can redistribute it and/or
|
6
|
-
* modify it under the terms of the GNU Lesser General Public
|
7
|
-
* License as published by the Free Software Foundation; either
|
8
|
-
* version 2 of the License, or (at your option) any later version.
|
9
|
-
*
|
10
|
-
* This library is distributed in the hope that it will be useful,
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
-
* Lesser General Public License for more details.
|
14
|
-
*
|
15
|
-
* You should have received a copy of the GNU Lesser General
|
16
|
-
* Public License along with this library; if not, write to the
|
17
|
-
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
18
|
-
* Boston, MA 02111-1307, USA.
|
19
|
-
*
|
20
|
-
* Author:
|
21
|
-
* Emmanuel Pacaud <emmanuel@gnome.org>
|
22
|
-
*/
|
23
|
-
|
24
|
-
#include <lsmattributes.h>
|
25
|
-
#include <lsmdebug.h>
|
26
|
-
#include <string.h>
|
27
|
-
#include <stdlib.h>
|
28
|
-
#include <math.h>
|
29
|
-
|
30
|
-
gboolean
|
31
|
-
lsm_attribute_is_defined (const LsmAttribute *attribute)
|
32
|
-
{
|
33
|
-
g_return_val_if_fail (attribute != NULL, FALSE);
|
34
|
-
|
35
|
-
return attribute->value != NULL;
|
36
|
-
}
|
37
|
-
|
38
|
-
#define ATTRIBUTE_TRAIT(attribute) ((void *) (((void *) attribute) + sizeof (LsmAttribute)))
|
39
|
-
|
40
|
-
struct _LsmAttributeManager {
|
41
|
-
GHashTable * hash_by_name;
|
42
|
-
|
43
|
-
gint ref_count;
|
44
|
-
};
|
45
|
-
|
46
|
-
G_DEFINE_BOXED_TYPE (LsmAttributeManager, lsm_attribute_manager, lsm_attribute_manager_ref, lsm_attribute_manager_unref)
|
47
|
-
|
48
|
-
static LsmAttributeManager *
|
49
|
-
lsm_attribute_manager_create (void)
|
50
|
-
{
|
51
|
-
LsmAttributeManager *manager;
|
52
|
-
|
53
|
-
manager = g_new0 (LsmAttributeManager, 1);
|
54
|
-
manager->hash_by_name = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
|
55
|
-
manager->ref_count = 1;
|
56
|
-
|
57
|
-
return manager;
|
58
|
-
}
|
59
|
-
|
60
|
-
LsmAttributeManager *
|
61
|
-
lsm_attribute_manager_new (unsigned int n_attributes, const LsmAttributeInfos *attribute_infos)
|
62
|
-
{
|
63
|
-
LsmAttributeManager *manager;
|
64
|
-
|
65
|
-
manager = lsm_attribute_manager_create ();
|
66
|
-
|
67
|
-
lsm_attribute_manager_add_attributes (manager, n_attributes, attribute_infos);
|
68
|
-
|
69
|
-
return manager;
|
70
|
-
}
|
71
|
-
|
72
|
-
LsmAttributeManager *
|
73
|
-
lsm_attribute_manager_duplicate (const LsmAttributeManager *origin)
|
74
|
-
{
|
75
|
-
LsmAttributeManager *manager;
|
76
|
-
GHashTableIter iter;
|
77
|
-
gpointer key, value;
|
78
|
-
|
79
|
-
g_return_val_if_fail (origin != NULL, NULL);
|
80
|
-
|
81
|
-
manager = lsm_attribute_manager_create ();
|
82
|
-
|
83
|
-
g_hash_table_iter_init (&iter, origin->hash_by_name);
|
84
|
-
while (g_hash_table_iter_next (&iter, &key, &value))
|
85
|
-
g_hash_table_insert (manager->hash_by_name, key, value);
|
86
|
-
|
87
|
-
return manager;
|
88
|
-
}
|
89
|
-
|
90
|
-
void
|
91
|
-
lsm_attribute_manager_add_attributes (LsmAttributeManager *manager,
|
92
|
-
unsigned int n_attributes,
|
93
|
-
const LsmAttributeInfos *attribute_infos)
|
94
|
-
{
|
95
|
-
unsigned int i;
|
96
|
-
|
97
|
-
g_return_if_fail (n_attributes > 0);
|
98
|
-
g_return_if_fail (attribute_infos != NULL);
|
99
|
-
|
100
|
-
for (i = 0; i < n_attributes; i++) {
|
101
|
-
g_assert (attribute_infos[i].name != NULL);
|
102
|
-
g_assert (attribute_infos[i].attribute_offset >= 0);
|
103
|
-
g_assert (attribute_infos[i].trait_class != NULL);
|
104
|
-
|
105
|
-
g_hash_table_insert (manager->hash_by_name,
|
106
|
-
(void *) attribute_infos[i].name,
|
107
|
-
(void *) &attribute_infos[i]);
|
108
|
-
}
|
109
|
-
|
110
|
-
}
|
111
|
-
|
112
|
-
LsmAttributeManager *
|
113
|
-
lsm_attribute_manager_ref (LsmAttributeManager *manager)
|
114
|
-
{
|
115
|
-
g_return_val_if_fail (manager != NULL, NULL);
|
116
|
-
|
117
|
-
g_atomic_int_inc (&manager->ref_count);
|
118
|
-
|
119
|
-
return manager;
|
120
|
-
}
|
121
|
-
|
122
|
-
void
|
123
|
-
lsm_attribute_manager_unref (LsmAttributeManager *manager)
|
124
|
-
{
|
125
|
-
g_return_if_fail (manager != NULL);
|
126
|
-
|
127
|
-
if (g_atomic_int_dec_and_test (&manager->ref_count)) {
|
128
|
-
g_hash_table_unref (manager->hash_by_name);
|
129
|
-
g_free (manager);
|
130
|
-
}
|
131
|
-
}
|
132
|
-
|
133
|
-
gboolean
|
134
|
-
lsm_attribute_manager_set_attribute (LsmAttributeManager *manager,
|
135
|
-
void *instance,
|
136
|
-
const char *name,
|
137
|
-
const char *value)
|
138
|
-
{
|
139
|
-
LsmAttribute *attribute;
|
140
|
-
LsmAttributeInfos *attribute_infos;
|
141
|
-
const LsmTraitClass *trait_class;
|
142
|
-
|
143
|
-
g_return_val_if_fail (manager != NULL, FALSE);
|
144
|
-
|
145
|
-
attribute_infos = g_hash_table_lookup (manager->hash_by_name, name);
|
146
|
-
if (attribute_infos == NULL)
|
147
|
-
return FALSE;
|
148
|
-
|
149
|
-
attribute = (void *)(instance + attribute_infos->attribute_offset);
|
150
|
-
g_return_val_if_fail (attribute != NULL, FALSE);
|
151
|
-
|
152
|
-
trait_class = attribute_infos->trait_class;
|
153
|
-
|
154
|
-
g_free (attribute->value);
|
155
|
-
attribute->value = g_strdup (value);
|
156
|
-
|
157
|
-
if (attribute->value != NULL) {
|
158
|
-
if (trait_class->from_string) {
|
159
|
-
gboolean success;
|
160
|
-
|
161
|
-
success = trait_class->from_string (ATTRIBUTE_TRAIT (attribute), (char *) value);
|
162
|
-
if (success)
|
163
|
-
return TRUE;
|
164
|
-
|
165
|
-
if (trait_class->finalize)
|
166
|
-
trait_class->finalize (ATTRIBUTE_TRAIT (attribute));
|
167
|
-
g_free (attribute->value);
|
168
|
-
attribute->value = NULL;
|
169
|
-
|
170
|
-
lsm_debug_dom ("[LsmAttributeManager::set_attribute] Invalid attribute value %s='%s'",
|
171
|
-
name, value);
|
172
|
-
} else
|
173
|
-
return TRUE;
|
174
|
-
}
|
175
|
-
|
176
|
-
if (trait_class->init)
|
177
|
-
trait_class->init (ATTRIBUTE_TRAIT (attribute), attribute_infos->trait_default);
|
178
|
-
else
|
179
|
-
/* Simple memcpy for default init implementation, discarded by a NULL default value. */
|
180
|
-
if (attribute_infos->trait_default != NULL)
|
181
|
-
memcpy (ATTRIBUTE_TRAIT (attribute),
|
182
|
-
attribute_infos->trait_default,
|
183
|
-
trait_class->size);
|
184
|
-
|
185
|
-
return TRUE;
|
186
|
-
}
|
187
|
-
|
188
|
-
char const *
|
189
|
-
lsm_attribute_manager_get_attribute (LsmAttributeManager *manager,
|
190
|
-
void *instance,
|
191
|
-
const char *name)
|
192
|
-
{
|
193
|
-
LsmAttributeInfos *attribute_infos;
|
194
|
-
LsmAttribute *attribute;
|
195
|
-
|
196
|
-
g_return_val_if_fail (manager != NULL, NULL);
|
197
|
-
|
198
|
-
attribute_infos = g_hash_table_lookup (manager->hash_by_name, name);
|
199
|
-
if (attribute_infos == NULL)
|
200
|
-
return NULL;
|
201
|
-
|
202
|
-
attribute = (void *)(instance + attribute_infos->attribute_offset);
|
203
|
-
g_return_val_if_fail (attribute != NULL, NULL);
|
204
|
-
|
205
|
-
return attribute->value;
|
206
|
-
}
|
207
|
-
|
208
|
-
void
|
209
|
-
lsm_attribute_manager_clean_attributes (LsmAttributeManager *manager,
|
210
|
-
void *instance)
|
211
|
-
{
|
212
|
-
LsmAttributeInfos *attribute_infos;
|
213
|
-
LsmAttribute *attribute;
|
214
|
-
const LsmTraitClass *trait_class;
|
215
|
-
GHashTableIter iter;
|
216
|
-
gpointer key, value;
|
217
|
-
|
218
|
-
g_return_if_fail (manager != NULL);
|
219
|
-
|
220
|
-
g_hash_table_iter_init (&iter, manager->hash_by_name);
|
221
|
-
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
222
|
-
attribute_infos = value;
|
223
|
-
trait_class = attribute_infos->trait_class;
|
224
|
-
|
225
|
-
attribute = (void *)(instance + attribute_infos->attribute_offset);
|
226
|
-
g_free (attribute->value);
|
227
|
-
attribute->value = NULL;
|
228
|
-
|
229
|
-
if (trait_class->finalize) {
|
230
|
-
trait_class->finalize (ATTRIBUTE_TRAIT (attribute));
|
231
|
-
}
|
232
|
-
}
|
233
|
-
}
|
234
|
-
|
235
|
-
char *
|
236
|
-
lsm_attribute_manager_serialize (LsmAttributeManager *manager,
|
237
|
-
void *instance)
|
238
|
-
{
|
239
|
-
LsmAttributeInfos *attribute_infos;
|
240
|
-
LsmAttribute *attribute;
|
241
|
-
GString *string;
|
242
|
-
GHashTableIter iter;
|
243
|
-
char *c_string;
|
244
|
-
gpointer key, value;
|
245
|
-
gboolean attribute_found = FALSE;
|
246
|
-
|
247
|
-
g_return_val_if_fail (manager != NULL, NULL);
|
248
|
-
|
249
|
-
string = g_string_new ("");
|
250
|
-
|
251
|
-
g_hash_table_iter_init (&iter, manager->hash_by_name);
|
252
|
-
while (g_hash_table_iter_next (&iter, &key, &value)) {
|
253
|
-
attribute_infos = value;
|
254
|
-
attribute = (void *)(instance + attribute_infos->attribute_offset);
|
255
|
-
|
256
|
-
if (attribute->value != NULL) {
|
257
|
-
if (!attribute_found) {
|
258
|
-
g_string_append_printf (string, "%s=\"%s\"",
|
259
|
-
attribute_infos->name,
|
260
|
-
attribute->value);
|
261
|
-
attribute_found = TRUE;
|
262
|
-
} else {
|
263
|
-
g_string_append_printf (string, " %s=\"%s\"",
|
264
|
-
attribute_infos->name,
|
265
|
-
attribute->value);
|
266
|
-
}
|
267
|
-
}
|
268
|
-
}
|
269
|
-
|
270
|
-
if (!attribute_found) {
|
271
|
-
g_string_free (string, TRUE);
|
272
|
-
return NULL;
|
273
|
-
}
|
274
|
-
|
275
|
-
c_string = string->str;
|
276
|
-
g_string_free (string, FALSE);
|
277
|
-
|
278
|
-
return c_string;
|
279
|
-
}
|
@@ -1,75 +0,0 @@
|
|
1
|
-
/* Lasem
|
2
|
-
*
|
3
|
-
* Copyright © 2007-2009 Emmanuel Pacaud
|
4
|
-
*
|
5
|
-
* This library is free software; you can redistribute it and/or
|
6
|
-
* modify it under the terms of the GNU Lesser General Public
|
7
|
-
* License as published by the Free Software Foundation; either
|
8
|
-
* version 2 of the License, or (at your option) any later version.
|
9
|
-
*
|
10
|
-
* This library is distributed in the hope that it will be useful,
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
-
* Lesser General Public License for more details.
|
14
|
-
*
|
15
|
-
* You should have received a copy of the GNU Lesser General
|
16
|
-
* Public License along with this library; if not, write to the
|
17
|
-
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
18
|
-
* Boston, MA 02111-1307, USA.
|
19
|
-
*
|
20
|
-
* Author:
|
21
|
-
* Emmanuel Pacaud <emmanuel@gnome.org>
|
22
|
-
*/
|
23
|
-
|
24
|
-
#ifndef LSM_ATTRIBUTES_H
|
25
|
-
#define LSM_ATTRIBUTES_H
|
26
|
-
|
27
|
-
#include <lsmtypes.h>
|
28
|
-
#include <lsmtraits.h>
|
29
|
-
|
30
|
-
G_BEGIN_DECLS
|
31
|
-
|
32
|
-
typedef struct {
|
33
|
-
char *value;
|
34
|
-
} LsmAttribute;
|
35
|
-
|
36
|
-
gboolean lsm_attribute_is_defined (const LsmAttribute *attribute);
|
37
|
-
|
38
|
-
typedef struct {
|
39
|
-
char const * name;
|
40
|
-
int attribute_offset;
|
41
|
-
const LsmTraitClass * trait_class;
|
42
|
-
const void * trait_default;
|
43
|
-
} LsmAttributeInfos;
|
44
|
-
|
45
|
-
typedef struct _LsmAttributeManager LsmAttributeManager;
|
46
|
-
|
47
|
-
#define LSM_TYPE_ATTRIBUTE_MANAGER (lsm_attribute_manager_get_type())
|
48
|
-
|
49
|
-
GType lsm_attribute_manager_get_type (void);
|
50
|
-
|
51
|
-
LsmAttributeManager * lsm_attribute_manager_new (unsigned int n_attributes,
|
52
|
-
const LsmAttributeInfos *attribute_infos);
|
53
|
-
LsmAttributeManager * lsm_attribute_manager_duplicate (const LsmAttributeManager *origin);
|
54
|
-
LsmAttributeManager * lsm_attribute_manager_ref (LsmAttributeManager *manager);
|
55
|
-
void lsm_attribute_manager_unref (LsmAttributeManager *manager);
|
56
|
-
|
57
|
-
void lsm_attribute_manager_add_attributes (LsmAttributeManager *manager,
|
58
|
-
unsigned int n_attributes,
|
59
|
-
const LsmAttributeInfos *attribute_infos);
|
60
|
-
|
61
|
-
gboolean lsm_attribute_manager_set_attribute (LsmAttributeManager *manager,
|
62
|
-
void *instance,
|
63
|
-
char const *name,
|
64
|
-
char const *value);
|
65
|
-
char const * lsm_attribute_manager_get_attribute (LsmAttributeManager *manager,
|
66
|
-
void *instance,
|
67
|
-
char const *name);
|
68
|
-
void lsm_attribute_manager_clean_attributes (LsmAttributeManager *manager,
|
69
|
-
void *instance);
|
70
|
-
char * lsm_attribute_manager_serialize (LsmAttributeManager *manager,
|
71
|
-
void *instance);
|
72
|
-
|
73
|
-
G_END_DECLS
|
74
|
-
|
75
|
-
#endif
|
data/ext/mathematical/lsmcairo.c
DELETED
@@ -1,598 +0,0 @@
|
|
1
|
-
/* Lasem
|
2
|
-
*
|
3
|
-
* Copyright © 2004 Caleb Moore
|
4
|
-
* Copyright © 2012 Emmanuel Pacaud
|
5
|
-
*
|
6
|
-
* This library is free software; you can redistribute it and/or
|
7
|
-
* modify it under the terms of the GNU Lesser General Public
|
8
|
-
* License as published by the Free Software Foundation; either
|
9
|
-
* version 2 of the License, or (at your option) any later version.
|
10
|
-
*
|
11
|
-
* This library is distributed in the hope that it will be useful,
|
12
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
-
* Lesser General Public License for more details.
|
15
|
-
*
|
16
|
-
* You should have received a copy of the GNU Lesser General
|
17
|
-
* Public License along with this library; if not, write to the
|
18
|
-
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
19
|
-
* Boston, MA 02111-1307, USA.
|
20
|
-
*
|
21
|
-
* Authors:
|
22
|
-
* Caleb Moore <c.moore@student.unsw.edu.au>
|
23
|
-
* Emmanuel Pacaud <emmanuel@gnome.org>
|
24
|
-
*/
|
25
|
-
|
26
|
-
#include <lsmcairo.h>
|
27
|
-
#include <lsmsvgenums.h>
|
28
|
-
#include <lsmutils.h>
|
29
|
-
#include <lsmstr.h>
|
30
|
-
#include <math.h>
|
31
|
-
#include <string.h>
|
32
|
-
|
33
|
-
typedef struct {
|
34
|
-
cairo_t *cr;
|
35
|
-
char *ptr;
|
36
|
-
char last_command;
|
37
|
-
double last_cp_x;
|
38
|
-
double last_cp_y;
|
39
|
-
double values[7];
|
40
|
-
} LsmSvgPathContext;
|
41
|
-
|
42
|
-
/*
|
43
|
-
* Code for:
|
44
|
-
*
|
45
|
-
* _calc_angle
|
46
|
-
* _cairo_elliptical_arc
|
47
|
-
* _cairo_quadratic_curve_to
|
48
|
-
* _emit_smooth_curve
|
49
|
-
* _emit_smooth_quadratic_curve
|
50
|
-
*
|
51
|
-
* is adapted from the goocanvas library (goocanvasutils.c)
|
52
|
-
*
|
53
|
-
* GooCanvas. Copyright (C) 2005 Damon Chaplin.
|
54
|
-
*/
|
55
|
-
|
56
|
-
void
|
57
|
-
lsm_cairo_quadratic_curve_to (cairo_t *cr, double x1, double y1, double x, double y)
|
58
|
-
{
|
59
|
-
double x0, y0, xx1, yy1, xx2, yy2;
|
60
|
-
|
61
|
-
cairo_get_current_point (cr, &x0, &y0);
|
62
|
-
|
63
|
-
/* We need to convert the quadratic into a cubic bezier. */
|
64
|
-
|
65
|
-
xx1 = x0 + (x1 - x0) * 2.0 / 3.0;
|
66
|
-
yy1 = y0 + (y1 - y0) * 2.0 / 3.0;
|
67
|
-
|
68
|
-
xx2 = xx1 + (x - x0) / 3.0;
|
69
|
-
yy2 = yy1 + (y - y0) / 3.0;
|
70
|
-
|
71
|
-
cairo_curve_to (cr, xx1, yy1, xx2, yy2, x, y);
|
72
|
-
}
|
73
|
-
|
74
|
-
void
|
75
|
-
lsm_cairo_rel_quadratic_curve_to (cairo_t *cr, double dx1, double dy1, double dx, double dy)
|
76
|
-
{
|
77
|
-
double x0, y0;
|
78
|
-
|
79
|
-
cairo_get_current_point (cr, &x0, &y0);
|
80
|
-
lsm_cairo_quadratic_curve_to (cr, x0 + dx1, y0 + dy1, x0 + dx, y0 + dy);
|
81
|
-
}
|
82
|
-
|
83
|
-
static double
|
84
|
-
_calc_angle (double ux, double uy, double vx, double vy)
|
85
|
-
{
|
86
|
-
double top, u_magnitude, v_magnitude, angle_cos, angle;
|
87
|
-
|
88
|
-
top = ux * vx + uy * vy;
|
89
|
-
u_magnitude = sqrt (ux * ux + uy * uy);
|
90
|
-
v_magnitude = sqrt (vx * vx + vy * vy);
|
91
|
-
angle_cos = top / (u_magnitude * v_magnitude);
|
92
|
-
|
93
|
-
/* We check if the cosine is slightly out-of-bounds. */
|
94
|
-
if (angle_cos >= 1.0)
|
95
|
-
angle = 0.0;
|
96
|
-
if (angle_cos <= -1.0)
|
97
|
-
angle = M_PI;
|
98
|
-
else
|
99
|
-
angle = acos (angle_cos);
|
100
|
-
|
101
|
-
if (ux * vy - uy * vx < 0)
|
102
|
-
angle = - angle;
|
103
|
-
|
104
|
-
return angle;
|
105
|
-
}
|
106
|
-
|
107
|
-
void
|
108
|
-
lsm_cairo_elliptical_arc (cairo_t *cairo, double rx, double ry, double x_axis_rotation,
|
109
|
-
gboolean large_arc_flag, gboolean sweep_flag, double x, double y)
|
110
|
-
{
|
111
|
-
double x1, y1, x2, y2, lambda;
|
112
|
-
double v1, v2, angle, angle_sin, angle_cos, x11, y11;
|
113
|
-
double rx_squared, ry_squared, x11_squared, y11_squared, top, bottom;
|
114
|
-
double c, cx1, cy1, cx, cy, start_angle, angle_delta;
|
115
|
-
|
116
|
-
cairo_get_current_point (cairo, &x1, &y1);
|
117
|
-
|
118
|
-
x2 = x;
|
119
|
-
y2 = y;
|
120
|
-
|
121
|
-
/* If the endpoints are exactly the same, just return (see SVG spec). */
|
122
|
-
if (x1 == x2 && y1 == y2)
|
123
|
-
return;
|
124
|
-
|
125
|
-
/* If either rx or ry is 0, do a simple lineto (see SVG spec). */
|
126
|
-
if (rx == 0.0 || ry == 0.0)
|
127
|
-
{
|
128
|
-
cairo_line_to (cairo, x2, y2);
|
129
|
-
return;
|
130
|
-
}
|
131
|
-
|
132
|
-
/* Calculate x1' and y1' (as per SVG implementation notes). */
|
133
|
-
v1 = (x1 - x2) / 2.0;
|
134
|
-
v2 = (y1 - y2) / 2.0;
|
135
|
-
|
136
|
-
angle = x_axis_rotation * (M_PI / 180.0);
|
137
|
-
angle_sin = sin (angle);
|
138
|
-
angle_cos = cos (angle);
|
139
|
-
|
140
|
-
x11 = (angle_cos * v1) + (angle_sin * v2);
|
141
|
-
y11 = - (angle_sin * v1) + (angle_cos * v2);
|
142
|
-
|
143
|
-
/* Ensure rx and ry are positive and large enough. */
|
144
|
-
rx = rx > 0.0 ? rx : - rx;
|
145
|
-
ry = ry > 0.0 ? ry : - ry;
|
146
|
-
lambda = (x11 * x11) / (rx * rx) + (y11 * y11) / (ry * ry);
|
147
|
-
if (lambda > 1.0)
|
148
|
-
{
|
149
|
-
gdouble square_root = sqrt (lambda);
|
150
|
-
rx *= square_root;
|
151
|
-
ry *= square_root;
|
152
|
-
}
|
153
|
-
|
154
|
-
/* Calculate cx' and cy'. */
|
155
|
-
rx_squared = rx * rx;
|
156
|
-
ry_squared = ry * ry;
|
157
|
-
x11_squared = x11 * x11;
|
158
|
-
y11_squared = y11 * y11;
|
159
|
-
|
160
|
-
top = (rx_squared * ry_squared) - (rx_squared * y11_squared)
|
161
|
-
- (ry_squared * x11_squared);
|
162
|
-
if (top < 0.0)
|
163
|
-
{
|
164
|
-
c = 0.0;
|
165
|
-
}
|
166
|
-
else
|
167
|
-
{
|
168
|
-
bottom = (rx_squared * y11_squared) + (ry_squared * x11_squared);
|
169
|
-
c = sqrt (top / bottom);
|
170
|
-
}
|
171
|
-
|
172
|
-
if (large_arc_flag == sweep_flag)
|
173
|
-
c = - c;
|
174
|
-
|
175
|
-
cx1 = c * ((rx * y11) / ry);
|
176
|
-
cy1 = c * (- (ry * x11) / rx);
|
177
|
-
|
178
|
-
/* Calculate cx and cy. */
|
179
|
-
cx = (angle_cos * cx1) - (angle_sin * cy1) + (x1 + x2) / 2;
|
180
|
-
cy = (angle_sin * cx1) + (angle_cos * cy1) + (y1 + y2) / 2;
|
181
|
-
|
182
|
-
/* Calculate the start and end angles. */
|
183
|
-
v1 = (x11 - cx1) / rx;
|
184
|
-
v2 = (y11 - cy1) / ry;
|
185
|
-
|
186
|
-
start_angle = _calc_angle (1, 0, v1, v2);
|
187
|
-
angle_delta = _calc_angle (v1, v2, (-x11 - cx1) / rx, (-y11 - cy1) / ry);
|
188
|
-
|
189
|
-
if (sweep_flag == 0 && angle_delta > 0.0)
|
190
|
-
angle_delta -= 2 * M_PI;
|
191
|
-
else if (sweep_flag == 1 && angle_delta < 0.0)
|
192
|
-
angle_delta += 2 * M_PI;
|
193
|
-
|
194
|
-
/* Now draw the arc. */
|
195
|
-
cairo_save (cairo);
|
196
|
-
cairo_translate (cairo, cx, cy);
|
197
|
-
cairo_rotate (cairo, angle);
|
198
|
-
cairo_scale (cairo, rx, ry);
|
199
|
-
|
200
|
-
if (angle_delta > 0.0)
|
201
|
-
cairo_arc (cairo, 0.0, 0.0, 1.0,
|
202
|
-
start_angle, start_angle + angle_delta);
|
203
|
-
else
|
204
|
-
cairo_arc_negative (cairo, 0.0, 0.0, 1.0,
|
205
|
-
start_angle, start_angle + angle_delta);
|
206
|
-
|
207
|
-
cairo_restore (cairo);
|
208
|
-
}
|
209
|
-
|
210
|
-
void
|
211
|
-
lsm_cairo_rel_elliptical_arc (cairo_t *cairo, double rx, double ry, double x_axis_rotation,
|
212
|
-
gboolean large_arc_flag, gboolean sweep_flag, double dx, double dy)
|
213
|
-
{
|
214
|
-
double x, y;
|
215
|
-
|
216
|
-
cairo_get_current_point (cairo, &x, &y);
|
217
|
-
|
218
|
-
lsm_cairo_elliptical_arc (cairo, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x +dx ,y + dy);
|
219
|
-
}
|
220
|
-
|
221
|
-
void
|
222
|
-
lsm_cairo_vertical (cairo_t *cairo, double y)
|
223
|
-
{
|
224
|
-
double x0, y0;
|
225
|
-
|
226
|
-
cairo_get_current_point (cairo, &x0, &y0);
|
227
|
-
cairo_line_to (cairo, x0, y);
|
228
|
-
}
|
229
|
-
|
230
|
-
void
|
231
|
-
lsm_cairo_rel_vertical (cairo_t *cairo, double dy)
|
232
|
-
{
|
233
|
-
double x0, y0;
|
234
|
-
|
235
|
-
cairo_get_current_point (cairo, &x0, &y0);
|
236
|
-
cairo_line_to (cairo, x0, y0 + dy);
|
237
|
-
}
|
238
|
-
|
239
|
-
void
|
240
|
-
lsm_cairo_horizontal (cairo_t *cairo, double x)
|
241
|
-
{
|
242
|
-
double x0, y0;
|
243
|
-
|
244
|
-
cairo_get_current_point (cairo, &x0, &y0);
|
245
|
-
cairo_line_to (cairo, x, y0);
|
246
|
-
}
|
247
|
-
|
248
|
-
void
|
249
|
-
lsm_cairo_rel_horizontal (cairo_t *cairo, double dx)
|
250
|
-
{
|
251
|
-
double x0, y0;
|
252
|
-
|
253
|
-
cairo_get_current_point (cairo, &x0, &y0);
|
254
|
-
cairo_line_to (cairo, x0 + dx, y0);
|
255
|
-
}
|
256
|
-
|
257
|
-
static void
|
258
|
-
_emit_function_1 (LsmSvgPathContext *ctxt,
|
259
|
-
void (*cairo_func) (cairo_t *, double))
|
260
|
-
{
|
261
|
-
while (lsm_str_parse_double_list (&ctxt->ptr, 1, ctxt->values) == 1)
|
262
|
-
cairo_func (ctxt->cr, ctxt->values[0]);
|
263
|
-
}
|
264
|
-
|
265
|
-
static void
|
266
|
-
_emit_function_2 (LsmSvgPathContext *ctxt,
|
267
|
-
void (*cairo_func_a) (cairo_t *, double, double),
|
268
|
-
void (*cairo_func_b) (cairo_t *, double, double))
|
269
|
-
{
|
270
|
-
|
271
|
-
if (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values) == 2) {
|
272
|
-
cairo_func_a (ctxt->cr, ctxt->values[0], ctxt->values[1]);
|
273
|
-
|
274
|
-
/* Why oh why does the specification say Line is implied here ? */
|
275
|
-
|
276
|
-
while (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values) == 2)
|
277
|
-
cairo_func_b (ctxt->cr, ctxt->values[0], ctxt->values[1]);
|
278
|
-
}
|
279
|
-
}
|
280
|
-
|
281
|
-
static void
|
282
|
-
_emit_function_4 (LsmSvgPathContext *ctxt,
|
283
|
-
void (*cairo_func) (cairo_t *, double, double, double, double))
|
284
|
-
{
|
285
|
-
while (lsm_str_parse_double_list (&ctxt->ptr, 4, ctxt->values) == 4)
|
286
|
-
cairo_func (ctxt->cr, ctxt->values[0], ctxt->values[1], ctxt->values[2], ctxt->values[3]);
|
287
|
-
}
|
288
|
-
|
289
|
-
static void
|
290
|
-
_emit_smooth_curve (LsmSvgPathContext *ctxt, gboolean relative)
|
291
|
-
{
|
292
|
-
double x, y;
|
293
|
-
double x0, y0;
|
294
|
-
|
295
|
-
cairo_get_current_point (ctxt->cr, &x0, &y0);
|
296
|
-
|
297
|
-
switch (ctxt->last_command) {
|
298
|
-
case 'C':
|
299
|
-
x = 2 * x0 - ctxt->values[2];
|
300
|
-
y = 2 * y0 - ctxt->values[3];
|
301
|
-
break;
|
302
|
-
case 'c':
|
303
|
-
x = 2 * x0 - (ctxt->values[2] + x0 - ctxt->values[4]);
|
304
|
-
y = 2 * y0 - (ctxt->values[3] + y0 - ctxt->values[5]);
|
305
|
-
break;
|
306
|
-
case 'S':
|
307
|
-
x = 2 * x0 - ctxt->values[0];
|
308
|
-
y = 2 * y0 - ctxt->values[1];
|
309
|
-
break;
|
310
|
-
case 's':
|
311
|
-
x = 2 * x0 - (ctxt->values[0] + x0 - ctxt->values[2]);
|
312
|
-
y = 2 * y0 - (ctxt->values[1] + y0 - ctxt->values[3]);
|
313
|
-
break;
|
314
|
-
default: x = x0; y = y0; break;
|
315
|
-
}
|
316
|
-
|
317
|
-
while (lsm_str_parse_double_list (&ctxt->ptr, 4, ctxt->values) == 4) {
|
318
|
-
if (relative) {
|
319
|
-
cairo_get_current_point (ctxt->cr, &x0, &y0);
|
320
|
-
cairo_curve_to (ctxt->cr,
|
321
|
-
x, y,
|
322
|
-
x0 + ctxt->values[0], y0 + ctxt->values[1],
|
323
|
-
x0 + ctxt->values[2], y0 + ctxt->values[3]);
|
324
|
-
x = 2 * (x0 + ctxt->values[2]) - (x0 + ctxt->values[0]);
|
325
|
-
y = 2 * (y0 + ctxt->values[3]) - (y0 + ctxt->values[1]);
|
326
|
-
} else {
|
327
|
-
cairo_curve_to (ctxt->cr, x, y,
|
328
|
-
ctxt->values[0], ctxt->values[1], ctxt->values[2], ctxt->values[3]);
|
329
|
-
x = 2 * ctxt->values[2] - ctxt->values[0];
|
330
|
-
y = 2 * ctxt->values[3] - ctxt->values[1];
|
331
|
-
}
|
332
|
-
}
|
333
|
-
}
|
334
|
-
|
335
|
-
static void
|
336
|
-
_emit_smooth_quadratic_curve (LsmSvgPathContext *ctxt, gboolean relative)
|
337
|
-
{
|
338
|
-
double x, y;
|
339
|
-
double x0, y0;
|
340
|
-
|
341
|
-
cairo_get_current_point (ctxt->cr, &x0, &y0);
|
342
|
-
|
343
|
-
switch (ctxt->last_command) {
|
344
|
-
case 'Q':
|
345
|
-
ctxt->last_cp_x = ctxt->values[0];
|
346
|
-
ctxt->last_cp_y = ctxt->values[1];
|
347
|
-
break;
|
348
|
-
case 'q':
|
349
|
-
ctxt->last_cp_x = ctxt->values[0] + x0 - ctxt->values[2];
|
350
|
-
ctxt->last_cp_y = ctxt->values[1] + y0 - ctxt->values[3];
|
351
|
-
break;
|
352
|
-
case 'T':
|
353
|
-
case 't':
|
354
|
-
break;
|
355
|
-
default: ctxt->last_cp_x = x0; ctxt->last_cp_y = y0; break;
|
356
|
-
}
|
357
|
-
|
358
|
-
while (lsm_str_parse_double_list (&ctxt->ptr, 2, ctxt->values) == 2) {
|
359
|
-
x = 2 * x0 - ctxt->last_cp_x;
|
360
|
-
y = 2 * y0 - ctxt->last_cp_y;
|
361
|
-
if (relative) {
|
362
|
-
cairo_get_current_point (ctxt->cr, &x0, &y0);
|
363
|
-
lsm_cairo_quadratic_curve_to (ctxt->cr, x, y, x0 + ctxt->values[0], y0 + ctxt->values[1]);
|
364
|
-
} else {
|
365
|
-
lsm_cairo_quadratic_curve_to (ctxt->cr, x, y, ctxt->values[0], ctxt->values[1]);
|
366
|
-
}
|
367
|
-
ctxt->last_cp_x = x;
|
368
|
-
ctxt->last_cp_y = y;
|
369
|
-
cairo_get_current_point (ctxt->cr, &x0, &y0);
|
370
|
-
}
|
371
|
-
}
|
372
|
-
|
373
|
-
static void
|
374
|
-
_emit_function_6 (LsmSvgPathContext *ctxt,
|
375
|
-
void (*cairo_func) (cairo_t *, double, double, double ,double, double, double))
|
376
|
-
{
|
377
|
-
while (lsm_str_parse_double_list (&ctxt->ptr, 6, ctxt->values) == 6)
|
378
|
-
cairo_func (ctxt->cr, ctxt->values[0], ctxt->values[1], ctxt->values[2],
|
379
|
-
ctxt->values[3], ctxt->values[4], ctxt->values[5]);
|
380
|
-
}
|
381
|
-
|
382
|
-
static void
|
383
|
-
_emit_function_7 (LsmSvgPathContext *ctxt,
|
384
|
-
void (*cairo_func) (cairo_t *, double, double, double ,gboolean, gboolean, double, double))
|
385
|
-
{
|
386
|
-
while (lsm_str_parse_double_list (&ctxt->ptr, 7, ctxt->values) == 7)
|
387
|
-
cairo_func (ctxt->cr, ctxt->values[0], ctxt->values[1], ctxt->values[2],
|
388
|
-
ctxt->values[3], ctxt->values[4], ctxt->values[5],
|
389
|
-
ctxt->values[6]);
|
390
|
-
}
|
391
|
-
|
392
|
-
void
|
393
|
-
lsm_cairo_emit_svg_path (cairo_t *cr, char const *path)
|
394
|
-
{
|
395
|
-
LsmSvgPathContext ctxt;
|
396
|
-
|
397
|
-
g_return_if_fail (cr != NULL);
|
398
|
-
|
399
|
-
if (path == NULL)
|
400
|
-
return;
|
401
|
-
|
402
|
-
ctxt.cr = cr;
|
403
|
-
ctxt.ptr = (char *) path;
|
404
|
-
ctxt.last_command = '\0';
|
405
|
-
cairo_get_current_point (cr,
|
406
|
-
&ctxt.values[0],
|
407
|
-
&ctxt.values[1]);
|
408
|
-
ctxt.values[2] = ctxt.values[4] = ctxt.values[0];
|
409
|
-
ctxt.values[3] = ctxt.values[5] = ctxt.values[1];
|
410
|
-
|
411
|
-
lsm_str_skip_spaces (&ctxt.ptr);
|
412
|
-
|
413
|
-
while (*ctxt.ptr != '\0') {
|
414
|
-
char command;
|
415
|
-
|
416
|
-
command = *ctxt.ptr;
|
417
|
-
ctxt.ptr++;
|
418
|
-
lsm_str_skip_spaces (&ctxt.ptr);
|
419
|
-
|
420
|
-
if (!cairo_has_current_point (cr)) {
|
421
|
-
cairo_move_to (cr, 0, 0);
|
422
|
-
ctxt.values[2] = ctxt.values[4] = ctxt.values[0] = 0;
|
423
|
-
ctxt.values[3] = ctxt.values[5] = ctxt.values[1] = 0;
|
424
|
-
}
|
425
|
-
|
426
|
-
switch (command) {
|
427
|
-
case 'M': _emit_function_2 (&ctxt, cairo_move_to, cairo_line_to); break;
|
428
|
-
case 'm': _emit_function_2 (&ctxt, cairo_rel_move_to, cairo_rel_line_to); break;
|
429
|
-
case 'L': _emit_function_2 (&ctxt, cairo_line_to, cairo_line_to); break;
|
430
|
-
case 'l': _emit_function_2 (&ctxt, cairo_rel_line_to, cairo_rel_line_to); break;
|
431
|
-
case 'C': _emit_function_6 (&ctxt, cairo_curve_to); break;
|
432
|
-
case 'c': _emit_function_6 (&ctxt, cairo_rel_curve_to); break;
|
433
|
-
case 'S': _emit_smooth_curve (&ctxt, FALSE); break;
|
434
|
-
case 's': _emit_smooth_curve (&ctxt, TRUE); break;
|
435
|
-
case 'V': _emit_function_1 (&ctxt, lsm_cairo_vertical); break;
|
436
|
-
case 'v': _emit_function_1 (&ctxt, lsm_cairo_rel_vertical); break;
|
437
|
-
case 'H': _emit_function_1 (&ctxt, lsm_cairo_horizontal); break;
|
438
|
-
case 'h': _emit_function_1 (&ctxt, lsm_cairo_rel_horizontal); break;
|
439
|
-
case 'Q': _emit_function_4 (&ctxt, lsm_cairo_quadratic_curve_to); break;
|
440
|
-
case 'q': _emit_function_4 (&ctxt, lsm_cairo_rel_quadratic_curve_to); break;
|
441
|
-
case 'T': _emit_smooth_quadratic_curve (&ctxt, FALSE); break;
|
442
|
-
case 't': _emit_smooth_quadratic_curve (&ctxt, TRUE); break;
|
443
|
-
case 'A': _emit_function_7 (&ctxt, lsm_cairo_elliptical_arc); break;
|
444
|
-
case 'a': _emit_function_7 (&ctxt, lsm_cairo_rel_elliptical_arc); break;
|
445
|
-
case 'Z':
|
446
|
-
case 'z': cairo_close_path (cr); break;
|
447
|
-
default: break;
|
448
|
-
}
|
449
|
-
|
450
|
-
ctxt.last_command = command;
|
451
|
-
}
|
452
|
-
}
|
453
|
-
|
454
|
-
void
|
455
|
-
lsm_cairo_box_user_to_device (cairo_t *cairo, LsmBox *to, const LsmBox *from)
|
456
|
-
{
|
457
|
-
if (to == NULL)
|
458
|
-
return;
|
459
|
-
|
460
|
-
if (from == NULL || cairo == NULL) {
|
461
|
-
to->x = 0;
|
462
|
-
to->y = 0;
|
463
|
-
to->width = 0;
|
464
|
-
to->height = 0;
|
465
|
-
}
|
466
|
-
|
467
|
-
*to = *from;
|
468
|
-
|
469
|
-
cairo_user_to_device (cairo, &to->x, &to->y);
|
470
|
-
cairo_user_to_device_distance (cairo, &to->width, &to->height);
|
471
|
-
}
|
472
|
-
|
473
|
-
void
|
474
|
-
lsm_cairo_box_device_to_user (cairo_t *cairo, LsmBox *to, const LsmBox *from)
|
475
|
-
{
|
476
|
-
if (to == NULL)
|
477
|
-
return;
|
478
|
-
|
479
|
-
if (from == NULL || cairo == NULL) {
|
480
|
-
to->x = 0;
|
481
|
-
to->y = 0;
|
482
|
-
to->width = 0;
|
483
|
-
to->height = 0;
|
484
|
-
}
|
485
|
-
|
486
|
-
*to = *from;
|
487
|
-
|
488
|
-
cairo_device_to_user (cairo, &to->x, &to->y);
|
489
|
-
cairo_device_to_user_distance (cairo, &to->width, &to->height);
|
490
|
-
}
|
491
|
-
|
492
|
-
/**
|
493
|
-
* lsm_cairo_set_source_pixbuf:
|
494
|
-
* @cairo: a cairo context
|
495
|
-
* @pixbuf: a #GdkPixbuf
|
496
|
-
* @pixbuf_x: X coordinate of location to place upper left corner of @pixbuf
|
497
|
-
* @pixbuf_y: Y coordinate of location to place upper left corner of @pixbuf
|
498
|
-
*
|
499
|
-
* Sets the given pixbuf as the source pattern for @cairo.
|
500
|
-
*
|
501
|
-
* The pattern has an extend mode of %CAIRO_EXTEND_NONE and is aligned
|
502
|
-
* so that the origin of @pixbuf is @pixbuf_x, @pixbuf_y.
|
503
|
-
*
|
504
|
-
* Since: 0.4
|
505
|
-
*/
|
506
|
-
|
507
|
-
void
|
508
|
-
lsm_cairo_set_source_pixbuf (cairo_t *cairo,
|
509
|
-
const GdkPixbuf *pixbuf,
|
510
|
-
double pixbuf_x,
|
511
|
-
double pixbuf_y)
|
512
|
-
{
|
513
|
-
gint width = gdk_pixbuf_get_width (pixbuf);
|
514
|
-
gint height = gdk_pixbuf_get_height (pixbuf);
|
515
|
-
guchar *gdk_pixels = gdk_pixbuf_get_pixels (pixbuf);
|
516
|
-
int gdk_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
|
517
|
-
int n_channels = gdk_pixbuf_get_n_channels (pixbuf);
|
518
|
-
int cairo_stride;
|
519
|
-
guchar *cairo_pixels;
|
520
|
-
cairo_format_t format;
|
521
|
-
cairo_surface_t *surface;
|
522
|
-
static const cairo_user_data_key_t key;
|
523
|
-
int j;
|
524
|
-
|
525
|
-
if (n_channels == 3)
|
526
|
-
format = CAIRO_FORMAT_RGB24;
|
527
|
-
else
|
528
|
-
format = CAIRO_FORMAT_ARGB32;
|
529
|
-
|
530
|
-
cairo_stride = cairo_format_stride_for_width (format, width);
|
531
|
-
cairo_pixels = g_malloc (height * cairo_stride);
|
532
|
-
surface = cairo_image_surface_create_for_data ((unsigned char *)cairo_pixels,
|
533
|
-
format,
|
534
|
-
width, height, cairo_stride);
|
535
|
-
|
536
|
-
cairo_surface_set_user_data (surface, &key,
|
537
|
-
cairo_pixels, (cairo_destroy_func_t)g_free);
|
538
|
-
|
539
|
-
for (j = height; j; j--)
|
540
|
-
{
|
541
|
-
guchar *p = gdk_pixels;
|
542
|
-
guchar *q = cairo_pixels;
|
543
|
-
|
544
|
-
if (n_channels == 3)
|
545
|
-
{
|
546
|
-
guchar *end = p + 3 * width;
|
547
|
-
|
548
|
-
while (p < end)
|
549
|
-
{
|
550
|
-
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
551
|
-
q[0] = p[2];
|
552
|
-
q[1] = p[1];
|
553
|
-
q[2] = p[0];
|
554
|
-
#else
|
555
|
-
q[1] = p[0];
|
556
|
-
q[2] = p[1];
|
557
|
-
q[3] = p[2];
|
558
|
-
#endif
|
559
|
-
p += 3;
|
560
|
-
q += 4;
|
561
|
-
}
|
562
|
-
}
|
563
|
-
else
|
564
|
-
{
|
565
|
-
guchar *end = p + 4 * width;
|
566
|
-
guint t1,t2,t3;
|
567
|
-
|
568
|
-
#define MULT(d,c,a,t) G_STMT_START { t = c * a + 0x7f; d = ((t >> 8) + t) >> 8; } G_STMT_END
|
569
|
-
|
570
|
-
while (p < end)
|
571
|
-
{
|
572
|
-
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
573
|
-
MULT(q[0], p[2], p[3], t1);
|
574
|
-
MULT(q[1], p[1], p[3], t2);
|
575
|
-
MULT(q[2], p[0], p[3], t3);
|
576
|
-
q[3] = p[3];
|
577
|
-
#else
|
578
|
-
q[0] = p[3];
|
579
|
-
MULT(q[1], p[0], p[3], t1);
|
580
|
-
MULT(q[2], p[1], p[3], t2);
|
581
|
-
MULT(q[3], p[2], p[3], t3);
|
582
|
-
#endif
|
583
|
-
|
584
|
-
p += 4;
|
585
|
-
q += 4;
|
586
|
-
}
|
587
|
-
|
588
|
-
#undef MULT
|
589
|
-
}
|
590
|
-
|
591
|
-
gdk_pixels += gdk_rowstride;
|
592
|
-
cairo_pixels += cairo_stride;
|
593
|
-
}
|
594
|
-
|
595
|
-
cairo_set_source_surface (cairo, surface, pixbuf_x, pixbuf_y);
|
596
|
-
cairo_surface_destroy (surface);
|
597
|
-
}
|
598
|
-
|