Class: Magick::GradientFill
- Inherits:
-
Object
- Object
- Magick::GradientFill
- Defined in:
- ext/RMagick/rmmain.c
Instance Method Summary collapse
-
#fill(image_obj) ⇒ Object
Extern: GradientFill_fill(image_obj) Purpose: the GradientFill#fill method - call GradientFill with the start and stop colors specified when this fill object was created.
-
#initialize(x1, y1, x2, y2, start_color, stop_color) ⇒ Object
constructor
Extern: GradientFill#initialize(start_color, stop_color) Purpose: store the vector points and the start and stop colors.
Constructor Details
#initialize(x1, y1, x2, y2, start_color, stop_color) ⇒ Object
Extern: GradientFill#initialize(start_color, stop_color) Purpose: store the vector points and the start and stop colors
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'ext/RMagick/rmfill.c', line 50
VALUE
GradientFill_initialize(
VALUE self,
VALUE x1,
VALUE y1,
VALUE x2,
VALUE y2,
VALUE start_color,
VALUE stop_color)
{
rm_GradientFill *fill;
Data_Get_Struct(self, rm_GradientFill, fill);
fill->x1 = NUM2DBL(x1);
fill->y1 = NUM2DBL(y1);
fill->x2 = NUM2DBL(x2);
fill->y2 = NUM2DBL(y2);
Color_to_PixelPacket(&fill->start_color, start_color);
Color_to_PixelPacket(&fill->stop_color, stop_color);
return self;
}
|
Instance Method Details
#fill(image_obj) ⇒ Object
Extern: GradientFill_fill(image_obj) Purpose: the GradientFill#fill method - call GradientFill with the
start and stop colors specified when this fill object
was created.
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 |
# File 'ext/RMagick/rmfill.c', line 410
VALUE
GradientFill_fill(VALUE self, VALUE image_obj)
{
rm_GradientFill *fill;
Image *image;
PixelPacket start_color, stop_color;
double x1, y1, x2, y2; // points on the line
Data_Get_Struct(self, rm_GradientFill, fill);
image = rm_check_destroyed(image_obj);
x1 = fill->x1;
y1 = fill->y1;
x2 = fill->x2;
y2 = fill->y2;
start_color = fill->start_color;
stop_color = fill->stop_color;
if (fabs(x2-x1) < 0.5) // vertical?
{
// If the x1,y1 and x2,y2 points are essentially the same
if (fabs(y2-y1) < 0.5)
{
point_fill(image, x1, y1, &start_color, &stop_color);
}
// A vertical line is a special case.
else
{
vertical_fill(image, x1, &start_color, &stop_color);
}
}
// A horizontal line is a special case.
else if (fabs(y2-y1) < 0.5)
{
horizontal_fill(image, y1, &start_color, &stop_color);
}
// This is the general case - a diagonal line. If the line is more horizontal
// than vertical, use the top and bottom of the image as the ends of the
// gradient, otherwise use the sides of the image.
else
{
double m = ((double)(y2 - y1))/((double)(x2 - x1));
double diagonal = ((double)image->rows)/image->columns;
if (fabs(m) <= diagonal)
{
v_diagonal_fill(image, x1, y1, x2, y2, &start_color, &stop_color);
}
else
{
h_diagonal_fill(image, x1, y1, x2, y2, &start_color, &stop_color);
}
}
return self;
}
|