wxSVGDC class test sample

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15882 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Chris Elliott 2002-06-19 09:16:19 +00:00
parent 164e084ab4
commit cdf3a589b2
30 changed files with 4090 additions and 0 deletions

View File

@ -0,0 +1,16 @@
# Makefile for plot sample.
# $Id$
top_srcdir = @top_srcdir@/..
top_builddir = ../../..
program_dir = contrib/samples/svg
PROGRAM=svgtest
OBJECTS=svgtest.o
APPEXTRALIBS=$(top_builddir)/lib/libwx_dcsvg.@WX_TARGET_LIBRARY_TYPE@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makeprog.env

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

@ -0,0 +1,310 @@
/* XPM */
static char *svgbitmap_xpm[] = {
/* columns rows colors chars-per-pixel */
"64 48 256 2",
" c #550000",
". c #5c0000",
"X c #5f000a",
"o c #5c033a",
"O c #5a3615",
"+ c #640000",
"@ c #640009",
"# c #680605",
"$ c #680807",
"% c #6d0e0e",
"& c #630015",
"* c #690717",
"= c #6d110e",
"- c #6e1412",
"; c #701513",
": c #721b16",
"> c #741c1a",
", c #650021",
"< c #65022b",
"1 c #65003d",
"2 c #650034",
"3 c #6b1132",
"4 c #711535",
"5 c #76221c",
"6 c #78211e",
"7 c #642939",
"8 c #643929",
"9 c #663336",
"0 c #772220",
"q c #792522",
"w c #7b2a23",
"e c #7d2d29",
"r c #7f312a",
"t c #5d004f",
"y c #560059",
"u c #5b005c",
"i c #5a0054",
"p c #5e0061",
"a c #64004a",
"s c #650046",
"d c #640150",
"f c #64025d",
"g c #660d58",
"h c #671746",
"j c #651352",
"k c #640064",
"l c #640069",
"z c #6d0e6c",
"x c #680767",
"c c #6e0f71",
"v c #6c106b",
"b c #6c1665",
"n c #711a6c",
"m c #731b72",
"M c #682847",
"N c #6d2653",
"B c #75236d",
"V c #7c2d74",
"C c #7d2c7a",
"Z c #782278",
"A c #7e3177",
"S c #565600",
"D c #5c5c00",
"F c #5e6100",
"G c #614416",
"H c #655f06",
"J c #655a0b",
"K c #70463b",
"L c #6e4538",
"P c #646400",
"I c #656a00",
"U c #6c6c0d",
"Y c #676708",
"T c #6d6914",
"R c #6d720f",
"E c #707014",
"W c #78781e",
"Q c #75771a",
"! c #75602d",
"~ c #7a7a23",
"^ c #7b7b2d",
"/ c #812e2a",
"( c #82392d",
") c #81332d",
"_ c #853a34",
"` c #843834",
"' c #833a7b",
"] c #8a443a",
"[ c #884438",
"{ c #8e4a42",
"} c #8d4542",
"| c #8b4055",
" . c #914e48",
".. c #94564a",
"X. c #955250",
"o. c #985b54",
"O. c #995d55",
"+. c #894679",
"@. c #90506f",
"#. c #995c7d",
"$. c #97624d",
"%. c #9e6a5b",
"&. c #9c6756",
"*. c #9e6460",
"=. c #8d6a64",
"-. c #a06a5d",
";. c #a1715d",
":. c #a26a66",
">. c #a97c6c",
",. c #a67568",
"<. c #ac7b74",
"1. c #ab7674",
"2. c #812f81",
"3. c #853a82",
"4. c #823081",
"5. c #8a4284",
"6. c #8d4a84",
"7. c #8f5080",
"8. c #945689",
"9. c #965792",
"0. c #9a6389",
"q. c #9d6397",
"w. c #a2658e",
"e. c #a16a99",
"r. c #a5778f",
"t. c #a77799",
"y. c #ad78aa",
"u. c #a76daa",
"i. c #81812b",
"p. c #878738",
"a. c #888837",
"s. c #8d8d40",
"d. c #919145",
"f. c #919149",
"g. c #979753",
"h. c #9c9c5a",
"j. c #9b9b54",
"k. c #9f8671",
"l. c #9b856c",
"z. c #aa826b",
"x. c #ae8772",
"c. c #b1847a",
"v. c #b08c75",
"b. c #b3897f",
"n. c #b19374",
"m. c #b6997d",
"M. c #a99e77",
"N. c #a1a25b",
"B. c #a4a465",
"V. c #abab73",
"C. c #adad79",
"Z. c #b6a079",
"A. c #b2b278",
"S. c #ab878d",
"D. c #ac8396",
"F. c #b78c86",
"G. c #b69182",
"H. c #b99c83",
"J. c #bc9a8b",
"K. c #bb9592",
"L. c #b183ab",
"P. c #b38ca3",
"I. c #bd98b7",
"U. c #b791a9",
"Y. c #bba385",
"T. c #bca696",
"R. c #bbbb8c",
"E. c #b8b785",
"W. c #bebe94",
"Q. c #bfa5a7",
"!. c #c19c97",
"~. c #c0a88d",
"^. c #c3a896",
"/. c #c3b48f",
"(. c #c7b698",
"). c #c6aba5",
"_. c #c6aab7",
"`. c #ccb7a8",
"'. c #cdb8b5",
"]. c #d0bbab",
"[. c #d1bbb3",
"{. c #c29bc2",
"}. c #caa9c6",
"|. c #d7bfd0",
" X c #d2b8ca",
".X c #c2c28e",
"XX c #c8c294",
"oX c #cbc59c",
"OX c #ccca9b",
"+X c #c4c595",
"@X c #cccaa3",
"#X c #ccc8a7",
"$X c #d0cba5",
"%X c #d3cbab",
"&X c #d1c5aa",
"*X c #d3c3b3",
"=X c #d8c4ba",
"-X c #d8cbbb",
";X c #d5cab7",
":X c #d4d4ab",
">X c #d6dcaa",
",X c #d8dbad",
"<X c #d2d5a3",
"1X c #d8d4b3",
"2X c #dbd4bc",
"3X c #dbdbb4",
"4X c #dcdcbb",
"5X c #d4d4b5",
"6X c #dbe3ab",
"7X c #dce1b4",
"8X c #dee3bb",
"9X c #dee9b8",
"0X c #e0e4bd",
"qX c #e1e8bc",
"wX c #e0e7b5",
"eX c #d9c8c3",
"rX c #dbc8d4",
"tX c #ddd3c1",
"yX c #dddbc2",
"uX c #dedaca",
"iX c #e1cecd",
"pX c #e0dcc4",
"aX c #e2d8cb",
"sX c #e6dcd2",
"dX c #e5d8d7",
"fX c #e1cfe0",
"gX c #e2e2c3",
"hX c #e3e2cb",
"jX c #e3eac3",
"kX c #e6eacb",
"lX c #e8ebcc",
"zX c #e5e4d3",
"xX c #eaead3",
"cX c #eeebde",
"vX c #e9e5d8",
"bX c #eaf1ce",
"nX c #e8f2c7",
"mX c #ebf2d3",
"MX c #eef2da",
"NX c #edf8d4",
"BX c #effad8",
"VX c #f0f6d6",
"CX c #f0f3dd",
"ZX c #f2fbda",
"AX c #edece1",
"SX c #efe6e7",
"DX c #f0ebe5",
"FX c #f2f3e4",
"GX c #f4f4ea",
"HX c #f4fae3",
"JX c #f6fbea",
"KX c #f8fdec",
"LX c #f8fee4",
"PX c #fbfdf4",
"IX c #fefefe",
"UX c #f8f4f2",
/* pixels */
"> % % % ; % % ; % % ; % % ; % % % % % % % ; % % % % % % % % % ; % % % % ; % % % = = % % % % = % % % % % ; % % ; % % ; % % ; % / ",
"% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # ",
"% + + + + + + + + + + + + + + + + + + = % = = % % % @ + + + + + + + + + + + % % % $ = $ % + + + + + + + # + + + + + + # + + + % ",
"% + + + + + + + + + + + + # + + + + % rXUXSXDXcXcXaX6 . + + + + + + + + + 6 oX$X@XoXXXOXZ.# + + + + + + + + + + + + + + + + + % ",
"% + + + + + + + + + + + + + # + + + . F.IXIXIXIXPXPX,.. + + + + + + + + + %.qX3X6X,X<X>X&.+ + + + + + + + + + + + + + + + + + ; ",
"% + + + + + + + # + + + + + + + + + + ` UXPXaX[.aXPX;X@ + + + + + + + + $ (.0X(.m./.<XOX5 + + + + + + + + + + + + + + + + + + % ",
"% + + + + + + + + + + # + + + + + + + + [.IXK. ` FXFX_ + + + + + + + . [ 4X,Xw . >.wXM.+ + + + + + + + + + + + + # + + + + + ; ",
"; + + + + + + + + + + + + # + + + + + . :.IXSX- . [.IXG.. + + + + + + + v.nXH.. = XX6X] + + + + + + + + + + + + + + + + + + + % ",
"; + + + + + + + + + + + + + + + + + + + > SXIXO. *.PXaX; + + + + + + ; %XjX.. ..6X(.= + + + + # + + + + + + + + + + + + + # % ",
"% + + + + + + + # + + + + # + + + + + + + !.IX[.. ; zXJXO.. + + + + . O.kX#X= + m.9Xz.. + + + + + + + + + + + + + + + # + + + % ",
"% + + + + + + + + + + + + + + + + + + + + } IXGXr J.IX).+ + + + + + ^.bXx. w :X<Xr + + + + + + # + + + + + # + + + + + + ; ",
"; + + + + + + + + + + # + + + # + + + + + # eXIXc. } HXxXe . + + . r 8X8X( ;.9XY.# + + + + + + + + + + + + + + + + + + + + % ",
"% + + + + + + + + + + + + + + + + + + + + 1.IXiX$ # ;XKX<.. + + + >.mX(.+ $ (.9X$.. + + + + + + + + + + + + + + + + + + + + ; ",
"% + + + + + + + + + + + # + + + + + + + + @ q GXPX . ,.KX-X$ + + $ #XbX&. [ 7X$X: + + + + + + + # + + + + + + + + # + + # + % ",
"; + + + + + + + + + + + + + + + + + + + + + + ).IX^.. q vXMX{ . . .kX5X> . n.jXn.+ + + + + + + + + + + + + + + + + + + + + + ; ",
"% + # + + + + + + + + % > ; $ + + + + + + + . o.PXvX> . ^.KXJ.+ + J.BXH.. : %X8X[ . + + + + + . $ / { ._ : + + + + + + + + + % ",
"% + + + + + + + > ,.`.aXpXpX].x.( + + + + + + - sXPX:. ..HXyX; : yXlX] &.jX(.$ + + + + . ; <.-XxXVXVXkX1XH.[ + + + + + + + % ",
"; + + + + + # 1.vXIXKXxXhXpXlXBX0Xm.: + + + + F.IX[.+ % tXHXO.%.MX&X% + /.jX;.. + + + + ..sXIXJXaX].^.%XgXNX8Xn.- + + + + + % ",
"% + + + + % ).IXPX`.O.e ; 6 ] v.1XnXoX( + + + + ` GXFX` c.HX;XyXmX>. r 8X3Xw + + + . 1.PXPX].X.% @ + + e >.1XjX/.: + + + + % ",
"% + + + @ ^.IXcXo.. + # + + 5 m.qX$X( . + + + [.PXb. ` lXxXlXgXe z.nXY.+ + + . :.IXGX,.@ $ w ) ; + w #X8X/.% + + + % ",
"* + + . 1.IXDX` > c.].2X%XH.] . . ;.,X(.5 . + . :.PXaX% + `.MXxX^.+ = %XjX.. + _ PXPXO. ; c.-XlXlXyX~.[ ;.3X7X>.$ + + + % ",
"v 2 + / UXUX} .sXHXMXxXlXBXkXm.) ..OX6Xn.+ + . > vXLXX. &.MXmXO. ..jX#X; + + # [.IX<. r eXPXCXpX-XpXMXgXjX3X..+ + + + * g ",
"c l t w.IXDXe ,.PXFXG.w _ >.1XjX3XqX7X<X+X5 + + + !.PX^.. : pXyX- . Y.bXx.+ + . X.IXeX+ 0 sXPX].] % $ 5 ,.3X%X[ . + + * a k c ",
"c k k l {.IXdX6 . b.LX;Xq X . > ~.1XZ.;.( - $ + + . { HXvXq . T.J.. w 2XgX_ . + + '.IXX. `.IXJ.# . + + + . ( w . @ < d l l k c ",
"c k k f x }.IXeX3 X J.JX;X: . . = - + . + + + + + + % -XKX,. ` 6 ,.bX(.$ + + > UXdX+ } IX=X$ + + + @ + + . & 1 f l l l k k c ",
"v k k k p z rXIX}.f d _.LX(.- + + + + + + + + + + + . <.KX*X$ . + $ `.bX;. + X.IXK.. !.IXX.. + + + @ , 1 f l l k k l k k k c ",
"c k k k k f m rXPXI.u n [.ZXT.< & @ + + + + + + + + + e vXcX] . . ] kX3X6 + + . 1.IX*.@ sXsX% @ , 2 d f f p p p f p p p f f k c ",
"c k k k k k f ' dXKXP.u n ;XNXP.f f a 1 < , & @ @ + + + (.KXF.. + G.BXH.+ + + . K.IX| 4 KX_.f f l l l l 6.6.6.6.6.+.+.+.+.+.z z ",
"c k k k k k k k 3.vXLXt.y C 2XnXt.p l l l l k k f a a o #.HXuX4 h 2XkX@.o a a t {.IX4.Z PXI.p k k k k z yXjXjX9XqX3X6X>X<XOXB v ",
"c k k k l k k k p 6.cXBX9.y 5.4XqX0.f k k l k l l k l l c aXMX9.9.bX;Xc p l l f {.IX3.m PX_.p l k k f z yX2X).).).T.T.T.XXOXn z ",
"K g l l k k k k k p 9.MXlX6.y 6.0X7X7.p k k k k k k k k f P.ZX=XtXbXt.f k k p u L.IX9.l SXrXx p k k k z yXQ.p f f p k l T.oXc b ",
"R H 8 g l l k x k k f e.BXgX' y 0.wX,X' p k k k k k k k p 3.xXlXlXhX' f k l k u q.IXy.u XJXC f l k f z yX'.C V A C x z oXR.9 T ",
"U I I H 8 j l p f k l f D.NX-XV y r.9X@XV k k k k k k k k x [.lXlX'.k k k k k f 2.IXrXu e.IXI.u f k k z yXkX4X3X3X`.x ' >XN.I E ",
"U P P P F D G M 2.x p p p U.nX&Xm p S.6X(.B p l k k k k k p e.mXlX0.p l k k k k x fXIXC x dXJX9.u p f z '.*X;X3XqXk.O B.>Xa.H R ",
"R P P U p.B.+XkXDXU.N i u f U.nX).b k K.6XT.b p k k k l l f Z hXpXm k k k k k k p y.IXI.y 9.KXFXq.x p p x A ).jX+XY Q <X+XU P U ",
"U P D C.IXIXIXGXGXKXyXV.=.+.P.0XnXt.u B <X<XA f k l k k l p f _.Q.p k k k l k k p m SXPX5.y y.JXLX XP.t.U.2XlXOXQ D A.3Xj.P P U ",
"U P P ~ AXIXyXp.a.5XGXKXMXlXmXkXE.K h S.6XS.k l l l k l l k k ' C f k k l l l l p p u.IXdXB o l.gXHXLXLXVXgXE.E S j.3X.XU P P U ",
"E P P S g.IXFXg.S P g.+X:X@XE.a.D F h.,XOX! 8 9 M h j j g f f x f f x x g g j h M 7 8 #XIXyX~ S U g.A.A.B.i.D P j.3X,Xa.H P P U ",
"yXf.P P D V.IXPXR.E S D P P D S E A.8X:Xa.P I I I I P Y Y H H J J J H H H P I P I I F E 2XIXvXB.Y S S S S P ~ E.0X3Xf.D P P P f.",
"IXIX5Xf.P D B.GXIXhXE.d.i.i.d.C.:XgX,Xa.P P P P P P P P I P P I P P P I P P I P P P I F T @XPXKXgXE.B.j.B.+X4XlX:Xd.P P P p.#XIX",
"IXIXIXIXyXh.T p.5XGXPXCXkXhXlXxXgX.X^ P P P P P P P P P P P P P P P P P P P P P P P P P D Y h.yXFXJXGXCXFXlX4XA.W H Y j.2XIXIXIX",
"IXIXIXIXIXIXAXE.p.d.R.5XgX3X@XC.a.I P P P P P P P P P P P P P P P P P P P P P P P P P P P P D U d.A.R.W.A.h.~ D ^ A.zXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXuXC.p.E U Y P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P H D D P Y ^ V.yXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXzXW.h.~ Y P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P W g.R.zXPXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXUXzX@XC.f.~ U P P P P P P P P P P P P P P P P P P P P P Y ~ d.V.+XhXPXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXAXyX#XW.C.B.h.f.s.p.p.a.a.p.s.f.j.B.C.R.#XyXAXPXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX"
};

