Embedding SVG inside an SVG


Using SVG for charting purposes is gratifying. Both completely new kinds of charts and those resembling the obsolete CT Chart Array-command. Besides enhancing the chart-capabilities another requirement was to include the customers-logo as part of the chart. First I thought about parsing that logo.svg … sounds like too much work.

Histogramme und Business-Graphik in SVG zu erstellen führt zu guten Ergebnissen. Einerseits sollte der obsolete CT Chart Array-Befehl ersetzt werden, andererseits komplett fachspezifische Chart-Typen möglich machen. Eine Anforderung war, das Logo des Kunden in den Chart einzubetten. Erst dachte ich, das Logo.svg zu parsen … doch hört sich das nach zu viel Arbeit an.

Oct 24, 2017: resulting images added

embed SVG inside SVG

$svgPictureRef:=SVG_New_embedded_image ($svgCopyrightLayer_Ref;$interPicture)
funktioniert, doch erzeugt es ein zu gering aufgelöstes PNG im SVG.

Danach experimentierte ich mit dem definierten Codec „svg“
$svgPictureRef:=SVG_New_embedded_image ($svgCopyrightLayer_Ref;$interPicture;5;0;“svg“)
Kam nichts bei raus.

Glücklicherweise habe ich den Source als Handbuch zur Hand. Mit Codec ist eigentlich die Extension gemeint, also „.svg“. Diese Zeile Code
$svgPictureRef:=SVG_New_embedded_image ($svgCopyrightLayer_Ref;$interPicture;5;0;“.svg“)
liefert genau was ich will: 4D kann das SVG im SVG rendern.

Alle anderen SVG-Renderer scheitern am base64-codierten SVG im SVG. Mich stört das nicht, solange 4D hochauflösende JPEG und PNG aus dem SVG erzeugt.

$svgPictureRef:=SVG_New_embedded_image ($svgCopyrightLayer_Ref;$interPicture)
results in a low-resolution PNG inside the SVG.

Next I tried the defined codec-option „svg“
$svgPictureRef:=SVG_New_embedded_image ($svgCopyrightLayer_Ref;$interPicture;5;0;“svg“)
to no avail.

Finally I checked my manual of the source. Actually codec means extension, ergo „.svg“. This line of code
$svgPictureRef:=SVG_New_embedded_image ($svgCopyrightLayer_Ref;$interPicture;5;0;“.svg“)
delivers what I was looking for: 4D renders SVG inside SVG perfectly well.

All other SVG-renderer fail to render the base64-encoded SVG inside a SVG. Doesn’t bother me, as long as 4D delievers high-resolution JPEG and PNG from that kind of SVG.


I ran the code 4 times using these extensions: .svg, svg, .png, png as codec-parameter to SVG_New_embedded_image.  Then I exported the picture containing the SVG into JPEG, which is another story. Finally I open the jpegs using GraphicConverter, enlarged to 400%, shot screenshots and cut the same small peace out of every screenshot.

Here are the JPEG-results at 300 dpi * for comparison:

first what’s all about: send „.svg“-extension as codec to SVG_New_embedded_image

.svg aka treating as extension

second what seemed obvious at first place: send „.png“-extension as codec to SVG_New_embedded_image

.png aka treating as extension

just for the sake of completeness: send any codec, both „svg“ and „png“ to SVG_New_embedded_image

no dot, both SVG and PNG aka treating as codec

Yes, just an empty white area and I didn’t include the other one.

* wouldn’t have made sense to use the SVG, as no other SVG-renderer than 4D renders embedded, base64-encoded SVGs at all.