7 # this needs to be kept in sync with the array of hatches in fills.c
9 qw/check1x1 check2x2 check4x4 vline1 vline2 vline4
10 hline1 hline2 hline4 slash1 slosh1 slash2 slosh2
11 grid1 grid2 grid4 dots1 dots4 dots16 stipple weave cross1 cross2
12 vlozenge hlozenge scalesdown scalesup scalesleft scalesright stipple2
15 @hatch_types{@hatch_types} = 0..$#hatch_types;
17 *_color = \&Imager::_color;
20 my ($class, %hsh) = @_;
22 my $self = bless { }, $class;
23 $hsh{combine} = Imager->_combine($hsh{combine}, 0);
25 my $solid = _color($hsh{solid});
26 if (UNIVERSAL::isa($solid, 'Imager::Color')) {
28 Imager::i_new_fill_solid($solid, $hsh{combine});
30 elsif (UNIVERSAL::isa($solid, 'Imager::Color::Float')) {
32 Imager::i_new_fill_solidf($solid, $hsh{combine});
35 $Imager::ERRSTR = "solid isn't a color";
39 elsif (defined $hsh{hatch}) {
42 $hsh{fg} ||= Imager::Color->new(0, 0, 0);
43 if (ref $hsh{hatch}) {
44 $hsh{cust_hatch} = pack("C8", @{$hsh{hatch}});
47 elsif ($hsh{hatch} =~ /\D/) {
48 unless (exists($hatch_types{$hsh{hatch}})) {
49 $Imager::ERRSTR = "Unknown hatch type $hsh{hatch}";
52 $hsh{hatch} = $hatch_types{$hsh{hatch}};
54 my $fg = _color($hsh{fg});
55 if (UNIVERSAL::isa($fg, 'Imager::Color')) {
56 my $bg = _color($hsh{bg} || Imager::Color->new(255, 255, 255));
58 Imager::i_new_fill_hatch($fg, $bg, $hsh{combine},
59 $hsh{hatch}, $hsh{cust_hatch},
62 elsif (UNIVERSAL::isa($fg, 'Imager::Color::Float')) {
63 my $bg = _color($hsh{bg} || Imager::Color::Float->new(1, 1, 1));
65 Imager::i_new_fill_hatchf($fg, $bg, $hsh{combine},
66 $hsh{hatch}, $hsh{cust_hatch},
70 $Imager::ERRSTR = "fg isn't a color";
74 elsif (defined $hsh{fountain}) {
75 # make sure we track the filter's defaults
76 my $fount = $Imager::filters{fountain};
77 my $def = $fount->{defaults};
78 my $names = $fount->{names};
80 $hsh{ftype} = $hsh{fountain};
81 # process names of values
82 for my $name (keys %$names) {
83 if (defined $hsh{$name} && exists $names->{$name}{$hsh{$name}}) {
84 $hsh{$name} = $names->{$name}{$hsh{$name}};
89 my @parms = @{$fount->{callseq}};
91 for my $name (@parms) {
92 unless (defined $hsh{$name}) {
94 "required parameter '$name' not set for fountain fill";
99 # check that the segments supplied is an array ref
100 unless (ref $hsh{segments} && $hsh{segments} =~ /ARRAY/) {
102 "segments must be an array reference or Imager::Fountain object";
106 # make sure the segments are specified with colors
108 for my $segment (@{$hsh{segments}}) {
109 my @new_segment = @$segment;
111 $_ = _color($_) or return for @new_segment[3,4];
112 push @segments, \@new_segment;
116 Imager::i_new_fill_fount($hsh{xa}, $hsh{ya}, $hsh{xb}, $hsh{yb},
117 $hsh{ftype}, $hsh{repeat}, $hsh{combine}, $hsh{super_sample},
118 $hsh{ssample_param}, \@segments);
120 elsif (defined $hsh{image}) {
124 Imager::i_new_fill_image($hsh{image}{IMG}, $hsh{matrix}, $hsh{xoff},
125 $hsh{yoff}, $hsh{combine});
126 $self->{DEPS} = [ $hsh{image}{IMG} ];
129 $Imager::ERRSTR = "No fill type specified";
130 warn "No fill type!";
142 return Imager->combines;
149 Imager::Fill - general fill types
153 my $fill1 = Imager::Fill->new(solid=>$color, combine=>$combine);
154 my $fill2 = Imager::Fill->new(hatch=>'vline2', fg=>$color1, bg=>$color2,
156 my $fill3 = Imager::Fill->new(fountain=>$type, ...);
157 my $fill4 = Imager::Fill->new(image=>$img, ...);
161 Creates fill objects for use by most filled area drawing functions.
163 All fills are created with the new method.
169 my $fill = Imager::Fill->new(...);
171 The parameters depend on the type of fill being created. See below
176 The currently available fills are:
190 fountain (similar to gradients in paint software)
194 =head1 Common options
200 The way in which the fill data is combined with the underlying image.
201 See L<Imager::Draw/"Combine Types">.
205 In general colors can be specified as Imager::Color or
206 Imager::Color::Float objects. The fill object will typically store
207 both types and convert from one to the other. If a fill takes 2 color
208 objects they should have the same type.
212 my $fill = Imager::Fill->new(solid=>$color, $combine =>$combine)
214 Creates a solid fill, the only required parameter is C<solid> which
215 should be the color to fill with.
219 my $fill = Imager::Fill->new(hatch=>$type, fg=>$fgcolor, bg=>$bgcolor,
222 Creates a hatched fill. You can specify the following keywords:
228 The type of hatch to perform, this can either be the numeric index of
229 the hatch (not recommended), the symbolic name of the hatch, or an
230 array of 8 integers which specify the pattern of the hatch.
232 Hatches are represented as cells 8x8 arrays of bits, which limits their
235 Current hatch names are:
239 =item check1x1, check2x2, check4x4
241 checkerboards at varios sizes
243 =item vline1, vline2, vline4
245 1, 2, or 4 vertical lines per cell
247 =item hline1, hline2, hline4
249 1, 2, or 4 horizontal lines per cell
253 1 or 2 / lines per cell.
257 1 or 2 \ lines per cell
259 =item grid1, grid2, grid4
261 1, 2, or 4 vertical and horizontal lines per cell
263 =item dots1, dots4, dots16
265 1, 4 or 16 dots per cell
267 =item stipple, stipple2
273 I hope this one is obvious.
277 2 densities of crosshatch
279 =item vlozenge, hlozenge
281 something like lozenge tiles
283 =item scalesdown, scalesup, scalesleft, scalesright
285 Vaguely like fish scales in each direction.
297 The fg color is rendered where bits are set in the hatch, and the bg
298 where they are clear. If you use a transparent fg or bg, and set
299 combine, you can overlay the hatch onto an existing image.
301 fg defaults to black, bg to white.
307 An offset into the hatch cell. Both default to zero.
311 You can call Imager::Fill->hatches for a list of hatch names.
313 =head2 Fountain fills
315 my $fill = Imager::Fill->new(fountain=>$ftype,
316 xa=>$xa, ya=>$ya, xb=>$xb, yb=>$yb,
317 segments=>$segments, repeat=>$repeat, combine=>$combine,
318 super_sample=>$super_sample, ssample_param=>$ssample_param);
320 This fills the given region with a fountain fill. This is exactly the
321 same fill as the C<fountain> filter, but is restricted to the shape
322 you are drawing, and the fountain parameter supplies the fill type,
327 my $fill = Imager::Fill->new(image=>$src, xoff=>$xoff, yoff=>$yoff,
328 matrix=>$matrix, $combine);
330 Fills the given image with a tiled version of the given image. The
331 first non-zero value of xoff or yoff will provide an offset along the
332 given axis between rows or columns of tiles respectively.
334 The matrix parameter performs a co-ordinate transformation from the
335 co-ordinates in the target image to the fill image co-ordinates.
336 Linear interpolation is used to determine the fill pixel. You can use
337 the L<Imager::Matrix2d> class to create transformation matrices.
339 The matrix parameter will significantly slow down the fill.
345 =item Imager::Fill->hatches
347 A list of all defined hatch names.
349 =item Imager::Fill->combines
351 A list of all combine types.
357 I'm planning on adding the following types of fills:
363 combines 2 other fills in a checkerboard
367 combines 2 other fills using the levels of an image
371 uses the transform2() register machine to create fills
377 Tony Cook <tony@develop-help.com>