[Bf-extensions-cvs] [f5401b5] master: Fix T49476: SVG importer distorts the color information

Sergey Sharybin noreply at git.blender.org
Fri Oct 14 16:36:36 CEST 2016


Commit: f5401b5aa1f0bbca88488a6aa6924477ffceea5b
Author: Sergey Sharybin
Date:   Fri Oct 14 16:35:48 2016 +0200
Branches: master
https://developer.blender.org/rBAf5401b5aa1f0bbca88488a6aa6924477ffceea5b

Fix T49476: SVG importer distorts the color information

This is quite weak solution and not happy with it, but should cover
most of the use-cases.

===================================================================

M	io_curve_svg/import_svg.py

===================================================================

diff --git a/io_curve_svg/import_svg.py b/io_curve_svg/import_svg.py
index 2f137c2..dd5b6a8 100644
--- a/io_curve_svg/import_svg.py
+++ b/io_curve_svg/import_svg.py
@@ -45,6 +45,12 @@ SVGUnits = {"": 1.0,
 SVGEmptyStyles = {'useFill': None,
                   'fill': None}
 
+def srgb_to_linearrgb(c):
+    if c < 0.04045:
+        return 0.0 if c < 0.0 else c * (1.0 / 12.92);
+    else:
+        return pow((c + 0.055) * (1.0 / 1.055), 2.4);
+
 
 def SVGParseFloat(s, i=0):
     """
@@ -283,8 +289,16 @@ def SVGGetMaterial(color, context):
     else:
         return None
 
+    diffuse_color = ([x / 255.0 for x in diff])
+
+    if context['do_colormanage']:
+        diffuse_color[0] = srgb_to_linearrgb(diffuse_color[0])
+        diffuse_color[1] = srgb_to_linearrgb(diffuse_color[1])
+        diffuse_color[2] = srgb_to_linearrgb(diffuse_color[2])
+
     mat = bpy.data.materials.new(name='SVGMat')
-    mat.diffuse_color = ([x / 255.0 for x in diff])
+    mat.diffuse_color = diffuse_color
+    mat.diffuse_intensity = 1.0
 
     materials[color] = mat
 
@@ -1796,7 +1810,7 @@ class SVGLoader(SVGGeometryContainer):
 
         return None
 
-    def __init__(self, filepath):
+    def __init__(self, filepath, do_colormanage):
         """
         Initialize SVG loader
         """
@@ -1816,7 +1830,8 @@ class SVGLoader(SVGGeometryContainer):
                          'matrix': m,
                          'materials': {},
                          'styles': [None],
-                         'style': None}
+                         'style': None,
+                         'do_colormanage': do_colormanage}
 
         super().__init__(node, self._context)
 
@@ -1853,7 +1868,7 @@ def parseAbstractNode(node, context):
     return None
 
 
-def load_svg(filepath):
+def load_svg(filepath, do_colormanage):
     """
     Load specified SVG file
     """
@@ -1861,7 +1876,7 @@ def load_svg(filepath):
     if bpy.ops.object.mode_set.poll():
         bpy.ops.object.mode_set(mode='OBJECT')
 
-    loader = SVGLoader(filepath)
+    loader = SVGLoader(filepath, do_colormanage)
     loader.parse()
     loader.createGeom(False)
 
@@ -1870,8 +1885,9 @@ def load(operator, context, filepath=""):
 
     # error in code should raise exceptions but loading
     # non SVG files can give useful messages.
+    do_colormanage = context.scene.display_settings.display_device != 'NONE'
     try:
-        load_svg(filepath)
+        load_svg(filepath, do_colormanage)
     except (xml.parsers.expat.ExpatError, UnicodeEncodeError) as e:
         import traceback
         traceback.print_exc()



More information about the Bf-extensions-cvs mailing list