ICC-Profile

 view release on metacpan or  search on metacpan

lib/ICC/Profile/gbd_.pm  view on Meta::CPAN

			$dxy = $dot->[$n * $i + $j];
			
			# compute face ID list, sorted by dot product
			$self->[5][$i][$j] = [map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, $dxy->[$_]]} (0 .. $#{$self->[1]})];
			
		}
		
	}

	# save internal point in header hash
	$self->[0]{'p0'} = $p0;

}

# make new gbd_ object from attribute hash
# hash keys are: ('vertex', 'pcs', 'device')
# object elements not specified in the hash are unchanged
# parameters: (ref_to_object, ref_to_attribute_hash)
sub _new_from_hash {

	# get parameters
	my ($self, $hash) = @_;

	# local variables
	my ($value, $f, $v, $e);

	# if 'vertex' key defined
	if (defined($hash->{'vertex'})) {
		
		# get value
		$value = $hash->{'vertex'};
		
		# if reference to a 2-D array
		if (ref($value) eq 'ARRAY' && @{$value} == grep {ref() eq 'ARRAY'} @{$value}) {
			
			# set vertex to clone of array
			$self->[1] = bless(Storable::dclone($value), 'Math::Matrix');
			
		# if a reference to a Math::Matrix object
		} elsif (UNIVERSAL::isa($value, 'Math::Matrix')) {
			
			# set vertex to object
			$self->[1] = $value;
			
		} else {
			
			# wrong data type
			croak('wrong \'vertex\' data type');
			
		}
		
		# verify number of faces
		(@{$self->[1]} >= 4) || croak('number of faces < 4');
		
		# verify number of vertices per face
		(@{$self->[1]} == 3) || croak('number of vertices per face <> 3');
		
		# check gamut faces
		($f, $v, $e) = _check_faces($self);
		
		# verify closed shape using Euler's formula
		($f + $v - $e == 2) || carp('not a closed shape');
		
	}

	# if 'pcs' key defined
	if (defined($hash->{'pcs'})) {
		
		# get value
		$value = $hash->{'pcs'};
		
		# if reference to a 2-D array
		if (ref($value) eq 'ARRAY' && @{$value} == grep {ref() eq 'ARRAY'} @{$value}) {
			
			# set pcs to clone of array
			$self->[1] = bless(Storable::dclone($value), 'Math::Matrix');
			
		# if a reference to a Math::Matrix object
		} elsif (UNIVERSAL::isa($value, 'Math::Matrix')) {
			
			# set pcs to object
			$self->[2] = $value;
			
		} else {
			
			# wrong data type
			croak('wrong \'pcs\' data type');
			
		}
		
		# verify number of vertices
		(@{$self->[2]} >= 4) || croak('number of vertices < 4');
		
		# verify number of pcs channels
		(@{$self->[2][0]} >= 3) || croak('number of pcs channels < 3');
		
	}

	# if 'device' key defined
	if (defined($hash->{'device'})) {
		
		# get value
		$value = $hash->{'device'};
		
		# if reference to a 2-D array
		if (ref($value) eq 'ARRAY' && @{$value} == grep {ref() eq 'ARRAY'} @{$value}) {
			
			# set device to clone of array
			$self->[1] = bless(Storable::dclone($value), 'Math::Matrix');
			
		# if a reference to a Math::Matrix object
		} elsif (UNIVERSAL::isa($value, 'Math::Matrix')) {
			
			# set device to object
			$self->[3] = $value;
			
		} else {
			
			# wrong data type
			croak('wrong \'device\' data type');
			



( run in 0.722 second using v1.01-cache-2.11-cpan-5735350b133 )