View File

@ -0,0 +1,25 @@
/* XPM */
static char *help_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 4 1",
" c None",
". c Black",
"X c Blue",
"o c #000080",
/* pixels */
" ",
" ...... ",
" .XXXXX.. ",
" .XX...oX.. ",
" .X.. .X.. ",
" .X.. .XX.. ",
" .. .XX.. ",
" .XX.. ",
" .X.. ",
" .X.. ",
" .o.. ",
" .. ",
" .XX.. ",
" .XX.. ",
" ... "
};

View File

@ -0,0 +1,24 @@
/* XPM */
static char *new_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 3 1",
" c None",
". c Black",
"X c Gray100",
/* pixels */
" ",
" ........ ",
" .XXXXXX.. ",
" .XXXXXX.X. ",
" .XXXXXX.... ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" ........... ",
" "
};

View File

@ -0,0 +1,25 @@
/* XPM */
static char *save_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 4 1",
" c None",
". c Black",
"X c #808000",
"o c #808080",
/* pixels */
" ",
" .............. ",
" .X. . . ",
" .X. ... ",
" .X. .X. ",
" .X. .X. ",
" .X. .X. ",
" .X. .X. ",
" .XX........oX. ",
" .XXXXXXXXXXXX. ",
" .XX.........X. ",
" .XX...... .X. ",
" .XX...... .X. ",
" .XX...... .X. ",
" ............. "
};

View File

@ -0,0 +1,18 @@
#
# File: makefile.b32
# Author: Julian Smart Chris Elliott
# Created: 1999/2002
# Updated:
# Copyright:
#
# Makefile : Builds sample for 32-bit BC++
EXTRALIBS=$(WXDIR)\lib\dcsvg.lib
WXDIR = $(WXWIN)
TARGET=svgtest
OBJECTS = $(TARGET).obj
!include $(WXDIR)\src\makeprog.b32

View File

@ -0,0 +1,15 @@
# File: makefile.g95 for svgtest demo
# Author: Julian Smart
# Created: 2001-06-12
# Updated:
WXDIR = ../../..
TARGET = svgtest
OBJECTS = $(TARGET).o
EXTRAINC = -I$(WXDIR)/contrib/include
RCEXTRAINC = --include-dir $(WXDIR)/contrib/include
EXTRALIBS = -ldcsvg
include $(WXDIR)/src/makeprog.g95

View File

@ -0,0 +1,14 @@
# File: makefile.vc for svgtest sample
# Author: Julian Smart
# Created: 2001-06-12
# Updated:
WXDIR = $(WXWIN)
PROGRAM = svgtest
OBJECTS = $(PROGRAM).obj
EXTRALIBS = $(WXDIR)\lib\dcsvg$(LIBEXT).lib
EXTRAINC = -I$(WXDIR)\contrib\include
!include $(WXDIR)\src\makeprog.vc

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

View File

@ -0,0 +1,44 @@
/* XPM */
static char *mondrian_xpm[] = {
/* columns rows colors chars-per-pixel */
"32 32 6 1",
" c Black",
". c Blue",
"X c #00bf00",
"o c Red",
"O c Yellow",
"+ c Gray100",
/* pixels */
" ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" "
};

View File

@ -0,0 +1,602 @@
// biol75@york.ac.uk (Chris Elliott) March 2000
#ifdef __BIDE__
#define _NO_VCL
#include "condefs.h"
USERC("svg.rc");
//---------------------------------------------------------------------------
#define WinMain WinMain
#endif
/////////////////////////////////////////////////////////////////////////////
// Name: svgtest.cpp
// Purpose: SVG sample
// Author: Chris Elliott
// Modified by:
// RCS-ID: $Id$
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ===========================================================================
// declarations
// ===========================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#include "wx/mdi.h"
#endif
#include <wx/toolbar.h>
#include <wx/svg/dcsvg.h>
#include "bitmaps/new.xpm"
#include "bitmaps/save.xpm"
#include "bitmaps/help.xpm"
#include "SVGlogo24.xpm"
class MyChild;
// Define a new application
class MyApp : public wxApp
{
public:
bool OnInit();
};
// Define a new frame
class MyFrame : public wxMDIParentFrame
{
public:
int nWinCreated;
wxList m_children;
MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
const wxPoint& pos, const wxSize& size, const long style);
void InitToolBar(wxToolBar* toolBar);
void OnSize(wxSizeEvent& event);
void OnAbout(wxCommandEvent& event);
void OnNewWindow(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
void FileSavePicture (wxCommandEvent & WXUNUSED(event) ) ;
DECLARE_EVENT_TABLE()
};
class MyCanvas : public wxScrolledWindow
{
public:
int m_index ;
MyChild * m_child ;
MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size);
virtual void OnDraw(wxDC& dc);
DECLARE_EVENT_TABLE()
};
class MyChild: public wxMDIChildFrame
{
public:
MyCanvas *m_canvas;
MyFrame *m_frame ;
//////////////////// Methods
MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, const long style);
~MyChild();
void OnActivate(wxActivateEvent& event);
void OnQuit(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
bool OnSave(wxString filename) ;
DECLARE_EVENT_TABLE()
};
// menu items ids
enum
{
MDI_QUIT = 100,
MDI_NEW_WINDOW,
MDI_SAVE,
MDI_REFRESH,
MDI_CHILD_QUIT,
MDI_ABOUT
};
IMPLEMENT_APP(MyApp)
// ---------------------------------------------------------------------------
// global variables
// ---------------------------------------------------------------------------
MyFrame *frame = (MyFrame *) NULL;
// ---------------------------------------------------------------------------
// event tables
// ---------------------------------------------------------------------------
BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
EVT_MENU(MDI_ABOUT, MyFrame::OnAbout)
EVT_MENU(MDI_NEW_WINDOW, MyFrame::OnNewWindow)
EVT_MENU(MDI_QUIT, MyFrame::OnQuit)
EVT_MENU (MDI_SAVE, MyFrame::FileSavePicture)
EVT_CLOSE(MyFrame::OnClose)
EVT_SIZE(MyFrame::OnSize)
END_EVENT_TABLE()
// ===========================================================================
// implementation
// ===========================================================================
// ---------------------------------------------------------------------------
// MyApp
// ---------------------------------------------------------------------------
// Initialise this in OnInit, not statically
bool MyApp::OnInit()
{
// Create the main frame window
frame = new MyFrame((wxFrame *)NULL, -1, wxT("SVG Demo"),
wxPoint(-1, -1), wxSize(500, 400),
wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL);
// Make a menubar
wxMenu *file_menu = new wxMenu;
file_menu->Append(MDI_NEW_WINDOW, wxT("&New test\tCtrl+N"));
file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
wxMenu *help_menu = new wxMenu;
help_menu->Append(MDI_ABOUT, wxT("&About"));
wxMenuBar *menu_bar = new wxMenuBar;
menu_bar->Append(file_menu, wxT("&File"));
menu_bar->Append(help_menu, wxT("&Help"));
// Associate the menu bar with the frame
frame->SetMenuBar(menu_bar);
frame->CreateStatusBar();
frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}
// ---------------------------------------------------------------------------
// MyFrame
// ---------------------------------------------------------------------------
// Define my frame constructor
MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
const wxPoint& pos, const wxSize& size, const long style)
: wxMDIParentFrame(parent, id, title, pos, size, style)
{
nWinCreated = 0 ;
// Give it an icon
SetIcon(wxICON(mondrian));
CreateToolBar(wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL);
InitToolBar(GetToolBar());
}
void MyFrame::OnClose(wxCloseEvent& event)
{
if ( !event.CanVeto() )
{
event.Skip();
return ;
}
if ( m_children.Number () < 1 )
{
event.Skip();
return ;
}
// now try the children
wxNode * pNode = m_children.GetFirst ();
wxNode * pNext ;
MyChild * pChild ;
while ( pNode )
{
pNext = pNode -> GetNext ();
pChild = (MyChild*) pNode -> Data ();
if (pChild -> Close ())
{
delete pNode ;
}
else
{
event.Veto();
return;
}
pNode = pNext ;
}
event.Skip();
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close();
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
{
(void)wxMessageBox(wxT("wxWindows 2.0 SVG 1.0 Test\n"
"Author: Chris Elliott (c) 2002\n"
"Usage: svg.exe \nClick File | New to show tests\n\n"), wxT("About SVG Test"));
}
void MyFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event) )
{
// Make another frame, containing a canvas
MyChild *subframe ;
m_children.Append (new MyChild(frame, wxT("SVG Frame"),
wxPoint(-1, -1), wxSize(-1, -1),
wxDEFAULT_FRAME_STYLE ) ) ;
subframe = (MyChild *) m_children.GetLast() -> Data ();
wxString title;
title.Printf(wxT("SVG Test Window %d"), nWinCreated );
// counts number of children previously, even if now closed
nWinCreated ++ ;
// Give it a title and icon
subframe->SetTitle(title);
subframe->SetIcon(wxICON(mondrian));
// Make a menubar
wxMenu *file_menu = new wxMenu;
file_menu->Append(MDI_NEW_WINDOW, wxT("&Another test\tCtrl+N"));
file_menu->Append(MDI_SAVE, wxT("&Save\tCtrl+S"), wxT("Save in SVG format"));
file_menu->Append(MDI_CHILD_QUIT, wxT("&Close child\tCtrl+F4"));
file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
wxMenu *help_menu = new wxMenu;
help_menu->Append(MDI_ABOUT, wxT("&About"));
wxMenuBar *menu_bar = new wxMenuBar;
menu_bar->Append(file_menu, wxT("&File"));
menu_bar->Append(help_menu, wxT("&Help"));
// Associate the menu bar with the frame
subframe->SetMenuBar(menu_bar);
subframe->Show(TRUE);
}
void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event))
{
int w, h;
GetClientSize(&w, &h);
GetClientWindow()->SetSize(0, 0, w, h);
}
void MyFrame::InitToolBar(wxToolBar* toolBar)
{
const int maxBitmaps = 3 ;
wxBitmap* bitmaps[maxBitmaps];
bitmaps[0] = new wxBitmap( new_xpm );
bitmaps[1] = new wxBitmap( save_xpm );
bitmaps[2] = new wxBitmap( help_xpm );
int width = 16;
int currentX = 5;
toolBar->AddTool( MDI_NEW_WINDOW, *(bitmaps[0]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, wxT("New SVG test window"));
currentX += width + 5;
toolBar->AddTool( MDI_SAVE, *bitmaps[1], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, wxT("Save test in SVG format"));
currentX += width + 5;
toolBar->AddSeparator();
toolBar->AddTool(MDI_ABOUT, *bitmaps[2], wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, wxT("Help"));
toolBar->Realize();
int i;
for (i = 0; i < maxBitmaps; i++)
delete bitmaps[i];
}
void MyFrame::FileSavePicture (wxCommandEvent & WXUNUSED(event) )
{
MyChild * pChild = (MyChild *)GetActiveChild ();
if (pChild == NULL)
{
return ;
}
wxFileDialog dialog(this, wxT("Save Picture as"), wxEmptyString, pChild->GetTitle(),
wxT("SVG vector picture files (*.svg)|*.svg"),
wxSAVE|wxOVERWRITE_PROMPT);
if (dialog.ShowModal() == wxID_OK)
{
if (!pChild -> OnSave ( dialog.GetPath() ))
{
return ;
}
}
return ;
}
// Note that MDI_NEW_WINDOW and MDI_ABOUT commands get passed
// to the parent window for processing, so no need to
// duplicate event handlers here.
BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame)
EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
EVT_CLOSE(MyChild::OnClose)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
END_EVENT_TABLE()
// ---------------------------------------------------------------------------
// MyCanvas
// ---------------------------------------------------------------------------
// Define a constructor for my canvas
MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
: wxScrolledWindow(parent, -1, pos, size,
wxSUNKEN_BORDER|wxVSCROLL|wxHSCROLL)
{
m_child = (MyChild *) parent ;
SetBackgroundColour(wxColour("WHITE"));
m_index = m_child->m_frame->nWinCreated % 7 ;
}
// Define the repainting behaviour
void MyCanvas::OnDraw(wxDC& dc)
{
// vars to use ...
wxString s ;
wxPen wP ;
wxBrush wB ;
wxPoint points[6];
wxColour wC;
wxFont wF ;
dc.SetFont(*wxSWISS_FONT);
dc.SetPen(*wxGREEN_PEN);
switch (m_index)
{
default:
case 0:
// draw lines to make a cross
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
// draw point colored line and spline
wP = *wxCYAN_PEN ;
wP.SetWidth(3);
dc.SetPen(wP);
dc.DrawPoint (25,15) ;
dc.DrawLine(50, 30, 200, 30);
dc.DrawSpline(50, 200, 50, 100, 200, 10);
s = wxT("Green Cross, Cyan Line and spline");
break ;
case 1:
// draw standard shapes
dc.SetBrush(*wxCYAN_BRUSH);
dc.SetPen(*wxRED_PEN);
dc.DrawRectangle(10, 10, 100, 70);
wB = wxBrush ("DARK ORCHID", wxTRANSPARENT);
dc.SetBrush (wB);
dc.DrawRoundedRectangle(50, 50, 100, 70, 20);
dc.SetBrush (wxBrush("GOLDENROD", wxSOLID) );
dc.DrawEllipse(100, 100, 100, 50);
points[0].x = 100; points[0].y = 200;
points[1].x = 70; points[1].y = 260;
points[2].x = 160; points[2].y = 230;
points[3].x = 40; points[3].y = 230;
points[4].x = 130; points[4].y = 260;
points[5].x = 100; points[5].y = 200;
dc.DrawPolygon(5, points);
dc.DrawLines (6, points, 160);
s = wxT("Blue rectangle, red edge, clear rounded rectangle, gold ellipse, gold and clear stars");
break ;
case 2:
// draw text in Arial or similar font
dc.DrawLine(50,25,50,35);
dc.DrawLine(45,30,55,30);
dc.DrawText(wxT("This is a Swiss-style string"), 50, 30);
wC = dc.GetTextForeground() ;
dc.SetTextForeground ("FIREBRICK");
// no effect in msw ??
dc.SetTextBackground ("WHEAT");
dc.DrawText(wxT("This is a Red string"), 50, 200);
dc.DrawRotatedText(wxT("This is a 45 deg string"), 50, 200, 45);
dc.DrawRotatedText(wxT("This is a 90 deg string"), 50, 200, 90);
wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, FALSE, wxT("Times New Roman"));
dc.SetFont(wF);
dc.SetTextForeground (wC) ;
dc.DrawText(wxT("This is a Times-style string"), 50, 60);
s = wxT("Swiss, Times text; red text, rotated and colored orange");
break ;
case 3 :
// four arcs start and end points, center
dc.SetBrush(*wxGREEN_BRUSH);
dc.DrawArc ( 200,300, 370,230, 300.0,300.0 );
dc.SetBrush(*wxBLUE_BRUSH);
dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270.0,270.0 );
dc.SetDeviceOrigin(-10,-10);
dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270.0,270.0 );
dc.SetDeviceOrigin(0,0);
wP.SetColour ("CADET BLUE");
dc.SetPen(wP);
dc.DrawArc ( 75,125, 110, 40, 75.0, 75.0 );
wP.SetColour ("SALMON");
dc.SetPen(wP);
dc.SetBrush(*wxRED_BRUSH);
//top left corner, width and height, start and end angle
// 315 same center and x-radius as last pie-arc, half Y radius
dc.DrawEllipticArc(25,50,100,50,180.0,45.0) ;
wP = *wxCYAN_PEN ;
wP.SetWidth(3);
dc.SetPen(wP);
//wxTRANSPARENT));
dc.SetBrush (wxBrush ("SALMON",wxSOLID)) ;
dc.DrawEllipticArc(300, 0,200,100, 0.0,145.0) ;
//same end point
dc.DrawEllipticArc(300, 50,200,100,90.0,145.0) ;
dc.DrawEllipticArc(300,100,200,100,90.0,345.0) ;
s = wxT("This is an arc test page");
break ;
case 4:
dc.DrawCheckMark ( 30,30,25,25);
dc.SetBrush (wxBrush ("SALMON",wxTRANSPARENT));
dc.DrawCheckMark ( 80,50,75,75);
dc.DrawRectangle ( 80,50,75,75);
s = wxT("Two check marks");
break ;
case 5:
wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, FALSE, wxT("Times New Roman"));
dc.SetFont(wF);
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
dc.DrawText(wxT("This is an 18pt string"), 50, 60);
// rescale and draw in blue
wP = *wxCYAN_PEN ;
dc.SetPen(wP);
dc.SetUserScale (2.0,0.5);
dc.SetDeviceOrigin(200,0);
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
dc.DrawText(wxT("This is an 18pt string 2 x 0.5 UserScaled"), 50, 60);
dc.SetUserScale (2.0,2.0);
dc.SetDeviceOrigin(200,200);
dc.DrawText(wxT("This is an 18pt string 2 x 2 UserScaled"), 50, 60);
wP = *wxRED_PEN ;
dc.SetPen(wP);
dc.SetUserScale (1.0,1.0);
dc.SetDeviceOrigin(0,10);
dc.SetMapMode (wxMM_METRIC) ; //svg ignores this
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
dc.DrawText(wxT("This is an 18pt string in MapMode"), 50, 60);
s = wxT("Scaling test page");
break ;
case 6:
dc.DrawIcon( wxICON(mondrian), 10, 10 );
dc.DrawBitmap ( wxBITMAP (svgbitmap), 50,15);
s = wxT("Icon and Bitmap ");
break ;
}
m_child->SetStatusText(s);
}
// ---------------------------------------------------------------------------
// MyChild
// ---------------------------------------------------------------------------
MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title,
const wxPoint& pos, const wxSize& size,
const long style)
: wxMDIChildFrame(parent, -1, title, pos, size, style)
{
m_frame = (MyFrame *) parent ;
CreateStatusBar();
SetStatusText(title);
int w, h ;
GetClientSize ( &w, &h );
m_canvas = new MyCanvas(this, wxPoint(0, 0), wxSize (w,h) );
// Give it scrollbars
m_canvas->SetScrollbars(20, 20, 50, 50);
}
MyChild::~MyChild()
{
m_frame->m_children.DeleteObject(this);
}
void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}
bool MyChild::OnSave(wxString filename)
{
wxSVGFileDC svgDC (filename, 600, 650) ;
m_canvas->OnDraw (svgDC);
return svgDC.Ok();
}
void MyChild::OnActivate(wxActivateEvent& event)
{
if ( event.GetActive() && m_canvas )
m_canvas->SetFocus();
}
void MyChild::OnClose(wxCloseEvent& event)
{
event.Skip();
}

