svn merge ^/trunk/blender -r42009:42053
authorCampbell Barton <ideasman42@gmail.com>
Tue, 22 Nov 2011 11:51:42 +0000 (11:51 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 22 Nov 2011 11:51:42 +0000 (11:51 +0000)
255 files changed:
intern/cycles/blender/addon/__init__.py
intern/cycles/blender/blender_shader.cpp
intern/cycles/kernel/kernel_bvh.h
intern/cycles/util/util_math.h
release/datafiles/fonts/droidsans.ttf.gz
release/scripts/modules/addon_utils.py
release/scripts/presets/tracking_camera/Sony_A55.py
release/scripts/startup/bl_operators/clip.py
release/scripts/startup/bl_ui/properties_render.py
release/scripts/startup/bl_ui/space_clip.py
release/scripts/startup/bl_ui/space_view3d.py
source/blender/blenkernel/BKE_image.h
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/BKE_writeavi.h
source/blender/blenkernel/intern/bmfont.c
source/blender/blenkernel/intern/dynamicpaint.c
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/movieclip.c
source/blender/blenkernel/intern/node.c
source/blender/blenkernel/intern/ocean.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/sequencer.c
source/blender/blenkernel/intern/subsurf_ccg.c
source/blender/blenkernel/intern/tracking.c
source/blender/blenkernel/intern/writeavi.c
source/blender/blenkernel/intern/writeffmpeg.c
source/blender/blenlib/BLI_string_utf8.h
source/blender/blenlib/intern/path_util.c
source/blender/blenlib/intern/string_utf8.c
source/blender/blenloader/intern/readfile.c
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_layout.c
source/blender/editors/interface/interface_regions.c
source/blender/editors/interface/interface_utils.c
source/blender/editors/mesh/loopcut.c
source/blender/editors/object/object_bake.c
source/blender/editors/object/object_edit.c
source/blender/editors/render/render_internal.c
source/blender/editors/render/render_opengl.c
source/blender/editors/render/render_shading.c
source/blender/editors/screen/screendump.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/sound/sound_ops.c
source/blender/editors/space_clip/clip_buttons.c
source/blender/editors/space_file/file_panels.c
source/blender/editors/space_image/image_buttons.c
source/blender/editors/space_image/image_ops.c
source/blender/editors/space_node/drawnode.c
source/blender/editors/space_node/node_draw.c
source/blender/editors/space_node/node_edit.c
source/blender/editors/space_view3d/drawobject.c
source/blender/gpu/CMakeLists.txt
source/blender/gpu/GPU_material.h
source/blender/gpu/SConscript
source/blender/gpu/intern/gpu_codegen.c
source/blender/gpu/intern/gpu_shader_material.glsl
source/blender/gpu/intern/gpu_shader_material.glsl.c
source/blender/imbuf/IMB_imbuf_types.h
source/blender/imbuf/intern/IMB_anim.h
source/blender/imbuf/intern/IMB_filter.h
source/blender/imbuf/intern/allocimbuf.c
source/blender/imbuf/intern/anim_movie.c
source/blender/imbuf/intern/filter.c
source/blender/imbuf/intern/imbuf_cocoa.m
source/blender/imbuf/intern/iris.c
source/blender/imbuf/intern/jp2.c
source/blender/imbuf/intern/jpeg.c
source/blender/imbuf/intern/openexr/openexr_api.cpp
source/blender/imbuf/intern/png.c
source/blender/imbuf/intern/scaling.c
source/blender/imbuf/intern/targa.c
source/blender/imbuf/intern/thumbs.c
source/blender/imbuf/intern/tiff.c
source/blender/makesdna/DNA_node_types.h
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/RNA_access.h
source/blender/makesrna/RNA_enum_types.h
source/blender/makesrna/intern/rna_armature.c
source/blender/makesrna/intern/rna_brush.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_fcurve.c
source/blender/makesrna/intern/rna_fluidsim.c
source/blender/makesrna/intern/rna_image.c
source/blender/makesrna/intern/rna_image_api.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_property.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_scene_api.c
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_texture_api.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/modifiers/intern/MOD_fluidsim_util.c
source/blender/modifiers/intern/MOD_ocean.c
source/blender/nodes/NOD_composite.h
source/blender/nodes/NOD_shader.h
source/blender/nodes/NOD_texture.h
source/blender/nodes/composite/node_composite_tree.c
source/blender/nodes/composite/node_composite_util.c
source/blender/nodes/composite/node_composite_util.h
source/blender/nodes/composite/nodes/node_composite_alphaOver.c
source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
source/blender/nodes/composite/nodes/node_composite_blur.c
source/blender/nodes/composite/nodes/node_composite_brightness.c
source/blender/nodes/composite/nodes/node_composite_channelMatte.c
source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
source/blender/nodes/composite/nodes/node_composite_colorMatte.c
source/blender/nodes/composite/nodes/node_composite_colorSpill.c
source/blender/nodes/composite/nodes/node_composite_colorbalance.c
source/blender/nodes/composite/nodes/node_composite_common.c
source/blender/nodes/composite/nodes/node_composite_composite.c
source/blender/nodes/composite/nodes/node_composite_crop.c
source/blender/nodes/composite/nodes/node_composite_curves.c
source/blender/nodes/composite/nodes/node_composite_defocus.c
source/blender/nodes/composite/nodes/node_composite_diffMatte.c
source/blender/nodes/composite/nodes/node_composite_dilate.c
source/blender/nodes/composite/nodes/node_composite_directionalblur.c
source/blender/nodes/composite/nodes/node_composite_displace.c
source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
source/blender/nodes/composite/nodes/node_composite_filter.c
source/blender/nodes/composite/nodes/node_composite_flip.c
source/blender/nodes/composite/nodes/node_composite_gamma.c
source/blender/nodes/composite/nodes/node_composite_glare.c
source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
source/blender/nodes/composite/nodes/node_composite_huecorrect.c
source/blender/nodes/composite/nodes/node_composite_idMask.c
source/blender/nodes/composite/nodes/node_composite_image.c
source/blender/nodes/composite/nodes/node_composite_invert.c
source/blender/nodes/composite/nodes/node_composite_lensdist.c
source/blender/nodes/composite/nodes/node_composite_levels.c
source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
source/blender/nodes/composite/nodes/node_composite_mapUV.c
source/blender/nodes/composite/nodes/node_composite_mapValue.c
source/blender/nodes/composite/nodes/node_composite_math.c
source/blender/nodes/composite/nodes/node_composite_mixrgb.c
source/blender/nodes/composite/nodes/node_composite_movieclip.c
source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
source/blender/nodes/composite/nodes/node_composite_normal.c
source/blender/nodes/composite/nodes/node_composite_normalize.c
source/blender/nodes/composite/nodes/node_composite_outputFile.c
source/blender/nodes/composite/nodes/node_composite_premulkey.c
source/blender/nodes/composite/nodes/node_composite_rgb.c
source/blender/nodes/composite/nodes/node_composite_rotate.c
source/blender/nodes/composite/nodes/node_composite_scale.c
source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
source/blender/nodes/composite/nodes/node_composite_setalpha.c
source/blender/nodes/composite/nodes/node_composite_splitViewer.c
source/blender/nodes/composite/nodes/node_composite_stabilize2d.c
source/blender/nodes/composite/nodes/node_composite_texture.c
source/blender/nodes/composite/nodes/node_composite_tonemap.c
source/blender/nodes/composite/nodes/node_composite_transform.c
source/blender/nodes/composite/nodes/node_composite_translate.c
source/blender/nodes/composite/nodes/node_composite_valToRgb.c
source/blender/nodes/composite/nodes/node_composite_value.c
source/blender/nodes/composite/nodes/node_composite_vecBlur.c
source/blender/nodes/composite/nodes/node_composite_viewer.c
source/blender/nodes/composite/nodes/node_composite_zcombine.c
source/blender/nodes/intern/node_common.c
source/blender/nodes/intern/node_exec.c
source/blender/nodes/intern/node_util.c
source/blender/nodes/intern/node_util.h
source/blender/nodes/shader/node_shader_tree.c
source/blender/nodes/shader/node_shader_util.c
source/blender/nodes/shader/node_shader_util.h
source/blender/nodes/shader/nodes/node_shader_add_shader.c
source/blender/nodes/shader/nodes/node_shader_attribute.c
source/blender/nodes/shader/nodes/node_shader_background.c
source/blender/nodes/shader/nodes/node_shader_bsdf_anisotropic.c
source/blender/nodes/shader/nodes/node_shader_bsdf_diffuse.c
source/blender/nodes/shader/nodes/node_shader_bsdf_glass.c
source/blender/nodes/shader/nodes/node_shader_bsdf_glossy.c
source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.c
source/blender/nodes/shader/nodes/node_shader_bsdf_transparent.c
source/blender/nodes/shader/nodes/node_shader_bsdf_velvet.c
source/blender/nodes/shader/nodes/node_shader_camera.c
source/blender/nodes/shader/nodes/node_shader_common.c
source/blender/nodes/shader/nodes/node_shader_curves.c
source/blender/nodes/shader/nodes/node_shader_dynamic.c
source/blender/nodes/shader/nodes/node_shader_emission.c
source/blender/nodes/shader/nodes/node_shader_fresnel.c
source/blender/nodes/shader/nodes/node_shader_geom.c
source/blender/nodes/shader/nodes/node_shader_geometry.c
source/blender/nodes/shader/nodes/node_shader_holdout.c
source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
source/blender/nodes/shader/nodes/node_shader_invert.c
source/blender/nodes/shader/nodes/node_shader_layer_weight.c
source/blender/nodes/shader/nodes/node_shader_light_path.c
source/blender/nodes/shader/nodes/node_shader_mapping.c
source/blender/nodes/shader/nodes/node_shader_material.c
source/blender/nodes/shader/nodes/node_shader_math.c
source/blender/nodes/shader/nodes/node_shader_mixRgb.c
source/blender/nodes/shader/nodes/node_shader_mix_shader.c
source/blender/nodes/shader/nodes/node_shader_normal.c
source/blender/nodes/shader/nodes/node_shader_output.c
source/blender/nodes/shader/nodes/node_shader_output_lamp.c
source/blender/nodes/shader/nodes/node_shader_output_material.c
source/blender/nodes/shader/nodes/node_shader_output_world.c
source/blender/nodes/shader/nodes/node_shader_rgb.c
source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
source/blender/nodes/shader/nodes/node_shader_squeeze.c
source/blender/nodes/shader/nodes/node_shader_tex_coord.c
source/blender/nodes/shader/nodes/node_shader_tex_environment.c
source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
source/blender/nodes/shader/nodes/node_shader_tex_image.c
source/blender/nodes/shader/nodes/node_shader_tex_magic.c
source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
source/blender/nodes/shader/nodes/node_shader_tex_noise.c
source/blender/nodes/shader/nodes/node_shader_tex_sky.c
source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
source/blender/nodes/shader/nodes/node_shader_tex_wave.c
source/blender/nodes/shader/nodes/node_shader_texture.c
source/blender/nodes/shader/nodes/node_shader_valToRgb.c
source/blender/nodes/shader/nodes/node_shader_value.c
source/blender/nodes/shader/nodes/node_shader_vectMath.c
source/blender/nodes/shader/nodes/node_shader_volume_isotropic.c
source/blender/nodes/shader/nodes/node_shader_volume_transparent.c
source/blender/nodes/texture/node_texture_tree.c
source/blender/nodes/texture/node_texture_util.c
source/blender/nodes/texture/node_texture_util.h
source/blender/nodes/texture/nodes/node_texture_at.c
source/blender/nodes/texture/nodes/node_texture_bricks.c
source/blender/nodes/texture/nodes/node_texture_checker.c
source/blender/nodes/texture/nodes/node_texture_common.c
source/blender/nodes/texture/nodes/node_texture_compose.c
source/blender/nodes/texture/nodes/node_texture_coord.c
source/blender/nodes/texture/nodes/node_texture_curves.c
source/blender/nodes/texture/nodes/node_texture_decompose.c
source/blender/nodes/texture/nodes/node_texture_distance.c
source/blender/nodes/texture/nodes/node_texture_hueSatVal.c
source/blender/nodes/texture/nodes/node_texture_image.c
source/blender/nodes/texture/nodes/node_texture_invert.c
source/blender/nodes/texture/nodes/node_texture_math.c
source/blender/nodes/texture/nodes/node_texture_mixRgb.c
source/blender/nodes/texture/nodes/node_texture_output.c
source/blender/nodes/texture/nodes/node_texture_proc.c
source/blender/nodes/texture/nodes/node_texture_rotate.c
source/blender/nodes/texture/nodes/node_texture_scale.c
source/blender/nodes/texture/nodes/node_texture_texture.c
source/blender/nodes/texture/nodes/node_texture_translate.c
source/blender/nodes/texture/nodes/node_texture_valToNor.c
source/blender/nodes/texture/nodes/node_texture_valToRgb.c
source/blender/nodes/texture/nodes/node_texture_viewer.c
source/blender/quicktime/apple/qtkit_export.m
source/blender/quicktime/apple/quicktime_export.c
source/blender/render/extern/include/RE_pipeline.h
source/blender/render/intern/source/pipeline.c
source/blender/render/intern/source/rendercore.c
source/blender/windowmanager/intern/wm_keymap.c
source/blenderplayer/bad_level_call_stubs/stubs.c
source/creator/creator.c
source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
source/gameengine/GamePlayer/common/bmfont.cpp

index ccb04ee..a7a8a74 100644 (file)
@@ -43,7 +43,7 @@ from cycles import presets
 
 class CyclesRender(bpy.types.RenderEngine):
     bl_idname = 'CYCLES'
-    bl_label = "Cycles"
+    bl_label = "Cycles Render"
     bl_use_shading_nodes = True
 
     def __init__(self):
index a6ce0e9..cf8527b 100644 (file)
@@ -99,6 +99,9 @@ static float get_node_output_value(BL::Node b_node, const string& name)
 
 static void get_tex_mapping(TextureMapping *mapping, BL::TexMapping b_mapping)
 {
+       if(!b_mapping)
+               return;
+
        mapping->translation = get_float3(b_mapping.location());
        mapping->rotation = get_float3(b_mapping.rotation());
        mapping->scale = get_float3(b_mapping.scale());
@@ -110,6 +113,9 @@ static void get_tex_mapping(TextureMapping *mapping, BL::TexMapping b_mapping)
 
 static void get_tex_mapping(TextureMapping *mapping, BL::ShaderNodeMapping b_mapping)
 {
+       if(!b_mapping)
+               return;
+
        mapping->translation = get_float3(b_mapping.location());
        mapping->rotation = get_float3(b_mapping.rotation());
        mapping->scale = get_float3(b_mapping.scale());
index b5f59b9..e98bb15 100644 (file)
@@ -97,11 +97,7 @@ __device_inline void bvh_node_intersect(KernelGlobals *kg,
        float c1loz = nz.z * idir.z - ood.z;
        float c1hiz = nz.w * idir.z - ood.z;
 
-       float c0min_x = min(c0lox, c0hix);
-       float c0min_y = min(c0loy, c0hiy);
-       float c0min_z = min(c0loz, c0hiz);
-
-       float c0min = max4(c0min_x, c0min_y, c0min_z, 0.0f);
+       float c0min = max4(min(c0lox, c0hix), min(c0loy, c0hiy), min(c0loz, c0hiz), 0.0f);
        float c0max = min4(max(c0lox, c0hix), max(c0loy, c0hiy), max(c0loz, c0hiz), t);
        float c1lox = n1xy.x * idir.x - ood.x;
        float c1hix = n1xy.y * idir.x - ood.x;
index c0dd627..2f9e00d 100644 (file)
@@ -115,12 +115,12 @@ __device_inline double min(double a, double b)
 
 __device_inline float min4(float a, float b, float c, float d)
 {
-       return min(min(min(a, b), c), d);
+       return min(min(a, b), min(c, d));
 }
 
 __device_inline float max4(float a, float b, float c, float d)
 {
-       return max(max(max(a, b), c), d);
+       return max(max(a, b), max(c, d));
 }
 
 #ifndef __KERNEL_OPENCL__
index 1701612..9c70d31 100644 (file)
Binary files a/release/datafiles/fonts/droidsans.ttf.gz and b/release/datafiles/fonts/droidsans.ttf.gz differ
index 1bd218a..bcde4ce 100644 (file)
@@ -146,7 +146,10 @@ def modules(module_cache):
     for path in path_list:
 
         # force all contrib addons to be 'TESTING'
-        force_support = 'TESTING' if path.endswith("addons_contrib") else None
+        if path.endswith("addons_contrib") or path.endswith("addons_extern"):
+            force_support = 'TESTING'
+        else:
+            force_support = None
 
         for mod_name, mod_path in _bpy.path.module_names(path):
             modules_stale -= {mod_name}
index f3095c6..5805bfa 100644 (file)
@@ -2,7 +2,6 @@ import bpy
 camera = bpy.context.edit_movieclip.tracking.camera
 
 camera.sensor_width = 23.4
-camera.sensor_height = 15.6
 camera.units = 'MILLIMETERS'
 camera.focal_length = 24.0
 camera.pixel_aspect = 1
index 59c4f88..63b928c 100644 (file)
@@ -77,11 +77,11 @@ class CLIP_OT_track_to_empty(Operator):
         return {'FINISHED'}
 
 
-class CLIP_OT_tracks_to_mesh(Operator):
-    """Create vertex cloud using coordinates of tracks"""
+class CLIP_OT_bundles_to_mesh(Operator):
+    """Create vertex cloud using coordinates of reconstructed tracks"""
 
-    bl_idname = "clip.tracks_to_mesh"
-    bl_label = "Tracks to Mesh"
+    bl_idname = "clip.bundles_to_mesh"
+    bl_label = "3D Markers to Mesh"
     bl_options = {'UNDO', 'REGISTER'}
 
     @classmethod
index 145ae29..100f5b1 100644 (file)
@@ -452,66 +452,22 @@ class RENDER_PT_output(RenderButtonsPanel, Panel):
         layout = self.layout
 
         rd = context.scene.render
-        file_format = rd.file_format
+        image_settings = rd.image_settings
+        file_format = rd.image_settings.file_format
 
         layout.prop(rd, "filepath", text="")
 
         split = layout.split()
 
         col = split.column()
-        col.prop(rd, "file_format", text="")
-        col.row().prop(rd, "color_mode", text="Color", expand=True)
+        col.template_image_settings(rd.image_settings)
 
         col = split.column()
         col.prop(rd, "use_file_extension")
         col.prop(rd, "use_overwrite")
         col.prop(rd, "use_placeholder")
 
-        if file_format in {'AVI_JPEG', 'JPEG'}:
-            layout.prop(rd, "file_quality", slider=True)
-
-        if file_format == 'PNG':
-            layout.prop(rd, "file_quality", slider=True, text="Compression")
-
-        if file_format in {'OPEN_EXR', 'MULTILAYER'}:
-            row = layout.row()
-            row.prop(rd, "exr_codec", text="Codec")
-
-            if file_format == 'OPEN_EXR':
-                row = layout.row()
-                row.prop(rd, "use_exr_half")
-                row.prop(rd, "exr_zbuf")
-                row.prop(rd, "exr_preview")
-
-        elif file_format == 'JPEG2000':
-            split = layout.split()
-            col = split.column()
-            col.label(text="Depth:")
-            col.row().prop(rd, "jpeg2k_depth", expand=True)
-
-            col = split.column()
-            col.prop(rd, "jpeg2k_preset", text="")
-            col.prop(rd, "jpeg2k_ycc")
-
-        elif file_format in {'CINEON', 'DPX'}:
-
-            split = layout.split()
-            split.label("FIXME: hard coded Non-Linear, Gamma:1.0")
-            '''
-            col = split.column()
-            col.prop(rd, "use_cineon_log", text="Convert to Log")
-
-            col = split.column(align=True)
-            col.active = rd.use_cineon_log
-            col.prop(rd, "cineon_black", text="Black")
-            col.prop(rd, "cineon_white", text="White")
-            col.prop(rd, "cineon_gamma", text="Gamma")
-            '''
-
-        elif file_format == 'TIFF':
-            layout.prop(rd, "use_tiff_16bit")
-
-        elif file_format == 'QUICKTIME_CARBON':
+        if file_format == 'QUICKTIME_CARBON':
             layout.operator("scene.render_data_set_quicktime_codec")
 
         elif file_format == 'QUICKTIME_QTKIT':
@@ -552,7 +508,7 @@ class RENDER_PT_encoding(RenderButtonsPanel, Panel):
     @classmethod
     def poll(cls, context):
         rd = context.scene.render
-        return rd.file_format in {'FFMPEG', 'XVID', 'H264', 'THEORA'}
+        return rd.image_settings.file_format in {'FFMPEG', 'XVID', 'H264', 'THEORA'}
 
     def draw(self, context):
         layout = self.layout
index a70d632..eb67f6b 100644 (file)
@@ -210,7 +210,7 @@ class CLIP_PT_tools_geometry(Panel):
     def draw(self, context):
         layout = self.layout
 
-        layout.operator("clip.tracks_to_mesh")
+        layout.operator("clip.bundles_to_mesh")
         layout.operator("clip.track_to_empty")
 
 
@@ -402,15 +402,15 @@ class CLIP_PT_display(Panel):
         col.prop(sc, "show_marker_search", text="Search")
         col.prop(sc, "show_pyramid_levels", text="Pyramid")
 
-        col.prop(sc, "show_track_path", text="Track Path")
+        col.prop(sc, "show_track_path", text="Path")
         row = col.row()
         row.active = sc.show_track_path
         row.prop(sc, "path_length", text="Length")
 
         col.prop(sc, "show_disabled", "Disabled Tracks")
-        col.prop(sc, "show_bundles", text="Bundles")
+        col.prop(sc, "show_bundles", text="3D Markers")
 
-        col.prop(sc, "show_names", text="Track Names and Status")
+        col.prop(sc, "show_names", text="Names and Status")
         col.prop(sc, "show_tiny_markers", text="Compact Markers")
 
         col.prop(sc, "show_grease_pencil", text="Grease Pencil")
index 1cadf60..8e63da8 100644 (file)
@@ -2208,7 +2208,7 @@ class VIEW3D_PT_view3d_motion_tracking(Panel):
 
         col = layout.column()
         col.active = view.show_reconstruction
-        col.prop(view, "show_tracks_name")
+        col.prop(view, "show_bundle_names")
         col.prop(view, "show_camera_path")
         col.label(text="Tracks:")
         col.prop(view, "tracks_draw_type", text="")
index a3e0b5b..7233f95 100644 (file)
@@ -43,6 +43,7 @@ struct Tex;
 struct anim;
 struct Scene;
 struct Object;
+struct ImageFormatData;
 
 /* call from library */
 void   free_image(struct Image *me);
@@ -50,13 +51,19 @@ void        free_image(struct Image *me);
 void   BKE_stamp_info(struct Scene *scene, struct Object *camera, struct ImBuf *ibuf);
 void   BKE_stamp_buf(struct Scene *scene, struct Object *camera, unsigned char *rect, float *rectf, int width, int height, int channels);
 int            BKE_alphatest_ibuf(struct ImBuf *ibuf);
-int            BKE_write_ibuf_stamp(struct Scene *scene, struct Object *camera, struct ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality);
-int            BKE_write_ibuf(struct ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality);
-void   BKE_makepicstring(char *string, const char *base, const char *relbase, int frame, int imtype, const short use_ext, const short use_frames);
-int            BKE_add_image_extension(char *string, int imtype);
-int            BKE_ftype_to_imtype(int ftype);
-int            BKE_imtype_to_ftype(int imtype);
-int            BKE_imtype_is_movie(int imtype);
+int            BKE_write_ibuf_stamp(struct Scene *scene, struct Object *camera, struct ImBuf *ibuf, const char *name, struct ImageFormatData *imf);
+int            BKE_write_ibuf(struct ImBuf *ibuf, const char *name, struct ImageFormatData *imf);
+void   BKE_makepicstring(char *string, const char *base, const char *relbase, int frame, char imtype, const short use_ext, const short use_frames);
+int            BKE_add_image_extension(char *string, const char imtype);
+char   BKE_ftype_to_imtype(const int ftype);
+int            BKE_imtype_to_ftype(char imtype);
+
+int            BKE_imtype_is_movie(const char imtype);
+int            BKE_imtype_supports_alpha(const char imtype);
+int            BKE_imtype_supports_zbuf(const char imtype);
+int            BKE_imtype_supports_compress(const char imtype);
+int            BKE_imtype_supports_quality(const char imtype);
+char   BKE_imtype_valid_depths(const char imtype);
 
 struct anim *openanim(const char *name, int flags, int streamindex);
 
index 580f78d..82e42ae 100644 (file)
@@ -190,10 +190,24 @@ typedef struct bNodeType {
         * when a final generic version of execution code is defined, this will be changed anyway
         */
        void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
+       /* This is the muting callback.
+        * XXX Mimics the newexecfunc signature... Not sure all of this will be useful, we will see.
+        */
+       void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
+       /* And the muting util.
+        * Returns links as a ListBase, as pairs of bNodeStack* if in/out bNodeStacks were provided,
+        * else as pairs of bNodeSocket* if node tree was provided.
+        */
+       ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
+                                 struct GPUNodeStack *, struct GPUNodeStack *);
        /* gpu */
        int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out);
        /* extended gpu function */
        int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out);
+       /* This is the muting gpu callback.
+        * XXX Mimics the gpuextfunc signature... Not sure all of this will be useful, we will see.
+        */
+       int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *, struct GPUNodeStack *, struct GPUNodeStack *);
 } bNodeType;
 
 /* node->exec, now in use for composites (#define for break is same as ready yes) */
