Has JIT code parsing changed recently? In previous versions, I can use macro outside of another macro, and it’ll still work. In addition, I noticed that sometimes variable is uninitialized.
This code works fine in previous version:
Works before maybe 3.5
$ +rep_random_subdivision_of_dimension_boundaries 5,0,20,100%,160000,0,,256,256 256,256 eval.. polygon(#-1,4,i0,i1,i2,i1,i2,i3,i0,i3,1,y);
#@cli rep_random_subdivision_of_dimension_boundaries: split>1,_additional_thickness>=0,_max_iter>=2,_probability[%]>0,_loop_limit>1,0<=_border[%]>=100%,_seed,_number_of_dimensions,spatial_dimension_1,spatial_dimension_2,...
#@cli : Generate random division of rectangle as in random number of division and varying thickness within rectangle.
#@cli : _additional_thickness refers to the excess pixel thickness.
#@cli : _max_iter limits the number of iterations per rectangle.
#@cli : _probability determines the probability that a rectangle will be permitted to be utilized for further iteration.
#@cli : _loop_limit limits the number of time the process of subdivision of all quadrilaterals is done.
#@cli : _seed generates the output based on defined parameter.
#@cli : Default values: '_gen_thick=0','_max_iter=5','_probability[%]=95%','_loop_limit=5000','_border=0%','_seed=n/a'
+rep_random_subdivision_of_dimension_boundaries:
skip ${2=0},${3=5},${4=95%},${5=5000},${6=2},${7=}
old_status=${}
start_img_ind:=$!
split,additional_thickness,maximum_iteration,probability,loop_limit,border_size,seed,use_multithreading=${1-7},1
use_seed={narg($seed)}
check "$split>1 &&
$additional_thickness>=0 &&
$maximum_iteration>=2 &&
inrange($probability,0,1,1,1) &&
(ispercentage("$border_size")?inrange("$border_size",0,1,1,1):isint("$border_size",0)) &&
$loop_limit>1"
list_of_dimensions:=abs([${8--1}])
prod_dimensions:=prod($list_of_dimensions)
prod_loops_and_iter:=prod($loop_limit,$maximum_iteration)
dimensions:=$#-7
if $_cpus==1||($prod_dimensions/($additional_thickness+1))<0x10000||prod($maximum_iteration,$loop_limit)<0x10000
use_multithreading=0
fi
if ispercentage($border_size)
border_size:=int((additional_thickness)*$border_size)
fi
check "$border_size<(1+$additional_thickness)"
coordinates_and_iterations_array_size={($dimensions<<1)+1}
1,1,1,$coordinates_and_iterations_array_size,"
const dimensions=$dimensions;
const additional_thickness=$additional_thickness;
const border_size=$border_size;
const double_border_size=border_size<<1;
const minimum_dimension_requirement=additional_thickness+double_border_size+1;
list_of_dimensions=["$list_of_dimensions"];
coordinates=vector(#s,0);
repeat(dimensions,p,
current_dimension=list_of_dimensions[p];
if(!isfinite(current_dimension)||!isint(current_dimension,minimum_dimension_requirement),run('error inv_inp'););
copy(coordinates[p],[0,current_dimension-1],2,dimensions,1);
);
[coordinates,0];"
(1) a[-2,-1] y # Convert last image to dynamic array image
1,1,1,100%
1,1,1,1,$loop_limit
repeat 1+$use_multithreading {
iter:=$>
eval[-1] :"
begin_t(
if($use_seed,srand($iter+t+$seed));
const dimensions=$dimensions;
const decrement_dimensions=dimensions-1;
const iteration_index=dimensions<<1;
const step_size=$additional_thickness+1;
const max_split_count=$split;
const probability=$probability;
const coordinates_and_iterations_array_size=$coordinates_and_iterations_array_size;
const start_array_size=min($prod_dimensions,$prod_loops_and_iter,1<<16);
const post_mt=$use_multithreading&&!$iter;
current_selection=vector(#coordinates_and_iterations_array_size);
if(post_mt
,condition()=da_size(#modifiable_array_ind)<$_cpus&&loop_limit--;
,condition()=da_size(#modifiable_array_ind)&&loop_limit--;
);
probability==1?(
calc_probability()=bool_ins_mod;
):(
const negate_probability=1-probability;
calc_probability()=bool_ins_mod&&arg_coordinates[iteration_index]>1?(u>negate_probability):bool_ins_mod;
);
calculate_distance(arg_part_coordinates)=arg_part_coordinates[1]-arg_part_coordinates[0]+1;
array_subdivision(arg_coordinates)=(
bool_ins_mod=++arg_coordinates[iteration_index]<$maximum_iteration;
starting_coordinate=v(0,decrement_dimensions);
end_coordinate=starting_coordinate+dimensions;
part_coordinates=arg_coordinates[starting_coordinate,2,dimensions];
max_split_possible=int(calculate_distance(part_coordinates)/step_size);
max_split_possible>1?(
rf_split_count=v(2,min(max_split_possible,max_split_count))-1;
end_point=1+part_coordinates[1]-rf_split_count*step_size;
repeat(rf_split_count,
left_coordinate=v(arg_coordinates[starting_coordinate]+step_size,end_point);
arg_coordinates[end_coordinate]=left_coordinate-1;
if(calc_probability()
,da_push(#modifiable_array_ind,arg_coordinates);
,da_push(#unmodifiable_array_ind,arg_coordinates);
);
arg_coordinates[starting_coordinate]=left_coordinate;
end_point+=step_size;
);
arg_coordinates[end_coordinate]=part_coordinates[1];
if(calc_probability()
,da_push(#modifiable_array_ind,arg_coordinates);
,da_push(#unmodifiable_array_ind,arg_coordinates);
);
):(
da_push(#unmodifiable_array_ind,arg_coordinates);
);
);
);
modifiable_array_ind=$start_img_ind+(x<<1);
unmodifiable_array_ind=modifiable_array_ind+1;
loop_limit=i;
if(!post_mt,
elm_count_mod=da_size(#modifiable_array_ind);
elm_count_unm=da_size(#unmodifiable_array_ind);
resize(#modifiable_array_ind,1,start_array_size,1,coordinates_and_iterations_array_size,0);
resize(#unmodifiable_array_ind,1,start_array_size,1,coordinates_and_iterations_array_size,0);
i[#modifiable_array_ind,start_array_size-1]=elm_count_mod;
i[#unmodifiable_array_ind,start_array_size-1]=elm_count_unm;
);
while(condition(),
current_selection_of_modifiable_array=v(0,da_size(#modifiable_array_ind)-1);
copy(current_selection[0],i[#modifiable_array_ind,current_selection_of_modifiable_array],coordinates_and_iterations_array_size,1,h(#modifiable_array_ind));
da_remove(#modifiable_array_ind,current_selection_of_modifiable_array);
array_subdivision(current_selection);
);
final_da_size=da_size(#modifiable_array_ind);
da_freeze(#modifiable_array_ind);
da_freeze(#unmodifiable_array_ind);
end(
post_mt&&loop_limit&&final_da_size?(
set('new_loop_limit',loop_limit);
set('continue_loop_in_multithreaded_mode',1);
):(
set('continue_loop_in_multithreaded_mode',0);
);
);"
if $continue_loop_in_multithreaded_mode
rm.
{min($new_loop_limit,$_cpus)},1,1,1,$new_loop_limit>>1
__rep_random_subdivision_of_dimension_boundaries_shuffle[$start_img_ind]
s[$start_img_ind] y,$_cpus
foreach[$start_img_ind--3] { ({h}) a[-2,-1] y 1,1,1,100% }
else
rm.
break
fi
}
if $use_multithreading
mirror[$start_img_ind--1:2] y
rep_zip[$start_img_ind--1] y
else
a[$start_img_ind--1] y
fi
status $old_status
There are two problems with current G’MIC.
Somehow loop_limit turns uninitialized. And unable to use macro outside. These are not the case before.