View File

@ -0,0 +1,10 @@
# $Id$
CONTRIB_SAMPLES=canvas fl gizmos mmedia net ogl plot stc svg xrc #applet
all:
@for d in $(CONTRIB_SAMPLES); do (cd $$d && $(MAKE)); done
clean:
@for d in $(CONTRIB_SAMPLES); do (cd $$d && $(MAKE) clean); done

856
contrib/src/svg/dcsvg.cpp Normal file
View File

@ -0,0 +1,856 @@
/////////////////////////////////////////////////////////////////////////////
// Name: svg.cpp
// Purpose: SVG sample
// Author: Chris Elliott
// Modified by:
// RCS-ID: $Id$
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/svg/dcsvg.h"
#include <math.h>
#include "wx/image.h"
#define wxSVG_DEBUG FALSE
// or TRUE to see the calls being executed
#define newline wxString(wxT("\n"))
#define space wxString(wxT(" "))
#define semicolon wxString(wxT(";"))
#define wx_round(a) (int)((a)+.5)
#ifdef __BORLANDC__
#pragma warn -rch
#pragma warn -ccc
#endif
static inline double DegToRad(double deg) { return (deg * 3.14) / 180.0; } ;
wxString wxColStr ( wxColour c )
{
unsigned char r, g, b ;
r = c.Red ();
g = c.Green ();
b = c. Blue ();
// possible Unicode bug here
wxString s = wxDecToHex(r) + wxDecToHex(g) + wxDecToHex(b) ;
return s ;
}
wxString wxBrushString ( wxColour c, int style )
{
wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space ;
switch ( style )
{
case wxSOLID :
s = s + wxT("fill-opacity:1.0; ");
break ;
case wxTRANSPARENT:
s = s + wxT("fill-opacity:0.0; ");
break ;
default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::Requested Brush Style not available")) ;
}
s = s + newline ;
return s ;
}
void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
{
//set up things first wxDCBase does all this?
m_width = Width ;
m_height = Height ;
m_clipping = FALSE;
m_OK = TRUE;
m_mm_to_pix_x = dpi/25.4;
m_mm_to_pix_y = dpi/25.4;
m_signX = m_signY = 1;
m_userScaleX = m_userScaleY =
m_deviceOriginX = m_deviceOriginY = 0;
m_OriginX = m_OriginY = 0;
m_logicalOriginX = m_logicalOriginY = 0;
m_logicalScaleX = m_logicalScaleY = 0 ;
m_scaleX = m_scaleY = 1.0 ;
m_logicalFunction = wxCOPY;
m_backgroundMode = wxTRANSPARENT;
m_mappingMode = wxMM_TEXT;
m_backgroundBrush = *wxTRANSPARENT_BRUSH;
m_textForegroundColour = *wxBLACK;
m_textBackgroundColour = *wxWHITE;
m_colour = wxColourDisplay();
m_pen = *wxBLACK_PEN;
m_font = *wxNORMAL_FONT;
m_brush = *wxWHITE_BRUSH;
m_graphics_changed = TRUE ;
////////////////////code here
m_outfile = new wxFileOutputStream(f) ;
m_OK = m_outfile->Ok ();
if (m_OK)
{
m_filename = f ;
m_sub_images = 0 ;
wxString s ;
s = wxT("<?xml version=\"1.0\" standalone=\"no\"?>") ; s = s + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\"> ")+ newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s.Printf ( wxT("<svg width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"> \n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height );
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("<title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
}
// constructors
wxSVGFileDC::wxSVGFileDC (wxString f)
{
// quarter 640x480 screen display at 72 dpi
Init (f,320,240,72.0);
};
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height)
{
Init (f,Width,Height,72.0);
};
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi)
{
Init (f,Width,Height,dpi);
};
wxSVGFileDC::~wxSVGFileDC()
{
wxString s = wxT("</g> \n</svg> \n") ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
delete m_outfile ;
}
//////////////////////////////////////////////////////////////////////////////////////////
void wxSVGFileDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
{
if (m_graphics_changed) NewGraphics ();
wxString s ;
s.Printf ( wxT("<path d=\"M%d %d L%d %d\" /> \n"), x1,y1,x2,y2 );
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed")) ;
CalcBoundingBox(x1, y1) ;
CalcBoundingBox(x2, y2) ;
return;
};
void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset )
{
for ( int i = 1; i < n ; i++ )
{
DoDrawLine ( points [i-1].x + xoffset, points [i-1].y + yoffset,
points [ i ].x + xoffset, points [ i ].y + yoffset ) ;
}
}
void wxSVGFileDC::DoDrawPoint (wxCoord x1, wxCoord y1)
{
wxString s;
if (m_graphics_changed) NewGraphics ();
s = wxT("<g style = \"stroke-linecap:round;\" > ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
DrawLine ( x1,y1,x1,y1 );
s = wxT("</g>");
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
}
void wxSVGFileDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height)
{
wxDCBase::DoDrawCheckMark (x1,y1,width,height) ;
}
void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1)
{
DoDrawRotatedText(text, x1,y1,0.0);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawText Call executed")) ;
}
void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle)
{
//known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW
if (m_graphics_changed) NewGraphics ();
wxString s, sTmp;
// calculate bounding box
wxCoord w, h, desc ;
DoGetTextExtent(sText, &w, &h, &desc);
double rad = DegToRad(angle);
// wxT("upper left") and wxT("upper right")
CalcBoundingBox(x, y);
CalcBoundingBox(x + w*cos(rad), y - h*sin(rad));
// wxT("bottom left") and wxT("bottom right")
x += (wxCoord)(h*sin(rad));
y += (wxCoord)(h*cos(rad));
CalcBoundingBox(x, y);
CalcBoundingBox(x + h*sin(rad), y + h*cos(rad));
if (m_backgroundMode == wxSOLID)
{
// draw background first
// just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ;
sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x,y+desc-h, w, h );
s = sTmp + wxT("style=\"fill:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
s = s + wxT("stroke-width:1; stroke:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
sTmp.Printf ( wxT("\" transform=\"rotate( %.2g %d %d ) \">"), -angle, x,y ) ;
s = s + sTmp + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
}
//now do the text itself
s.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x,y );
sTmp = m_font.GetFaceName () ;
if (sTmp.Len () > 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; ");
else s = s + wxT("style=\" ") ;
wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") };
s = s + wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space;
wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") };
s = s + wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space;
sTmp.Printf (wxT("font-size:%dpt; fill:#"), m_font.GetPointSize () );
s = s + sTmp ;
s = s + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ;
sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >"), -angle, x,y ) ;
s = s + sTmp + sText + wxT("</text> ") + newline ;
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ;
}
void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
DoDrawRoundedRectangle(x, y, width, height, 0) ;
}
void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
{
if (m_graphics_changed) NewGraphics ();
wxString s ;
s.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "),
x, y, width, height, radius );
s = s + wxT(" /> ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ;
CalcBoundingBox(x, y) ;
CalcBoundingBox(x + width, y + height) ;
}
void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle)
{
if (m_graphics_changed) NewGraphics ();
wxString s, sTmp ;
s = wxT("<polygon style=\"") ;
if ( fillStyle == wxODDEVEN_RULE )
s = s + wxT("fill-rule:evenodd; ");
else
s = s + wxT("fill-rule:nonzero; ");
s = s + wxT("\" \npoints=\"") ;
for (int i = 0; i < n; i++)
{
sTmp.Printf ( wxT("%d,%d"), points [i].x+xoffset, points[i].y+yoffset );
s = s + sTmp + newline ;
CalcBoundingBox ( points [i].x+xoffset, points[i].y+yoffset);
}
s = s + wxT("\" /> ") ;
s = s + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ;
}
void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
if (m_graphics_changed) NewGraphics ();
int rh = height /2 ;
int rw = width /2 ;
wxString s;
s.Printf ( wxT("<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" "), x+rw,y+rh, rw, rh );
s = s + wxT(" /> ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ;
CalcBoundingBox(x, y) ;
CalcBoundingBox(x + width, y + height) ;
}
void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc)
{
/* Draws an arc of a circle, centred on (xc, yc), with starting point
(x1, y1) and ending at (x2, y2). The current pen is used for the outline
and the current brush for filling the shape.
The arc is drawn in an anticlockwise direction from the start point to
the end point.
Might be better described as Pie drawing */
if (m_graphics_changed) NewGraphics ();
wxString s ;
// we need the radius of the circle which has two estimates
double r1 = sqrt ( double( (x1-xc)*(x1-xc) ) + double( (y1-yc)*(y1-yc) ) );
double r2 = sqrt ( double( (x2-xc)*(x2-xc) ) + double( (y2-yc)*(y2-yc) ) );
wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ;
if ( fabs ( r2-r1 ) > 3 ) //pixels
{
s = wxT("<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n") ;
m_outfile->Write (s.c_str(), s.Len() ) ;
}
double theta1 = atan2(yc-y1,x1-xc);
if ( theta1 < 0 ) theta1 = theta1 + 3.14 * 2;
double theta2 = atan2(yc-y2, x2-xc);
if ( theta2 < 0 ) theta2 = theta2 + 3.14 * 2;
if ( theta2 < theta1 ) theta2 = theta2 + 3.14 *2 ;
int fArc ; // flag for large or small arc 0 means less than 180 degrees
if ( fabs((theta2 - theta1) > 3.14 )) fArc = 1; else fArc = 0 ;
int fSweep = 0 ; // flag for sweep always 0
s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "),
x1,y1, r1, r2, fArc, fSweep, x2, y2, xc, yc );
// the z means close the path and fill
s = s + wxT(" \" /> ") + newline ;
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed")) ;
}
void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
{
/*
Draws an arc of an ellipse. The current pen is used for drawing the arc
and the current brush is used for drawing the pie. This function is
currently only available for X window and PostScript device contexts.
x and y specify the x and y coordinates of the upper-left corner of the
rectangle that contains the ellipse.
width and height specify the width and height of the rectangle that
contains the ellipse.
start and end specify the start and end of the arc relative to the
three-o'clock position from the center of the rectangle. Angles are
specified in degrees (360 is a complete circle). Positive values mean
counter-clockwise motion. If start is equal to end, a complete ellipse
will be drawn. */
//known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW
if (m_graphics_changed) NewGraphics ();
wxString s ;
//radius
double rx = w / 2 ;
double ry = h / 2 ;
// center
double xc = x + rx ;
double yc = y + ry ;
double xs, ys, xe, ye ;
xs = xc + rx * cos (DegToRad(sa)) ;
xe = xc + rx * cos (DegToRad(ea)) ;
ys = yc - ry * sin (DegToRad(sa)) ;
ye = yc - ry * sin (DegToRad(ea)) ;
///now same as circle arc...
double theta1 = atan2(ys-yc, xs-xc);
double theta2 = atan2(ye-yc, xe-xc);
int fArc ; // flag for large or small arc 0 means less than 180 degrees
if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ;
int fSweep ;
if ( fabs( (theta2 - theta1) > 3.14)) fSweep = 1; else fSweep = 0 ;
s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "),
int(xs), int(ys), int(rx), int(ry),
fArc, fSweep, int(xe), int(ye), int(xc), int(yc) );
s = s + wxT(" \" /> ") + newline ;
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ;
}
void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , wxFont *font) const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
if ( font != NULL ) sDC.SetFont ( *font );
sDC.GetTextExtent(string, w, h, descent, externalLeading );
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetTextExtent Call executed")) ;
}
wxCoord wxSVGFileDC::GetCharHeight() const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharHeight Call executing")) ;
return ( sDC.GetCharHeight() );
}
wxCoord wxSVGFileDC::GetCharWidth() const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing")) ;
return ( sDC.GetCharWidth() ) ;
}
/// Set Functions /////////////////////////////////////////////////////////////////
void wxSVGFileDC::SetBackground( const wxBrush &brush )
{
m_backgroundBrush = brush;
return;
}
void wxSVGFileDC::SetBackgroundMode( int mode )
{
m_backgroundMode = mode;
return;
}
void wxSVGFileDC::SetBrush(const wxBrush& brush)
{
m_brush = brush ;
m_graphics_changed = TRUE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed")) ;
}
void wxSVGFileDC::SetPen(const wxPen& pen)
{
// width, color, ends, joins : currently implemented
// dashes, stipple : not implemented
m_pen = pen ;
m_graphics_changed = TRUE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ;
}
void wxSVGFileDC::NewGraphics ()
{
int w = m_pen.GetWidth ();
wxColour c = m_pen.GetColour () ;
wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn;
sBrush = wxT("</g>\n<g style=\"") + wxBrushString ( m_brush.GetColour (), m_brush.GetStyle () )
+ wxT(" stroke:#") + wxColStr (c) + wxT("; ") ;
switch ( m_pen.GetCap () )
{
case wxCAP_PROJECTING :
sPenCap = wxT("stroke-linecap:square; ") ;
break ;
case wxCAP_BUTT :
sPenCap = wxT("stroke-linecap:butt; ") ;
break ;
case wxCAP_ROUND :
default :
sPenCap = wxT("stroke-linecap:round; ") ;
};
switch ( m_pen.GetJoin () )
{
case wxJOIN_BEVEL :
sPenJoin = wxT("stroke-linejoin:bevel; ") ;
break ;
case wxJOIN_MITER :
sPenJoin = wxT("stroke-linejoin:miter; ") ;
break ;
case wxJOIN_ROUND :
default :
sPenJoin = wxT("stroke-linejoin:round; ") ;
};
switch ( m_pen.GetStyle () )
{
case wxSOLID :
sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ;
break ;
case wxTRANSPARENT :
sPenStyle = wxT("stroke-opacity:0.0; stroke-opacity:0.0; ") ;
break ;
default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ;
sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ;
}
sLast.Printf ( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
w, m_OriginX, m_OriginY, m_scaleX, m_scaleY );
s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
m_graphics_changed = FALSE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed")) ;
}
void wxSVGFileDC::SetFont(const wxFont& font)
{
m_font = font ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed")) ;
}
void wxSVGFileDC::ComputeScaleAndOrigin()
{
m_scaleX = m_logicalScaleX * m_userScaleX;
m_scaleY = m_logicalScaleY * m_userScaleY;
m_OriginX = m_logicalOriginX * m_logicalScaleX + m_deviceOriginX ;
m_OriginY = m_logicalOriginY * m_logicalScaleY + m_deviceOriginY ;
m_graphics_changed = TRUE;
}
int wxSVGFileDC::GetMapMode()
{
return m_mappingMode ;
}
void wxSVGFileDC::SetMapMode( int mode )
{
switch (mode)
{
case wxMM_TWIPS:
SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
break;
case wxMM_POINTS:
SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
break;
case wxMM_METRIC:
SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
break;
case wxMM_LOMETRIC:
SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
break;
default:
case wxMM_TEXT:
SetLogicalScale( 1.0, 1.0 );
break;
}
m_mappingMode = mode;
/* we don't do this mega optimisation
if (mode != wxMM_TEXT)
{
m_needComputeScaleX = TRUE;
m_needComputeScaleY = TRUE;
}
*/
}
void wxSVGFileDC::GetUserScale(double *x, double *y) const
{
*x = m_userScaleX ;
*y = m_userScaleY ;
}
void wxSVGFileDC::SetUserScale( double x, double y )
{
// allow negative ? -> no
m_userScaleX = x;
m_userScaleY = y;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetLogicalScale( double x, double y )
{
// allow negative ?
m_logicalScaleX = x;
m_logicalScaleY = y;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetLogicalOrigin( wxCoord x, wxCoord y )
{
// is this still correct ?
m_logicalOriginX = x * m_signX;
m_logicalOriginY = y * m_signY;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetDeviceOrigin( wxCoord x, wxCoord y )
{
// only wxPostScripDC has m_signX = -1,
m_deviceOriginX = x;
m_deviceOriginY = y;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{
// only wxPostScripDC has m_signX = -1,
m_signX = (xLeftRight ? 1 : -1);
m_signY = (yBottomUp ? -1 : 1);
ComputeScaleAndOrigin();
}
// export a bitmap as a raster image in png
bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
wxDC* source, wxCoord xsrc, wxCoord ysrc,
int logicalFunc /*= wxCOPY*/, bool useMask /*= FALSE*/,
wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/)
{
if (logicalFunc != wxCOPY)
{
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ;
return FALSE ;
}
if (useMask != FALSE)
{
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ;
return FALSE ;
}
wxBitmap myBitmap (width, height) ;
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
memDC.Blit(0, 0, width, height, source, xsrc, ysrc);
memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, xdest, ydest);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed")) ;
return FALSE ;
}
void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
{
wxBitmap myBitmap (myIcon.GetWidth(), myIcon.GetHeight() ) ;
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
memDC.DrawIcon(myIcon,0,0);
memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, x, y);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ;
return ;
}
void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool bTransparent /*=0*/ )
{
if (m_graphics_changed) NewGraphics ();
wxString sTmp, s, sPNG ;
wxImage::AddHandler(new wxPNGHandler);
// create suitable file name
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
while (wxFile::Exists(sPNG) )
{
m_sub_images ++ ;
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
}
//create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
wxBitmap myBitmap = bmp ;
//save it
bool bPNG_OK = myBitmap.SaveFile(sPNG,wxBITMAP_TYPE_PNG);
// refrence the bitmap from the SVG doc
int w = myBitmap.GetWidth();
int h = myBitmap.GetHeight();
sTmp.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x,y,w,h );
s = s + sTmp ;
sTmp.Printf ( wxT(" xlink:href=\"%s\"> \n"), sPNG.c_str() );
s = s + sTmp + wxT("<title>Image from wxSVG</title> </image>") + newline;
if (m_OK && bPNG_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok () && bPNG_OK;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawBitmap Call executed")) ;
return ;
}
// ---------------------------------------------------------------------------
// coordinates transformations
// ---------------------------------------------------------------------------
wxCoord wxSVGFileDC::DeviceToLogicalX(wxCoord x) const
{
return XDEV2LOG(x);
}
wxCoord wxSVGFileDC::DeviceToLogicalY(wxCoord y) const
{
return YDEV2LOG(y);
}
wxCoord wxSVGFileDC::DeviceToLogicalXRel(wxCoord x) const
{
return XDEV2LOGREL(x);
}
wxCoord wxSVGFileDC::DeviceToLogicalYRel(wxCoord y) const
{
return YDEV2LOGREL(y);
}
wxCoord wxSVGFileDC::LogicalToDeviceX(wxCoord x) const
{
return XLOG2DEV(x);
}
wxCoord wxSVGFileDC::LogicalToDeviceY(wxCoord y) const
{
return YLOG2DEV(y);
}
wxCoord wxSVGFileDC::LogicalToDeviceXRel(wxCoord x) const
{
return XLOG2DEVREL(x);
}
wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const
{
return YLOG2DEVREL(y);
}
#ifdef __BORLANDC__
#pragma warn .rch
#pragma warn .ccc
#endif