@@ -270,6 +284,13 @@ typedef struct bNodeTreeType
        void (*update_node)(struct bNodeTree *ntree, struct bNode *node);
        
        int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link);
+
+       /* Default muting pointers. */
+       void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **);
+       ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
+                                 struct GPUNodeStack *, struct GPUNodeStack *);
+       /* gpu */
+       int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *, struct GPUNodeStack *, struct GPUNodeStack *);
 } bNodeTreeType;
 
 /* ************** GENERIC API, TREES *************** */
@@ -325,7 +346,7 @@ struct bNode        *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp);
 void                   nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
 void                   nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
 
-void                   nodeRegisterType(struct ListBase *typelist, struct bNodeType *ntype) ;
+void                   nodeRegisterType(struct bNodeTreeType *ttype, struct bNodeType *ntype) ;
 void                   nodeMakeDynamicType(struct bNode *node);
 int                            nodeDynamicUnlinkText(struct ID *txtid);
 
@@ -368,7 +389,8 @@ struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit);
 void                   nodeGroupEditClear(struct bNode *node);
 
 /* Init a new node type struct with default values and callbacks */
-void                   node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag);
+void                   node_type_base(struct bNodeTreeType *ttype, struct bNodeType *ntype, int type,
+                               const char *name, short nclass, short flag);
 void                   node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs);
 void                   node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
 void                   node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp));
@@ -390,13 +412,25 @@ void                      node_type_group_edit(struct bNodeType *ntype,
                                                                         struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit),
                                                                         void (*group_edit_clear)(struct bNode *node));
 
-void                   node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
+void                   node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **,
+                                                                         struct bNodeStack **));
 void                   node_type_exec_new(struct bNodeType *ntype,
                                                                   void *(*initexecfunc)(struct bNode *node),
                                                                   void (*freeexecfunc)(struct bNode *node, void *nodedata),
-                                                                  void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **));
-void                   node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
-void                   node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out));
+                                                                  void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata,
+                                                                                      struct bNodeStack **, struct bNodeStack **));
+void                   node_type_mute(struct bNodeType *ntype,
+                               void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata,
+                                                struct bNodeStack **, struct bNodeStack **),
+                               ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **,
+                                                         struct bNodeStack **, struct GPUNodeStack*, struct GPUNodeStack*));
+void                   node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node,
+                                                                      struct GPUNodeStack *in, struct GPUNodeStack *out));
+void                   node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node,
+                                                                             void *nodedata, struct GPUNodeStack *in,
+                                                                             struct GPUNodeStack *out));
+void                   node_type_gpu_mute(struct bNodeType *ntype, int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *,
+                                                                               struct GPUNodeStack *, struct GPUNodeStack *));
 void                   node_type_compatibility(struct bNodeType *ntype, short compatibility);
 
 /* ************** COMMON NODES *************** */
@@ -421,7 +455,7 @@ struct bNode        *node_group_make_from_selected(struct bNodeTree *ntree);
 int                            node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode);
 
 /* in node_common.c */
-void register_node_type_frame(ListBase *lb);
+void register_node_type_frame(struct bNodeTreeType *ttype);
 
 /* ************** SHADER NODES *************** */
 
index f2502cf..01a16be 100644 (file)
@@ -50,7 +50,7 @@ typedef struct bMovieHandle {
        void (*get_movie_path)(char *string, struct RenderData *rd); /* optional */
 } bMovieHandle;
 
-bMovieHandle *BKE_get_movie_handle(int imtype);
+bMovieHandle *BKE_get_movie_handle(const char imtype);
 void BKE_makeanimstring(char *string, struct RenderData *rd);
 
 #ifdef __cplusplus
index f1e6de9..0211dcd 100644 (file)
@@ -159,7 +159,7 @@ void readBitmapFontVersion0(ImBuf * ibuf, unsigned char * rect, int step)
                ibuf->userdata = bmfont;
                ibuf->userflags |= IB_BITMAPFONT;
 
