Class: Magick::GradientFill
- Inherits:
-
Object
- Object
- Magick::GradientFill
- Defined in:
- ext/RMagick/rmmain.c
Instance Method Summary collapse
-
#fill(image_obj) ⇒ Magick::GradientFill
Call GradientFill with the start and stop colors specified when this fill object was created.
-
#initialize(x1, y1, x2, y2, start_color, stop_color) ⇒ Magick::GradientFill
constructor
Initialize GradientFill object.
Constructor Details
#initialize(x1, y1, x2, y2, start_color, stop_color) ⇒ Magick::GradientFill
Initialize GradientFill object.
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'ext/RMagick/rmfill.c', line 69
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_PixelColor(&fill->start_color, start_color);
Color_to_PixelColor(&fill->stop_color, stop_color);
return self;
}
|
Instance Method Details
#fill(image_obj) ⇒ Magick::GradientFill
Call GradientFill with the start and stop colors specified when this fill object was created.
594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 |
# File 'ext/RMagick/rmfill.c', line 594
VALUE
GradientFill_fill(VALUE self, VALUE image_obj)
{
rm_GradientFill *fill;
Image *image;
PixelColor 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;
}
|