View File

@ -0,0 +1,19 @@
#
# File: makefile.b32
# Author: Julian Smart/Chris Elliott
# Created: 1999/2002
# Updated:
# Copyright:
#
# Makefile : Builds SVG library for 32-bit BC++
WXDIR = $(WXWIN)
EXTRACPPFLAGS=-Icontrib/include
LIBTARGET=$(WXDIR)\lib\dcsvg.lib
OBJECTS = dcsvg.obj
!include $(WXDIR)\src\makelib.b32

View File

@ -0,0 +1,16 @@
#
# File: makefile.g95
# Author: Julian Smart
# Created: 1999
# Updated:
# Copyright: (c) Julian Smart, 1999
#
# Makefile for wxWindows dcsvg library Cygwin/Mingw32).
WXDIR = ../../..
LIBTARGET=$(WXDIR)/lib/libdcsvg.a
OBJECTS = dcsvg.o
include $(WXDIR)/src/makelib.g95

147
contrib/src/svg/makefile.vc Normal file
View File

@ -0,0 +1,147 @@
# File: makefile.vc
# Author: Julian Smart
# Created: 2001
# Updated:
# Copyright: (c) 2001, Julian Smart
#
# "%W% %G%"
#
# This has not been tested Chris Elliott (biol75@york.ac.uk) and
# the docs don't yet exist
#
# Makefile : Builds dcsvg class library (MS VC++).
# Use FINAL=1 argument to nmake to build final version with no debugging
# info
# Set WXDIR for your system
WXDIR = $(WXWIN)
GIZMOSDIR = $(WXDIR)\contrib\src\dcsvg
GIZMOSINC = $(WXDIR)\contrib\include\wx\dcsvg
THISDIR = $(WXDIR)\contrib\src\dcsvg
DOCDIR=$(WXDIR)\contrib\docs
LOCALDOCDIR=$(WXDIR)\contrib\docs\latex\dcsvg
!include $(WXDIR)\src\makevc.env
OBJECTS = $(D)\dcsvg.obj
LIBTARGET=$(WXDIR)\lib\dcsvg$(LIBEXT).lib
all: $(D) $(LIBTARGET)
$(D) :
mkdir $(D)
wx:
cd $(WXDIR)\src\msw
nmake -f makefile.vc FINAL=$(FINAL)
cd $(THISDIR)
wxclean:
cd $(WXDIR)\src\msw
nmake -f makefile.vc clean
cd $(THISDIR)
$(LIBTARGET): $(OBJECTS)
-erase $(LIBTARGET)
$(implib) @<<
-out:$(LIBTARGET)
-machine:$(CPU)
$(OBJECTS)
<<
$(D)\dcsvg.obj: dcsvg.$(SRCSUFF)
cl @<<
$(CPPFLAGS) /c /Fo$@ /Tp $(*B).$(SRCSUFF)
<<
clean:
-erase $(D)\*.obj
-erase *.sbr
-erase *.exe
-erase *.res
-erase *.map
-erase *.pdb
-erase $(LIBTARGET)
DOCSOURCES=$(LOCALDOCDIR)\dcsvg.tex \
$(LOCALDOCDIR)\bugs.tex $(LOCALDOCDIR)\changes.tex\
$(LOCALDOCDIR)\classes.tex $(LOCALDOCDIR)\intro.tex\
$(LOCALDOCDIR)\topics.tex $(LOCALDOCDIR)\sample.tex
html: $(DOCDIR)\html\dcsvg\dcsvg.htm
htmlhelp: $(DOCDIR)\htmlhelp\dcsvg.chm
htb: $(DOCDIR)\htb\dcsvg.htb
hlp: $(DOCDIR)\winhelp\dcsvg.hlp
pdfrtf: $(DOCDIR)\pdf\dcsvg.rtf
ps: $(DOCDIR)\ps\dcsvg.ps
touchmanual:
touch $(LOCALDOCDIR)\dcsvg.tex
$(DOCDIR)\winhelp\dcsvg.hlp: $(LOCALDOCDIR)\dcsvg.rtf $(LOCALDOCDIR)\dcsvg.hpj
cd $(LOCALDOCDIR)
-erase dcsvg.ph
hc dcsvg
move dcsvg.hlp $(DOCDIR)\winhelp\dcsvg.hlp
move dcsvg.cnt $(DOCDIR)\winhelp\dcsvg.cnt
cd $(THISDIR)
$(LOCALDOCDIR)\dcsvg.rtf: $(DOCSOURCES)
cd $(LOCALDOCDIR)
-start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\dcsvg.tex $(LOCALDOCDIR)\dcsvg.rtf -twice -winhelp
cd $(THISDIR)
$(DOCDIR)\pdf\dcsvg.rtf: $(DOCSOURCES)
cd $(LOCALDOCDIR)
-copy *.bmp $(DOCDIR)\pdf
-start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\dcsvg.tex $(DOCDIR)\pdf\dcsvg.rtf -twice -rtf
cd $(THISDIR)
$(DOCDIR)\html\dcsvg\dcsvg.htm: $(DOCSOURCES)
cd $(LOCALDOCDIR)
-mkdir $(DOCDIR)\html\dcsvg
copy *.gif $(DOCDIR)\html\dcsvg
-start $(WAITFLAG) tex2rtf $(LOCALDOCDIR)\dcsvg.tex $(DOCDIR)\html\dcsvg\dcsvg.htm -twice -html
-erase $(DOCDIR)\html\dcsvg\*.con
-erase *.con
-erase $(DOCDIR)\html\dcsvg\*.ref
cd $(THISDIR)
$(DOCDIR)\htmlhelp\dcsvg.chm: $(DOCDIR)\html\dcsvg\dcsvg.htm $(DOCDIR)\html\dcsvg\dcsvg.hhp
cd $(DOCDIR)\html\dcsvg
-hhc dcsvg.hhp
move dcsvg.chm $(DOCDIR)\htmlhelp\dcsvg.chm
cd $(THISDIR)
# An htb file is a zip file containing the .htm, .gif, .hhp, .hhc and .hhk
# files, renamed to htb.
# This can then be used with e.g. helpview.
# Optionally, a cached version of the .hhp file can be generated with hhp2cached.
$(DOCDIR)\htb\dcsvg.htb: $(DOCDIR)\html\dcsvg\dcsvg.htm
cd $(DOCDIR)\html\dcsvg
-erase dcsvg.zip dcsvg.htb
zip dcsvg.zip *.htm *.gif *.hhp *.hhc *.hhk
-mkdir $(DOCDIR)\htb
move dcsvg.zip $(DOCDIR)\htb\dcsvg.htb
cd $(THISDIR)
$(LOCALDOCDIR)\dcsvg.dvi: $(DOCSOURCES)
cd $(LOCALDOCDIR)
-latex dcsvg
-latex dcsvg
-makeindx dcsvg
-bibtex dcsvg
-latex dcsvg
-latex dcsvg
cd $(THISDIR)
$(WXDIR)\docs\ps\dcsvg.ps: $(LOCALDOCDIR)\dcsvg.dvi
cd $(LOCALDOCDIR)
-dvips32 -o dcsvg.ps dcsvg
move dcsvg.ps $(WXDIR)\docs\ps\dcsvg.ps
cd $(THISDIR)