-               if (ibuf->depth < 32) {
+               if (ibuf->planes < 32) {
                        // we're going to fake alpha here:
                        calcAlpha(ibuf);
                }
index aa2790f..714800e 100644 (file)
@@ -976,7 +976,7 @@ struct DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSett
        surface->wave_timescale = 1.0f;
        surface->wave_spring = 0.20f;
 
-       modifier_path_init(surface->image_output_path, sizeof(surface->image_output_path), "dynamicpaint");
+       modifier_path_init(surface->image_output_path, sizeof(surface->image_output_path), "cache_dynamicpaint");
 
        dynamicPaintSurface_setUniqueName(surface, "Surface");
 
@@ -2527,13 +2527,13 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char* filenam
        PaintSurfaceData *sData = surface->data;
        ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
        /* OpenEXR or PNG       */
-       int format = (surface->image_fileformat & MOD_DPAINT_IMGFORMAT_OPENEXR) ? R_OPENEXR : R_PNG;
+       int format = (surface->image_fileformat & MOD_DPAINT_IMGFORMAT_OPENEXR) ? R_IMF_IMTYPE_OPENEXR : R_IMF_IMTYPE_PNG;
        char output_file[FILE_MAX];
 
        if (!sData || !sData->type_data) {setError(surface->canvas, "Image save failed: Invalid surface.");return;}
        /* if selected format is openexr, but current build doesnt support one */
        #ifndef WITH_OPENEXR
-       if (format == R_OPENEXR) format = R_PNG;
+       if (format == R_IMF_IMTYPE_OPENEXR) format = R_IMF_IMTYPE_PNG;
        #endif
        BLI_strncpy(output_file, filename, sizeof(output_file));
        BKE_add_image_extension(output_file, format);
@@ -2622,7 +2622,7 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char* filenam
        /* Set output format, png in case exr isnt supported */
        ibuf->ftype= PNG|95;
 #ifdef WITH_OPENEXR
-       if (format == R_OPENEXR) {      /* OpenEXR 32-bit float */
+       if (format == R_IMF_IMTYPE_OPENEXR) {   /* OpenEXR 32-bit float */
                ibuf->ftype = OPENEXR | OPENEXR_COMPRESS;
        }
 #endif
index a61ae70..ef764f2 100644 (file)
@@ -556,13 +556,13 @@ Image *BKE_add_image_size(unsigned int width, unsigned int height, const char *n
        if (ima) {
                ImBuf *ibuf;
                
-               BLI_strncpy(ima->name, name, FILE_MAX);
+               /* BLI_strncpy(ima->name, name, FILE_MAX); */ /* dont do this, this writes in ain invalid filepath! */
                ima->gen_x= width;
                ima->gen_y= height;
                ima->gen_type= uvtestgrid;
                ima->gen_flag |= (floatbuf ? IMA_GEN_FLOAT : 0);
                
-               ibuf= add_ibuf_size(width, height, name, depth, floatbuf, uvtestgrid, color);
+               ibuf= add_ibuf_size(width, height, ima->name, depth, floatbuf, uvtestgrid, color);
                image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
                
                ima->ok= IMA_OK_LOADED;
@@ -601,7 +601,7 @@ void BKE_image_memorypack(Image *ima)
        }
        
        ibuf->ftype= PNG;
-       ibuf->depth= 32;
+       ibuf->planes= R_IMF_PLANES_RGBA;
        
        IMB_saveiff(ibuf, ibuf->name, IB_rect | IB_mem);
        if(ibuf->encodedbuffer==NULL) {
@@ -800,175 +800,246 @@ void BKE_image_all_free_anim_ibufs(int cfra)
 
 /* *********** READ AND WRITE ************** */
 
-int BKE_imtype_to_ftype(int imtype)
+int BKE_imtype_to_ftype(const char imtype)
 {
-       if(imtype==R_TARGA)
+       if(imtype==R_IMF_IMTYPE_TARGA)
                return TGA;
-       else if(imtype==R_RAWTGA)
+       else if(imtype==R_IMF_IMTYPE_RAWTGA)
                return RAWTGA;
-       else if(imtype== R_IRIS) 
+       else if(imtype== R_IMF_IMTYPE_IRIS) 
                return IMAGIC;
 #ifdef WITH_HDR
-       else if (imtype==R_RADHDR)
+       else if (imtype==R_IMF_IMTYPE_RADHDR)
                return RADHDR;
 #endif
-       else if (imtype==R_PNG)
+       else if (imtype==R_IMF_IMTYPE_PNG)
                return PNG;
 #ifdef WITH_DDS
-       else if (imtype==R_DDS)
+       else if (imtype==R_IMF_IMTYPE_DDS)
                return DDS;
 #endif
-       else if (imtype==R_BMP)
+       else if (imtype==R_IMF_IMTYPE_BMP)
                return BMP;
 #ifdef WITH_TIFF
-       else if (imtype==R_TIFF)
+       else if (imtype==R_IMF_IMTYPE_TIFF)
                return TIF;
 #endif
-       else if (imtype==R_OPENEXR || imtype==R_MULTILAYER)
+       else if (imtype==R_IMF_IMTYPE_OPENEXR || imtype==R_IMF_IMTYPE_MULTILAYER)
                return OPENEXR;
 #ifdef WITH_CINEON
-       else if (imtype==R_CINEON)
+       else if (imtype==R_IMF_IMTYPE_CINEON)
                return CINEON;
-       else if (imtype==R_DPX)
+       else if (imtype==R_IMF_IMTYPE_DPX)
                return DPX;
 #endif
 #ifdef WITH_OPENJPEG
-       else if(imtype==R_JP2)
+       else if(imtype==R_IMF_IMTYPE_JP2)
                return JP2;
 #endif
        else
                return JPG|90;
 }
 
-int BKE_ftype_to_imtype(int ftype)
+char BKE_ftype_to_imtype(const int ftype)
 {
        if(ftype==0)
-               return TGA;
+               return R_IMF_IMTYPE_TARGA;
        else if(ftype == IMAGIC) 
-               return R_IRIS;
+               return R_IMF_IMTYPE_IRIS;
 #ifdef WITH_HDR
        else if (ftype & RADHDR)
-               return R_RADHDR;
+               return R_IMF_IMTYPE_RADHDR;
 #endif
        else if (ftype & PNG)
-               return R_PNG;
+               return R_IMF_IMTYPE_PNG;
 #ifdef WITH_DDS
        else if (ftype & DDS)
-               return R_DDS;
+               return R_IMF_IMTYPE_DDS;
 #endif
        else if (ftype & BMP)
-               return R_BMP;
+               return R_IMF_IMTYPE_BMP;
 #ifdef WITH_TIFF
        else if (ftype & TIF)
-               return R_TIFF;
+               return R_IMF_IMTYPE_TIFF;
 #endif
        else if (ftype & OPENEXR)
-               return R_OPENEXR;
+               return R_IMF_IMTYPE_OPENEXR;
 #ifdef WITH_CINEON
        else if (ftype & CINEON)
-               return R_CINEON;
+               return R_IMF_IMTYPE_CINEON;
        else if (ftype & DPX)
-               return R_DPX;
+               return R_IMF_IMTYPE_DPX;
 #endif
        else if (ftype & TGA)
-               return R_TARGA;
+               return R_IMF_IMTYPE_TARGA;
        else if(ftype & RAWTGA)
-               return R_RAWTGA;
+               return R_IMF_IMTYPE_RAWTGA;
 #ifdef WITH_OPENJPEG
        else if(ftype & JP2)
-               return R_JP2;
+               return R_IMF_IMTYPE_JP2;
 #endif
        else
-               return R_JPEG90;
+               return R_IMF_IMTYPE_JPEG90;
 }
 
 
-int BKE_imtype_is_movie(int imtype)
+int BKE_imtype_is_movie(const char imtype)
+{
+       switch(imtype) {
+       case R_IMF_IMTYPE_AVIRAW:
+       case R_IMF_IMTYPE_AVIJPEG:
+       case R_IMF_IMTYPE_AVICODEC:
+       case R_IMF_IMTYPE_QUICKTIME:
+       case R_IMF_IMTYPE_FFMPEG:
+       case R_IMF_IMTYPE_H264:
+       case R_IMF_IMTYPE_THEORA:
+       case R_IMF_IMTYPE_XVID:
+       case R_IMF_IMTYPE_FRAMESERVER:
+                       return 1;
+       }
+       return 0;
+}
+
+int BKE_imtype_supports_alpha(const char imtype)
 {
        switch(imtype) {
-       case R_AVIRAW:
-       case R_AVIJPEG:
-       case R_AVICODEC:
-       case R_QUICKTIME:
-       case R_FFMPEG:
-       case R_H264:
-       case R_THEORA:
-       case R_XVID:
-       case R_FRAMESERVER:
+       case R_IMF_IMTYPE_TARGA:
+       case R_IMF_IMTYPE_IRIS:
+       case R_IMF_IMTYPE_PNG:
+       /* case R_IMF_IMTYPE_BMP: */ /* read but not write */
+       case R_IMF_IMTYPE_RADHDR:
+       case R_IMF_IMTYPE_TIFF:
+       case R_IMF_IMTYPE_OPENEXR:
+       case R_IMF_IMTYPE_MULTILAYER:
+       case R_IMF_IMTYPE_DDS:
+       case R_IMF_IMTYPE_JP2:
                        return 1;
        }
        return 0;
 }
 
-int BKE_add_image_extension(char *string, int imtype)
+int BKE_imtype_supports_zbuf(const char imtype)
+{
+       switch(imtype) {
+       case R_IMF_IMTYPE_IRIZ:
+       case R_IMF_IMTYPE_OPENEXR: /* but not R_IMF_IMTYPE_MULTILAYER */
+                       return 1;
+       }
+       return 0;
+}
+
+int BKE_imtype_supports_compress(const char imtype)
+{
+       switch(imtype) {
+       case R_IMF_IMTYPE_PNG:
+                       return 1;
+       }
+       return 0;
+}
+
+int BKE_imtype_supports_quality(const char imtype)
+{
+       switch(imtype) {
+       case R_IMF_IMTYPE_JPEG90:
+       case R_IMF_IMTYPE_JP2:
+       case R_IMF_IMTYPE_AVIJPEG:
+                       return 1;
+       }
+       return 0;
+}
+
+char BKE_imtype_valid_depths(const char imtype)
+{
+       switch (imtype) {
+       case R_IMF_IMTYPE_RADHDR:
+               return R_IMF_CHAN_DEPTH_32;
+       case R_IMF_IMTYPE_TIFF:
+               return R_IMF_CHAN_DEPTH_8 | R_IMF_CHAN_DEPTH_16;
+       case R_IMF_IMTYPE_OPENEXR:
+               return R_IMF_CHAN_DEPTH_16 | R_IMF_CHAN_DEPTH_32;
+       case R_IMF_IMTYPE_MULTILAYER:
+               return R_IMF_CHAN_DEPTH_32;
+       /* eeh, cineone does some strange 10bits per channel */
+       case R_IMF_IMTYPE_DPX:
+       case R_IMF_IMTYPE_CINEON:
+               return R_IMF_CHAN_DEPTH_12;
+       case R_IMF_IMTYPE_JP2:
+               return R_IMF_CHAN_DEPTH_8 | R_IMF_CHAN_DEPTH_12 | R_IMF_CHAN_DEPTH_16;
+       /* most formats are 8bit only */
+       default:
+               return R_IMF_CHAN_DEPTH_8;
+       }
+}
+
+int BKE_add_image_extension(char *string, const char imtype)
 {
        const char *extension= NULL;
        
-       if(imtype== R_IRIS) {
+       if(imtype== R_IMF_IMTYPE_IRIS) {
                if(!BLI_testextensie(string, ".rgb"))
                        extension= ".rgb";
        }
-       else if(imtype==R_IRIZ) {
+       else if(imtype==R_IMF_IMTYPE_IRIZ) {
                if(!BLI_testextensie(string, ".rgb"))
                        extension= ".rgb";
        }
 #ifdef WITH_HDR
-       else if(imtype==R_RADHDR) {
+       else if(imtype==R_IMF_IMTYPE_RADHDR) {
                if(!BLI_testextensie(string, ".hdr"))
                        extension= ".hdr";
        }
 #endif
-       else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
+       else if (ELEM5(imtype, R_IMF_IMTYPE_PNG, R_IMF_IMTYPE_FFMPEG, R_IMF_IMTYPE_H264, R_IMF_IMTYPE_THEORA, R_IMF_IMTYPE_XVID)) {
                if(!BLI_testextensie(string, ".png"))
                        extension= ".png";
        }
 #ifdef WITH_DDS
-       else if(imtype==R_DDS) {
+       else if(imtype==R_IMF_IMTYPE_DDS) {
                if(!BLI_testextensie(string, ".dds"))
                        extension= ".dds";
        }
 #endif
-       else if(imtype==R_RAWTGA) {
+       else if(imtype==R_IMF_IMTYPE_RAWTGA) {
                if(!BLI_testextensie(string, ".tga"))
                        extension= ".tga";
        }
-       else if(imtype==R_BMP) {
+       else if(imtype==R_IMF_IMTYPE_BMP) {
                if(!BLI_testextensie(string, ".bmp"))
                        extension= ".bmp";
        }
 #ifdef WITH_TIFF
-       else if(imtype==R_TIFF) {
+       else if(imtype==R_IMF_IMTYPE_TIFF) {
                if(!BLI_testextensie(string, ".tif") && 
                        !BLI_testextensie(string, ".tiff")) extension= ".tif";
        }
 #endif
 #ifdef WITH_OPENEXR
-       else if( ELEM(imtype, R_OPENEXR, R_MULTILAYER)) {
+       else if( ELEM(imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER)) {
                if(!BLI_testextensie(string, ".exr"))
                        extension= ".exr";
        }
 #endif
 #ifdef WITH_CINEON
-       else if(imtype==R_CINEON){
+       else if(imtype==R_IMF_IMTYPE_CINEON){
                if (!BLI_testextensie(string, ".cin"))
                        extension= ".cin";
        }
-       else if(imtype==R_DPX){
+       else if(imtype==R_IMF_IMTYPE_DPX){
                if (!BLI_testextensie(string, ".dpx"))
                        extension= ".dpx";
        }
 #endif
-       else if(imtype==R_TARGA) {
+       else if(imtype==R_IMF_IMTYPE_TARGA) {
                if(!BLI_testextensie(string, ".tga"))
                        extension= ".tga";
        }
 #ifdef WITH_OPENJPEG
-       else if(imtype==R_JP2) {
+       else if(imtype==R_IMF_IMTYPE_JP2) {
                if(!BLI_testextensie(string, ".jp2"))
                        extension= ".jp2";
        }
 #endif
-       else { //   R_AVICODEC, R_AVIRAW, R_AVIJPEG, R_JPEG90, R_QUICKTIME etc
+       else { //   R_IMF_IMTYPE_AVICODEC, R_IMF_IMTYPE_AVIRAW, R_IMF_IMTYPE_AVIJPEG, R_IMF_IMTYPE_JPEG90, R_IMF_IMTYPE_QUICKTIME etc
                if(!( BLI_testextensie(string, ".jpg") || BLI_testextensie(string, ".jpeg")))
                        extension= ".jpg";
        }
@@ -1371,98 +1442,101 @@ int BKE_alphatest_ibuf(ImBuf *ibuf)
        return FALSE;
 }
 
-int BKE_write_ibuf(ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality)
+int BKE_write_ibuf(ImBuf *ibuf, const char *name, ImageFormatData *imf)
 {
+       char imtype= imf->imtype;
+       char compress= imf->compress;
+       char quality= imf->quality;
+
        int ok;
-       (void)subimtype; /* quies unused warnings */
 
        if(imtype == -1) {
                /* use whatever existing image type is set by 'ibuf' */
        }
-       else if(imtype== R_IRIS) {
+       else if(imtype== R_IMF_IMTYPE_IRIS) {
                ibuf->ftype= IMAGIC;
        }
 #ifdef WITH_HDR
-       else if (imtype==R_RADHDR) {
+       else if (imtype==R_IMF_IMTYPE_RADHDR) {
                ibuf->ftype= RADHDR;
        }
 #endif
-       else if (ELEM5(imtype, R_PNG, R_FFMPEG, R_H264, R_THEORA, R_XVID)) {
+       else if (ELEM5(imtype, R_IMF_IMTYPE_PNG, R_IMF_IMTYPE_FFMPEG, R_IMF_IMTYPE_H264, R_IMF_IMTYPE_THEORA, R_IMF_IMTYPE_XVID)) {
                ibuf->ftype= PNG;
 
-               if(imtype==R_PNG)
-                       ibuf->ftype |= quality;  /* quality is actually compression 0-100 --> 0-9 */
+               if(imtype==R_IMF_IMTYPE_PNG)
+                       ibuf->ftype |= compress;
 
        }
 #ifdef WITH_DDS
-       else if (imtype==R_DDS) {
+       else if (imtype==R_IMF_IMTYPE_DDS) {
                ibuf->ftype= DDS;
        }
 #endif
-       else if (imtype==R_BMP) {
+       else if (imtype==R_IMF_IMTYPE_BMP) {
                ibuf->ftype= BMP;
        }
 #ifdef WITH_TIFF
-       else if (imtype==R_TIFF) {
+       else if (imtype==R_IMF_IMTYPE_TIFF) {
                ibuf->ftype= TIF;
 
-               if(subimtype & R_TIFF_16BIT)
+               if(imf->depth == R_IMF_CHAN_DEPTH_16)
                        ibuf->ftype |= TIF_16BIT;
        }
 #endif
 #ifdef WITH_OPENEXR
-       else if (imtype==R_OPENEXR || imtype==R_MULTILAYER) {
+       else if (imtype==R_IMF_IMTYPE_OPENEXR || imtype==R_IMF_IMTYPE_MULTILAYER) {
                ibuf->ftype= OPENEXR;
-               if(subimtype & R_OPENEXR_HALF)
+               if(imf->depth == R_IMF_CHAN_DEPTH_16)
                        ibuf->ftype |= OPENEXR_HALF;
                ibuf->ftype |= (quality & OPENEXR_COMPRESS);
                
-               if(!(subimtype & R_OPENEXR_ZBUF))
+               if(!(imf->flag & R_IMF_FLAG_ZBUF))
                        ibuf->zbuf_float = NULL;        /* signal for exr saving */
                
        }
 #endif
 #ifdef WITH_CINEON
-       else if (imtype==R_CINEON) {
+       else if (imtype==R_IMF_IMTYPE_CINEON) {
                ibuf->ftype = CINEON;
        }
-       else if (imtype==R_DPX) {
+       else if (imtype==R_IMF_IMTYPE_DPX) {
                ibuf->ftype = DPX;
        }
 #endif
-       else if (imtype==R_TARGA) {
+       else if (imtype==R_IMF_IMTYPE_TARGA) {
                ibuf->ftype= TGA;
        }
-       else if(imtype==R_RAWTGA) {
+       else if(imtype==R_IMF_IMTYPE_RAWTGA) {
                ibuf->ftype= RAWTGA;
        }
 #ifdef WITH_OPENJPEG
-       else if(imtype==R_JP2) {
+       else if(imtype==R_IMF_IMTYPE_JP2) {
                if(quality < 10) quality= 90;
                ibuf->ftype= JP2|quality;
                
-               if (subimtype & R_JPEG2K_16BIT) {
+               if (imf->depth == R_IMF_CHAN_DEPTH_16) {
                        ibuf->ftype |= JP2_16BIT;
-               } else if (subimtype & R_JPEG2K_12BIT) {
+               } else if (imf->depth == R_IMF_CHAN_DEPTH_12) {
                        ibuf->ftype |= JP2_12BIT;
                }
                
-               if (subimtype & R_JPEG2K_YCC) {
+               if (imf->jp2_flag & R_IMF_JP2_FLAG_YCC) {
                        ibuf->ftype |= JP2_YCC;
                }
-               
-               if (subimtype & R_JPEG2K_CINE_PRESET) {
+
+               if (imf->jp2_flag & R_IMF_JP2_FLAG_CINE_PRESET) {
                        ibuf->ftype |= JP2_CINE;
-                       if (subimtype & R_JPEG2K_CINE_48FPS)
+                       if (imf->jp2_flag & R_IMF_JP2_FLAG_CINE_48)
                                ibuf->ftype |= JP2_CINE_48FPS;
                }
        }
 #endif
        else {
-               /* R_JPEG90, etc. default we save jpegs */
+               /* R_IMF_IMTYPE_JPEG90, etc. default we save jpegs */
                if(quality < 10) quality= 90;
                ibuf->ftype= JPG|quality;
-               if(ibuf->depth==32) ibuf->depth= 24;    /* unsupported feature only confuses other s/w */
+               if(ibuf->planes==32) ibuf->planes= 24;  /* unsupported feature only confuses other s/w */
        }
        
        BLI_make_existing_file(name);
@@ -1475,16 +1549,16 @@ int BKE_write_ibuf(ImBuf *ibuf, const char *name, int imtype, int subimtype, int
        return(ok);
 }
 
-int BKE_write_ibuf_stamp(Scene *scene, struct Object *camera, ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality)
+int BKE_write_ibuf_stamp(Scene *scene, struct Object *camera, ImBuf *ibuf, const char *name, struct ImageFormatData *imf)
 {
        if(scene && scene->r.stamp & R_STAMP_ALL)
                BKE_stamp_info(scene, camera, ibuf);
 
-       return BKE_write_ibuf(ibuf, name, imtype, subimtype, quality);
+       return BKE_write_ibuf(ibuf, name, imf);
 }
 
 
-void BKE_makepicstring(char *string, const char *base, const char *relbase, int frame, int imtype, const short use_ext, const short use_frames)
+void BKE_makepicstring(char *string, const char *base, const char *relbase, int frame, const char imtype, const short use_ext, const short use_frames)
 {
        if (string==NULL) return;
        BLI_strncpy(string, base, FILE_MAX - 10);       /* weak assumption */
@@ -2414,13 +2488,13 @@ int BKE_image_has_alpha(struct Image *image)
 {
        ImBuf *ibuf;
        void *lock;
-       int depth;
+       int planes;
        
        ibuf= BKE_image_acquire_ibuf(image, NULL, &lock);
-       depth = (ibuf?ibuf->depth:0);
+       planes = (ibuf?ibuf->planes:0);
        BKE_image_release_ibuf(image, lock);
 
-       if (depth == 32)
+       if (planes == 32)
                return 1;
        else
                return 0;
index 540d757..12a2fe2 100644 (file)
@@ -913,8 +913,8 @@ static void movieclip_build_proxy_ibuf(MovieClip *clip, ImBuf *ibuf, int cfra, i
        scaleibuf->ftype= JPG | quality;
 
        /* unsupported feature only confuses other s/w */
-       if(scaleibuf->depth==32)
-               scaleibuf->depth= 24;
+       if(scaleibuf->planes==32)
+               scaleibuf->planes= 24;
 
        BLI_lock_thread(LOCK_MOVIECLIP);
 
index c4edddf..7be6ef9 100644 (file)
@@ -1643,15 +1643,22 @@ struct bNodeTemplate nodeMakeTemplate(struct bNode *node)
        }
 }
 
-void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag)
+void node_type_base(bNodeTreeType *ttype, bNodeType *ntype, int type, const char *name, short nclass, short flag)
 {
        memset(ntype, 0, sizeof(bNodeType));
-       
+
        ntype->type = type;
        BLI_strncpy(ntype->name, name, sizeof(ntype->name));
        ntype->nclass = nclass;
        ntype->flag = flag;
-       
+
+       /* Default muting stuff. */
+       if(ttype) {
+               ntype->mutefunc      = ttype->mutefunc;
+               ntype->mutelinksfunc = ttype->mutelinksfunc;
+               ntype->gpumutefunc   = ttype->gpumutefunc;
+       }
+
        /* default size values */
        ntype->width = 140;
        ntype->minwidth = 100;
@@ -1746,6 +1753,16 @@ void node_type_exec_new(struct bNodeType *ntype,
        ntype->newexecfunc = newexecfunc;
 }
 
+void node_type_mute(struct bNodeType *ntype,
+                    void (*mutefunc)(void *data, int thread, struct bNode *, void *nodedata,
+                                     struct bNodeStack **, struct bNodeStack **),
+                    ListBase (*mutelinksfunc)(struct bNodeTree *, struct bNode *, struct bNodeStack **, struct bNodeStack **,
+                                              struct GPUNodeStack *, struct GPUNodeStack *))
+{
+       ntype->mutefunc = mutefunc;
+       ntype->mutelinksfunc = mutelinksfunc;
+}
+
 void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))
 {
        ntype->gpufunc = gpufunc;
@@ -1756,6 +1773,12 @@ void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMate
        ntype->gpuextfunc = gpuextfunc;
 }
 
+void node_type_gpu_mute(struct bNodeType *ntype, int (*gpumutefunc)(struct GPUMaterial *, struct bNode *, void *,
+                                                                    struct GPUNodeStack *, struct GPUNodeStack *))
+{
+       ntype->gpumutefunc = gpumutefunc;
+}
+
 void node_type_compatibility(struct bNodeType *ntype, short compatibility)
 {
        ntype->compatibility = compatibility;
@@ -1772,211 +1795,212 @@ static bNodeType *is_nodetype_registered(ListBase *typelist, int type)
        return NULL;
 }
 
-void nodeRegisterType(ListBase *typelist, bNodeType *ntype) 
+void nodeRegisterType(bNodeTreeType *ttype, bNodeType *ntype) 
 {
+       ListBase *typelist = &(ttype->node_types);
        bNodeType *found= is_nodetype_registered(typelist, ntype->type);
        
        if(found==NULL)
                BLI_addtail(typelist, ntype);
 }
 
-static void registerCompositNodes(ListBase *ntypelist)
-{
-       register_node_type_frame(ntypelist);
-       
-       register_node_type_cmp_group(ntypelist);
-//     register_node_type_cmp_forloop(ntypelist);
-//     register_node_type_cmp_whileloop(ntypelist);
-       
-       register_node_type_cmp_rlayers(ntypelist);
-       register_node_type_cmp_image(ntypelist);
-       register_node_type_cmp_texture(ntypelist);
-       register_node_type_cmp_value(ntypelist);
-       register_node_type_cmp_rgb(ntypelist);
-       register_node_type_cmp_curve_time(ntypelist);
-       register_node_type_cmp_movieclip(ntypelist);
-       
-       register_node_type_cmp_composite(ntypelist);
-       register_node_type_cmp_viewer(ntypelist);
-       register_node_type_cmp_splitviewer(ntypelist);
-       register_node_type_cmp_output_file(ntypelist);
-       register_node_type_cmp_view_levels(ntypelist);
-       
-       register_node_type_cmp_curve_rgb(ntypelist);
-       register_node_type_cmp_mix_rgb(ntypelist);
-       register_node_type_cmp_hue_sat(ntypelist);
-       register_node_type_cmp_brightcontrast(ntypelist);
-       register_node_type_cmp_gamma(ntypelist);
-       register_node_type_cmp_invert(ntypelist);
-       register_node_type_cmp_alphaover(ntypelist);
-       register_node_type_cmp_zcombine(ntypelist);
-       register_node_type_cmp_colorbalance(ntypelist);
-       register_node_type_cmp_huecorrect(ntypelist);
-       
-       register_node_type_cmp_normal(ntypelist);
-       register_node_type_cmp_curve_vec(ntypelist);
-       register_node_type_cmp_map_value(ntypelist);
-       register_node_type_cmp_normalize(ntypelist);
-       
-       register_node_type_cmp_filter(ntypelist);
-       register_node_type_cmp_blur(ntypelist);
-       register_node_type_cmp_dblur(ntypelist);
-       register_node_type_cmp_bilateralblur(ntypelist);
-       register_node_type_cmp_vecblur(ntypelist);
-       register_node_type_cmp_dilateerode(ntypelist);
-       register_node_type_cmp_defocus(ntypelist);
-       
-       register_node_type_cmp_valtorgb(ntypelist);
-       register_node_type_cmp_rgbtobw(ntypelist);
-       register_node_type_cmp_setalpha(ntypelist);
-       register_node_type_cmp_idmask(ntypelist);
-       register_node_type_cmp_math(ntypelist);
-       register_node_type_cmp_seprgba(ntypelist);
-       register_node_type_cmp_combrgba(ntypelist);
-       register_node_type_cmp_sephsva(ntypelist);
-       register_node_type_cmp_combhsva(ntypelist);
-       register_node_type_cmp_sepyuva(ntypelist);
-       register_node_type_cmp_combyuva(ntypelist);
-       register_node_type_cmp_sepycca(ntypelist);
-       register_node_type_cmp_combycca(ntypelist);
-       register_node_type_cmp_premulkey(ntypelist);
-       
-       register_node_type_cmp_diff_matte(ntypelist);
-       register_node_type_cmp_distance_matte(ntypelist);
-       register_node_type_cmp_chroma_matte(ntypelist);
-       register_node_type_cmp_color_matte(ntypelist);
-       register_node_type_cmp_channel_matte(ntypelist);
-       register_node_type_cmp_color_spill(ntypelist);
-       register_node_type_cmp_luma_matte(ntypelist);
-       
-       register_node_type_cmp_translate(ntypelist);
-       register_node_type_cmp_rotate(ntypelist);
-       register_node_type_cmp_scale(ntypelist);
-       register_node_type_cmp_flip(ntypelist);
-       register_node_type_cmp_crop(ntypelist);
-       register_node_type_cmp_displace(ntypelist);
-       register_node_type_cmp_mapuv(ntypelist);
-       register_node_type_cmp_glare(ntypelist);
-       register_node_type_cmp_tonemap(ntypelist);
-       register_node_type_cmp_lensdist(ntypelist);
-       register_node_type_cmp_transform(ntypelist);
-       register_node_type_cmp_stabilize2d(ntypelist);
-       register_node_type_cmp_moviedistortion(ntypelist);
-}
-
-static void registerShaderNodes(ListBase *ntypelist
-{
-       register_node_type_frame(ntypelist);
-       
-       register_node_type_sh_group(ntypelist);
-       //register_node_type_sh_forloop(ntypelist);
-       //register_node_type_sh_whileloop(ntypelist);
-
-       register_node_type_sh_output(ntypelist);
-       register_node_type_sh_material(ntypelist);
-       register_node_type_sh_camera(ntypelist);
-       register_node_type_sh_value(ntypelist);
-       register_node_type_sh_rgb(ntypelist);
-       register_node_type_sh_mix_rgb(ntypelist);
-       register_node_type_sh_valtorgb(ntypelist);
-       register_node_type_sh_rgbtobw(ntypelist);
-       register_node_type_sh_texture(ntypelist);
-       register_node_type_sh_normal(ntypelist);
-       register_node_type_sh_geom(ntypelist);
-       register_node_type_sh_mapping(ntypelist);
-       register_node_type_sh_curve_vec(ntypelist);
-       register_node_type_sh_curve_rgb(ntypelist);
-       register_node_type_sh_math(ntypelist);
-       register_node_type_sh_vect_math(ntypelist);
-       register_node_type_sh_squeeze(ntypelist);
-       //register_node_type_sh_dynamic(ntypelist);
-       register_node_type_sh_material_ext(ntypelist);
-       register_node_type_sh_invert(ntypelist);
-       register_node_type_sh_seprgb(ntypelist);
-       register_node_type_sh_combrgb(ntypelist);
-       register_node_type_sh_hue_sat(ntypelist);
-
-       register_node_type_sh_attribute(ntypelist);
-       register_node_type_sh_geometry(ntypelist);
-       register_node_type_sh_light_path(ntypelist);
-       register_node_type_sh_fresnel(ntypelist);
-       register_node_type_sh_layer_weight(ntypelist);
-       register_node_type_sh_tex_coord(ntypelist);
-
-       register_node_type_sh_background(ntypelist);
-       register_node_type_sh_bsdf_diffuse(ntypelist);
-       register_node_type_sh_bsdf_glossy(ntypelist);
-       register_node_type_sh_bsdf_glass(ntypelist);
-       register_node_type_sh_bsdf_translucent(ntypelist);
-       register_node_type_sh_bsdf_transparent(ntypelist);
-       register_node_type_sh_bsdf_velvet(ntypelist);
-       register_node_type_sh_emission(ntypelist);
-       register_node_type_sh_holdout(ntypelist);
-       //register_node_type_sh_volume_transparent(ntypelist);
-       //register_node_type_sh_volume_isotropic(ntypelist);
-       register_node_type_sh_mix_shader(ntypelist);
-       register_node_type_sh_add_shader(ntypelist);
-
-       register_node_type_sh_output_lamp(ntypelist);
-       register_node_type_sh_output_material(ntypelist);
-       register_node_type_sh_output_world(ntypelist);
-
-       register_node_type_sh_tex_image(ntypelist);
-       register_node_type_sh_tex_environment(ntypelist);
-       register_node_type_sh_tex_sky(ntypelist);
-       register_node_type_sh_tex_noise(ntypelist);
-       register_node_type_sh_tex_wave(ntypelist);
-       register_node_type_sh_tex_voronoi(ntypelist);
-       register_node_type_sh_tex_musgrave(ntypelist);
-       register_node_type_sh_tex_gradient(ntypelist);
-       register_node_type_sh_tex_magic(ntypelist);
-}
-
-static void registerTextureNodes(ListBase *ntypelist)
-{
-       register_node_type_frame(ntypelist);
-       
-       register_node_type_tex_group(ntypelist);
-//     register_node_type_tex_forloop(ntypelist);
-//     register_node_type_tex_whileloop(ntypelist);
-       
-       register_node_type_tex_math(ntypelist);
-       register_node_type_tex_mix_rgb(ntypelist);
-       register_node_type_tex_valtorgb(ntypelist);
-       register_node_type_tex_rgbtobw(ntypelist);
-       register_node_type_tex_valtonor(ntypelist);
-       register_node_type_tex_curve_rgb(ntypelist);
-       register_node_type_tex_curve_time(ntypelist);
-       register_node_type_tex_invert(ntypelist);
-       register_node_type_tex_hue_sat(ntypelist);
-       register_node_type_tex_coord(ntypelist);
-       register_node_type_tex_distance(ntypelist);
-       register_node_type_tex_compose(ntypelist);
-       register_node_type_tex_decompose(ntypelist);
-       
-       register_node_type_tex_output(ntypelist);
-       register_node_type_tex_viewer(ntypelist);
-       
-       register_node_type_tex_checker(ntypelist);
-       register_node_type_tex_texture(ntypelist);
-       register_node_type_tex_bricks(ntypelist);
-       register_node_type_tex_image(ntypelist);
-       
-       register_node_type_tex_rotate(ntypelist);
-       register_node_type_tex_translate(ntypelist);
-       register_node_type_tex_scale(ntypelist);
-       register_node_type_tex_at(ntypelist);
-       
-       register_node_type_tex_proc_voronoi(ntypelist);
-       register_node_type_tex_proc_blend(ntypelist);
-       register_node_type_tex_proc_magic(ntypelist);
-       register_node_type_tex_proc_marble(ntypelist);
-       register_node_type_tex_proc_clouds(ntypelist);
-       register_node_type_tex_proc_wood(ntypelist);
-       register_node_type_tex_proc_musgrave(ntypelist);
-       register_node_type_tex_proc_noise(ntypelist);
-       register_node_type_tex_proc_stucci(ntypelist);
-       register_node_type_tex_proc_distnoise(ntypelist);
+static void registerCompositNodes(bNodeTreeType *ttype)
+{
+       register_node_type_frame(ttype);
+       
+       register_node_type_cmp_group(ttype);
+//     register_node_type_cmp_forloop(ttype);
+//     register_node_type_cmp_whileloop(ttype);
+       
+       register_node_type_cmp_rlayers(ttype);
+       register_node_type_cmp_image(ttype);
+       register_node_type_cmp_texture(ttype);
+       register_node_type_cmp_value(ttype);
+       register_node_type_cmp_rgb(ttype);
+       register_node_type_cmp_curve_time(ttype);
+       register_node_type_cmp_movieclip(ttype);
+       
+       register_node_type_cmp_composite(ttype);
+       register_node_type_cmp_viewer(ttype);
+       register_node_type_cmp_splitviewer(ttype);
+       register_node_type_cmp_output_file(ttype);
+       register_node_type_cmp_view_levels(ttype);
+       
+       register_node_type_cmp_curve_rgb(ttype);
+       register_node_type_cmp_mix_rgb(ttype);
+       register_node_type_cmp_hue_sat(ttype);
+       register_node_type_cmp_brightcontrast(ttype);
+       register_node_type_cmp_gamma(ttype);
+       register_node_type_cmp_invert(ttype);
+       register_node_type_cmp_alphaover(ttype);
+       register_node_type_cmp_zcombine(ttype);
+       register_node_type_cmp_colorbalance(ttype);
+       register_node_type_cmp_huecorrect(ttype);
+       
+       register_node_type_cmp_normal(ttype);
+       register_node_type_cmp_curve_vec(ttype);
+       register_node_type_cmp_map_value(ttype);
+       register_node_type_cmp_normalize(ttype);
+       
+       register_node_type_cmp_filter(ttype);
+       register_node_type_cmp_blur(ttype);
+       register_node_type_cmp_dblur(ttype);
+       register_node_type_cmp_bilateralblur(ttype);
+       register_node_type_cmp_vecblur(ttype);
+       register_node_type_cmp_dilateerode(ttype);
+       register_node_type_cmp_defocus(ttype);
+       
+       register_node_type_cmp_valtorgb(ttype);
+       register_node_type_cmp_rgbtobw(ttype);
+       register_node_type_cmp_setalpha(ttype);
+       register_node_type_cmp_idmask(ttype);
+       register_node_type_cmp_math(ttype);
+       register_node_type_cmp_seprgba(ttype);
+       register_node_type_cmp_combrgba(ttype);
+       register_node_type_cmp_sephsva(ttype);
+       register_node_type_cmp_combhsva(ttype);
+       register_node_type_cmp_sepyuva(ttype);
+       register_node_type_cmp_combyuva(ttype);
+       register_node_type_cmp_sepycca(ttype);
+       register_node_type_cmp_combycca(ttype);
+       register_node_type_cmp_premulkey(ttype);
+       
+       register_node_type_cmp_diff_matte(ttype);
+       register_node_type_cmp_distance_matte(ttype);
+       register_node_type_cmp_chroma_matte(ttype);
+       register_node_type_cmp_color_matte(ttype);
+       register_node_type_cmp_channel_matte(ttype);
+       register_node_type_cmp_color_spill(ttype);
+       register_node_type_cmp_luma_matte(ttype);
+       
+       register_node_type_cmp_translate(ttype);
+       register_node_type_cmp_rotate(ttype);
+       register_node_type_cmp_scale(ttype);
+       register_node_type_cmp_flip(ttype);
+       register_node_type_cmp_crop(ttype);
+       register_node_type_cmp_displace(ttype);
+       register_node_type_cmp_mapuv(ttype);
+       register_node_type_cmp_glare(ttype);
+       register_node_type_cmp_tonemap(ttype);
+       register_node_type_cmp_lensdist(ttype);
+       register_node_type_cmp_transform(ttype);
+       register_node_type_cmp_stabilize2d(ttype);
+       register_node_type_cmp_moviedistortion(ttype);
+}
+
+static void registerShaderNodes(bNodeTreeType *ttype
+{
+       register_node_type_frame(ttype);
+       
+       register_node_type_sh_group(ttype);
+       //register_node_type_sh_forloop(ttype);
+       //register_node_type_sh_whileloop(ttype);
+
+       register_node_type_sh_output(ttype);
+       register_node_type_sh_material(ttype);
+       register_node_type_sh_camera(ttype);
+       register_node_type_sh_value(ttype);
+       register_node_type_sh_rgb(ttype);
+       register_node_type_sh_mix_rgb(ttype);
+       register_node_type_sh_valtorgb(ttype);
+       register_node_type_sh_rgbtobw(ttype);
+       register_node_type_sh_texture(ttype);
+       register_node_type_sh_normal(ttype);
+       register_node_type_sh_geom(ttype);
+       register_node_type_sh_mapping(ttype);
+       register_node_type_sh_curve_vec(ttype);
+       register_node_type_sh_curve_rgb(ttype);
+       register_node_type_sh_math(ttype);
+       register_node_type_sh_vect_math(ttype);
+       register_node_type_sh_squeeze(ttype);
+       //register_node_type_sh_dynamic(ttype);
+       register_node_type_sh_material_ext(ttype);
+       register_node_type_sh_invert(ttype);
+       register_node_type_sh_seprgb(ttype);
+       register_node_type_sh_combrgb(ttype);
+       register_node_type_sh_hue_sat(ttype);
+
+       register_node_type_sh_attribute(ttype);
+       register_node_type_sh_geometry(ttype);
+       register_node_type_sh_light_path(ttype);
+       register_node_type_sh_fresnel(ttype);
+       register_node_type_sh_layer_weight(ttype);
+       register_node_type_sh_tex_coord(ttype);
+
+       register_node_type_sh_background(ttype);
+       register_node_type_sh_bsdf_diffuse(ttype);
+       register_node_type_sh_bsdf_glossy(ttype);
+       register_node_type_sh_bsdf_glass(ttype);
+       register_node_type_sh_bsdf_translucent(ttype);
+       register_node_type_sh_bsdf_transparent(ttype);
+       register_node_type_sh_bsdf_velvet(ttype);
+       register_node_type_sh_emission(ttype);
+       register_node_type_sh_holdout(ttype);
+       //register_node_type_sh_volume_transparent(ttype);
+       //register_node_type_sh_volume_isotropic(ttype);
+       register_node_type_sh_mix_shader(ttype);
+       register_node_type_sh_add_shader(ttype);
+
+       register_node_type_sh_output_lamp(ttype);
+       register_node_type_sh_output_material(ttype);
+       register_node_type_sh_output_world(ttype);
+
+       register_node_type_sh_tex_image(ttype);
+       register_node_type_sh_tex_environment(ttype);
+       register_node_type_sh_tex_sky(ttype);
+       register_node_type_sh_tex_noise(ttype);
+       register_node_type_sh_tex_wave(ttype);
+       register_node_type_sh_tex_voronoi(ttype);
+       register_node_type_sh_tex_musgrave(ttype);
+       register_node_type_sh_tex_gradient(ttype);
+       register_node_type_sh_tex_magic(ttype);
+}
+
+static void registerTextureNodes(bNodeTreeType *ttype)
+{
+       register_node_type_frame(ttype);
+       
+       register_node_type_tex_group(ttype);
+//     register_node_type_tex_forloop(ttype);
+//     register_node_type_tex_whileloop(ttype);
+       
+       register_node_type_tex_math(ttype);
+       register_node_type_tex_mix_rgb(ttype);
+       register_node_type_tex_valtorgb(ttype);
+       register_node_type_tex_rgbtobw(ttype);
+       register_node_type_tex_valtonor(ttype);
+       register_node_type_tex_curve_rgb(ttype);
+       register_node_type_tex_curve_time(ttype);
+       register_node_type_tex_invert(ttype);
+       register_node_type_tex_hue_sat(ttype);
+       register_node_type_tex_coord(ttype);
+       register_node_type_tex_distance(ttype);
+       register_node_type_tex_compose(ttype);
+       register_node_type_tex_decompose(ttype);
+       
+       register_node_type_tex_output(ttype);
+       register_node_type_tex_viewer(ttype);
+       
+       register_node_type_tex_checker(ttype);
+       register_node_type_tex_texture(ttype);
+       register_node_type_tex_bricks(ttype);
+       register_node_type_tex_image(ttype);
+       
+       register_node_type_tex_rotate(ttype);
+       register_node_type_tex_translate(ttype);
+       register_node_type_tex_scale(ttype);
+       register_node_type_tex_at(ttype);
+       
+       register_node_type_tex_proc_voronoi(ttype);
+       register_node_type_tex_proc_blend(ttype);
+       register_node_type_tex_proc_magic(ttype);
+       register_node_type_tex_proc_marble(ttype);
+       register_node_type_tex_proc_clouds(ttype);
+       register_node_type_tex_proc_wood(ttype);
+       register_node_type_tex_proc_musgrave(ttype);
+       register_node_type_tex_proc_noise(ttype);
+       register_node_type_tex_proc_stucci(ttype);
+       register_node_type_tex_proc_distnoise(ttype);
 }
 
 static void free_dynamic_typeinfo(bNodeType *ntype)
@@ -2010,9 +2034,9 @@ static void free_typeinfos(ListBase *list)
 
 void init_nodesystem(void) 
 {
-       registerCompositNodes(&ntreeGetType(NTREE_COMPOSIT)->node_types);
-       registerShaderNodes(&ntreeGetType(NTREE_SHADER)->node_types);
-       registerTextureNodes(&ntreeGetType(NTREE_TEXTURE)->node_types);
+       registerCompositNodes(ntreeGetType(NTREE_COMPOSIT));
+       registerShaderNodes(ntreeGetType(NTREE_SHADER));
+       registerTextureNodes(ntreeGetType(NTREE_TEXTURE));
 }
 
 void free_nodesystem(void) 
index 67cedb7..b8f96fa 100644 (file)
@@ -1018,7 +1018,7 @@ static void cache_filename(char *string, const char *path, const char *relbase,
 
        BLI_join_dirfile(cachepath, sizeof(cachepath), path, fname);
 
-       BKE_makepicstring(string, cachepath, relbase, frame, R_OPENEXR, 1, TRUE);
+       BKE_makepicstring(string, cachepath, relbase, frame, R_IMF_IMTYPE_OPENEXR, 1, TRUE);
 }
 
 void BKE_free_ocean_cache(struct OceanCache *och)
@@ -1185,6 +1185,8 @@ void BKE_bake_ocean(struct Ocean *o, struct OceanCache *och, void (*update_cb)(v
         * before use - campbell */
        OceanResult ocr;
 
+       ImageFormatData imf= {0};
+
        int f, i=0, x, y, cancel=0;
        float progress;
 
@@ -1201,6 +1203,13 @@ void BKE_bake_ocean(struct Ocean *o, struct OceanCache *och, void (*update_cb)(v
 
        BLI_srand(0);
 
+       /* setup image format */
+       imf.imtype= R_IMF_IMTYPE_OPENEXR;
+       imf.depth=  R_IMF_CHAN_DEPTH_16;
+       imf.exr_codec= R_IMF_EXR_CODEC_ZIP; /* ZIP */
+
+
+
        for (f=och->start, i=0; f<=och->end; f++, i++) {
 
                /* create a new imbuf to store image for this frame */
@@ -1292,18 +1301,18 @@ void BKE_bake_ocean(struct Ocean *o, struct OceanCache *och, void (*update_cb)(v
 
                /* write the images */
                cache_filename(string, och->bakepath, och->relbase, f, CACHE_TYPE_DISPLACE);
-               if(0 == BKE_write_ibuf(ibuf_disp, string, R_OPENEXR, R_OPENEXR_HALF, 2))  // 2 == ZIP exr codec
+               if(0 == BKE_write_ibuf(ibuf_disp, string, &imf))  // 2 == ZIP exr codec
                        printf("Cannot save Displacement File Output to %s\n", string);
 
                if (o->_do_jacobian) {
                        cache_filename(string, och->bakepath, och->relbase,  f, CACHE_TYPE_FOAM);
-                       if(0 == BKE_write_ibuf(ibuf_foam, string, R_OPENEXR, R_OPENEXR_HALF, 2))  // 2 == ZIP exr codec
+                       if(0 == BKE_write_ibuf(ibuf_foam, string, &imf))  // 2 == ZIP exr codec
                                printf("Cannot save Foam File Output to %s\n", string);
                }
 
                if (o->_do_normals) {
                        cache_filename(string, och->bakepath,  och->relbase, f, CACHE_TYPE_NORMAL);
-                       if(0 == BKE_write_ibuf(ibuf_normal, string, R_OPENEXR, R_OPENEXR_HALF, 2))  // 2 == ZIP exr codec
+                       if(0 == BKE_write_ibuf(ibuf_normal, string, &imf))  // 2 == ZIP exr codec
                                printf("Cannot save Normal File Output to %s\n", string);
                }
 
@@ -1404,8 +1413,9 @@ void BKE_ocean_cache_eval_ij(struct OceanCache *UNUSED(och), struct OceanResult
 {
 }
 
-struct OceanCache *BKE_init_ocean_cache(const char *UNUSED(bakepath), const char *UNUSED(relbase), int UNUSED(start), int UNUSED(end), float UNUSED(wave_scale),
-                                                 float UNUSED(chop_amount), float UNUSED(foam_coverage), float UNUSED(foam_fade), int UNUSED(resolution))
+struct OceanCache *BKE_init_ocean_cache(const char *UNUSED(bakepath), const char *UNUSED(relbase),
+                                        int UNUSED(start), int UNUSED(end), float UNUSED(wave_scale),
+                                        float UNUSED(chop_amount), float UNUSED(foam_coverage), float UNUSED(foam_fade), int UNUSED(resolution))
 {
        OceanCache *och = MEM_callocN(sizeof(OceanCache), "ocean cache data");
 
index 483e95f..b7aa02b 100644 (file)
@@ -347,9 +347,11 @@ Scene *add_scene(const char *name)
        sce->r.mblur_samples= 1;
        sce->r.filtertype= R_FILTER_MITCH;
        sce->r.size= 50;
-       sce->r.planes= 24;
-       sce->r.imtype= R_PNG;
-       sce->r.quality= 90;
+
+       sce->r.im_format.planes= R_IMF_PLANES_RGB;
+       sce->r.im_format.imtype= R_IMF_IMTYPE_PNG;
+       sce->r.im_format.quality= 90;
+
        sce->r.displaymode= R_OUTPUT_AREA;
        sce->r.framapto= 100;
        sce->r.images= 100;
index 5d35867..880bdbf 100644 (file)
@@ -1327,8 +1327,8 @@ static void seq_proxy_build_frame(SeqRenderData context,
        ibuf->ftype= JPG | quality;
 
        /* unsupported feature only confuses other s/w */
-       if(ibuf->depth==32)
-               ibuf->depth= 24;
+       if(ibuf->planes==32)
+               ibuf->planes= 24;
 
        BLI_make_existing_file(name);
        
@@ -1729,7 +1729,7 @@ static ImBuf * input_preprocess(
        }
 
        if(seq->flag & SEQ_MAKE_PREMUL) {
-               if(ibuf->depth == 32 && ibuf->zbuf == NULL) {
+               if(ibuf->planes == 32 && ibuf->zbuf == NULL) {
                        IMB_premultiply_alpha(ibuf);
                }
        }
index 5f23b54..a23037c 100644 (file)
@@ -1412,8 +1412,6 @@ static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
 static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(drawAllEdges)) {
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
        CCGSubSurf *ss = ccgdm->ss;
-       CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
-       CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
        int i, j, edgeSize = ccgSubSurf_getEdgeSize(ss);
        int totedge = ccgSubSurf_getNumEdges(ss);
        int gridSize = ccgSubSurf_getGridSize(ss);
@@ -1451,8 +1449,10 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(draw
        }
 
        if (ccgdm->drawInteriorEdges) {
-               for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
-                       CCGFace *f = ccgFaceIterator_getCurrent(fi);
+               int totface = ccgSubSurf_getNumFaces(ss);
+
+               for(j = 0; j < totface; j++) {
+                       CCGFace *f = ccgdm->faceMap[j].face;
                        int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
 
                        for (S=0; S<numVerts; S++) {
@@ -1477,18 +1477,15 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(draw
                        }
                }
        }
-
-       ccgFaceIterator_free(fi);
-       ccgEdgeIterator_free(ei);
 }
 static void ccgDM_drawLooseEdges(DerivedMesh *dm) {
        CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm;
        CCGSubSurf *ss = cgdm->ss;
-       CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
-       int i, edgeSize = ccgSubSurf_getEdgeSize(ss);
+       int totedge = ccgSubSurf_getNumEdges(ss);
+       int i, j, edgeSize = ccgSubSurf_getEdgeSize(ss);
 
-       for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
-               CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
+       for (j=0; j< totedge; j++) {
+               CCGEdge *e = ccgdm->edgeMap[j].edge;
                DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
 
                if (!ccgSubSurf_getEdgeNumFaces(e)) {
@@ -1500,8 +1497,6 @@ static void ccgDM_drawLooseEdges(DerivedMesh *dm) {
                        glEnd();
                }
        }
-
-       ccgEdgeIterator_free(ei);
 }
 
 static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
@@ -1522,10 +1517,11 @@ static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
 static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)[4], int fast, int (*setMaterial)(int, void *attribs)) {
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
        CCGSubSurf *ss = ccgdm->ss;
-       CCGFaceIterator *fi;
        int gridSize = ccgSubSurf_getGridSize(ss);
        char *faceFlags = ccgdm->faceFlags;
        int step = (fast)? gridSize-1: 1;
+       int i, totface = ccgSubSurf_getNumFaces(ss);
+       int drawcurrent = 0, matnr = -1, shademodel = -1;
 
        ccgdm_pbvh_update(ccgdm);
 
@@ -1543,30 +1539,37 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)
                return;
        }
 
-       fi = ccgSubSurf_getFaceIterator(ss);
-       for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
-               CCGFace *f = ccgFaceIterator_getCurrent(fi);
+       for(i = 0; i < totface; i++) {
+               CCGFace *f = ccgdm->faceMap[i].face;
                int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
                int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f));
-               int drawSmooth, mat_nr;
+               int new_matnr, new_shademodel;
 
                if(faceFlags) {
-                       drawSmooth = (faceFlags[index*2] & ME_SMOOTH);
-                       mat_nr= faceFlags[index*2 + 1];
+                       new_shademodel = (faceFlags[index*2] & ME_SMOOTH)? GL_SMOOTH: GL_FLAT;
+                       new_matnr= faceFlags[index*2 + 1];
                }
                else {
-                       drawSmooth = 1;
-                       mat_nr= 0;
+                       new_shademodel = GL_SMOOTH;
+                       new_matnr= 0;
                }
                
-               if (!setMaterial(mat_nr+1, NULL))
+               if(shademodel != new_shademodel || matnr != new_matnr) {
+                       matnr= new_matnr;
+                       shademodel= new_shademodel;
+
+                       drawcurrent= setMaterial(matnr+1, NULL);
+
+                       glShadeModel(shademodel);
+               }
+
+               if(!drawcurrent)
                        continue;
 
-               glShadeModel(drawSmooth? GL_SMOOTH: GL_FLAT);
                for (S=0; S<numVerts; S++) {
                        DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
-                       if (drawSmooth) {
+                       if (shademodel == GL_SMOOTH) {
                                for (y=0; y<gridSize-1; y+=step) {
                                        glBegin(GL_QUAD_STRIP);
                                        for (x=0; x<gridSize; x+=step) {
@@ -1601,15 +1604,12 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)
                        }
                }
        }
-
-       ccgFaceIterator_free(fi);
 }
 
        /* Only used by non-editmesh types */
 static void cgdm_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *attribs), int (*setDrawOptions)(void *userData, int index), void *userData) {
        CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm;
        CCGSubSurf *ss = cgdm->ss;
-       CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
        GPUVertexAttribs gattribs;
        DMVertexAttribs attribs= {{{NULL}}};
        /* MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE); */ /* UNUSED */
@@ -1742,8 +1742,6 @@ static void cgdm_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
        }
 
 #undef PASSATTRIB
-
-       ccgFaceIterator_free(fi);
 }
 
 static void cgdm_drawFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *attribs)) {
@@ -1754,7 +1752,6 @@ static void cgdm_drawFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *at
 static void cgdm_drawMappedFacesMat(DerivedMesh *dm, void (*setMaterial)(void *userData, int, void *attribs), int (*setFace)(void *userData, int index), void *userData) {
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
        CCGSubSurf *ss = ccgdm->ss;
-       CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
        GPUVertexAttribs gattribs;
        DMVertexAttribs attribs= {{{NULL}}};
        int gridSize = ccgSubSurf_getGridSize(ss);
@@ -1894,18 +1891,15 @@ static void cgdm_drawMappedFacesMat(DerivedMesh *dm, void (*setMaterial)(void *u
        }
 
 #undef PASSATTRIB
-
-       ccgFaceIterator_free(fi);
 }
 
 
 static void cgdm_drawFacesColored(DerivedMesh *dm, int UNUSED(useTwoSided), unsigned char *col1, unsigned char *col2) {
        CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm;
        CCGSubSurf *ss = cgdm->ss;
-       CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
        int gridSize = ccgSubSurf_getGridSize(ss);
        unsigned char *cp1, *cp2;
-       int useTwoSide=1;
+       int useTwoSide=1, i, totface;
 
        ccgdm_pbvh_update(cgdm);
 
@@ -1924,8 +1918,9 @@ static void cgdm_drawFacesColored(DerivedMesh *dm, int UNUSED(useTwoSided), unsi
        }
 
        glBegin(GL_QUADS);
-       for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
-               CCGFace *f = ccgFaceIterator_getCurrent(fi);
+       totface = ccgSubSurf_getNumFaces(ss);
+       for(i = 0; i < totface; i++) {
+               CCGFace *f = ccgdm->faceMap[i].face;
                int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
 
                for (S=0; S<numVerts; S++) {
@@ -1964,8 +1959,6 @@ static void cgdm_drawFacesColored(DerivedMesh *dm, int UNUSED(useTwoSided), unsi
                }
        }
        glEnd();
-
-       ccgFaceIterator_free(fi);
 }
 
 static void cgdm_drawFacesTex_common(DerivedMesh *dm,
index 49e6d59..474b00e 100644 (file)
@@ -231,9 +231,12 @@ MovieTrackingTrack *BKE_tracking_add_track(MovieTracking *tracking, float x, flo
 
 void BKE_tracking_insert_marker(MovieTrackingTrack *track, MovieTrackingMarker *marker)
 {
-       MovieTrackingMarker *old_marker= BKE_tracking_get_marker(track, marker->framenr);
+       MovieTrackingMarker *old_marker= NULL;
 
-       if(old_marker && old_marker->framenr==marker->framenr) {
+       if(track->markersnr)
+               old_marker= BKE_tracking_exact_marker(track, marker->framenr);
+
+       if(old_marker) {
                *old_marker= *marker;
        } else {
                int a= track->markersnr;
@@ -324,7 +327,7 @@ MovieTrackingMarker *BKE_tracking_ensure_marker(MovieTrackingTrack *track, int f
 {
        MovieTrackingMarker *marker= BKE_tracking_get_marker(track, framenr);
 
-       if(marker && marker->framenr!=framenr) {
+       if(marker->framenr!=framenr) {
                MovieTrackingMarker marker_new;
 
                marker_new= *marker;
@@ -341,7 +344,7 @@ MovieTrackingMarker *BKE_tracking_exact_marker(MovieTrackingTrack *track, int fr
 {
        MovieTrackingMarker *marker= BKE_tracking_get_marker(track, framenr);
 
-       if(marker && marker->framenr!=framenr)
+       if(marker->framenr!=framenr)
                return NULL;
 
        return marker;
@@ -440,7 +443,6 @@ void BKE_tracking_clear_path(MovieTrackingTrack *track, int ref_frame, int actio
 int BKE_tracking_test_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack *src_track)
 {
        int a= 0, b= 0;
-       /* int tot= dst_track->markersnr+src_track->markersnr; */ /* UNUSED */
        int count= 0;
 
        while(a<src_track->markersnr || b<dst_track->markersnr) {
@@ -858,13 +860,11 @@ static unsigned char *get_search_bytebuf(ImBuf *ibuf, MovieTrackingTrack *track,
 static ImBuf *get_frame_ibuf(MovieTrackingContext *context, int framenr)
 {
        ImBuf *ibuf;
-       int framenr_old= context->user.framenr;
-
-       context->user.framenr= framenr;
+       MovieClipUser user= context->user;
 
-       ibuf= BKE_movieclip_get_ibuf_flag(context->clip, &context->user, 0);
+       user.framenr= framenr;
 
-       context->user.framenr= framenr_old;
+       ibuf= BKE_movieclip_get_ibuf_flag(context->clip, &user, 0);
 
        return ibuf;
 }
@@ -1050,9 +1050,9 @@ int BKE_tracking_next(MovieTrackingContext *context)
        for(a= 0; a<context->num_tracks; a++) {
                TrackContext *track_context= &context->track_context[a];
                MovieTrackingTrack *track= track_context->track;
-               MovieTrackingMarker *marker= BKE_tracking_get_marker(track, curfra);
+               MovieTrackingMarker *marker= BKE_tracking_exact_marker(track, curfra);
 
-               if(marker && (marker->flag&MARKER_DISABLED)==0 && marker->framenr==curfra) {
+               if(marker && (marker->flag&MARKER_DISABLED)==0) {
 #ifdef WITH_LIBMV
                        int width, height, origin[2], tracked= 0, need_readjust= 0;
                        float pos[2], margin[2];
@@ -1921,10 +1921,8 @@ static float stabilization_auto_scale_factor(MovieTracking *tracking, int width,
                while(track) {
                        if(track->flag&TRACK_USE_2D_STAB ||
                           ((stab->flag&TRACKING_STABILIZE_ROTATION) && track==stab->rot_track)) {
-                               if(track->markersnr) {
-                                       sfra= MIN2(sfra, track->markers[0].framenr);
-                                       efra= MAX2(efra, track->markers[track->markersnr-1].framenr);
-                               }
+                               sfra= MIN2(sfra, track->markers[0].framenr);
+                               efra= MAX2(efra, track->markers[track->markersnr-1].framenr);
                        }
 
                        track= track->next;
@@ -2024,7 +2022,7 @@ static ImBuf* stabilize_alloc_ibuf(ImBuf *cacheibuf, ImBuf *srcibuf, int fill)
                }
        }
        else {
-               cacheibuf= IMB_allocImBuf(srcibuf->x, srcibuf->y, srcibuf->depth, flags);
+               cacheibuf= IMB_allocImBuf(srcibuf->x, srcibuf->y, srcibuf->planes, flags);
                cacheibuf->profile= srcibuf->profile;
        }
 
index 03091a0..8cd3091 100644 (file)
@@ -67,7 +67,7 @@ static void filepath_avi(char *string, RenderData *rd);
 
 #include "BKE_writeframeserver.h"
 
-bMovieHandle *BKE_get_movie_handle(int imtype)
+bMovieHandle *BKE_get_movie_handle(const char imtype)
 {
        static bMovieHandle mh;
        
@@ -80,14 +80,14 @@ bMovieHandle *BKE_get_movie_handle(int imtype)
        
        /* do the platform specific handles */
 #if defined(_WIN32) && !defined(FREE_WINDOWS)
-       if (imtype == R_AVICODEC) {             
+       if (imtype == R_IMF_IMTYPE_AVICODEC) {          
                //XXX mh.start_movie= start_avi_codec;
                //XXX mh.append_movie= append_avi_codec;
                //XXX mh.end_movie= end_avi_codec;
        }
 #endif
 #ifdef WITH_QUICKTIME
-       if (imtype == R_QUICKTIME) {
+       if (imtype == R_IMF_IMTYPE_QUICKTIME) {
                mh.start_movie= start_qt;
                mh.append_movie= append_qt;
                mh.end_movie= end_qt;
@@ -95,7 +95,7 @@ bMovieHandle *BKE_get_movie_handle(int imtype)
        }
 #endif
 #ifdef WITH_FFMPEG
-       if (ELEM4(imtype, R_FFMPEG, R_H264, R_XVID, R_THEORA)) {
+       if (ELEM4(imtype, R_IMF_IMTYPE_FFMPEG, R_IMF_IMTYPE_H264, R_IMF_IMTYPE_XVID, R_IMF_IMTYPE_THEORA)) {
                mh.start_movie = start_ffmpeg;
                mh.append_movie = append_ffmpeg;
                mh.end_movie = end_ffmpeg;
@@ -103,7 +103,7 @@ bMovieHandle *BKE_get_movie_handle(int imtype)
        }
 #endif
 #ifdef WITH_FRAMESERVER
-       if (imtype == R_FRAMESERVER) {
+       if (imtype == R_IMF_IMTYPE_FRAMESERVER) {
                mh.start_movie = start_frameserver;
                mh.append_movie = append_frameserver;
                mh.end_movie = end_frameserver;
@@ -154,7 +154,7 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
        x = rectx;
        y = recty;
 
-       quality= rd->quality;
+       quality= rd->im_format.quality;
        framerate= (double) rd->frs_sec / (double) rd->frs_sec_base;
        
        avi = MEM_mallocN (sizeof(AviMovie), "avimovie");
@@ -162,7 +162,7 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
        /* RPW 11-21-2002 
        if (rd->imtype != AVI_FORMAT_MJPEG) format = AVI_FORMAT_AVI_RGB;
        */
-       if (rd->imtype != R_AVIJPEG ) format = AVI_FORMAT_AVI_RGB;
+       if (rd->im_format.imtype != R_IMF_IMTYPE_AVIJPEG ) format = AVI_FORMAT_AVI_RGB;
        else format = AVI_FORMAT_MJPEG;
 
        if (AVI_open_compress (name, avi, 1, format) != AVI_ERROR_NONE) {
@@ -233,7 +233,7 @@ static void end_avi(void)
 /* similar to BKE_makepicstring() */
 void BKE_makeanimstring(char *string, RenderData *rd)
 {
-       bMovieHandle *mh= BKE_get_movie_handle(rd->imtype);
+       bMovieHandle *mh= BKE_get_movie_handle(rd->im_format.imtype);
        if(mh->get_movie_path)
                mh->get_movie_path(string, rd);
        else
index 3af724b..aa7d71b 100644 (file)
@@ -1337,7 +1337,7 @@ void ffmpeg_verify_image_type(RenderData *rd)
 {
        int audio= 0;
 
-       if(rd->imtype == R_FFMPEG) {
+       if(rd->imtype == R_IMF_IMTYPE_FFMPEG) {
                if(rd->ffcodecdata.type <= 0 ||
                   rd->ffcodecdata.codec <= 0 ||
                   rd->ffcodecdata.audio_codec <= 0 ||
@@ -1353,19 +1353,19 @@ void ffmpeg_verify_image_type(RenderData *rd)
 
                audio= 1;
        }
-       else if(rd->imtype == R_H264) {
+       else if(rd->imtype == R_IMF_IMTYPE_H264) {
                if(rd->ffcodecdata.codec != CODEC_ID_H264) {
                        ffmpeg_set_preset(rd, FFMPEG_PRESET_H264);
                        audio= 1;
                }
        }
-       else if(rd->imtype == R_XVID) {
+       else if(rd->imtype == R_IMF_IMTYPE_XVID) {
                if(rd->ffcodecdata.codec != CODEC_ID_MPEG4) {
                        ffmpeg_set_preset(rd, FFMPEG_PRESET_XVID);
                        audio= 1;
                }
        }
-       else if(rd->imtype == R_THEORA) {
+       else if(rd->imtype == R_IMF_IMTYPE_THEORA) {
                if(rd->ffcodecdata.codec != CODEC_ID_THEORA) {
                        ffmpeg_set_preset(rd, FFMPEG_PRESET_THEORA);
                        audio= 1;
index 69b5612..6eba7d5 100644 (file)
@@ -32,6 +32,7 @@ extern "C" {
 #endif
 
 char        *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy);
+char        *BLI_strncat_utf8(char *dst, const char *src, size_t maxncpy);
 int          BLI_utf8_invalid_byte(const char *str, int length);
 int          BLI_utf8_invalid_strip(char *str, int length);
 
index 1101a7a..217e768 100644 (file)
@@ -45,6 +45,7 @@
 #include "BLI_fileops.h"
 #include "BLI_path_util.h"
 #include "BLI_string.h"
+#include "BLI_string_utf8.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_utildefines.h"
@@ -221,16 +222,25 @@ int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, cons
        }
 
        if(unique_check(arg, name)) {
+               char    numstr[16];
                char    tempname[UNIQUE_NAME_MAX];
                char    left[UNIQUE_NAME_MAX];
                int             number;
                int             len= BLI_split_name_num(left, &number, name, delim);
                do {
-                       int newlen= BLI_snprintf(tempname, name_len, "%s%c%03d", left, delim, ++number);
-                       if(newlen >= name_len) {
-                               len -= ((newlen + 1) - name_len);
-                               if(len < 0) len= number= 0;
-                               left[len]= '\0';
+                       int numlen= BLI_snprintf(numstr, sizeof(numstr), "%c%03d", delim, ++number);
+
+                       /* highly unlikely the string only has enough room for the number
+                        * but support anyway */
+                       if ((len == 0) || (numlen >= name_len)) {
+                               /* number is know not to be utf-8 */
+                               BLI_strncpy(tempname, numstr, name_len);
+                       }
+                       else {
+                               char *tempname_buf;
+                               tempname[0]= '\0';
+                               tempname_buf =BLI_strncat_utf8(tempname, left, name_len - numlen);
+                               memcpy(tempname_buf, numstr, numlen + 1);
                        }
                } while(unique_check(arg, tempname));
 
index f8cdc3e..89136f2 100644 (file)
@@ -163,28 +163,46 @@ static const size_t utf8_skip_data[256] = {
     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1
 };
 
+#define BLI_STR_UTF8_CPY(dst, src, maxncpy)                                   \
+       {                                                                         \
+               size_t utf8_size;                                                     \
+               while(*src != '\0' && (utf8_size= utf8_skip_data[*src]) < maxncpy) {  \
+                       maxncpy -= utf8_size;                                             \
+                       switch(utf8_size) {                                               \
+                               case 6: *dst ++ = *src ++;                                    \
+                               case 5: *dst ++ = *src ++;                                    \
+                               case 4: *dst ++ = *src ++;                                    \
+                               case 3: *dst ++ = *src ++;                                    \
+                               case 2: *dst ++ = *src ++;                                    \
+                               case 1: *dst ++ = *src ++;                                    \
+                       }                                                                 \
+               }                                                                     \
+               *dst= '\0';                                                           \
+       }
+
 char *BLI_strncpy_utf8(char *dst, const char *src, size_t maxncpy)
 {
        char *dst_r= dst;
-       size_t utf8_size;
 
        /* note: currently we dont attempt to deal with invalid utf8 chars */
+       BLI_STR_UTF8_CPY(dst, src, maxncpy)
 
-       while(*src != '\0' && (utf8_size= utf8_skip_data[*src]) < maxncpy) {
-               maxncpy -= utf8_size;
-               switch(utf8_size) {
-                       case 6: *dst ++ = *src ++;
-                       case 5: *dst ++ = *src ++;
-                       case 4: *dst ++ = *src ++;
-                       case 3: *dst ++ = *src ++;
-                       case 2: *dst ++ = *src ++;
-                       case 1: *dst ++ = *src ++;
-               }
-       }
-       *dst= '\0';
        return dst_r;
 }
 
+char *BLI_strncat_utf8(char *dst, const char *src, size_t maxncpy)
+{
+       while (*dst && maxncpy > 0) {
+               dst++;
+               maxncpy--;
+       }
+
+       BLI_STR_UTF8_CPY(dst, src, maxncpy)
+
+       return dst;
+}
+
+#undef BLI_STR_UTF8_CPY
 
 /* --------------------------------------------------------------------------*/
 /* wchar_t / utf8 functions  */
index b58a27f..f49a6be 100644 (file)
@@ -7430,6 +7430,67 @@ static void do_versions_nodetree_convert_angle(bNodeTree *ntree)
        }
 }
 
+void do_versions_image_settings_2_60(Scene *sce)
+{
+       /* note: rd->subimtype is moved into indervidual settings now and no longer
+        * exists */
+       RenderData *rd= &sce->r;
+       ImageFormatData *imf= &sce->r.im_format;
+
+       imf->imtype= rd->imtype;
+       imf->planes= rd->planes;
+       imf->compress= rd->quality;
+       imf->quality= rd->quality;
+
+       /* default, was stored in multiple places, may override later */
+       imf->depth= R_IMF_CHAN_DEPTH_8;
+
+       /* openexr */
+       imf->exr_codec = rd->quality & 7; /* strange but true! 0-4 are valid values, OPENEXR_COMPRESS */
+
+       switch (imf->imtype) {
+       case R_IMF_IMTYPE_OPENEXR:
+               imf->depth=  (rd->subimtype & R_OPENEXR_HALF) ? R_IMF_CHAN_DEPTH_16 : R_IMF_CHAN_DEPTH_32;
+               if (rd->subimtype & R_PREVIEW_JPG) {
+                       imf->flag |= R_IMF_FLAG_PREVIEW_JPG;
+               }
+               if (rd->subimtype & R_OPENEXR_ZBUF) {
+                       imf->flag |= R_IMF_FLAG_ZBUF;
+               }
+               break;
+       case R_IMF_IMTYPE_TIFF:
+               if (rd->subimtype & R_TIFF_16BIT) {
+                       imf->depth= R_IMF_CHAN_DEPTH_16;
+               }
+               break;
+       case R_IMF_IMTYPE_JP2:
+               if (rd->subimtype & R_JPEG2K_16BIT) {
+                       imf->depth= R_IMF_CHAN_DEPTH_16;
+               }
+               else if (rd->subimtype & R_JPEG2K_12BIT) {
+                       imf->depth= R_IMF_CHAN_DEPTH_12;
+               }
+
+               if (rd->subimtype & R_JPEG2K_YCC) {
+                       imf->jp2_flag |= R_IMF_JP2_FLAG_YCC;
+               }
+               if (rd->subimtype & R_JPEG2K_CINE_PRESET) {
+                       imf->jp2_flag |= R_IMF_JP2_FLAG_CINE_PRESET;
+               }
+               if (rd->subimtype & R_JPEG2K_CINE_48FPS) {
+                       imf->jp2_flag |= R_IMF_JP2_FLAG_CINE_48;
+               }
+               break;
+       case R_IMF_IMTYPE_CINEON:
+       case R_IMF_IMTYPE_DPX:
+               if (rd->subimtype & R_CINEON_LOG) {
+                       imf->cineon_flag |= R_IMF_CINEON_FLAG_LOG;
+               }
+               break;
+       }
+
+}
+
 static void do_versions(FileData *fd, Library *lib, Main *main)
 {
        /* WATCH IT!!!: pointers from libdata have not been converted */
@@ -12626,6 +12687,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
 
        /* put compatibility code here until next subversion bump */
        {
+               Scene *sce;
+               for(sce = main->scene.first; sce; sce = sce->id.next) {
+                       if (sce->r.im_format.depth == 0) {
+                               do_versions_image_settings_2_60(sce);
+                       }
+               }
        }
 
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! */
index a0b4774..458fe17 100644 (file)
@@ -515,7 +515,7 @@ uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, const char *str, int x1, i
 uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, int x1, int y1, short x2, short y2, float a1, float a2, const char *tip);
 
 uiBut *uiDefAutoButR(uiBlock *block, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, const char *name, int icon, int x1, int y1, int x2, int y2);
-int uiDefAutoButsRNA(uiLayout *layout, struct PointerRNA *ptr, int (*check_prop)(struct PropertyRNA *), const char label_align);
+int uiDefAutoButsRNA(uiLayout *layout, struct PointerRNA *ptr, int (*check_prop)(struct PointerRNA *, struct PropertyRNA *), const char label_align);
 
 /* Links
  *
@@ -688,7 +688,7 @@ uiBlock *uiLayoutGetBlock(uiLayout *layout);
 void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
 void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr);
 const char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
-void uiLayoutOperatorButs(const struct bContext *C, struct uiLayout *layout, struct wmOperator *op, int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag);
+void uiLayoutOperatorButs(const struct bContext *C, struct uiLayout *layout, struct wmOperator *op, int (*check_prop)(struct PointerRNA *, struct PropertyRNA *), const char label_align, const short flag);
 struct MenuType *uiButGetMenuType(uiBut *but);
 
 void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
@@ -748,6 +748,7 @@ void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, const char *
 void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
                       PointerRNA *used_ptr, const char *used_propname, int active_layer);
 void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr, int compact);
+void uiTemplateImageSettings(uiLayout *layout, struct PointerRNA *imfptr);
 void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
 void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
 void uiTemplateOperatorSearch(uiLayout *layout);
index c553c1e..84f0c61 100644 (file)
@@ -2743,7 +2743,7 @@ const char *uiLayoutIntrospect(uiLayout *layout)
 }
 
 /* this function does not initialize the layout, functions can be called on the layout before and after */
-void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag)
+void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,int (*check_prop)(struct PointerRNA *, struct PropertyRNA *), const char label_align, const short flag)
 {
        if(!op->properties) {
                IDPropertyTemplate val = {0};
index 47dde3f..d117a7f 100644 (file)
@@ -385,7 +385,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
 
                        for(i=0; i<totitem; i++) {
                                if(item[i].identifier[0] && item[i].value == value) {
-                                       if(item[i].description[0]) {
+                                       if(item[i].description && item[i].description[0]) {
                                                BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "%s: %s", item[i].name, item[i].description);
                                                data->color[data->totline]= 0xDDDDDD;
                                                data->totline++;
index 23d5e77..8335668 100644 (file)
@@ -130,7 +130,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
        return but;
 }
 
-int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(PropertyRNA *), const char label_align)
+int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(PointerRNA *, PropertyRNA *), const char label_align)
 {
        uiLayout *split, *col;
        int flag;
@@ -141,7 +141,7 @@ int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(Proper
 
        RNA_STRUCT_BEGIN(ptr, prop) {
                flag= RNA_property_flag(prop);
-               if(flag & PROP_HIDDEN || (check_prop && check_prop(prop)==FALSE))
+               if(flag & PROP_HIDDEN || (check_prop && check_prop(ptr, prop)==FALSE))
                        continue;
 
                if(label_align != '\0') {
index 5e14434..a6f71d9 100644 (file)
@@ -72,6 +72,7 @@
 #include "ED_space_api.h"
 #include "ED_view3d.h"
 #include "ED_mesh.h"
+#include "ED_numinput.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -98,6 +99,7 @@ typedef struct tringselOpData {
        Object *ob;
        BMEditMesh *em;
        BMEdge *eed;
+       NumInput num;
 
        int extend;
        int do_cut;
@@ -368,6 +370,11 @@ static int ringsel_init (bContext *C, wmOperator *op, int do_cut)
        lcd->em= ((Mesh *)lcd->ob->data)->edit_btmesh;
        lcd->extend = do_cut ? 0 : RNA_boolean_get(op->ptr, "extend");
        lcd->do_cut = do_cut;
+       
+       initNumInput(&lcd->num);
+       lcd->num.idx_max = 0;
+       lcd->num.flag |= NUM_NO_NEGATIVE | NUM_NO_FRACTION;
+       
        em_setup_viewcontext(C, &lcd->vc);
 
        ED_region_tag_redraw(lcd->ar);
@@ -455,6 +462,7 @@ static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
                        
                        ED_region_tag_redraw(lcd->ar);
                        break;
+               case PADPLUSKEY:
                case PAGEUPKEY:
                case WHEELUPMOUSE:  /* change number of cuts */
                        if (event->val == KM_RELEASE)
@@ -466,6 +474,7 @@ static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
                        
                        ED_region_tag_redraw(lcd->ar);
                        break;
+               case PADMINUS:
                case PAGEDOWNKEY:
                case WHEELDOWNMOUSE:  /* change number of cuts */
                        if (event->val == KM_RELEASE)
@@ -495,6 +504,23 @@ static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
                }                       
        }
        
+       /* using the keyboard to input the number of cuts */
+       if (event->val==KM_PRESS) {
+               float value;
+               
+               if (handleNumInput(&lcd->num, event))
+               {
+                       applyNumInput(&lcd->num, &value);
+                       
+                       cuts= CLAMPIS(value, 1, 32);
+                       
+                       RNA_int_set(op->ptr,"number_cuts",cuts);
+                       ringsel_find_edge(lcd, cuts);
+                       
+                       ED_region_tag_redraw(lcd->ar);
+               }
+       }
+       
        /* keep going until the user confirms */
        return OPERATOR_RUNNING_MODAL;
 }
index 68a58ae..0d3d732 100644 (file)
@@ -1085,7 +1085,7 @@ static void clear_images(MTFace *mtface, int totface)
                if((ima->id.flag&LIB_DOIT)==0) {
                        ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
 
-                       IMB_rectfill(ibuf, (ibuf->depth == 32) ? vec_alpha : vec_solid);
+                       IMB_rectfill(ibuf, (ibuf->planes == R_IMF_PLANES_RGBA) ? vec_alpha : vec_solid);
                        ima->id.flag|= LIB_DOIT;
                }
        }
index 47f3906..6392672 100644 (file)
@@ -2057,10 +2057,8 @@ static int game_property_copy_exec(bContext *C, wmOperator *op)
                
                if(prop) {
                        CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
-                               if (ob != ob_iter) {
-                                       if (ob->data != ob_iter->data)
-                                               set_ob_property(ob_iter, prop);
-                               }
+                               if (ob != ob_iter)
+                                       set_ob_property(ob_iter, prop);
                        } CTX_DATA_END;
                }
        }
@@ -2068,17 +2066,13 @@ static int game_property_copy_exec(bContext *C, wmOperator *op)
        else {
                CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
                        if (ob != ob_iter) {
-                               if (ob->data != ob_iter->data){
-                                       if (type == COPY_PROPERTIES_REPLACE)
-                                               copy_properties( &ob_iter->prop, &ob->prop );
-
-                                       /* merge - the default when calling with no argument */
-                                       else {
-                                               for(prop = ob->prop.first; prop; prop= prop->next ) {
-                                                       set_ob_property(ob_iter, prop);
-                                               }
-                                       }
-                               }
+                               if (type == COPY_PROPERTIES_REPLACE)
+                                       copy_properties(&ob_iter->prop, &ob->prop);
+
+                               /* merge - the default when calling with no argument */
+                               else
+                                       for(prop = ob->prop.first; prop; prop= prop->next)
+                                               set_ob_property(ob_iter, prop);
                        }
                }
                CTX_DATA_END;
index 6931b0b..dbd1e27 100644 (file)
@@ -235,7 +235,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
        /* custom scene and single layer re-render */
        screen_render_scene_layer_set(op, mainp, &scene, &srl);
 
-       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) {
                BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected");
                return OPERATOR_CANCELLED;
        }
@@ -516,7 +516,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
                return OPERATOR_CANCELLED;
        }
 
-       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) {
                BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected");
                return OPERATOR_CANCELLED;
        }       
index 188a611..a68286b 100644 (file)
@@ -220,12 +220,12 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
                        char name[FILE_MAX];
                        int ok;
 
-                       if(scene->r.planes == 8) {
+                       if(scene->r.im_format.planes == R_IMF_CHAN_DEPTH_8) {
                                IMB_color_to_bw(ibuf);
                        }
 
-                       BKE_makepicstring(name, scene->r.pic, oglrender->bmain->name, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE);
-                       ok= BKE_write_ibuf(ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality); /* no need to stamp here */
+                       BKE_makepicstring(name, scene->r.pic, oglrender->bmain->name, scene->r.cfra, scene->r.im_format.imtype, scene->r.scemode & R_EXTENSION, FALSE);
+                       ok= BKE_write_ibuf(ibuf, name, &scene->r.im_format); /* no need to stamp here */
                        if(ok)  printf("OpenGL Render written to '%s'\n", name);
                        else    printf("OpenGL Render failed to write '%s'\n", name);
                }
@@ -263,7 +263,7 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
                return 0;
        }
 
-       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) {
                BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected");
                return 0;
        }
@@ -332,7 +332,7 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
        Scene *scene= oglrender->scene;
 
        if(oglrender->mh) {
-               if(BKE_imtype_is_movie(scene->r.imtype))
+               if(BKE_imtype_is_movie(scene->r.im_format.imtype))
                        oglrender->mh->end_movie();
        }
 
@@ -371,8 +371,8 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op)
        scene= oglrender->scene;
 
        oglrender->reports= op->reports;
-       oglrender->mh= BKE_get_movie_handle(scene->r.imtype);
-       if(BKE_imtype_is_movie(scene->r.imtype)) {
+       oglrender->mh= BKE_get_movie_handle(scene->r.im_format.imtype);
+       if(BKE_imtype_is_movie(scene->r.im_format.imtype)) {
                if(!oglrender->mh->start_movie(scene, &scene->r, oglrender->sizex, oglrender->sizey, oglrender->reports)) {
                        screen_opengl_render_end(C, oglrender);
                        return 0;
@@ -440,7 +440,7 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
        if(ibuf) {
                /* color -> greyscale */
                /* editing directly would alter the render view */
-               if(scene->r.planes == 8) {
+               if(scene->r.im_format.planes == R_IMF_PLANES_BW) {
                        ImBuf *ibuf_bw= IMB_dupImBuf(ibuf);
                        IMB_color_to_bw(ibuf_bw);
                        // IMB_freeImBuf(ibuf); /* owned by the image */
@@ -449,14 +449,14 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
                else {
                        /* this is lightweight & doesnt re-alloc the buffers, only do this
                         * to save the correct bit depth since the image is always RGBA */
-                       ImBuf *ibuf_cpy= IMB_allocImBuf(ibuf->x, ibuf->y, scene->r.planes, 0);
+                       ImBuf *ibuf_cpy= IMB_allocImBuf(ibuf->x, ibuf->y, scene->r.im_format.planes, 0);
                        ibuf_cpy->rect= ibuf->rect;
                        ibuf_cpy->rect_float= ibuf->rect_float;
                        ibuf_cpy->zbuf_float= ibuf->zbuf_float;
                        ibuf= ibuf_cpy;
                }
 
-               if(BKE_imtype_is_movie(scene->r.imtype)) {
+               if(BKE_imtype_is_movie(scene->r.im_format.imtype)) {
                        ok= oglrender->mh->append_movie(&scene->r, CFRA, (int*)ibuf->rect, oglrender->sizex, oglrender->sizey, oglrender->reports);
                        if(ok) {
                                printf("Append frame %d", scene->r.cfra);
@@ -464,8 +464,8 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
                        }
                }
                else {
-                       BKE_makepicstring(name, scene->r.pic, oglrender->bmain->name, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE);
-                       ok= BKE_write_ibuf_stamp(scene, camera, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+                       BKE_makepicstring(name, scene->r.pic, oglrender->bmain->name, scene->r.cfra, scene->r.im_format.imtype, scene->r.scemode & R_EXTENSION, TRUE);
+                       ok= BKE_write_ibuf_stamp(scene, camera, ibuf, name, &scene->r.im_format);
 
                        if(ok==0) {
                                printf("Write error: cannot save %s\n", name);
index aca2d14..ba73bbd 100644 (file)
@@ -658,7 +658,7 @@ void TEXTURE_OT_slot_move(wmOperatorType *ot)
 
 /********************** environment map operators *********************/
 
-static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *path, int imtype)
+static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *path, const char imtype)
 {
        float layout[12];
        if ( RNA_struct_find_property(op->ptr, "layout") )
@@ -680,7 +680,7 @@ static int envmap_save_exec(bContext *C, wmOperator *op)
        Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
        Scene *scene = CTX_data_scene(C);
        //int imtype = RNA_enum_get(op->ptr, "file_type");
-       int imtype = scene->r.imtype;
+       char imtype = scene->r.im_format.imtype;
        char path[FILE_MAX];
        
        RNA_string_get(op->ptr, "filepath", path);
@@ -707,7 +707,7 @@ static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event
        if(RNA_property_is_set(op->ptr, "filepath"))
                return envmap_save_exec(C, op);
 
-       //RNA_enum_set(op->ptr, "file_type", scene->r.imtype);
+       //RNA_enum_set(op->ptr, "file_type", scene->r.im_format.imtype);
        RNA_string_set(op->ptr, "filepath", G.main->name);
        WM_event_add_fileselect(C, op);
        
index 8a90aad..48970df 100644 (file)
@@ -161,12 +161,12 @@ static int screenshot_exec(bContext *C, wmOperator *op)
                        /* BKE_add_image_extension() checks for if extension was already set */
                        if(scene->r.scemode & R_EXTENSION)
                                if(strlen(path)<FILE_MAXDIR+FILE_MAXFILE-5)
-                                       BKE_add_image_extension(path, scene->r.imtype);
+                                       BKE_add_image_extension(path, scene->r.im_format.imtype);
 
                        ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0);
                        ibuf->rect= scd->dumprect;
 
-                       BKE_write_ibuf(ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+                       BKE_write_ibuf(ibuf, path, &scene->r.im_format);
 
                        IMB_freeImBuf(ibuf);
                }
@@ -261,14 +261,14 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float
 {
        ScreenshotJob *sj= sjv;
        RenderData rd= sj->scene->r;
-       bMovieHandle *mh= BKE_get_movie_handle(sj->scene->r.imtype);
+       bMovieHandle *mh= BKE_get_movie_handle(sj->scene->r.im_format.imtype);
        int cfra= 1;
        
        /* we need this as local variables for renderdata */
        rd.frs_sec= U.scrcastfps;
        rd.frs_sec_base= 1.0f;
        
-       if(BKE_imtype_is_movie(rd.imtype)) {
+       if(BKE_imtype_is_movie(rd.im_format.imtype)) {
                if(!mh->start_movie(sj->scene, &rd, sj->dumpsx, sj->dumpsy, &sj->reports)) {
                        printf("screencast job stopped\n");
                        return;
@@ -294,14 +294,14 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float
                                        break;
                        }
                        else {
-                               ImBuf *ibuf= IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.planes, 0);
+                               ImBuf *ibuf= IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.im_format.planes, 0);
                                char name[FILE_MAXDIR+FILE_MAXFILE];
                                int ok;
                                
-                               BKE_makepicstring(name, rd.pic, sj->bmain->name, cfra, rd.imtype, rd.scemode & R_EXTENSION, TRUE);
+                               BKE_makepicstring(name, rd.pic, sj->bmain->name, cfra, rd.im_format.imtype, rd.scemode & R_EXTENSION, TRUE);
                                
                                ibuf->rect= sj->dumprect;
-                               ok= BKE_write_ibuf(ibuf, name, rd.imtype, rd.subimtype, rd.quality);
+                               ok= BKE_write_ibuf(ibuf, name, &rd.im_format);
                                
                                if(ok==0) {
                                        printf("Write error: cannot save %s\n", name);
index 7ae5f43..7625633 100644 (file)
@@ -4337,7 +4337,7 @@ static ImBuf *imapaint_lift_clone(ImBuf *ibuf, ImBuf *ibufb, int *pos)
        /* note: allocImbuf returns zero'd memory, so regions outside image will
           have zero alpha, and hence not be blended onto the image */
        int w=ibufb->x, h=ibufb->y, destx=0, desty=0, srcx=pos[0], srcy=pos[1];
-       ImBuf *clonebuf= IMB_allocImBuf(w, h, ibufb->depth, ibufb->flags);
+       ImBuf *clonebuf= IMB_allocImBuf(w, h, ibufb->planes, ibufb->flags);
 
        IMB_rectclip(clonebuf, ibuf, &destx, &desty, &srcx, &srcy, &w, &h);
        IMB_rectblend(clonebuf, ibuf, destx, desty, srcx, srcy, w, h,
index 623cfc4..dd7ea81 100644 (file)
@@ -265,7 +265,7 @@ static int sound_mixdown_invoke(bContext *C, wmOperator *op, wmEvent *event)
        return WM_operator_filesel(C, op, event);
 }
 
-static int sound_mixdown_draw_check_prop(PropertyRNA *prop)
+static int sound_mixdown_draw_check_prop(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
 {
        const char *prop_id= RNA_property_identifier(prop);
        return !(       strcmp(prop_id, "filepath") == 0 ||
index 43eb45b..ddfd403 100644 (file)
@@ -90,12 +90,14 @@ void uiTemplateMovieClip(uiLayout *layout, bContext *C, PointerRNA *ptr, const c
 
        prop= RNA_struct_find_property(ptr, propname);
        if(!prop) {
-               printf("uiTemplateMovieClip: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: property not found: %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
        if(RNA_property_type(prop) != PROP_POINTER) {
-               printf("uiTemplateMovieClip: expected pointer property for %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: expected pointer property for %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -136,12 +138,14 @@ void uiTemplateTrack(uiLayout *layout, PointerRNA *ptr, const char *propname)
 
        prop= RNA_struct_find_property(ptr, propname);
        if(!prop) {
-               printf("uiTemplateTrack: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: property not found: %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
        if(RNA_property_type(prop) != PROP_POINTER) {
-               printf("uiTemplateTrack: expected pointer property for %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: expected pointer property for %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -327,12 +331,14 @@ void uiTemplateMarker(uiLayout *layout, PointerRNA *ptr, const char *propname, P
 
        prop= RNA_struct_find_property(ptr, propname);
        if(!prop) {
-               printf("uiTemplateMarker: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: property not found: %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
        if(RNA_property_type(prop) != PROP_POINTER) {
-               printf("uiTemplateMarker: expected pointer property for %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: expected pointer property for %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
index 7bcaf72..26083cb 100644 (file)
@@ -177,7 +177,7 @@ static void file_panel_operator_header(const bContext *C, Panel *pa)
        BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname));
 }
 
-static int file_panel_check_prop(PropertyRNA *prop)
+static int file_panel_check_prop(PointerRNA *UNUSED(ptr), PropertyRNA *prop)
 {
        const char *prop_id= RNA_property_identifier(prop);
        return !(       strcmp(prop_id, "filepath") == 0 ||
index 5445f2e..11a9c0d 100644 (file)
@@ -122,13 +122,13 @@ static void image_info(Scene *scene, ImageUser *iuser, Image *ima, ImBuf *ibuf,
                        if(ibuf->channels!=4) {
                                ofs+= sprintf(str+ofs, "%d float channel(s)", ibuf->channels);
                        }
-                       else if(ibuf->depth==32)
+                       else if(ibuf->planes == R_IMF_PLANES_RGBA)
                                ofs+= sprintf(str+ofs, " RGBA float");
                        else
                                ofs+= sprintf(str+ofs, " RGB float");
                }
                else {
-                       if(ibuf->depth==32)
+                       if(ibuf->planes == R_IMF_PLANES_RGBA)
                                ofs+= sprintf(str+ofs, " RGBA byte");
                        else
                                ofs+= sprintf(str+ofs, " RGB byte");
@@ -649,12 +649,14 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
 
        prop= RNA_struct_find_property(ptr, propname);
        if(!prop) {
-               printf("uiTemplateImage: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: property not found: %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
        if(RNA_property_type(prop) != PROP_POINTER) {
-               printf("uiTemplateImage: expected pointer property for %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+               printf("%s: expected pointer property for %s.%s\n",
+                      __func__, RNA_struct_identifier(ptr->type), propname);
                return;
        }
 
@@ -815,6 +817,74 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
        MEM_freeN(cb);
 }
 
+void uiTemplateImageSettings(uiLayout *layout, PointerRNA *imfptr)
+{
+       ImageFormatData *imf= imfptr->data;
+       ID *id= imfptr->id.data;
+       const int depth_ok= BKE_imtype_valid_depths(imf->imtype);
+       /* some settings depend on this being a scene thats rendered */
+       const short is_render_out= (id && GS(id->name) == ID_SCE);
+
+       uiLayout *col, *row;
+
+       col= uiLayoutColumn(layout, 0);
+
+       uiItemR(col, imfptr, "file_format", 0, "", ICON_NONE);
+
+       row= uiLayoutRow(col, 0);
+       uiItemR(row, imfptr, "color_mode", UI_ITEM_R_EXPAND, "Color", ICON_NONE);
+
+       /* only display depth setting if multiple depths can be used */
+       if((ELEM6(depth_ok,
+                 R_IMF_CHAN_DEPTH_1,
+                 R_IMF_CHAN_DEPTH_8,
+                 R_IMF_CHAN_DEPTH_12,
+                 R_IMF_CHAN_DEPTH_16,
+                 R_IMF_CHAN_DEPTH_24,
+                 R_IMF_CHAN_DEPTH_32)) == 0)
+       {
+               row= uiLayoutRow(col, 0);
+               uiItemR(row, imfptr, "color_depth", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+       }
+
+       if (BKE_imtype_supports_quality(imf->imtype)) {
+               uiItemR(col, imfptr, "quality", 0, NULL, ICON_NONE);
+       }
+
+       if (BKE_imtype_supports_compress(imf->imtype)) {
+               uiItemR(col, imfptr, "compression", 0, NULL, ICON_NONE);
+       }
+
+       if (ELEM(imf->imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER)) {
+               uiItemR(col, imfptr, "exr_codec", 0, NULL, ICON_NONE);
+       }
+
+       if (BKE_imtype_supports_zbuf(imf->imtype)) {
+               uiItemR(col, imfptr, "use_zbuffer", 0, NULL, ICON_NONE);
+       }
+
+       if (is_render_out && (imf->imtype == R_IMF_IMTYPE_OPENEXR)) {
+               uiItemR(col, imfptr, "use_preview", 0, NULL, ICON_NONE);
+       }
+
+       if (imf->imtype == R_IMF_IMTYPE_JP2) {
+               uiItemR(col, imfptr, "use_jpeg2k_ycc", 0, NULL, ICON_NONE);
+               uiItemR(col, imfptr, "use_jpeg2k_cinema_preset", 0, NULL, ICON_NONE);
+               uiItemR(col, imfptr, "use_jpeg2k_cinema_48", 0, NULL, ICON_NONE);
+       }
+
+       if (imf->imtype == R_IMF_IMTYPE_CINEON) {
+#if 1
+               uiItemL(col, "FIXME: hard coded Non-Linear, Gamma:1.0", ICON_NONE);
+#else
+               uiItemR(col, imfptr, "use_cineon_log", 0, NULL, ICON_NONE);
+               uiItemR(col, imfptr, "cineon_black", 0, NULL, ICON_NONE);
+               uiItemR(col, imfptr, "cineon_white", 0, NULL, ICON_NONE);
+               uiItemR(col, imfptr, "cineon_gamma", 0, NULL, ICON_NONE);
+#endif
+       }
+}
+
 void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser *iuser)
 {
        Scene *scene= CTX_data_scene(C);
index 77c92b2..bff2d82 100644 (file)
@@ -707,40 +707,6 @@ void IMAGE_OT_view_zoom_ratio(wmOperatorType *ot)
 }
 
 /**************** load/replace/save callbacks ******************/
-
-/* XXX make dynamic */
-static const EnumPropertyItem image_file_type_items[] = {
-               {R_TARGA, "TARGA", 0, "Targa", ""},
-               {R_RAWTGA, "TARGA RAW", 0, "Targa Raw", ""},
-               {R_PNG, "PNG", 0, "PNG", ""},
-#ifdef WITH_DDS
-               {R_DDS, "DDS", 0, "DirectDraw Surface", ""},
-#endif
-               {R_BMP, "BMP", 0, "BMP", ""},
-               {R_JPEG90, "JPEG", 0, "Jpeg", ""},
-#ifdef WITH_OPENJPEG
-               {R_JP2, "JPEG_2000", 0, "Jpeg 2000", ""},
-#endif
-               {R_IRIS, "IRIS", 0, "Iris", ""},
-#ifdef WITH_TIFF
-               {R_TIFF, "TIFF", 0, "Tiff", ""},
-#endif
-#ifdef WITH_DDS
-               {R_RADHDR, "RADIANCE_HDR", 0, "Radiance HDR", ""},
-#endif
-#ifdef WITH_CINEON
-               {R_CINEON, "CINEON", 0, "Cineon", ""},
-               {R_DPX, "DPX", 0, "DPX", ""},
-#endif
-#ifdef WITH_OPENEXR
-               {R_OPENEXR, "OPENEXR", 0, "OpenEXR", ""},
-       /* saving sequences of multilayer won't work, they copy buffers  */
-       /*if(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER);
-       else*/
-               {R_MULTILAYER, "MULTILAYER", 0, "MultiLayer", ""},
-#endif 
-               {0, NULL, 0, NULL, NULL}};
-
 static void image_filesel(bContext *C, wmOperator *op, const char *path)
 {
        RNA_string_set(op->ptr, "filepath", path);
@@ -943,19 +909,42 @@ void IMAGE_OT_replace(wmOperatorType *ot)
 
 typedef struct {
        /* matching scene->r settings */
-       short planes, imtype, subimtype, quality;
+       //short planes, imtype, subimtype, quality;
+       ImageFormatData im_format;
        char filepath[FILE_MAX]; /* keep absolute */
 } SaveImageOptions;
 
 static void save_image_options_defaults(SaveImageOptions *simopts)
 {
-       simopts->planes= R_PLANES24;
-       simopts->imtype= R_PNG;
-       simopts->subimtype= 0;
-       simopts->quality= 90;
+       memset(&simopts->im_format, 0, sizeof(simopts->im_format));
+       simopts->im_format.planes= R_IMF_PLANES_RGB;
+       simopts->im_format.imtype= R_IMF_IMTYPE_PNG;
+       simopts->im_format.quality= 90;
+       simopts->im_format.compress= 90;
        simopts->filepath[0]= '\0';
 }
 
+static char imtype_best_depth(ImBuf *ibuf, const char imtype)
+{
+       const char depth_ok= BKE_imtype_valid_depths(imtype);
+
+       if (ibuf->rect_float) {
+               if (depth_ok & R_IMF_CHAN_DEPTH_32) return R_IMF_CHAN_DEPTH_32;
+               if (depth_ok & R_IMF_CHAN_DEPTH_24) return R_IMF_CHAN_DEPTH_24;
+               if (depth_ok & R_IMF_CHAN_DEPTH_16) return R_IMF_CHAN_DEPTH_16;
+               if (depth_ok & R_IMF_CHAN_DEPTH_12) return R_IMF_CHAN_DEPTH_12;
+               return R_IMF_CHAN_DEPTH_8;
+       }
+       else {
+               if (depth_ok & R_IMF_CHAN_DEPTH_8) return R_IMF_CHAN_DEPTH_8;
+               if (depth_ok & R_IMF_CHAN_DEPTH_12) return R_IMF_CHAN_DEPTH_12;
+               if (depth_ok & R_IMF_CHAN_DEPTH_16) return R_IMF_CHAN_DEPTH_16;
+               if (depth_ok & R_IMF_CHAN_DEPTH_24) return R_IMF_CHAN_DEPTH_24;
+               if (depth_ok & R_IMF_CHAN_DEPTH_32) return R_IMF_CHAN_DEPTH_32;
+               return R_IMF_CHAN_DEPTH_8; /* fallback, should not get here */
+       }
+}
+
 static int save_image_options_init(SaveImageOptions *simopts, SpaceImage *sima, Scene *scene, const short guess_path)
 {
        void *lock;
@@ -963,34 +952,41 @@ static int save_image_options_init(SaveImageOptions *simopts, SpaceImage *sima,
 
        if(ibuf) {
                Image *ima= sima->image;
+               short is_depth_set= FALSE;
 
-               simopts->planes= ibuf->depth;
+               simopts->im_format.planes= ibuf->planes;
 
                if(ELEM(ima->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE)) {
-                       simopts->imtype= scene->r.imtype;
-                       simopts->planes= scene->r.planes;
+                       /* imtype */
+                       simopts->im_format= scene->r.im_format;
+                       is_depth_set= TRUE;
                }
                else if (ima->source == IMA_SRC_GENERATED) {
-                       simopts->imtype= R_PNG;
+                       simopts->im_format.imtype= R_IMF_IMTYPE_PNG;
                }
                else {
-                       simopts->imtype= BKE_ftype_to_imtype(ibuf->ftype);
+                       simopts->im_format.imtype= BKE_ftype_to_imtype(ibuf->ftype);
                }
-               simopts->subimtype= scene->r.subimtype; /* XXX - this is lame, we need to make these available too! */
-               simopts->quality= ibuf->ftype & 0xff;
+               //simopts->subimtype= scene->r.subimtype; /* XXX - this is lame, we need to make these available too! */
+               simopts->im_format.quality= ibuf->ftype & 0xff;
 
                BLI_strncpy(simopts->filepath, ibuf->name, sizeof(simopts->filepath));
 
                /* sanitize all settings */
 
                /* unlikely but just incase */
-               if (ELEM3(simopts->planes, R_PLANESBW, R_PLANES24, R_PLANES32) == 0) {
-                       simopts->planes= R_PLANES32;
+               if (ELEM3(simopts->im_format.planes, R_IMF_PLANES_BW, R_IMF_PLANES_RGB, R_IMF_PLANES_RGBA) == 0) {
+                       simopts->im_format.planes= R_IMF_PLANES_RGBA;
+               }
+
+               /* depth, account for float buffer and format support */
+               if (is_depth_set == FALSE) {
+                       simopts->im_format.depth= imtype_best_depth(ibuf, simopts->im_format.imtype);
                }
 
                /* some formats dont use quality so fallback to scenes quality */
-               if (simopts->quality == 0) {
-                       simopts->quality= scene->r.quality;
+               if (simopts->im_format.quality == 0) {
+                       simopts->im_format.quality= scene->r.im_format.quality;
                }
 
                /* check for empty path */
@@ -1009,18 +1005,11 @@ static int save_image_options_init(SaveImageOptions *simopts, SpaceImage *sima,
        return (ibuf != NULL);
 }
 
-static void save_image_options_from_op(SaveImageOptions *simopts, wmOperator *op, Scene *evil_scene)
+static void save_image_options_from_op(SaveImageOptions *simopts, wmOperator *op)
 {
-       if (RNA_property_is_set(op->ptr, "color_mode")) simopts->planes= RNA_enum_get(op->ptr, "color_mode");
-       if (RNA_property_is_set(op->ptr, "file_format")) simopts->imtype= RNA_enum_get(op->ptr, "file_format");
-
-#if 0
-       if (RNA_property_is_set(op->ptr, "subimtype")) simopts->subimtype= RNA_enum_get(op->ptr, "subimtype"); // XXX
-#else
-       simopts->subimtype= evil_scene->r.subimtype;
-#endif
-
-       if (RNA_property_is_set(op->ptr, "file_quality")) simopts->quality= RNA_int_get(op->ptr, "file_quality");
+       if (op->customdata) {
+               simopts->im_format= *(ImageFormatData *)op->customdata;
+       }
 
        if (RNA_property_is_set(op->ptr, "filepath")) {
                RNA_string_get(op->ptr, "filepath", simopts->filepath);
@@ -1030,10 +1019,9 @@ static void save_image_options_from_op(SaveImageOptions *simopts, wmOperator *op
 
 static void save_image_options_to_op(SaveImageOptions *simopts, wmOperator *op)
 {
-       RNA_enum_set(op->ptr, "color_mode", simopts->planes);
-       RNA_enum_set(op->ptr, "file_format", simopts->imtype);
-       // RNA_enum_set(op->ptr, "subimtype", simopts->subimtype);
-       RNA_int_set(op->ptr, "file_quality", simopts->quality);
+       if (op->customdata) {
+               *(ImageFormatData *)op->customdata= simopts->im_format;
+       }
 
        RNA_string_set(op->ptr, "filepath", simopts->filepath);
 }
@@ -1059,26 +1047,26 @@ static void save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
 
                if(ima->type == IMA_TYPE_R_RESULT) {
                        /* enforce user setting for RGB or RGBA, but skip BW */
-                       if(simopts->planes==R_PLANES32) {
-                               ibuf->depth= 32;
+                       if(simopts->im_format.planes==R_IMF_PLANES_RGBA) {
+                               ibuf->planes= R_IMF_PLANES_RGBA;
                        }
-                       else if(simopts->planes==R_PLANES24) {
-                               ibuf->depth= 24;
+                       else if(simopts->im_format.planes==R_IMF_PLANES_RGB) {
+                               ibuf->planes= R_IMF_PLANES_RGB;
                        }
                }
                else {
                        /* TODO, better solution, if a 24bit image is painted onto it may contain alpha */
                        if(ibuf->userflags & IB_BITMAPDIRTY) { /* it has been painted onto */
                                /* checks each pixel, not ideal */
-                               ibuf->depth= BKE_alphatest_ibuf(ibuf) ? 32 : 24;
+                               ibuf->planes= BKE_alphatest_ibuf(ibuf) ? 32 : 24;
                        }
                }
                
-               if(simopts->imtype==R_MULTILAYER) {
+               if(simopts->im_format.imtype==R_IMF_IMTYPE_MULTILAYER) {
                        Scene *scene= CTX_data_scene(C);
                        RenderResult *rr= BKE_image_acquire_renderresult(scene, ima);
                        if(rr) {
-                               RE_WriteRenderResult(op->reports, rr, simopts->filepath, simopts->quality);
+                               RE_WriteRenderResult(op->reports, rr, simopts->filepath, simopts->im_format.quality);
                                ok= TRUE;
                        }
                        else {
@@ -1086,8 +1074,10 @@ static void save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
                        }
                        BKE_image_release_renderresult(scene, ima);
                }
-               else if (BKE_write_ibuf(ibuf, simopts->filepath, simopts->imtype, simopts->subimtype, simopts->quality)) {
-                       ok= TRUE;
+               else {
+                       if (BKE_write_ibuf(ibuf, simopts->filepath, &simopts->im_format)) {
+                               ok= TRUE;
+                       }
                }
 
                if (ok) {
@@ -1139,27 +1129,40 @@ static void save_image_doit(bContext *C, SpaceImage *sima, wmOperator *op, SaveI
        ED_space_image_release_buffer(sima, lock);
 }
 
+static void image_save_as_free(wmOperator *op)
+{
+       if (op->customdata) {
+               MEM_freeN(op->customdata);
+               op->customdata= NULL;
+       }
+}
+
 static int image_save_as_exec(bContext *C, wmOperator *op)
 {
        SpaceImage *sima= CTX_wm_space_image(C);
        SaveImageOptions simopts;
 
+       save_image_options_defaults(&simopts);
+
        /* just incase to initialize values,
         * these should be set on invoke or by the caller. */
-       save_image_options_defaults(&simopts);
-       save_image_options_from_op(&simopts, op, CTX_data_scene(C));
+       save_image_options_init(&simopts, sima, CTX_data_scene(C), 0);
+
+       save_image_options_from_op(&simopts, op);
 
        save_image_doit(C, sima, op, &simopts, TRUE);
 
+       image_save_as_free(op);
        return OPERATOR_FINISHED;
 }
 
 
 static int image_save_as_check(bContext *UNUSED(C), wmOperator *op)
 {
+       ImageFormatData *imf= op->customdata;
        char filepath[FILE_MAX];
        RNA_string_get(op->ptr, "filepath", filepath);
-       if(BKE_add_image_extension(filepath, RNA_enum_get(op->ptr, "file_format"))) {
+       if(BKE_add_image_extension(filepath, imf->imtype)) {
                RNA_string_set(op->ptr, "filepath", filepath);
                return TRUE;
        }
@@ -1185,15 +1188,51 @@ static int image_save_as_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(eve
                RNA_boolean_set(op->ptr, "copy", TRUE);
        }
 
-       // XXX note: we can give default menu enums to operator for this
+       op->customdata= MEM_mallocN(sizeof(simopts.im_format), __func__);
+       memcpy(op->customdata, &simopts.im_format, sizeof(simopts.im_format));
+
        image_filesel(C, op, simopts.filepath);
 
        return OPERATOR_RUNNING_MODAL;
 }
 
+static int image_save_as_cancel(bContext *UNUSED(C), wmOperator *op)
+{
+       image_save_as_free(op);
+
+       return OPERATOR_CANCELLED;
+}
+
+static int image_save_as_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
+{
+       const char *prop_id= RNA_property_identifier(prop);
+
+       return !(strcmp(prop_id, "filepath") == 0 ||
+                strcmp(prop_id, "directory") == 0 ||
+                strcmp(prop_id, "filename") == 0 ||
+                /* when saving a copy, relative path has no effect */
+                ((strcmp(prop_id, "relative_path") == 0) && RNA_boolean_get(ptr, "copy"))
+                );
+}
+
+static void image_save_as_draw(bContext *UNUSED(C), wmOperator *op)
+{
+       uiLayout *layout= op->layout;
+       ImageFormatData *imf= op->customdata;
+       PointerRNA ptr;
+
+       /* image template */
+       RNA_pointer_create(NULL, &RNA_ImageFormatSettings, imf, &ptr);
+       uiTemplateImageSettings(layout, &ptr);
+
+       /* main draw call */
+       RNA_pointer_create(NULL, op->type->srna, op->properties, &ptr);
+       uiDefAutoButsRNA(layout, &ptr, image_save_as_draw_check_prop, '\0');
+}
+
 void IMAGE_OT_save_as(wmOperatorType *ot)
 {
-       PropertyRNA *prop;
+//     PropertyRNA *prop;
 
        /* identifiers */
        ot->name= "Save As Image";
@@ -1203,22 +1242,17 @@ void IMAGE_OT_save_as(wmOperatorType *ot)
        ot->exec= image_save_as_exec;
        ot->check= image_save_as_check;
        ot->invoke= image_save_as_invoke;
+       ot->cancel= image_save_as_cancel;
+       ot->ui= image_save_as_draw;
        ot->poll= space_image_buffer_exists_poll;
 
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
        /* properties */
-
-       /* format options */
-       RNA_def_enum(ot->srna, "file_format", image_file_type_items, R_PNG, "File Type", "File type to save image as");
-       RNA_def_enum(ot->srna, "color_mode", image_color_mode_items, R_PLANES24, "Channels", "Image channels to save");
-       prop= RNA_def_int(ot->srna, "file_quality", 90, 0, 100, "Quality", "", 0, 100);
-       RNA_def_property_subtype(prop, PROP_PERCENTAGE);
+       RNA_def_boolean(ot->srna, "copy", 0, "Copy", "Create a new image file without modifying the current image in blender");
 
        WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH);
-
-       RNA_def_boolean(ot->srna, "copy", 0, "Copy", "Create a new image file without modifying the current image in blender");
 }
 
 /******************** save image operator ********************/
@@ -1231,7 +1265,7 @@ static int image_save_exec(bContext *C, wmOperator *op)
 
        if (save_image_options_init(&simopts, sima, scene, FALSE) == 0)
                return OPERATOR_CANCELLED;
-       save_image_options_from_op(&simopts, op, scene);
+       save_image_options_from_op(&simopts, op);
 
        if (BLI_exists(simopts.filepath) && BLI_file_is_writable(simopts.filepath)) {
                save_image_doit(C, sima, op, &simopts, FALSE);
index 92592a7..47cfa5c 100644 (file)
@@ -1633,24 +1633,18 @@ static void node_composit_buts_id_mask(uiLayout *layout, bContext *UNUSED(C), Po
 
 static void node_composit_buts_file_output(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
+       bNode *node= ptr->data;
+       NodeImageFile *nif= node->storage;
+       PointerRNA imfptr;
+
        uiLayout *col, *row;
 
        col= uiLayoutColumn(layout, 0);
        uiItemR(col, ptr, "filepath", 0, "", ICON_NONE);
-       uiItemR(col, ptr, "image_type", 0, "", ICON_NONE);
-       
-       row= uiLayoutRow(layout, 0);
-       if (RNA_enum_get(ptr, "image_type")== R_OPENEXR) {
-               uiItemR(row, ptr, "use_exr_half", 0, NULL, ICON_NONE);
-               uiItemR(row, ptr, "exr_codec", 0, "", ICON_NONE);
-       }
-       else if (RNA_enum_get(ptr, "image_type")== R_JPEG90) {
-               uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", ICON_NONE);
-       }
-       else if (RNA_enum_get(ptr, "image_type")== R_PNG) {
-               uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", ICON_NONE);
-       }
-       
+
+       RNA_pointer_create(NULL, &RNA_ImageFormatSettings, &nif->im_format, &imfptr);
+       uiTemplateImageSettings(layout, &imfptr);
+
        row= uiLayoutRow(layout, 1);
        uiItemR(row, ptr, "frame_start", 0, "Start", ICON_NONE);
        uiItemR(row, ptr, "frame_end", 0, "End", ICON_NONE);
index 36cba15..c4a7f2c 100644 (file)
@@ -73,6 +73,8 @@
 #include "NOD_composite.h"
 #include "NOD_shader.h"
 
+#include "intern/node_util.h"
+
 #include "node_intern.h"
 
 /* width of socket columns in group display */
@@ -418,38 +420,41 @@ static int node_get_colorid(bNode *node)
        return TH_NODE;
 }
 
-/* note: in cmp_util.c is similar code, for node_compo_pass_on() */
+/* note: in cmp_util.c is similar code, for node_compo_pass_on()
+ *       the same goes for shader and texture nodes. */
 /* note: in node_edit.c is similar code, for untangle node */
 static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
 {
-       static int types[]= { SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA };
+       ListBase links;
+       LinkInOutsMuteNode *lnk;
        bNodeLink link= {NULL};
        int i;
-       
-       /* connect the first input of each type with first output of the same type */
-       
+
+       if(node->typeinfo->mutelinksfunc == NULL)
+               return;
+
+       /* Get default muting links (as bNodeSocket pointers). */
+       links = node->typeinfo->mutelinksfunc(snode->edittree, node, NULL, NULL, NULL, NULL);
+
        glEnable(GL_BLEND);
-       glEnable( GL_LINE_SMOOTH );
-       
+       glEnable(GL_LINE_SMOOTH);
+
        link.fromnode = link.tonode = node;
-       for (i=0; i < 3; ++i) {
-               /* find input socket */
-               for (link.fromsock=node->inputs.first; link.fromsock; link.fromsock=link.fromsock->next)
-                       if (link.fromsock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.fromsock))
-                               break;
-               if (link.fromsock) {
-                       for (link.tosock=node->outputs.first; link.tosock; link.tosock=link.tosock->next)
-                               if (link.tosock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.tosock))
-                                       break;
-                       
-                       if (link.tosock) {
-                               node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
-                       }
+       for(lnk = links.first; lnk; lnk = lnk->next) {
+               for(i = 0; i < lnk->num_outs; i++) {
+                       link.fromsock = (bNodeSocket*)(lnk->in);
+                       link.tosock   = (bNodeSocket*)(lnk->outs)+i;
+                       node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
                }
+               /* If num_outs > 1, lnk->outs was an allocated table of pointers... */
+               if(i > 1)
+                       MEM_freeN(lnk->outs);
        }
-       
+
        glDisable(GL_BLEND);
-       glDisable( GL_LINE_SMOOTH );
+       glDisable(GL_LINE_SMOOTH);
+
+       BLI_freelistN(&links);
 }
 
 /* this might have some more generic use */
index 23855ff..cd4e999 100644 (file)
@@ -3283,7 +3283,8 @@ static int node_mute_exec(bContext *C, wmOperator *UNUSED(op))
        ED_preview_kill_jobs(C);
 
        for(node= snode->edittree->nodes.first; node; node= node->next) {
-               if(node->flag & SELECT) {
+               /* Only allow muting of nodes having a mute func! */
+               if((node->flag & SELECT) && node->typeinfo->mutefunc) {
                        /* Be able to mute in-/output nodes as well.  - DingTo
                        if(node->inputs.first && node->outputs.first) { */
                                node->flag ^= NODE_MUTED;
index 959e267..8078229 100644 (file)
@@ -2819,34 +2819,28 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
        if(dt>OB_WIRE) {
                if(CHECK_OB_DRAWTEXTURE(v3d, dt)) {
                        if(draw_glsl_material(scene, ob, v3d, dt)) {
-                               /* if em has no faces the drawMappedFaces callback will fail */
-                               if(em->bm->totface) {
-                                       glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
+                               glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
 
-                                       finalDM->drawMappedFacesGLSL(finalDM, GPU_enable_material,
-                                                                    draw_em_fancy__setGLSLFaceOpts, em);
-                                       GPU_disable_material();
+                               finalDM->drawMappedFacesGLSL(finalDM, GPU_enable_material,
+                                                            draw_em_fancy__setGLSLFaceOpts, em);
+                               GPU_disable_material();
 
-                                       glFrontFace(GL_CCW);
-                               }
+                               glFrontFace(GL_CCW);
                        }
                        else {
                                draw_mesh_textured(scene, v3d, rv3d, ob, finalDM, 0);
                        }
                }
                else {
-                       /* if em has no faces the drawMappedFaces callback will fail */
-                       if(em->bm->totface) {
-                               /* 3 floats for position, 3 for normal and times two because the faces may actually be quads instead of triangles */
-                               glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED);
+                       /* 3 floats for position, 3 for normal and times two because the faces may actually be quads instead of triangles */
+                       glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED);
 
-                               glEnable(GL_LIGHTING);
-                               glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
-                               finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, me->edit_btmesh, 0, GPU_enable_material, NULL);
+                       glEnable(GL_LIGHTING);
+                       glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
+                       finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, me->edit_btmesh, 0, GPU_enable_material, NULL);
 
-                               glFrontFace(GL_CCW);
-                               glDisable(GL_LIGHTING);
-                       }
+                       glFrontFace(GL_CCW);
+                       glDisable(GL_LIGHTING);
                }
                        
                // Setup for drawing wire over, disable zbuffer
index 557b22e..4488442 100644 (file)
@@ -31,6 +31,8 @@ set(INC
        ../imbuf
        ../makesdna
        ../makesrna
+       ../nodes        # For node muting stuff...
+       ../nodes/intern # For node muting stuff...
        ../../../intern/guardedalloc
        ../../../intern/smoke/extern
 )
index 00c47a2..e838d80 100644 (file)
@@ -49,6 +49,7 @@ struct Lamp;
 struct Image;
 struct bNode;
 struct LinkNode;
+struct LinkInOutsMuteNode;
 struct Scene;
 struct GPUVertexAttribs;
 struct GPUNode;
@@ -117,6 +118,7 @@ GPUNodeLink *GPU_builtin(GPUBuiltin builtin);
 
 int GPU_link(GPUMaterial *mat, const char *name, ...);
 int GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
+int GPU_stack_link_mute(GPUMaterial *mat, const char *name, struct LinkInOutsMuteNode *mlnk);
 
 void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
 void GPU_material_enable_alpha(GPUMaterial *material);
index adb52d5..ee4491c 100644 (file)
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
 
 defs = [ 'GLEW_STATIC' ]
 
-incs = '../blenlib ../blenkernel ../makesdna ../makesrna ../include ../blenloader'
+incs = '../blenlib ../blenkernel ../makesdna ../makesrna ../include ../blenloader ../nodes ../nodes/intern'
 incs += ' #/extern/glew/include #intern/guardedalloc #intern/smoke/extern ../imbuf .'
 
 if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
index 35ef482..4a923e6 100644 (file)
@@ -54,6 +54,8 @@
 
 #include "gpu_codegen.h"
 
+#include "node_util.h" /* For muting node stuff... */
+
 #include <string.h>
 #include <stdarg.h>
 
@@ -1212,6 +1214,31 @@ int GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNode
        return 1;
 }
 
+int GPU_stack_link_mute(GPUMaterial *mat, const char *name, LinkInOutsMuteNode *mlnk)
+{
+       GPUNode *node;
+       GPUFunction *function;
+       int i;
+
+       function = GPU_lookup_function(name);
+       if(!function) {
+               fprintf(stderr, "GPU failed to find function %s\n", name);
+               return 0;
+       }
+
+       for(i = 0; i < mlnk->num_outs; i++) {
+               node = GPU_node_begin(name);
+               gpu_node_input_socket(node, (GPUNodeStack*)mlnk->in);
+               GPU_node_output(node, ((GPUNodeStack*)mlnk->outs+i)->type, ((GPUNodeStack*)mlnk->outs+i)->name,
+                               &((GPUNodeStack*)mlnk->outs+i)->link);
+               GPU_node_end(node);
+
+               gpu_material_add_node(mat, node);
+       }
+
+       return 1;
+}
+
 int GPU_link_changed(GPUNodeLink *link)
 {
        GPUNode *node;
index 5aaf99b..5d2da31 100644 (file)
@@ -368,6 +368,26 @@ void set_rgba_zero(out vec4 outval)
        outval = vec4(0.0);
 }
 
+void copy_raw(vec4 val, out vec4 outval)
+{
+       outval = val;
+}
+
+void copy_raw(vec3 val, out vec3 outval)
+{
+       outval = val;
+}
+
+void copy_raw(vec2 val, out vec2 outval)
+{
+       outval = val;
+}
+
+void copy_raw(float val, out float outval)
+{
+       outval = val;
+}
+
 void mix_blend(float fac, vec4 col1, vec4 col2, out vec4 outcol)
 {
        fac = clamp(fac, 0.0, 1.0);
index 493c32d..0b7bd5d 100644 (file)
 /* DataToC output of file <gpu_shader_material_glsl> */
 
-int datatoc_gpu_shader_material_glsl_size= 46619;
+int datatoc_gpu_shader_material_glsl_size= 46865;
 char datatoc_gpu_shader_material_glsl[]= {
- 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41,
- 10,123, 10,  9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,
-117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,
-109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,
-  9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,
-114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,
-110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109,
- 97,120, 45, 99,109,105,110, 59, 10, 10,  9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61,
- 48, 46, 48, 41, 10,  9,  9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,123, 10,
-  9,  9,115, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32, 40,115,
- 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123,
- 10,  9,  9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45,
- 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120, 61, 61,
- 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,105,102,
- 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32,
- 32, 99, 91, 50, 93, 59, 10,  9,  9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99,
- 91, 48, 93, 59, 10, 10,  9,  9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10,
-  9,  9,  9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,
-104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,
-114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
- 10,  9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10,
-  9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10,  9,115, 32, 61, 32,104,115,
-118, 91, 49, 93, 59, 10,  9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,
-123, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10,  9,125, 10,  9,101,108,115,
-101, 32,123, 10,  9,  9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,
-  9,  9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10,  9,  9,102, 32,
- 61, 32,104, 32, 45, 32,105, 59, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10,
-  9,  9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115,
- 42,102, 41, 41, 59, 10,  9,  9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59,
- 10,  9,  9, 10,  9,  9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118,
- 44, 32,116, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103,
- 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32,
- 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10,  9,  9,101,
-108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,
-113, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32,
- 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101,
- 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,
-114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,
-110,101, 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48,
- 52, 53, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42,
- 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32,112,111,119,
- 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,
-125, 10, 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116,
- 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10,  9,  9,114,101,116,117,114,
-110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10,  9,101,108,
-115,101, 10,  9,  9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50,
- 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,
-101, 97,114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,
-111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,
-101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,
-115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9,
- 99,111,108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108,
- 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97,
- 59, 10,125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52,
- 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,
-111,108, 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,
-102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,
-111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,
-108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9,
- 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,
-101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 35,100,
-101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56, 56, 54, 49, 56, 51, 55, 57, 48, 54, 57,
- 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,
-101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123,
- 10,  9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,
-116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44,
- 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50,
- 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9,117,118, 32, 61, 32,118,101, 99,
- 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46,
- 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,
-111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,
-111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 99,111,108, 95, 97,108,112,104, 97, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,108, 32, 61, 32, 99,
-111, 59, 10,  9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10,  9,103,108,
-111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49,
- 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,  9,117,118, 95, 97,
-116,116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32, 45,
-110,111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,
-114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,108, 95, 97,116,116,
-114,105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,118, 99,111,108, 95, 97,108,112,
-104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, 46, 97, 59, 10,  9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48,
- 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52,
- 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,
-102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116, 32,118,101,
- 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101,
- 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,105,102, 40,100,111,109,105,110, 32, 61, 61, 32,
- 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,105,110,118,
-101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32,
- 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,
- 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,101,119, 44,
- 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59,
- 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10,  9,111,117,116,118,105,101,119,
- 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,
-100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,
-118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,108,111, 97,
+ 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,
+114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56,
+ 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,
+101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111,
+ 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,
+  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,
+120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,109,105,110, 32, 61, 32,109,105,110, 40,
+114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,
+100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10,  9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,
+105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10,  9,  9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120,
+ 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,115, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,
+  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,
+  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,
+120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,
+102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59,
+ 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48,
+ 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10,  9,  9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32,
+ 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10,  9,  9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,
+102, 32, 40,104, 60, 48, 46, 48, 41, 10,  9,  9,  9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,
+111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52,
+ 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44,
+ 32,104, 44, 32,115, 44, 32,118, 59, 10,  9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48,
+ 93, 59, 10,  9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10,  9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,
+102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118,
+ 41, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32,
+ 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,  9,  9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,
+114, 40,104, 41, 59, 10,  9,  9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,
+102, 44, 32,102, 44, 32,102, 41, 59, 10,  9,  9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61,
+ 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10,  9,  9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,
+ 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10,  9,  9, 10,  9,  9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103,
+ 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32,
+ 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,
+108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,
+118, 44, 32,116, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32,
+ 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61,
+ 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,
+101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,
+111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,
+115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102,
+ 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41,
+ 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,
+114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53,
+ 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,
+115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48,
+ 56, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32,
+ 49, 50, 46, 57, 50, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,
+119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,
+114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,
+111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,
+114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,
+111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,
+102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,
+101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32,
+ 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111,
+ 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,
+108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111,
+ 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,
+105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,
+111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,
+102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59,
+ 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55,
+ 57, 51, 50, 51, 56, 52, 54, 10, 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56,
+ 56, 54, 49, 56, 51, 55, 57, 48, 54, 57, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32,
+ 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,
+108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,
+120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,
+108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,
+105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123,
+ 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48,
+ 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32,
+ 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,
+101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,
+116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109,
+ 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 99,111,
+108, 95, 97,108,112,104, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,
+  9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10,  9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,
+111, 99, 97,108, 41, 59, 10,  9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99,
+ 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,
+114, 99,111, 59, 10,  9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,
+110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,
+110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47,
+ 10,  9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59,
+ 10,  9,118, 99,111,108, 95, 97,108,112,104, 97, 32, 61, 32, 97,116,116,118, 99,111,108, 46, 97, 59, 10,  9,102,114,111,110,116,
+ 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51,
+ 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99,
+ 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109,
+ 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61,
+ 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,105,102,
+ 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,
+116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41,
+ 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99,
+ 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32,
+ 97, 98,115, 40, 99,111, 46,122, 41, 59, 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41,
+ 59, 10,  9,111,117,116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,
+111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118,
+ 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108,
+ 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,
+116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49,
+ 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,
+108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49,
+ 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+123, 10,  9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48,
+ 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110,
+ 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116,
+ 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,
+108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,
+110,116, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
+123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
+116,104, 95, 97,115,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61,
+ 32, 45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,101,108,
+115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,
+ 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
+ 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49,
+ 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,
+  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,
+110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
+ 10,  9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,
+116,104, 95,112,111,119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32,
+ 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59,
+ 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+ 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48,
+ 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,111,103,
+ 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,
+116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,
 116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
-116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50, 59, 10,125,
- 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44,
- 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
- 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,
-109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,
-108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108,
- 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 10,
-  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,
-109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,
-108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111, 97,116, 32,118,
- 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32,
- 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,110, 40,102,108,
-111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102,
- 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,111,
-117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,
-108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,111, 97,116,
- 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118,
- 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,
- 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61,
- 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,116, 32,118, 97,
-108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61,
- 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119, 40,102,108,111,
- 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,
-118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,
-117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,102,108,
-111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108,
- 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,
-108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59,
- 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,
-111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,
-117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,
-109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,114,111,
-117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
- 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44,
- 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
- 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48,
- 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
-109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,
-111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,
-102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,
-101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,113,117,
-101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,102,108,111,
- 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,
-111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49,
- 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,
-118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,
-118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,
-118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,
-101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10,
- 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51,
- 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10,  9,111,117,
-116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,
-118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125,
- 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,118, 49, 44,
+116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,
+102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
+  9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32,
+ 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,
+108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,
+116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,
+116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,
+108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125,
+ 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,
+119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,
+119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,
+116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51,
+ 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,
+117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32,
+ 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32,
+ 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93,
+ 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99,
+ 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49,
+ 32, 45, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41,
+ 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50,
+ 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,
+101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
+118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99,
+ 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,
+118,101, 99, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44,
  32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,
-108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50,
- 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,  9,111,117,116,
-118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
-108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59, 10,  9,111,
-117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99,
- 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,
-116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
- 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10,  9,111,117,116,
-118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101,
- 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,
-117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,
-109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,101,103, 97,
-116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10,  9,111,117,116,
-118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,105,114, 44,
- 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,110,111,114, 32, 61, 32,100,105,114, 59, 10,  9,
-111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44,
- 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
-116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,
-114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32,
- 48, 46, 48, 41, 41, 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,
-117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44,
- 32, 48, 46, 48, 41, 41, 46,121, 59, 10,  9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,
- 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53,
- 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,
-117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48,
- 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,108,111, 97,
-116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,
-109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 46,
-114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,
-116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,114, 44, 32, 48, 46, 48,
- 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 10,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,
-114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,
-114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48,
- 41, 41, 46,103, 59, 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,
-101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,
-101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46, 98, 59, 10, 10,  9,105,
-102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,111,
-108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,  9,111,117,116, 99,
-111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 40,
-102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,
-111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118,101,
- 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,
-111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52, 32,
- 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 32,
- 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,117,
-116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59,
- 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,116,
- 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,
-100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 10,
-123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, 10,
-  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
+108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44,
+ 32, 48, 44, 32, 48, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125,
+ 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,
+101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44,
+ 32,118, 50, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,
+125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,
+118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,111,117,
+116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99,
+ 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
+116,118, 41, 10,123, 10,  9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108,
+ 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
+116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,110,111,
+114, 32, 61, 32,100,105,114, 59, 10,  9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
+ 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,
+117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,
+120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32,
+ 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,
+101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43,
+ 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 10,  9,111,117,116,118,101, 99, 46,122, 32, 61, 32,
+116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32,
+ 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33,
+ 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43,
+ 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,
+115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,
+101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
+123, 10,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112,
+ 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,
+ 99,111,108, 46,114, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 10,  9,111,117,116, 99,111,108,
+ 46,103, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,
+120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46,
+ 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,103, 59, 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,
+117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,
+117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46,
+ 48, 41, 41, 46, 98, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,
+108, 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99,
+ 41, 41, 59, 10, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,
+115,101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
+117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,
+115,101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,
+108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,
+114,103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
+123, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,
+117,101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,
+118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101,
+ 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49,
+ 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99,
+ 51, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,
+111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125,
+ 10, 10,118,111,105,100, 32, 99,111,112,121, 95,114, 97,119, 40,118,101, 99, 52, 32,118, 97,108, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,
+111,105,100, 32, 99,111,112,121, 95,114, 97,119, 40,118,101, 99, 51, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100,
+ 32, 99,111,112,121, 95,114, 97,119, 40,118,101, 99, 50, 32,118, 97,108, 44, 32,111,117,116, 32,118,101, 99, 50, 32,111,117,116,
+118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,
+112,121, 95,114, 97,119, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
+ 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
  95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99,
  52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32,
  61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32,
index 59899dc..5ce3d63 100644 (file)
@@ -74,7 +74,7 @@ typedef struct ImBuf {
                                                         * but this is problematic with texture math in imagetexture.c
                                                         * avoid problems and use int. - campbell */
 
-       unsigned char depth;    /* Active amount of bits/bitplanes */
+       unsigned char planes;   /* Active amount of bits/bitplanes */
        int channels;                   /* amount of channels in rect_float (0 = 4 channel default) */
 
        /* flags */
index 5a410a6..b627baf 100644 (file)
@@ -173,6 +173,7 @@ struct anim {
        AVCodecContext *pCodecCtx;
        AVCodec *pCodec;
        AVFrame *pFrame;
+       int pFrameComplete;
        AVFrame *pFrameRGB;
        AVFrame *pFrameDeinterlaced;
        struct SwsContext *img_convert_ctx;
@@ -181,7 +182,6 @@ struct anim {
        struct ImBuf * last_frame;
        int64_t last_pts;
        int64_t next_pts;
-       int64_t next_undecoded_pts;
        AVPacket next_packet;
 #endif
 
index a9e9e0a..29e6c49 100644 (file)
@@ -40,8 +40,8 @@ struct ImBuf;
 
 void imb_filterx(struct ImBuf *ibuf);
 
-void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h);
-void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h);
+void IMB_premultiply_rect(unsigned int *rect, char planes, int w, int h);
+void IMB_premultiply_rect_float(float *rect_float, char planes, int w, int h);
 
 void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1);
 
index 5bbabd8..d08c86a 100644 (file)
@@ -323,7 +323,7 @@ short imb_addrectImBuf(ImBuf *ibuf)
        if((ibuf->rect = MEM_mapallocN(size, "imb_addrectImBuf"))) {
                ibuf->mall |= IB_rect;
                ibuf->flags |= IB_rect;
-               if(ibuf->depth > 32) return (addzbufImBuf(ibuf));
+               if(ibuf->planes > 32) return (addzbufImBuf(ibuf));
                else return TRUE;
        }
 
@@ -341,7 +341,7 @@ short imb_addtilesImBuf(ImBuf *ibuf)
        return (ibuf->tiles != NULL);
 }
 
-ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y, uchar d, unsigned int flags)
+ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y, uchar planes, unsigned int flags)
 {
        ImBuf *ibuf;
 
@@ -350,7 +350,7 @@ ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y, uchar d, unsigned int flag
        if(ibuf) {
                ibuf->x= x;
                ibuf->y= y;
-               ibuf->depth= d;
+               ibuf->planes= planes;
                ibuf->ftype= TGA;
                ibuf->channels= 4;      /* float option, is set to other values when buffers get assigned */
                ibuf->ppm[0]= ibuf->ppm[1]= 150.0 / 0.0254; /* 150dpi -> pixels-per-meter */
@@ -402,7 +402,7 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
        y = ibuf1->y;
        if(ibuf1->flags & IB_fields) y *= 2;
        
-       ibuf2 = IMB_allocImBuf(x, y, ibuf1->depth, flags);
+       ibuf2 = IMB_allocImBuf(x, y, ibuf1->planes, flags);
        if(ibuf2 == NULL) return NULL;
 
        if(flags & IB_rect)
index db27c1c..8928774 100644 (file)
@@ -504,7 +504,6 @@ static int startffmpeg(struct anim * anim) {
        anim->last_frame = 0;
        anim->last_pts = -1;
        anim->next_pts = -1;
-       anim->next_undecoded_pts = -1;
        anim->next_packet.stream_index = -1;
 
        anim->pFormatCtx = pFormatCtx;
@@ -513,6 +512,7 @@ static int startffmpeg(struct anim * anim) {
        anim->videoStream = videoStream;
 
        anim->pFrame = avcodec_alloc_frame();
+       anim->pFrameComplete = FALSE;
        anim->pFrameDeinterlaced = avcodec_alloc_frame();
        anim->pFrameRGB = avcodec_alloc_frame();
 
@@ -602,6 +602,10 @@ static void ffmpeg_postprocess(struct anim * anim)
 
        ibuf->profile = IB_PROFILE_SRGB;
 
+       if (!anim->pFrameComplete) {
+               return;
+       }
+
        /* This means the data wasnt read properly, 
           this check stops crashing */
        if (input->data[0]==0 && input->data[1]==0 
@@ -611,6 +615,12 @@ static void ffmpeg_postprocess(struct anim * anim)
                return;
        }
 
+       av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
+              "  POSTPROC: anim->pFrame planes: %p %p %p %p\n",
+              input->data[0], input->data[1], input->data[2],
+              input->data[3]);
+
+
        if (anim->ib_flags & IB_animdeinterlace) {
                if (avpicture_deinterlace(
                            (AVPicture*) 
@@ -648,10 +658,6 @@ static void ffmpeg_postprocess(struct anim * anim)
                          dst2,
                          dstStride2);
                
-               /* workaround: sws_scale bug
-                  sets alpha = 0 and compensate
-                  for altivec-bugs and flipy... */
-               
                bottom = (unsigned char*) ibuf->rect;
                top = bottom + ibuf->x * (ibuf->y-1) * 4;
                
@@ -662,17 +668,17 @@ static void ffmpeg_postprocess(struct anim * anim)
                        unsigned char tmp[4];
                        unsigned int * tmp_l =
                                (unsigned int*) tmp;
-                       tmp[3] = 0xff;
                        
                        for (x = 0; x < w; x++) {
                                tmp[0] = bottom[0];
                                tmp[1] = bottom[1];
                                tmp[2] = bottom[2];
+                               tmp[3] = bottom[3];
                                
                                bottom[0] = top[0];
                                bottom[1] = top[1];
                                bottom[2] = top[2];
-                               bottom[3] = 0xff;
+                               bottom[3] = top[3];
                                
                                *(unsigned int*) top = *tmp_l;
                                
@@ -688,7 +694,6 @@ static void ffmpeg_postprocess(struct anim * anim)
                uint8_t* dst2[4]  = { dst[0] + (anim->y - 1)*dstStride[0],
                                      0, 0, 0 };
                int i;
-               unsigned char* r;
                
                sws_scale(anim->img_convert_ctx,
                          (const uint8_t * const *)input->data,
@@ -697,17 +702,6 @@ static void ffmpeg_postprocess(struct anim * anim)
                          anim->pCodecCtx->height,
                          dst2,
                          dstStride2);
-               
-               r = (unsigned char*) ibuf->rect;
-               
-               /* workaround sws_scale bug: older version of 
-                  sws_scale set alpha = 0... */
-               if (r[3] == 0) {
-                       for (i = 0; i < ibuf->x * ibuf->y; i++) {
-                               r[3] = 0xff;
-                               r += 4;
-                       }
-               }
        }
 
        if (filter_y) {
@@ -715,42 +709,15 @@ static void ffmpeg_postprocess(struct anim * anim)
        }
 }
 
-/* decode one video frame and load the next packet into anim->packet,
-   so that we can obtain next_pts and next undecoded pts */
+/* decode one video frame also considering the packet read into next_packet */
 
 static int ffmpeg_decode_video_frame(struct anim * anim)
 {
-       int frameFinished = 0;
        int rval = 0;
 
        av_log(anim->pFormatCtx, AV_LOG_DEBUG, "  DECODE VIDEO FRAME\n");
 
-       anim->next_undecoded_pts = -1;
-
        if (anim->next_packet.stream_index == anim->videoStream) {
-               av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
-                      "  DECODE: cached next packet\n");
-
-               avcodec_decode_video2(anim->pCodecCtx, 
-                                     anim->pFrame, &frameFinished, 
-                                     &anim->next_packet);
-
-               if (frameFinished) {
-                       av_log(anim->pFormatCtx, 
-                              AV_LOG_DEBUG, 
-                              "  FRAME DONE: "
-                               "next_pts=%lld pkt_pts=%lld\n",
-                               (anim->pFrame->pts == AV_NOPTS_VALUE) ? 
-                               -1 : (long long int)anim->pFrame->pts,
-                               (anim->pFrame->pkt_pts == AV_NOPTS_VALUE) ?
-                               -1 : (long long int)anim->pFrame->pkt_pts);
-                       anim->next_pts = 
-                               av_get_pts_from_frame(anim->pFormatCtx,
-                                                     anim->pFrame);
-
-                       ffmpeg_postprocess(anim);
-               }
-
                av_free_packet(&anim->next_packet);
                anim->next_packet.stream_index = -1;
        }
@@ -771,21 +738,14 @@ static int ffmpeg_decode_video_frame(struct anim * anim)
                       (anim->next_packet.flags & AV_PKT_FLAG_KEY) ? 
                       " KEY" : "");
                if (anim->next_packet.stream_index == anim->videoStream) {
-                       if (frameFinished) {
-                               av_log(anim->pFormatCtx,
-                                      AV_LOG_DEBUG,
-                                      "  FRAME finished, we leave\n");
-                               anim->next_undecoded_pts 
-                                       = anim->next_packet.dts;
-                               break;
-                       }
+                       anim->pFrameComplete = 0;
 
                        avcodec_decode_video2(
                                anim->pCodecCtx, 
-                               anim->pFrame, &frameFinished
+                               anim->pFrame, &anim->pFrameComplete
                                &anim->next_packet);
 
-                       if (frameFinished) {
+                       if (anim->pFrameComplete) {
                                anim->next_pts = av_get_pts_from_frame(
                                        anim->pFormatCtx, anim->pFrame);
 
@@ -799,15 +759,16 @@ static int ffmpeg_decode_video_frame(struct anim * anim)
                                        == AV_NOPTS_VALUE) ?
                                       -1 : (long long int)anim->pFrame->pkt_pts,
                                        (long long int)anim->next_pts);
-
-                               ffmpeg_postprocess(anim);
                        }
+                       break;
                }
                av_free_packet(&anim->next_packet);
                anim->next_packet.stream_index = -1;
        }
        
        if (rval < 0) {
+               anim->next_packet.stream_index = -1;
+
                av_log(anim->pFormatCtx,
                       AV_LOG_ERROR, "  DECODE READ FAILED: av_read_frame() "
                       "returned error: %d\n",  rval);
@@ -875,7 +836,7 @@ static int match_format(const char *name, AVFormatContext * pFormatCtx)
 
 static int ffmpeg_seek_by_byte(AVFormatContext *pFormatCtx)
 {
-       static const char * byte_seek_list [] = { "dv", "mpegts", 0 };
+       static const char * byte_seek_list [] = { "mpegts", 0 };
        const char ** p;
 
        if (pFormatCtx->iformat->flags & AVFMT_TS_DISCONT) {
@@ -928,7 +889,8 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
                        tc_index, new_frame_index);
        } else {
                pts_to_search = (long long) 
-                       floor(((double) position) / pts_time_base / frame_rate + 0.5);
+                       floor(((double) position) 
+                             / pts_time_base / frame_rate + 0.5);
 
                if (st_time != AV_NOPTS_VALUE) {
                        pts_to_search += st_time / pts_time_base 
@@ -939,36 +901,23 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
        av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
               "FETCH: looking for PTS=%lld "
               "(pts_timebase=%g, frame_rate=%g, st_time=%lld)\n", 
-              (long long int)pts_to_search, pts_time_base, frame_rate, st_time);
+              (long long int)pts_to_search,pts_time_base, frame_rate, st_time);
 
        if (anim->last_frame && 
            anim->last_pts <= pts_to_search && anim->next_pts > pts_to_search){
                av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
                       "FETCH: frame repeat: last: %lld next: %lld\n",
-                      (long long int)anim->last_pts, (long long int)anim->next_pts);
+                      (long long int)anim->last_pts, 
+                      (long long int)anim->next_pts);
                IMB_refImBuf(anim->last_frame);
                anim->curposition = position;
                return anim->last_frame;
        }
         
-       IMB_freeImBuf(anim->last_frame);
-       anim->last_frame = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect);
-
-       if (anim->next_pts <= pts_to_search && 
-           anim->next_undecoded_pts > pts_to_search) {
-               av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
-                      "FETCH: no seek necessary: "
-                       "next: %lld next undecoded: %lld\n",
-                       (long long int)anim->next_pts,
-                   (long long int)anim->next_undecoded_pts);
-
-               /* we are already done :) */
-
-       } else if (position > anim->curposition + 1 
-                  && anim->preseek 
-                  && !tc_index
-                  && position - (anim->curposition + 1) < anim->preseek) {
-
+       if (position > anim->curposition + 1 
+           && anim->preseek 
+           && !tc_index
+           && position - (anim->curposition + 1) < anim->preseek) {
                av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
                       "FETCH: within preseek interval (no index)\n");
 
@@ -1017,6 +966,11 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
                } else {
                        pos = (long long) (position - anim->preseek) 
                                * AV_TIME_BASE / frame_rate;
+
+                       av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
+                              "NO INDEX seek pos = %lld, st_time = %lld\n", 
+                              pos, (st_time != AV_NOPTS_VALUE) ? st_time : 0);
+
                        if (pos < 0) {
                                pos = 0;
                        }
@@ -1025,6 +979,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
                                pos += st_time;
                        }
 
+                       av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
+                              "NO INDEX final seek pos = %lld\n", pos);
+
                        ret = av_seek_frame(anim->pFormatCtx, -1, 
                                            pos, AVSEEK_FLAG_BACKWARD);
                }
@@ -1054,8 +1011,16 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
        } else if (position == 0 && anim->curposition == -1) {
                /* first frame without seeking special case... */
                ffmpeg_decode_video_frame(anim);
+       } else {
+               av_log(anim->pFormatCtx, AV_LOG_DEBUG, 
+                      "FETCH: no seek necessary, just continue...\n");
        }
 
+       IMB_freeImBuf(anim->last_frame);
+       anim->last_frame = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect);
+
+       ffmpeg_postprocess(anim);
+
        anim->last_pts = anim->next_pts;
        
        ffmpeg_decode_video_frame(anim);
@@ -1063,7 +1028,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position,
        anim->curposition = position;
        
        IMB_refImBuf(anim->last_frame);
-       
+
        return anim->last_frame;
 }
 
index 479c7ed..29da797 100644 (file)
@@ -148,7 +148,7 @@ void IMB_filtery(struct ImBuf *ibuf)
 
        for (;x>0;x--){
                if (point) {
-                       if (ibuf->depth > 24) filtcolum(point,y,skip);
+                       if (ibuf->planes > 24) filtcolum(point,y,skip);
                        point++;
                        filtcolum(point,y,skip);
                        point++;
@@ -158,7 +158,7 @@ void IMB_filtery(struct ImBuf *ibuf)
                        point++;
                }
                if (pointf) {
-                       if (ibuf->depth > 24) filtcolumf(pointf,y,skip);
+                       if (ibuf->planes > 24) filtcolumf(pointf,y,skip);
                        pointf++;
                        filtcolumf(pointf,y,skip);
                        pointf++;
@@ -186,7 +186,7 @@ void imb_filterx(struct ImBuf *ibuf)
 
        for (;y>0;y--){
                if (point) {
-                       if (ibuf->depth > 24) filtrow(point,x);
+                       if (ibuf->planes > 24) filtrow(point,x);
                        point++;
                        filtrow(point,x);
                        point++;
@@ -196,7 +196,7 @@ void imb_filterx(struct ImBuf *ibuf)
                        point+=skip;
                }
                if (pointf) {
-                       if (ibuf->depth > 24) filtrowf(pointf,x);
+                       if (ibuf->planes > 24) filtrowf(pointf,x);
                        pointf++;
                        filtrowf(pointf,x);
                        pointf++;
@@ -529,12 +529,12 @@ ImBuf *IMB_getmipmap(ImBuf *ibuf, int level)
        return (level == 0)? ibuf: ibuf->mipmap[level-1];
 }
 
-void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h)
+void IMB_premultiply_rect(unsigned int *rect, char planes, int w, int h)
 {
        char *cp;
        int x, y, val;
 
-       if(depth == 24) {       /* put alpha at 255 */
+       if(planes == 24) {      /* put alpha at 255 */
                cp= (char *)(rect);
 
                for(y=0; y<h; y++)
@@ -555,12 +555,12 @@ void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h)
        }
 }
 
-void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h)
+void IMB_premultiply_rect_float(float *rect_float, char planes, int w, int h)
 {
        float val, *cp;
        int x, y;
 
-       if(depth==24) { /* put alpha at 1.0 */
+       if(planes==24) {        /* put alpha at 1.0 */
                cp= rect_float;
 
                for(y=0; y<h; y++)
@@ -587,9 +587,9 @@ void IMB_premultiply_alpha(ImBuf *ibuf)
                return;
 
        if(ibuf->rect)
-               IMB_premultiply_rect(ibuf->rect, ibuf->depth, ibuf->x, ibuf->y);
+               IMB_premultiply_rect(ibuf->rect, ibuf->planes, ibuf->x, ibuf->y);
 
        if(ibuf->rect_float)
-               IMB_premultiply_rect_float(ibuf->rect_float, ibuf->depth, ibuf->x, ibuf->y);
+               IMB_premultiply_rect_float(ibuf->rect_float, ibuf->planes, ibuf->x, ibuf->y);
 }
 
index 7005558..b79b135 100644 (file)
@@ -228,7 +228,7 @@ short imb_cocoaSaveImage(struct ImBuf *ibuf, char *name, int flags)
        /* check for a valid number of bytes per pixel.  Like the PNG writer,
         * the TIFF writer supports 1, 3 or 4 bytes per pixel, corresponding
         * to gray, RGB, RGBA respectively. */
-       samplesperpixel = (uint16_t)((ibuf->depth + 7) >> 3);
+       samplesperpixel = (uint16_t)((ibuf->planes + 7) >> 3);
        switch (samplesperpixel) {
                case 4: /*RGBA type*/
                        hasAlpha = YES;
index cf7337a..83351b5 100644 (file)
@@ -320,7 +320,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
                if (bpp == 1) {
                        
                        ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect);
-                       if (ibuf->depth > 32) ibuf->depth = 32;
+                       if (ibuf->planes > 32) ibuf->planes = 32;
                        base = ibuf->rect;
                        zbase = (unsigned int *)ibuf->zbuf;
                        
@@ -404,7 +404,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
                if (bpp == 1) {
                        
                        ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect);
-                       if (ibuf->depth > 32) ibuf->depth = 32;
+                       if (ibuf->planes > 32) ibuf->planes = 32;
 
                        base = ibuf->rect;
                        zbase = (unsigned int *)ibuf->zbuf;
@@ -822,7 +822,7 @@ int imb_saveiris(struct ImBuf * ibuf, const char *name, int flags)
        short zsize;
        int ret;
 
-       zsize = (ibuf->depth + 7) >> 3;
+       zsize = (ibuf->planes + 7) >> 3;
        if (flags & IB_zbuf &&  ibuf->zbuf != NULL) zsize = 8;
        
        IMB_convert_rgba_to_abgr(ibuf);
index 151933d..568dd7a 100644 (file)
@@ -101,7 +101,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
 
        int index;
        
-       int w, h, depth;
+       int w, h, planes;
        
        opj_dparameters_t parameters;   /* decompression parameters */
        
@@ -166,10 +166,10 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
        switch (image->numcomps) {
        case 1: /* Greyscale */
        case 3: /* Color */
-               depth= 24; 
+               planes= 24;
                break;
        default: /* 2 or 4 - Greyscale or Color + alpha */
-               depth= 32; /* greyscale + alpha */
+               planes= 32; /* greyscale + alpha */
                break;
        }
        
@@ -190,7 +190,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
                float_divs[i]= (1<<image->comps[i].prec)-1;
        }
        
-       ibuf= IMB_allocImBuf(w, h, depth, use_float ? IB_rectfloat : IB_rect);
+       ibuf= IMB_allocImBuf(w, h, planes, use_float ? IB_rectfloat : IB_rect);
        
        if (ibuf==NULL) {
                if(dinfo)
@@ -494,7 +494,7 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) {
                
                /* 32bit images == alpha channel */
                /* grayscale not supported yet */
-               numcomps= (ibuf->depth==32) ? 4 : 3;
+               numcomps= (ibuf->planes==32) ? 4 : 3;
        }
        
        w= ibuf->x;
index 89038d7..5a40de0 100644 (file)
@@ -571,8 +571,8 @@ static int init_jpeg(FILE * outfile, struct jpeg_compress_struct * cinfo, struct
        cinfo->image_height = ibuf->y;
 
        cinfo->in_color_space = JCS_RGB;
-       if (ibuf->depth == 8) cinfo->in_color_space = JCS_GRAYSCALE;
-       if (ibuf->depth == 32) cinfo->in_color_space = JCS_UNKNOWN;
+       if (ibuf->planes == 8) cinfo->in_color_space = JCS_GRAYSCALE;
+       if (ibuf->planes == 32) cinfo->in_color_space = JCS_UNKNOWN;
        
        switch(cinfo->in_color_space){
        case JCS_RGB:
index 1084355..a5a9427 100644 (file)
@@ -208,7 +208,7 @@ static int imb_save_openexr_half(struct ImBuf *ibuf, const char *name, int flags
                header.channels().insert ("R", Channel (HALF));
                header.channels().insert ("G", Channel (HALF));
                header.channels().insert ("B", Channel (HALF));
-               if (ibuf->depth==32 && channels >= 4)
+               if (ibuf->planes==32 && channels >= 4)
                        header.channels().insert ("A", Channel (HALF));
                if (write_zbuf)         // z we do as float always
                        header.channels().insert ("Z", Channel (FLOAT));
@@ -226,7 +226,7 @@ static int imb_save_openexr_half(struct ImBuf *ibuf, const char *name, int flags
                frameBuffer.insert ("R", Slice (HALF,  (char *) &pixels[0].r, xstride, ystride));       
                frameBuffer.insert ("G", Slice (HALF,  (char *) &pixels[0].g, xstride, ystride));
                frameBuffer.insert ("B", Slice (HALF,  (char *) &pixels[0].b, xstride, ystride));
-               if (ibuf->depth==32 && channels >= 4)
+               if (ibuf->planes==32 && channels >= 4)
                        frameBuffer.insert ("A", Slice (HALF, (char *) &pixels[0].a, xstride, ystride));
                if (write_zbuf)
                        frameBuffer.insert ("Z", Slice (FLOAT, (char *)(ibuf->zbuf_float + (height-1)*width),
@@ -335,7 +335,7 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, const char *name, int flag
                header.channels().insert ("R", Channel (FLOAT));
                header.channels().insert ("G", Channel (FLOAT));
                header.channels().insert ("B", Channel (FLOAT));
-               if (ibuf->depth==32 && channels >= 4)
+               if (ibuf->planes==32 && channels >= 4)
                        header.channels().insert ("A", Channel (FLOAT));
                if (write_zbuf)
                        header.channels().insert ("Z", Channel (FLOAT));
@@ -355,7 +355,7 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, const char *name, int flag
                frameBuffer.insert ("R", Slice (FLOAT,  (char *)rect[0], xstride, ystride));
                frameBuffer.insert ("G", Slice (FLOAT,  (char *)rect[1], xstride, ystride));
                frameBuffer.insert ("B", Slice (FLOAT,  (char *)rect[2], xstride, ystride));
-               if (ibuf->depth==32 && channels >= 4)
+               if (ibuf->planes==32 && channels >= 4)
                        frameBuffer.insert ("A", Slice (FLOAT,  (char *)rect[3], xstride, ystride));
                if (write_zbuf)
                        frameBuffer.insert ("Z", Slice (FLOAT, (char *) (ibuf->zbuf_float + (height-1)*width),