16
samples/svg/Makefile.in Normal file
View File

@ -0,0 +1,16 @@
# Makefile for plot sample.
# $Id$
top_srcdir = @top_srcdir@/..
top_builddir = ../../..
program_dir = contrib/samples/svg
PROGRAM=svgtest
OBJECTS=svgtest.o
APPEXTRALIBS=$(top_builddir)/lib/libwx_dcsvg.@WX_TARGET_LIBRARY_TYPE@
APPEXTRADEFS=-I$(top_srcdir)/contrib/include
include $(top_builddir)/src/makeprog.env

BIN
samples/svg/SVGlogo24.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

310
samples/svg/SVGlogo24.xpm Normal file
View File

@ -0,0 +1,310 @@
/* XPM */
static char *svgbitmap_xpm[] = {
/* columns rows colors chars-per-pixel */
"64 48 256 2",
" c #550000",
". c #5c0000",
"X c #5f000a",
"o c #5c033a",
"O c #5a3615",
"+ c #640000",
"@ c #640009",
"# c #680605",
"$ c #680807",
"% c #6d0e0e",
"& c #630015",
"* c #690717",
"= c #6d110e",
"- c #6e1412",
"; c #701513",
": c #721b16",
"> c #741c1a",
", c #650021",
"< c #65022b",
"1 c #65003d",
"2 c #650034",
"3 c #6b1132",
"4 c #711535",
"5 c #76221c",
"6 c #78211e",
"7 c #642939",
"8 c #643929",
"9 c #663336",
"0 c #772220",
"q c #792522",
"w c #7b2a23",
"e c #7d2d29",
"r c #7f312a",
"t c #5d004f",
"y c #560059",
"u c #5b005c",
"i c #5a0054",
"p c #5e0061",
"a c #64004a",
"s c #650046",
"d c #640150",
"f c #64025d",
"g c #660d58",
"h c #671746",
"j c #651352",
"k c #640064",
"l c #640069",
"z c #6d0e6c",
"x c #680767",
"c c #6e0f71",
"v c #6c106b",
"b c #6c1665",
"n c #711a6c",
"m c #731b72",
"M c #682847",
"N c #6d2653",
"B c #75236d",
"V c #7c2d74",
"C c #7d2c7a",
"Z c #782278",
"A c #7e3177",
"S c #565600",
"D c #5c5c00",
"F c #5e6100",
"G c #614416",
"H c #655f06",
"J c #655a0b",
"K c #70463b",
"L c #6e4538",
"P c #646400",
"I c #656a00",
"U c #6c6c0d",
"Y c #676708",
"T c #6d6914",
"R c #6d720f",
"E c #707014",
"W c #78781e",
"Q c #75771a",
"! c #75602d",
"~ c #7a7a23",
"^ c #7b7b2d",
"/ c #812e2a",
"( c #82392d",
") c #81332d",
"_ c #853a34",
"` c #843834",
"' c #833a7b",
"] c #8a443a",
"[ c #884438",
"{ c #8e4a42",
"} c #8d4542",
"| c #8b4055",
" . c #914e48",
".. c #94564a",
"X. c #955250",
"o. c #985b54",
"O. c #995d55",
"+. c #894679",
"@. c #90506f",
"#. c #995c7d",
"$. c #97624d",
"%. c #9e6a5b",
"&. c #9c6756",
"*. c #9e6460",
"=. c #8d6a64",
"-. c #a06a5d",
";. c #a1715d",
":. c #a26a66",
">. c #a97c6c",
",. c #a67568",
"<. c #ac7b74",
"1. c #ab7674",
"2. c #812f81",
"3. c #853a82",
"4. c #823081",
"5. c #8a4284",
"6. c #8d4a84",
"7. c #8f5080",
"8. c #945689",
"9. c #965792",
"0. c #9a6389",
"q. c #9d6397",
"w. c #a2658e",
"e. c #a16a99",
"r. c #a5778f",
"t. c #a77799",
"y. c #ad78aa",
"u. c #a76daa",
"i. c #81812b",
"p. c #878738",
"a. c #888837",
"s. c #8d8d40",
"d. c #919145",
"f. c #919149",
"g. c #979753",
"h. c #9c9c5a",
"j. c #9b9b54",
"k. c #9f8671",
"l. c #9b856c",
"z. c #aa826b",
"x. c #ae8772",
"c. c #b1847a",
"v. c #b08c75",
"b. c #b3897f",
"n. c #b19374",
"m. c #b6997d",
"M. c #a99e77",
"N. c #a1a25b",
"B. c #a4a465",
"V. c #abab73",
"C. c #adad79",
"Z. c #b6a079",
"A. c #b2b278",
"S. c #ab878d",
"D. c #ac8396",
"F. c #b78c86",
"G. c #b69182",
"H. c #b99c83",
"J. c #bc9a8b",
"K. c #bb9592",
"L. c #b183ab",
"P. c #b38ca3",
"I. c #bd98b7",
"U. c #b791a9",
"Y. c #bba385",
"T. c #bca696",
"R. c #bbbb8c",
"E. c #b8b785",
"W. c #bebe94",
"Q. c #bfa5a7",
"!. c #c19c97",
"~. c #c0a88d",
"^. c #c3a896",
"/. c #c3b48f",
"(. c #c7b698",
"). c #c6aba5",
"_. c #c6aab7",
"`. c #ccb7a8",
"'. c #cdb8b5",
"]. c #d0bbab",
"[. c #d1bbb3",
"{. c #c29bc2",
"}. c #caa9c6",
"|. c #d7bfd0",
" X c #d2b8ca",
".X c #c2c28e",
"XX c #c8c294",
"oX c #cbc59c",
"OX c #ccca9b",
"+X c #c4c595",
"@X c #cccaa3",
"#X c #ccc8a7",
"$X c #d0cba5",
"%X c #d3cbab",
"&X c #d1c5aa",
"*X c #d3c3b3",
"=X c #d8c4ba",
"-X c #d8cbbb",
";X c #d5cab7",
":X c #d4d4ab",
">X c #d6dcaa",
",X c #d8dbad",
"<X c #d2d5a3",
"1X c #d8d4b3",
"2X c #dbd4bc",
"3X c #dbdbb4",
"4X c #dcdcbb",
"5X c #d4d4b5",
"6X c #dbe3ab",
"7X c #dce1b4",
"8X c #dee3bb",
"9X c #dee9b8",
"0X c #e0e4bd",
"qX c #e1e8bc",
"wX c #e0e7b5",
"eX c #d9c8c3",
"rX c #dbc8d4",
"tX c #ddd3c1",
"yX c #dddbc2",
"uX c #dedaca",
"iX c #e1cecd",
"pX c #e0dcc4",
"aX c #e2d8cb",
"sX c #e6dcd2",
"dX c #e5d8d7",
"fX c #e1cfe0",
"gX c #e2e2c3",
"hX c #e3e2cb",
"jX c #e3eac3",
"kX c #e6eacb",
"lX c #e8ebcc",
"zX c #e5e4d3",
"xX c #eaead3",
"cX c #eeebde",
"vX c #e9e5d8",
"bX c #eaf1ce",
"nX c #e8f2c7",
"mX c #ebf2d3",
"MX c #eef2da",
"NX c #edf8d4",
"BX c #effad8",
"VX c #f0f6d6",
"CX c #f0f3dd",
"ZX c #f2fbda",
"AX c #edece1",
"SX c #efe6e7",
"DX c #f0ebe5",
"FX c #f2f3e4",
"GX c #f4f4ea",
"HX c #f4fae3",
"JX c #f6fbea",
"KX c #f8fdec",
"LX c #f8fee4",
"PX c #fbfdf4",
"IX c #fefefe",
"UX c #f8f4f2",
/* pixels */
"> % % % ; % % ; % % ; % % ; % % % % % % % ; % % % % % % % % % ; % % % % ; % % % = = % % % % = % % % % % ; % % ; % % ; % % ; % / ",
"% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # ",
"% + + + + + + + + + + + + + + + + + + = % = = % % % @ + + + + + + + + + + + % % % $ = $ % + + + + + + + # + + + + + + # + + + % ",
"% + + + + + + + + + + + + # + + + + % rXUXSXDXcXcXaX6 . + + + + + + + + + 6 oX$X@XoXXXOXZ.# + + + + + + + + + + + + + + + + + % ",
"% + + + + + + + + + + + + + # + + + . F.IXIXIXIXPXPX,.. + + + + + + + + + %.qX3X6X,X<X>X&.+ + + + + + + + + + + + + + + + + + ; ",
"% + + + + + + + # + + + + + + + + + + ` UXPXaX[.aXPX;X@ + + + + + + + + $ (.0X(.m./.<XOX5 + + + + + + + + + + + + + + + + + + % ",
"% + + + + + + + + + + # + + + + + + + + [.IXK. ` FXFX_ + + + + + + + . [ 4X,Xw . >.wXM.+ + + + + + + + + + + + + # + + + + + ; ",
"; + + + + + + + + + + + + # + + + + + . :.IXSX- . [.IXG.. + + + + + + + v.nXH.. = XX6X] + + + + + + + + + + + + + + + + + + + % ",
"; + + + + + + + + + + + + + + + + + + + > SXIXO. *.PXaX; + + + + + + ; %XjX.. ..6X(.= + + + + # + + + + + + + + + + + + + # % ",
"% + + + + + + + # + + + + # + + + + + + + !.IX[.. ; zXJXO.. + + + + . O.kX#X= + m.9Xz.. + + + + + + + + + + + + + + + # + + + % ",
"% + + + + + + + + + + + + + + + + + + + + } IXGXr J.IX).+ + + + + + ^.bXx. w :X<Xr + + + + + + # + + + + + # + + + + + + ; ",
"; + + + + + + + + + + # + + + # + + + + + # eXIXc. } HXxXe . + + . r 8X8X( ;.9XY.# + + + + + + + + + + + + + + + + + + + + % ",
"% + + + + + + + + + + + + + + + + + + + + 1.IXiX$ # ;XKX<.. + + + >.mX(.+ $ (.9X$.. + + + + + + + + + + + + + + + + + + + + ; ",
"% + + + + + + + + + + + # + + + + + + + + @ q GXPX . ,.KX-X$ + + $ #XbX&. [ 7X$X: + + + + + + + # + + + + + + + + # + + # + % ",
"; + + + + + + + + + + + + + + + + + + + + + + ).IX^.. q vXMX{ . . .kX5X> . n.jXn.+ + + + + + + + + + + + + + + + + + + + + + ; ",
"% + # + + + + + + + + % > ; $ + + + + + + + . o.PXvX> . ^.KXJ.+ + J.BXH.. : %X8X[ . + + + + + . $ / { ._ : + + + + + + + + + % ",
"% + + + + + + + > ,.`.aXpXpX].x.( + + + + + + - sXPX:. ..HXyX; : yXlX] &.jX(.$ + + + + . ; <.-XxXVXVXkX1XH.[ + + + + + + + % ",
"; + + + + + # 1.vXIXKXxXhXpXlXBX0Xm.: + + + + F.IX[.+ % tXHXO.%.MX&X% + /.jX;.. + + + + ..sXIXJXaX].^.%XgXNX8Xn.- + + + + + % ",
"% + + + + % ).IXPX`.O.e ; 6 ] v.1XnXoX( + + + + ` GXFX` c.HX;XyXmX>. r 8X3Xw + + + . 1.PXPX].X.% @ + + e >.1XjX/.: + + + + % ",
"% + + + @ ^.IXcXo.. + # + + 5 m.qX$X( . + + + [.PXb. ` lXxXlXgXe z.nXY.+ + + . :.IXGX,.@ $ w ) ; + w #X8X/.% + + + % ",
"* + + . 1.IXDX` > c.].2X%XH.] . . ;.,X(.5 . + . :.PXaX% + `.MXxX^.+ = %XjX.. + _ PXPXO. ; c.-XlXlXyX~.[ ;.3X7X>.$ + + + % ",
"v 2 + / UXUX} .sXHXMXxXlXBXkXm.) ..OX6Xn.+ + . > vXLXX. &.MXmXO. ..jX#X; + + # [.IX<. r eXPXCXpX-XpXMXgXjX3X..+ + + + * g ",
"c l t w.IXDXe ,.PXFXG.w _ >.1XjX3XqX7X<X+X5 + + + !.PX^.. : pXyX- . Y.bXx.+ + . X.IXeX+ 0 sXPX].] % $ 5 ,.3X%X[ . + + * a k c ",
"c k k l {.IXdX6 . b.LX;Xq X . > ~.1XZ.;.( - $ + + . { HXvXq . T.J.. w 2XgX_ . + + '.IXX. `.IXJ.# . + + + . ( w . @ < d l l k c ",
"c k k f x }.IXeX3 X J.JX;X: . . = - + . + + + + + + % -XKX,. ` 6 ,.bX(.$ + + > UXdX+ } IX=X$ + + + @ + + . & 1 f l l l k k c ",
"v k k k p z rXIX}.f d _.LX(.- + + + + + + + + + + + . <.KX*X$ . + $ `.bX;. + X.IXK.. !.IXX.. + + + @ , 1 f l l k k l k k k c ",
"c k k k k f m rXPXI.u n [.ZXT.< & @ + + + + + + + + + e vXcX] . . ] kX3X6 + + . 1.IX*.@ sXsX% @ , 2 d f f p p p f p p p f f k c ",
"c k k k k k f ' dXKXP.u n ;XNXP.f f a 1 < , & @ @ + + + (.KXF.. + G.BXH.+ + + . K.IX| 4 KX_.f f l l l l 6.6.6.6.6.+.+.+.+.+.z z ",
"c k k k k k k k 3.vXLXt.y C 2XnXt.p l l l l k k f a a o #.HXuX4 h 2XkX@.o a a t {.IX4.Z PXI.p k k k k z yXjXjX9XqX3X6X>X<XOXB v ",
"c k k k l k k k p 6.cXBX9.y 5.4XqX0.f k k l k l l k l l c aXMX9.9.bX;Xc p l l f {.IX3.m PX_.p l k k f z yX2X).).).T.T.T.XXOXn z ",
"K g l l k k k k k p 9.MXlX6.y 6.0X7X7.p k k k k k k k k f P.ZX=XtXbXt.f k k p u L.IX9.l SXrXx p k k k z yXQ.p f f p k l T.oXc b ",
"R H 8 g l l k x k k f e.BXgX' y 0.wX,X' p k k k k k k k p 3.xXlXlXhX' f k l k u q.IXy.u XJXC f l k f z yX'.C V A C x z oXR.9 T ",
"U I I H 8 j l p f k l f D.NX-XV y r.9X@XV k k k k k k k k x [.lXlX'.k k k k k f 2.IXrXu e.IXI.u f k k z yXkX4X3X3X`.x ' >XN.I E ",
"U P P P F D G M 2.x p p p U.nX&Xm p S.6X(.B p l k k k k k p e.mXlX0.p l k k k k x fXIXC x dXJX9.u p f z '.*X;X3XqXk.O B.>Xa.H R ",
"R P P U p.B.+XkXDXU.N i u f U.nX).b k K.6XT.b p k k k l l f Z hXpXm k k k k k k p y.IXI.y 9.KXFXq.x p p x A ).jX+XY Q <X+XU P U ",
"U P D C.IXIXIXGXGXKXyXV.=.+.P.0XnXt.u B <X<XA f k l k k l p f _.Q.p k k k l k k p m SXPX5.y y.JXLX XP.t.U.2XlXOXQ D A.3Xj.P P U ",
"U P P ~ AXIXyXp.a.5XGXKXMXlXmXkXE.K h S.6XS.k l l l k l l k k ' C f k k l l l l p p u.IXdXB o l.gXHXLXLXVXgXE.E S j.3X.XU P P U ",
"E P P S g.IXFXg.S P g.+X:X@XE.a.D F h.,XOX! 8 9 M h j j g f f x f f x x g g j h M 7 8 #XIXyX~ S U g.A.A.B.i.D P j.3X,Xa.H P P U ",
"yXf.P P D V.IXPXR.E S D P P D S E A.8X:Xa.P I I I I P Y Y H H J J J H H H P I P I I F E 2XIXvXB.Y S S S S P ~ E.0X3Xf.D P P P f.",
"IXIX5Xf.P D B.GXIXhXE.d.i.i.d.C.:XgX,Xa.P P P P P P P P I P P I P P P I P P I P P P I F T @XPXKXgXE.B.j.B.+X4XlX:Xd.P P P p.#XIX",
"IXIXIXIXyXh.T p.5XGXPXCXkXhXlXxXgX.X^ P P P P P P P P P P P P P P P P P P P P P P P P P D Y h.yXFXJXGXCXFXlX4XA.W H Y j.2XIXIXIX",
"IXIXIXIXIXIXAXE.p.d.R.5XgX3X@XC.a.I P P P P P P P P P P P P P P P P P P P P P P P P P P P P D U d.A.R.W.A.h.~ D ^ A.zXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXuXC.p.E U Y P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P H D D P Y ^ V.yXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXzXW.h.~ Y P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P W g.R.zXPXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXUXzX@XC.f.~ U P P P P P P P P P P P P P P P P P P P P P Y ~ d.V.+XhXPXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXAXyX#XW.C.B.h.f.s.p.p.a.a.p.s.f.j.B.C.R.#XyXAXPXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX"
};

View File

@ -0,0 +1,25 @@
/* XPM */
static char *help_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 4 1",
" c None",
". c Black",
"X c Blue",
"o c #000080",
/* pixels */
" ",
" ...... ",
" .XXXXX.. ",
" .XX...oX.. ",
" .X.. .X.. ",
" .X.. .XX.. ",
" .. .XX.. ",
" .XX.. ",
" .X.. ",
" .X.. ",
" .o.. ",
" .. ",
" .XX.. ",
" .XX.. ",
" ... "
};

View File

@ -0,0 +1,24 @@
/* XPM */
static char *new_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 3 1",
" c None",
". c Black",
"X c Gray100",
/* pixels */
" ",
" ........ ",
" .XXXXXX.. ",
" .XXXXXX.X. ",
" .XXXXXX.... ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" .XXXXXXXXX. ",
" ........... ",
" "
};

View File

@ -0,0 +1,25 @@
/* XPM */
static char *save_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 15 4 1",
" c None",
". c Black",
"X c #808000",
"o c #808080",
/* pixels */
" ",
" .............. ",
" .X. . . ",
" .X. ... ",
" .X. .X. ",
" .X. .X. ",
" .X. .X. ",
" .X. .X. ",
" .XX........oX. ",
" .XXXXXXXXXXXX. ",
" .XX.........X. ",
" .XX...... .X. ",
" .XX...... .X. ",
" .XX...... .X. ",
" ............. "
};

18
samples/svg/makefile.b32 Normal file
View File

@ -0,0 +1,18 @@
#
# File: makefile.b32
# Author: Julian Smart Chris Elliott
# Created: 1999/2002
# Updated:
# Copyright:
#
# Makefile : Builds sample for 32-bit BC++
EXTRALIBS=$(WXDIR)\lib\dcsvg.lib
WXDIR = $(WXWIN)
TARGET=svgtest
OBJECTS = $(TARGET).obj
!include $(WXDIR)\src\makeprog.b32

15
samples/svg/makefile.g95 Normal file
View File

@ -0,0 +1,15 @@
# File: makefile.g95 for svgtest demo
# Author: Julian Smart
# Created: 2001-06-12
# Updated:
WXDIR = ../../..
TARGET = svgtest
OBJECTS = $(TARGET).o
EXTRAINC = -I$(WXDIR)/contrib/include
RCEXTRAINC = --include-dir $(WXDIR)/contrib/include
EXTRALIBS = -ldcsvg
include $(WXDIR)/src/makeprog.g95

14
samples/svg/makefile.vc Normal file
View File

@ -0,0 +1,14 @@
# File: makefile.vc for svgtest sample
# Author: Julian Smart
# Created: 2001-06-12
# Updated:
WXDIR = $(WXWIN)
PROGRAM = svgtest
OBJECTS = $(PROGRAM).obj
EXTRALIBS = $(WXDIR)\lib\dcsvg$(LIBEXT).lib
EXTRAINC = -I$(WXDIR)\contrib\include
!include $(WXDIR)\src\makeprog.vc

BIN
samples/svg/mondrian.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

44
samples/svg/mondrian.xpm Normal file
View File

@ -0,0 +1,44 @@
/* XPM */
static char *mondrian_xpm[] = {
/* columns rows colors chars-per-pixel */
"32 32 6 1",
" c Black",
". c Blue",
"X c #00bf00",
"o c Red",
"O c Yellow",
"+ c Gray100",
/* pixels */
" ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" oooooo +++++++++++++++++++++++ ",
" ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ .... ",
" ++++++ ++++++++++++++++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++++++++++++++++ ++++ ",
" ++++++ ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
" "
};

602
samples/svg/svgtest.cpp Normal file
View File

@ -0,0 +1,602 @@
// biol75@york.ac.uk (Chris Elliott) March 2000
#ifdef __BIDE__
#define _NO_VCL
#include "condefs.h"
USERC("svg.rc");
//---------------------------------------------------------------------------
#define WinMain WinMain
#endif
/////////////////////////////////////////////////////////////////////////////
// Name: svgtest.cpp
// Purpose: SVG sample
// Author: Chris Elliott
// Modified by:
// RCS-ID: $Id$
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ===========================================================================
// declarations
// ===========================================================================
// ---------------------------------------------------------------------------
// headers
// ---------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#include "wx/mdi.h"
#endif
#include <wx/toolbar.h>
#include <wx/svg/dcsvg.h>
#include "bitmaps/new.xpm"
#include "bitmaps/save.xpm"
#include "bitmaps/help.xpm"
#include "SVGlogo24.xpm"
class MyChild;
// Define a new application
class MyApp : public wxApp
{
public:
bool OnInit();
};
// Define a new frame
class MyFrame : public wxMDIParentFrame
{
public:
int nWinCreated;
wxList m_children;
MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
const wxPoint& pos, const wxSize& size, const long style);
void InitToolBar(wxToolBar* toolBar);
void OnSize(wxSizeEvent& event);
void OnAbout(wxCommandEvent& event);
void OnNewWindow(wxCommandEvent& event);
void OnQuit(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
void FileSavePicture (wxCommandEvent & WXUNUSED(event) ) ;
DECLARE_EVENT_TABLE()
};
class MyCanvas : public wxScrolledWindow
{
public:
int m_index ;
MyChild * m_child ;
MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size);
virtual void OnDraw(wxDC& dc);
DECLARE_EVENT_TABLE()
};
class MyChild: public wxMDIChildFrame
{
public:
MyCanvas *m_canvas;
MyFrame *m_frame ;
//////////////////// Methods
MyChild(wxMDIParentFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, const long style);
~MyChild();
void OnActivate(wxActivateEvent& event);
void OnQuit(wxCommandEvent& event);
void OnClose(wxCloseEvent& event);
bool OnSave(wxString filename) ;
DECLARE_EVENT_TABLE()
};
// menu items ids
enum
{
MDI_QUIT = 100,
MDI_NEW_WINDOW,
MDI_SAVE,
MDI_REFRESH,
MDI_CHILD_QUIT,
MDI_ABOUT
};
IMPLEMENT_APP(MyApp)
// ---------------------------------------------------------------------------
// global variables
// ---------------------------------------------------------------------------
MyFrame *frame = (MyFrame *) NULL;
// ---------------------------------------------------------------------------
// event tables
// ---------------------------------------------------------------------------
BEGIN_EVENT_TABLE(MyFrame, wxMDIParentFrame)
EVT_MENU(MDI_ABOUT, MyFrame::OnAbout)
EVT_MENU(MDI_NEW_WINDOW, MyFrame::OnNewWindow)
EVT_MENU(MDI_QUIT, MyFrame::OnQuit)
EVT_MENU (MDI_SAVE, MyFrame::FileSavePicture)
EVT_CLOSE(MyFrame::OnClose)
EVT_SIZE(MyFrame::OnSize)
END_EVENT_TABLE()
// ===========================================================================
// implementation
// ===========================================================================
// ---------------------------------------------------------------------------
// MyApp
// ---------------------------------------------------------------------------
// Initialise this in OnInit, not statically
bool MyApp::OnInit()
{
// Create the main frame window
frame = new MyFrame((wxFrame *)NULL, -1, wxT("SVG Demo"),
wxPoint(-1, -1), wxSize(500, 400),
wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL);
// Make a menubar
wxMenu *file_menu = new wxMenu;
file_menu->Append(MDI_NEW_WINDOW, wxT("&New test\tCtrl+N"));
file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
wxMenu *help_menu = new wxMenu;
help_menu->Append(MDI_ABOUT, wxT("&About"));
wxMenuBar *menu_bar = new wxMenuBar;
menu_bar->Append(file_menu, wxT("&File"));
menu_bar->Append(help_menu, wxT("&Help"));
// Associate the menu bar with the frame
frame->SetMenuBar(menu_bar);
frame->CreateStatusBar();
frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}
// ---------------------------------------------------------------------------
// MyFrame
// ---------------------------------------------------------------------------
// Define my frame constructor
MyFrame::MyFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
const wxPoint& pos, const wxSize& size, const long style)
: wxMDIParentFrame(parent, id, title, pos, size, style)
{
nWinCreated = 0 ;
// Give it an icon
SetIcon(wxICON(mondrian));
CreateToolBar(wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL);
InitToolBar(GetToolBar());
}
void MyFrame::OnClose(wxCloseEvent& event)
{
if ( !event.CanVeto() )
{
event.Skip();
return ;
}
if ( m_children.Number () < 1 )
{
event.Skip();
return ;
}
// now try the children
wxNode * pNode = m_children.GetFirst ();
wxNode * pNext ;
MyChild * pChild ;
while ( pNode )
{
pNext = pNode -> GetNext ();
pChild = (MyChild*) pNode -> Data ();
if (pChild -> Close ())
{
delete pNode ;
}
else
{
event.Veto();
return;
}
pNode = pNext ;
}
event.Skip();
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close();
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
{
(void)wxMessageBox(wxT("wxWindows 2.0 SVG 1.0 Test\n"
"Author: Chris Elliott (c) 2002\n"
"Usage: svg.exe \nClick File | New to show tests\n\n"), wxT("About SVG Test"));
}
void MyFrame::OnNewWindow(wxCommandEvent& WXUNUSED(event) )
{
// Make another frame, containing a canvas
MyChild *subframe ;
m_children.Append (new MyChild(frame, wxT("SVG Frame"),
wxPoint(-1, -1), wxSize(-1, -1),
wxDEFAULT_FRAME_STYLE ) ) ;
subframe = (MyChild *) m_children.GetLast() -> Data ();
wxString title;
title.Printf(wxT("SVG Test Window %d"), nWinCreated );
// counts number of children previously, even if now closed
nWinCreated ++ ;
// Give it a title and icon
subframe->SetTitle(title);
subframe->SetIcon(wxICON(mondrian));
// Make a menubar
wxMenu *file_menu = new wxMenu;
file_menu->Append(MDI_NEW_WINDOW, wxT("&Another test\tCtrl+N"));
file_menu->Append(MDI_SAVE, wxT("&Save\tCtrl+S"), wxT("Save in SVG format"));
file_menu->Append(MDI_CHILD_QUIT, wxT("&Close child\tCtrl+F4"));
file_menu->Append(MDI_QUIT, wxT("&Exit\tAlt+X"));
wxMenu *help_menu = new wxMenu;
help_menu->Append(MDI_ABOUT, wxT("&About"));
wxMenuBar *menu_bar = new wxMenuBar;
menu_bar->Append(file_menu, wxT("&File"));
menu_bar->Append(help_menu, wxT("&Help"));
// Associate the menu bar with the frame
subframe->SetMenuBar(menu_bar);
subframe->Show(TRUE);
}
void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event))
{
int w, h;
GetClientSize(&w, &h);
GetClientWindow()->SetSize(0, 0, w, h);
}
void MyFrame::InitToolBar(wxToolBar* toolBar)
{
const int maxBitmaps = 3 ;
wxBitmap* bitmaps[maxBitmaps];
bitmaps[0] = new wxBitmap( new_xpm );
bitmaps[1] = new wxBitmap( save_xpm );
bitmaps[2] = new wxBitmap( help_xpm );
int width = 16;
int currentX = 5;
toolBar->AddTool( MDI_NEW_WINDOW, *(bitmaps[0]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, wxT("New SVG test window"));
currentX += width + 5;
toolBar->AddTool( MDI_SAVE, *bitmaps[1], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, wxT("Save test in SVG format"));
currentX += width + 5;
toolBar->AddSeparator();
toolBar->AddTool(MDI_ABOUT, *bitmaps[2], wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, wxT("Help"));
toolBar->Realize();
int i;
for (i = 0; i < maxBitmaps; i++)
delete bitmaps[i];
}
void MyFrame::FileSavePicture (wxCommandEvent & WXUNUSED(event) )
{
MyChild * pChild = (MyChild *)GetActiveChild ();
if (pChild == NULL)
{
return ;
}
wxFileDialog dialog(this, wxT("Save Picture as"), wxEmptyString, pChild->GetTitle(),
wxT("SVG vector picture files (*.svg)|*.svg"),
wxSAVE|wxOVERWRITE_PROMPT);
if (dialog.ShowModal() == wxID_OK)
{
if (!pChild -> OnSave ( dialog.GetPath() ))
{
return ;
}
}
return ;
}
// Note that MDI_NEW_WINDOW and MDI_ABOUT commands get passed
// to the parent window for processing, so no need to
// duplicate event handlers here.
BEGIN_EVENT_TABLE(MyChild, wxMDIChildFrame)
EVT_MENU(MDI_CHILD_QUIT, MyChild::OnQuit)
EVT_CLOSE(MyChild::OnClose)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
END_EVENT_TABLE()
// ---------------------------------------------------------------------------
// MyCanvas
// ---------------------------------------------------------------------------
// Define a constructor for my canvas
MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
: wxScrolledWindow(parent, -1, pos, size,
wxSUNKEN_BORDER|wxVSCROLL|wxHSCROLL)
{
m_child = (MyChild *) parent ;
SetBackgroundColour(wxColour("WHITE"));
m_index = m_child->m_frame->nWinCreated % 7 ;
}
// Define the repainting behaviour
void MyCanvas::OnDraw(wxDC& dc)
{
// vars to use ...
wxString s ;
wxPen wP ;
wxBrush wB ;
wxPoint points[6];
wxColour wC;
wxFont wF ;
dc.SetFont(*wxSWISS_FONT);
dc.SetPen(*wxGREEN_PEN);
switch (m_index)
{
default:
case 0:
// draw lines to make a cross
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
// draw point colored line and spline
wP = *wxCYAN_PEN ;
wP.SetWidth(3);
dc.SetPen(wP);
dc.DrawPoint (25,15) ;
dc.DrawLine(50, 30, 200, 30);
dc.DrawSpline(50, 200, 50, 100, 200, 10);
s = wxT("Green Cross, Cyan Line and spline");
break ;
case 1:
// draw standard shapes
dc.SetBrush(*wxCYAN_BRUSH);
dc.SetPen(*wxRED_PEN);
dc.DrawRectangle(10, 10, 100, 70);
wB = wxBrush ("DARK ORCHID", wxTRANSPARENT);
dc.SetBrush (wB);
dc.DrawRoundedRectangle(50, 50, 100, 70, 20);
dc.SetBrush (wxBrush("GOLDENROD", wxSOLID) );
dc.DrawEllipse(100, 100, 100, 50);
points[0].x = 100; points[0].y = 200;
points[1].x = 70; points[1].y = 260;
points[2].x = 160; points[2].y = 230;
points[3].x = 40; points[3].y = 230;
points[4].x = 130; points[4].y = 260;
points[5].x = 100; points[5].y = 200;
dc.DrawPolygon(5, points);
dc.DrawLines (6, points, 160);
s = wxT("Blue rectangle, red edge, clear rounded rectangle, gold ellipse, gold and clear stars");
break ;
case 2:
// draw text in Arial or similar font
dc.DrawLine(50,25,50,35);
dc.DrawLine(45,30,55,30);
dc.DrawText(wxT("This is a Swiss-style string"), 50, 30);
wC = dc.GetTextForeground() ;
dc.SetTextForeground ("FIREBRICK");
// no effect in msw ??
dc.SetTextBackground ("WHEAT");
dc.DrawText(wxT("This is a Red string"), 50, 200);
dc.DrawRotatedText(wxT("This is a 45 deg string"), 50, 200, 45);
dc.DrawRotatedText(wxT("This is a 90 deg string"), 50, 200, 90);
wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, FALSE, wxT("Times New Roman"));
dc.SetFont(wF);
dc.SetTextForeground (wC) ;
dc.DrawText(wxT("This is a Times-style string"), 50, 60);
s = wxT("Swiss, Times text; red text, rotated and colored orange");
break ;
case 3 :
// four arcs start and end points, center
dc.SetBrush(*wxGREEN_BRUSH);
dc.DrawArc ( 200,300, 370,230, 300.0,300.0 );
dc.SetBrush(*wxBLUE_BRUSH);
dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270.0,270.0 );
dc.SetDeviceOrigin(-10,-10);
dc.DrawArc ( 270-50, 270-86, 270-86, 270-50, 270.0,270.0 );
dc.SetDeviceOrigin(0,0);
wP.SetColour ("CADET BLUE");
dc.SetPen(wP);
dc.DrawArc ( 75,125, 110, 40, 75.0, 75.0 );
wP.SetColour ("SALMON");
dc.SetPen(wP);
dc.SetBrush(*wxRED_BRUSH);
//top left corner, width and height, start and end angle
// 315 same center and x-radius as last pie-arc, half Y radius
dc.DrawEllipticArc(25,50,100,50,180.0,45.0) ;
wP = *wxCYAN_PEN ;
wP.SetWidth(3);
dc.SetPen(wP);
//wxTRANSPARENT));
dc.SetBrush (wxBrush ("SALMON",wxSOLID)) ;
dc.DrawEllipticArc(300, 0,200,100, 0.0,145.0) ;
//same end point
dc.DrawEllipticArc(300, 50,200,100,90.0,145.0) ;
dc.DrawEllipticArc(300,100,200,100,90.0,345.0) ;
s = wxT("This is an arc test page");
break ;
case 4:
dc.DrawCheckMark ( 30,30,25,25);
dc.SetBrush (wxBrush ("SALMON",wxTRANSPARENT));
dc.DrawCheckMark ( 80,50,75,75);
dc.DrawRectangle ( 80,50,75,75);
s = wxT("Two check marks");
break ;
case 5:
wF = wxFont ( 18, wxROMAN, wxITALIC, wxBOLD, FALSE, wxT("Times New Roman"));
dc.SetFont(wF);
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
dc.DrawText(wxT("This is an 18pt string"), 50, 60);
// rescale and draw in blue
wP = *wxCYAN_PEN ;
dc.SetPen(wP);
dc.SetUserScale (2.0,0.5);
dc.SetDeviceOrigin(200,0);
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
dc.DrawText(wxT("This is an 18pt string 2 x 0.5 UserScaled"), 50, 60);
dc.SetUserScale (2.0,2.0);
dc.SetDeviceOrigin(200,200);
dc.DrawText(wxT("This is an 18pt string 2 x 2 UserScaled"), 50, 60);
wP = *wxRED_PEN ;
dc.SetPen(wP);
dc.SetUserScale (1.0,1.0);
dc.SetDeviceOrigin(0,10);
dc.SetMapMode (wxMM_METRIC) ; //svg ignores this
dc.DrawLine(0, 0, 200, 200);
dc.DrawLine(200, 0, 0, 200);
dc.DrawText(wxT("This is an 18pt string in MapMode"), 50, 60);
s = wxT("Scaling test page");
break ;
case 6:
dc.DrawIcon( wxICON(mondrian), 10, 10 );
dc.DrawBitmap ( wxBITMAP (svgbitmap), 50,15);
s = wxT("Icon and Bitmap ");
break ;
}
m_child->SetStatusText(s);
}
// ---------------------------------------------------------------------------
// MyChild
// ---------------------------------------------------------------------------
MyChild::MyChild(wxMDIParentFrame *parent, const wxString& title,
const wxPoint& pos, const wxSize& size,
const long style)
: wxMDIChildFrame(parent, -1, title, pos, size, style)
{
m_frame = (MyFrame *) parent ;
CreateStatusBar();
SetStatusText(title);
int w, h ;
GetClientSize ( &w, &h );
m_canvas = new MyCanvas(this, wxPoint(0, 0), wxSize (w,h) );
// Give it scrollbars
m_canvas->SetScrollbars(20, 20, 50, 50);
}
MyChild::~MyChild()
{
m_frame->m_children.DeleteObject(this);
}
void MyChild::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}
bool MyChild::OnSave(wxString filename)
{
wxSVGFileDC svgDC (filename, 600, 650) ;
m_canvas->OnDraw (svgDC);
return svgDC.Ok();
}
void MyChild::OnActivate(wxActivateEvent& event)
{
if ( event.GetActive() && m_canvas )
m_canvas->SetFocus();
}
void MyChild::OnClose(wxCloseEvent& event)
{
event.Skip();
}

856
src/common/dcsvg.cpp Normal file
View File

@ -0,0 +1,856 @@
/////////////////////////////////////////////////////////////////////////////
// Name: svg.cpp
// Purpose: SVG sample
// Author: Chris Elliott
// Modified by:
// RCS-ID: $Id$
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/svg/dcsvg.h"
#include <math.h>
#include "wx/image.h"
#define wxSVG_DEBUG FALSE
// or TRUE to see the calls being executed
#define newline wxString(wxT("\n"))
#define space wxString(wxT(" "))
#define semicolon wxString(wxT(";"))
#define wx_round(a) (int)((a)+.5)
#ifdef __BORLANDC__
#pragma warn -rch
#pragma warn -ccc
#endif
static inline double DegToRad(double deg) { return (deg * 3.14) / 180.0; } ;
wxString wxColStr ( wxColour c )
{
unsigned char r, g, b ;
r = c.Red ();
g = c.Green ();
b = c. Blue ();
// possible Unicode bug here
wxString s = wxDecToHex(r) + wxDecToHex(g) + wxDecToHex(b) ;
return s ;
}
wxString wxBrushString ( wxColour c, int style )
{
wxString s = wxT("fill:#") + wxColStr (c) + semicolon + space ;
switch ( style )
{
case wxSOLID :
s = s + wxT("fill-opacity:1.0; ");
break ;
case wxTRANSPARENT:
s = s + wxT("fill-opacity:0.0; ");
break ;
default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::Requested Brush Style not available")) ;
}
s = s + newline ;
return s ;
}
void wxSVGFileDC::Init (wxString f, int Width, int Height, float dpi)
{
//set up things first wxDCBase does all this?
m_width = Width ;
m_height = Height ;
m_clipping = FALSE;
m_OK = TRUE;
m_mm_to_pix_x = dpi/25.4;
m_mm_to_pix_y = dpi/25.4;
m_signX = m_signY = 1;
m_userScaleX = m_userScaleY =
m_deviceOriginX = m_deviceOriginY = 0;
m_OriginX = m_OriginY = 0;
m_logicalOriginX = m_logicalOriginY = 0;
m_logicalScaleX = m_logicalScaleY = 0 ;
m_scaleX = m_scaleY = 1.0 ;
m_logicalFunction = wxCOPY;
m_backgroundMode = wxTRANSPARENT;
m_mappingMode = wxMM_TEXT;
m_backgroundBrush = *wxTRANSPARENT_BRUSH;
m_textForegroundColour = *wxBLACK;
m_textBackgroundColour = *wxWHITE;
m_colour = wxColourDisplay();
m_pen = *wxBLACK_PEN;
m_font = *wxNORMAL_FONT;
m_brush = *wxWHITE_BRUSH;
m_graphics_changed = TRUE ;
////////////////////code here
m_outfile = new wxFileOutputStream(f) ;
m_OK = m_outfile->Ok ();
if (m_OK)
{
m_filename = f ;
m_sub_images = 0 ;
wxString s ;
s = wxT("<?xml version=\"1.0\" standalone=\"no\"?>") ; s = s + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\" ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\"> ")+ newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s.Printf ( wxT("<svg width=\"%.2gcm\" height=\"%.2gcm\" viewBox=\"0 0 %d %d \"> \n"), float(Width)/dpi*2.54, float(Height)/dpi*2.54, Width, Height );
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("<title>SVG Picture created as ") + wxFileNameFromPath(f) + wxT(" </title>") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxString (wxT("<desc>Picture generated by wxSVG ")) + wxSVGVersion + wxT(" </desc>")+ newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
s = wxT("<g style=\"fill:black; stroke:black; stroke-width:1\">") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
}
// constructors
wxSVGFileDC::wxSVGFileDC (wxString f)
{
// quarter 640x480 screen display at 72 dpi
Init (f,320,240,72.0);
};
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height)
{
Init (f,Width,Height,72.0);
};
wxSVGFileDC::wxSVGFileDC (wxString f, int Width, int Height, float dpi)
{
Init (f,Width,Height,dpi);
};
wxSVGFileDC::~wxSVGFileDC()
{
wxString s = wxT("</g> \n</svg> \n") ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
delete m_outfile ;
}
//////////////////////////////////////////////////////////////////////////////////////////
void wxSVGFileDC::DoDrawLine (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
{
if (m_graphics_changed) NewGraphics ();
wxString s ;
s.Printf ( wxT("<path d=\"M%d %d L%d %d\" /> \n"), x1,y1,x2,y2 );
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawLine Call executed")) ;
CalcBoundingBox(x1, y1) ;
CalcBoundingBox(x2, y2) ;
return;
};
void wxSVGFileDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset , wxCoord yoffset )
{
for ( int i = 1; i < n ; i++ )
{
DoDrawLine ( points [i-1].x + xoffset, points [i-1].y + yoffset,
points [ i ].x + xoffset, points [ i ].y + yoffset ) ;
}
}
void wxSVGFileDC::DoDrawPoint (wxCoord x1, wxCoord y1)
{
wxString s;
if (m_graphics_changed) NewGraphics ();
s = wxT("<g style = \"stroke-linecap:round;\" > ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
DrawLine ( x1,y1,x1,y1 );
s = wxT("</g>");
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
}
void wxSVGFileDC::DoDrawCheckMark(wxCoord x1, wxCoord y1, wxCoord width, wxCoord height)
{
wxDCBase::DoDrawCheckMark (x1,y1,width,height) ;
}
void wxSVGFileDC::DoDrawText(const wxString& text, wxCoord x1, wxCoord y1)
{
DoDrawRotatedText(text, x1,y1,0.0);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawText Call executed")) ;
}
void wxSVGFileDC::DoDrawRotatedText(const wxString& sText, wxCoord x, wxCoord y, double angle)
{
//known bug; if the font is drawn in a scaled DC, it will not behave exactly as wxMSW
if (m_graphics_changed) NewGraphics ();
wxString s, sTmp;
// calculate bounding box
wxCoord w, h, desc ;
DoGetTextExtent(sText, &w, &h, &desc);
double rad = DegToRad(angle);
// wxT("upper left") and wxT("upper right")
CalcBoundingBox(x, y);
CalcBoundingBox(x + w*cos(rad), y - h*sin(rad));
// wxT("bottom left") and wxT("bottom right")
x += (wxCoord)(h*sin(rad));
y += (wxCoord)(h*cos(rad));
CalcBoundingBox(x, y);
CalcBoundingBox(x + h*sin(rad), y + h*cos(rad));
if (m_backgroundMode == wxSOLID)
{
// draw background first
// just like DoDrawRectangle except we pass the text color to it and set the border to a 1 pixel wide text background
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::Draw Rotated Text Call plotting text background")) ;
sTmp.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" "), x,y+desc-h, w, h );
s = sTmp + wxT("style=\"fill:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
s = s + wxT("stroke-width:1; stroke:#") + wxColStr (m_textBackgroundColour) + wxT("; ") ;
sTmp.Printf ( wxT("\" transform=\"rotate( %.2g %d %d ) \">"), -angle, x,y ) ;
s = s + sTmp + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
}
//now do the text itself
s.Printf (wxT(" <text x=\"%d\" y=\"%d\" "),x,y );
sTmp = m_font.GetFaceName () ;
if (sTmp.Len () > 0) s = s + wxT("style=\"font-family:") + sTmp + wxT("; ");
else s = s + wxT("style=\" ") ;
wxString fontweights [3] = { wxT("normal"), wxT("lighter"), wxT("bold") };
s = s + wxT("font-weight:") + fontweights[m_font.GetWeight() - wxNORMAL] + semicolon + space;
wxString fontstyles [5] = { wxT("normal"), wxT("style error"), wxT("style error"), wxT("italic"), wxT("oblique") };
s = s + wxT("font-style:") + fontstyles[m_font.GetStyle() - wxNORMAL] + semicolon + space;
sTmp.Printf (wxT("font-size:%dpt; fill:#"), m_font.GetPointSize () );
s = s + sTmp ;
s = s + wxColStr (m_textForegroundColour) + wxT("; stroke:#") + wxColStr (m_textForegroundColour) + wxT("; ") ;
sTmp.Printf ( wxT("stroke-width:0;\" transform=\"rotate( %.2g %d %d ) \" >"), -angle, x,y ) ;
s = s + sTmp + sText + wxT("</text> ") + newline ;
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DrawRotatedText Call executed")) ;
}
void wxSVGFileDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
DoDrawRoundedRectangle(x, y, width, height, 0) ;
}
void wxSVGFileDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
{
if (m_graphics_changed) NewGraphics ();
wxString s ;
s.Printf ( wxT(" <rect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" rx=\"%.2g\" "),
x, y, width, height, radius );
s = s + wxT(" /> ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawRoundedRectangle Call executed")) ;
CalcBoundingBox(x, y) ;
CalcBoundingBox(x + width, y + height) ;
}
void wxSVGFileDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset,int fillStyle)
{
if (m_graphics_changed) NewGraphics ();
wxString s, sTmp ;
s = wxT("<polygon style=\"") ;
if ( fillStyle == wxODDEVEN_RULE )
s = s + wxT("fill-rule:evenodd; ");
else
s = s + wxT("fill-rule:nonzero; ");
s = s + wxT("\" \npoints=\"") ;
for (int i = 0; i < n; i++)
{
sTmp.Printf ( wxT("%d,%d"), points [i].x+xoffset, points[i].y+yoffset );
s = s + sTmp + newline ;
CalcBoundingBox ( points [i].x+xoffset, points[i].y+yoffset);
}
s = s + wxT("\" /> ") ;
s = s + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawPolygon Call executed")) ;
}
void wxSVGFileDC::DoDrawEllipse (wxCoord x, wxCoord y, wxCoord width, wxCoord height)
{
if (m_graphics_changed) NewGraphics ();
int rh = height /2 ;
int rw = width /2 ;
wxString s;
s.Printf ( wxT("<ellipse cx=\"%d\" cy=\"%d\" rx=\"%d\" ry=\"%d\" "), x+rw,y+rh, rw, rh );
s = s + wxT(" /> ") + newline ;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipse Call executed")) ;
CalcBoundingBox(x, y) ;
CalcBoundingBox(x + width, y + height) ;
}
void wxSVGFileDC::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc)
{
/* Draws an arc of a circle, centred on (xc, yc), with starting point
(x1, y1) and ending at (x2, y2). The current pen is used for the outline
and the current brush for filling the shape.
The arc is drawn in an anticlockwise direction from the start point to
the end point.
Might be better described as Pie drawing */
if (m_graphics_changed) NewGraphics ();
wxString s ;
// we need the radius of the circle which has two estimates
double r1 = sqrt ( double( (x1-xc)*(x1-xc) ) + double( (y1-yc)*(y1-yc) ) );
double r2 = sqrt ( double( (x2-xc)*(x2-xc) ) + double( (y2-yc)*(y2-yc) ) );
wxASSERT_MSG( (fabs ( r2-r1 ) <= 3), wxT("wxSVGFileDC::DoDrawArc Error in getting radii of circle")) ;
if ( fabs ( r2-r1 ) > 3 ) //pixels
{
s = wxT("<!--- wxSVGFileDC::DoDrawArc Error in getting radii of circle --> \n") ;
m_outfile->Write (s.c_str(), s.Len() ) ;
}
double theta1 = atan2(yc-y1,x1-xc);
if ( theta1 < 0 ) theta1 = theta1 + 3.14 * 2;
double theta2 = atan2(yc-y2, x2-xc);
if ( theta2 < 0 ) theta2 = theta2 + 3.14 * 2;
if ( theta2 < theta1 ) theta2 = theta2 + 3.14 *2 ;
int fArc ; // flag for large or small arc 0 means less than 180 degrees
if ( fabs((theta2 - theta1) > 3.14 )) fArc = 1; else fArc = 0 ;
int fSweep = 0 ; // flag for sweep always 0
s.Printf ( wxT("<path d=\"M%d %d A%.2g %.2g 0.0 %d %d %d %d L%d %d z "),
x1,y1, r1, r2, fArc, fSweep, x2, y2, xc, yc );
// the z means close the path and fill
s = s + wxT(" \" /> ") + newline ;
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawArc Call executed")) ;
}
void wxSVGFileDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
{
/*
Draws an arc of an ellipse. The current pen is used for drawing the arc
and the current brush is used for drawing the pie. This function is
currently only available for X window and PostScript device contexts.
x and y specify the x and y coordinates of the upper-left corner of the
rectangle that contains the ellipse.
width and height specify the width and height of the rectangle that
contains the ellipse.
start and end specify the start and end of the arc relative to the
three-o'clock position from the center of the rectangle. Angles are
specified in degrees (360 is a complete circle). Positive values mean
counter-clockwise motion. If start is equal to end, a complete ellipse
will be drawn. */
//known bug: SVG draws with the current pen along the radii, but this does not happen in wxMSW
if (m_graphics_changed) NewGraphics ();
wxString s ;
//radius
double rx = w / 2 ;
double ry = h / 2 ;
// center
double xc = x + rx ;
double yc = y + ry ;
double xs, ys, xe, ye ;
xs = xc + rx * cos (DegToRad(sa)) ;
xe = xc + rx * cos (DegToRad(ea)) ;
ys = yc - ry * sin (DegToRad(sa)) ;
ye = yc - ry * sin (DegToRad(ea)) ;
///now same as circle arc...
double theta1 = atan2(ys-yc, xs-xc);
double theta2 = atan2(ye-yc, xe-xc);
int fArc ; // flag for large or small arc 0 means less than 180 degrees
if ( (theta2 - theta1) > 0 ) fArc = 1; else fArc = 0 ;
int fSweep ;
if ( fabs( (theta2 - theta1) > 3.14)) fSweep = 1; else fSweep = 0 ;
s.Printf ( wxT("<path d=\"M%d %d A%d %d 0.0 %d %d %d %d L %d %d z "),
int(xs), int(ys), int(rx), int(ry),
fArc, fSweep, int(xe), int(ye), int(xc), int(yc) );
s = s + wxT(" \" /> ") + newline ;
if (m_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok ();
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawEllipticArc Call executed")) ;
}
void wxSVGFileDC::DoGetTextExtent(const wxString& string, wxCoord *w, wxCoord *h, wxCoord *descent , wxCoord *externalLeading , wxFont *font) const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
if ( font != NULL ) sDC.SetFont ( *font );
sDC.GetTextExtent(string, w, h, descent, externalLeading );
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetTextExtent Call executed")) ;
}
wxCoord wxSVGFileDC::GetCharHeight() const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharHeight Call executing")) ;
return ( sDC.GetCharHeight() );
}
wxCoord wxSVGFileDC::GetCharWidth() const
{
wxScreenDC sDC ;
sDC.SetFont (m_font);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::GetCharWidth Call executing")) ;
return ( sDC.GetCharWidth() ) ;
}
/// Set Functions /////////////////////////////////////////////////////////////////
void wxSVGFileDC::SetBackground( const wxBrush &brush )
{
m_backgroundBrush = brush;
return;
}
void wxSVGFileDC::SetBackgroundMode( int mode )
{
m_backgroundMode = mode;
return;
}
void wxSVGFileDC::SetBrush(const wxBrush& brush)
{
m_brush = brush ;
m_graphics_changed = TRUE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetBrush Call executed")) ;
}
void wxSVGFileDC::SetPen(const wxPen& pen)
{
// width, color, ends, joins : currently implemented
// dashes, stipple : not implemented
m_pen = pen ;
m_graphics_changed = TRUE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetPen Call executed")) ;
}
void wxSVGFileDC::NewGraphics ()
{
int w = m_pen.GetWidth ();
wxColour c = m_pen.GetColour () ;
wxString s, sBrush, sPenCap, sPenJoin, sPenStyle, sLast, sWarn;
sBrush = wxT("</g>\n<g style=\"") + wxBrushString ( m_brush.GetColour (), m_brush.GetStyle () )
+ wxT(" stroke:#") + wxColStr (c) + wxT("; ") ;
switch ( m_pen.GetCap () )
{
case wxCAP_PROJECTING :
sPenCap = wxT("stroke-linecap:square; ") ;
break ;
case wxCAP_BUTT :
sPenCap = wxT("stroke-linecap:butt; ") ;
break ;
case wxCAP_ROUND :
default :
sPenCap = wxT("stroke-linecap:round; ") ;
};
switch ( m_pen.GetJoin () )
{
case wxJOIN_BEVEL :
sPenJoin = wxT("stroke-linejoin:bevel; ") ;
break ;
case wxJOIN_MITER :
sPenJoin = wxT("stroke-linejoin:miter; ") ;
break ;
case wxJOIN_ROUND :
default :
sPenJoin = wxT("stroke-linejoin:round; ") ;
};
switch ( m_pen.GetStyle () )
{
case wxSOLID :
sPenStyle = wxT("stroke-opacity:1.0; stroke-opacity:1.0; ") ;
break ;
case wxTRANSPARENT :
sPenStyle = wxT("stroke-opacity:0.0; stroke-opacity:0.0; ") ;
break ;
default :
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::SetPen Call called to set a Style which is not available")) ;
sWarn = sWarn + wxT("<!--- wxSVGFileDC::SetPen Call called to set a Style which is not available --> \n") ;
}
sLast.Printf ( wxT("stroke-width:%d\" \n transform=\"translate(%.2g %.2g) scale(%.2g %.2g)\">"),
w, m_OriginX, m_OriginY, m_scaleX, m_scaleY );
s = sBrush + sPenCap + sPenJoin + sPenStyle + sLast + newline + sWarn;
m_outfile->Write (s.c_str(), s.Len() ) ;
m_OK = m_outfile->Ok ();
m_graphics_changed = FALSE ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::NewGraphics Call executed")) ;
}
void wxSVGFileDC::SetFont(const wxFont& font)
{
m_font = font ;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::SetFont Call executed")) ;
}
void wxSVGFileDC::ComputeScaleAndOrigin()
{
m_scaleX = m_logicalScaleX * m_userScaleX;
m_scaleY = m_logicalScaleY * m_userScaleY;
m_OriginX = m_logicalOriginX * m_logicalScaleX + m_deviceOriginX ;
m_OriginY = m_logicalOriginY * m_logicalScaleY + m_deviceOriginY ;
m_graphics_changed = TRUE;
}
int wxSVGFileDC::GetMapMode()
{
return m_mappingMode ;
}
void wxSVGFileDC::SetMapMode( int mode )
{
switch (mode)
{
case wxMM_TWIPS:
SetLogicalScale( twips2mm*m_mm_to_pix_x, twips2mm*m_mm_to_pix_y );
break;
case wxMM_POINTS:
SetLogicalScale( pt2mm*m_mm_to_pix_x, pt2mm*m_mm_to_pix_y );
break;
case wxMM_METRIC:
SetLogicalScale( m_mm_to_pix_x, m_mm_to_pix_y );
break;
case wxMM_LOMETRIC:
SetLogicalScale( m_mm_to_pix_x/10.0, m_mm_to_pix_y/10.0 );
break;
default:
case wxMM_TEXT:
SetLogicalScale( 1.0, 1.0 );
break;
}
m_mappingMode = mode;
/* we don't do this mega optimisation
if (mode != wxMM_TEXT)
{
m_needComputeScaleX = TRUE;
m_needComputeScaleY = TRUE;
}
*/
}
void wxSVGFileDC::GetUserScale(double *x, double *y) const
{
*x = m_userScaleX ;
*y = m_userScaleY ;
}
void wxSVGFileDC::SetUserScale( double x, double y )
{
// allow negative ? -> no
m_userScaleX = x;
m_userScaleY = y;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetLogicalScale( double x, double y )
{
// allow negative ?
m_logicalScaleX = x;
m_logicalScaleY = y;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetLogicalOrigin( wxCoord x, wxCoord y )
{
// is this still correct ?
m_logicalOriginX = x * m_signX;
m_logicalOriginY = y * m_signY;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetDeviceOrigin( wxCoord x, wxCoord y )
{
// only wxPostScripDC has m_signX = -1,
m_deviceOriginX = x;
m_deviceOriginY = y;
ComputeScaleAndOrigin();
}
void wxSVGFileDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
{
// only wxPostScripDC has m_signX = -1,
m_signX = (xLeftRight ? 1 : -1);
m_signY = (yBottomUp ? -1 : 1);
ComputeScaleAndOrigin();
}
// export a bitmap as a raster image in png
bool wxSVGFileDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
wxDC* source, wxCoord xsrc, wxCoord ysrc,
int logicalFunc /*= wxCOPY*/, bool useMask /*= FALSE*/,
wxCoord /*xsrcMask = -1*/, wxCoord /*ysrcMask = -1*/)
{
if (logicalFunc != wxCOPY)
{
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested nonCopy mode; this is not possible")) ;
return FALSE ;
}
if (useMask != FALSE)
{
wxASSERT_MSG(FALSE, wxT("wxSVGFileDC::DoBlit Call requested False mask ; this is not possible")) ;
return FALSE ;
}
wxBitmap myBitmap (width, height) ;
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
memDC.Blit(0, 0, width, height, source, xsrc, ysrc);
memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, xdest, ydest);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoBlit Call executed")) ;
return FALSE ;
}
void wxSVGFileDC::DoDrawIcon(const class wxIcon & myIcon, wxCoord x, wxCoord y)
{
wxBitmap myBitmap (myIcon.GetWidth(), myIcon.GetHeight() ) ;
wxMemoryDC memDC;
memDC.SelectObject( myBitmap );
memDC.DrawIcon(myIcon,0,0);
memDC.SelectObject( wxNullBitmap );
DoDrawBitmap(myBitmap, x, y);
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawIcon Call executed")) ;
return ;
}
void wxSVGFileDC::DoDrawBitmap(const class wxBitmap & bmp, wxCoord x, wxCoord y , bool bTransparent /*=0*/ )
{
if (m_graphics_changed) NewGraphics ();
wxString sTmp, s, sPNG ;
wxImage::AddHandler(new wxPNGHandler);
// create suitable file name
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
while (wxFile::Exists(sPNG) )
{
m_sub_images ++ ;
sTmp.Printf ( wxT("_image%d.png"), m_sub_images);
sPNG = m_filename.BeforeLast(wxT('.')) + sTmp;
}
//create copy of bitmap (wxGTK doesn't like saving a constant bitmap)
wxBitmap myBitmap = bmp ;
//save it
bool bPNG_OK = myBitmap.SaveFile(sPNG,wxBITMAP_TYPE_PNG);
// refrence the bitmap from the SVG doc
int w = myBitmap.GetWidth();
int h = myBitmap.GetHeight();
sTmp.Printf ( wxT(" <image x=\"%d\" y=\"%d\" width=\"%dpx\" height=\"%dpx\" "), x,y,w,h );
s = s + sTmp ;
sTmp.Printf ( wxT(" xlink:href=\"%s\"> \n"), sPNG.c_str() );
s = s + sTmp + wxT("<title>Image from wxSVG</title> </image>") + newline;
if (m_OK && bPNG_OK)
{
m_outfile->Write (s.c_str(), s.Len() ) ;
}
m_OK = m_outfile->Ok () && bPNG_OK;
wxASSERT_MSG(!wxSVG_DEBUG, wxT("wxSVGFileDC::DoDrawBitmap Call executed")) ;
return ;
}
// ---------------------------------------------------------------------------
// coordinates transformations
// ---------------------------------------------------------------------------
wxCoord wxSVGFileDC::DeviceToLogicalX(wxCoord x) const
{
return XDEV2LOG(x);
}
wxCoord wxSVGFileDC::DeviceToLogicalY(wxCoord y) const
{
return YDEV2LOG(y);
}
wxCoord wxSVGFileDC::DeviceToLogicalXRel(wxCoord x) const
{
return XDEV2LOGREL(x);
}
wxCoord wxSVGFileDC::DeviceToLogicalYRel(wxCoord y) const
{
return YDEV2LOGREL(y);
}
wxCoord wxSVGFileDC::LogicalToDeviceX(wxCoord x) const
{
return XLOG2DEV(x);
}
wxCoord wxSVGFileDC::LogicalToDeviceY(wxCoord y) const
{
return YLOG2DEV(y);
}
wxCoord wxSVGFileDC::LogicalToDeviceXRel(wxCoord x) const
{
return XLOG2DEVREL(x);
}
wxCoord wxSVGFileDC::LogicalToDeviceYRel(wxCoord y) const
{
return YLOG2DEVREL(y);
}
#ifdef __BORLANDC__
#pragma warn .rch
#pragma warn .ccc
#endif