Add simple gradient implementation for the cairo backend.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@28873 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Fred Kiefer 2009-10-23 20:46:41 +00:00
parent fa0ec57ac5
commit 6653ef68cc
5 changed files with 160 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2009-10-23 Fred Kiefer <FredKiefer@gmx.de>
* Source/gsc/GSContext.m,
* Headers/gsc/GSGStateOps.h,
* Source/gsc/GSGState.m: Empty definitions of gradient methods.
* Source/cairo/CairoGState.m: Simple cairo gradient implementation.
2009-10-20 Fred Kiefer <FredKiefer@gmx.de>
* Source/winlib/WIN32GState.m: Small correction of last change.

View file

@ -27,6 +27,8 @@
#ifndef _GSGStateOps_h_INCLUDE
#define _GSGStateOps_h_INCLUDE
@class NSGradient;
@interface GSGState (Ops)
/* ----------------------------------------------------------------------- */
/* Color operations */
@ -166,4 +168,20 @@
@end
@interface GSGState (NSGradient)
- (void) drawGradient: (NSGradient*)gradient
fromCenter: (NSPoint)startCenter
radius: (CGFloat)startRadius
toCenter: (NSPoint)endCenter
radius: (CGFloat)endRadius
options: (NSUInteger)options;
- (void) drawGradient: (NSGradient*)gradient
fromPoint: (NSPoint)startPoint
toPoint: (NSPoint)endPoint
options: (NSUInteger)options;
@end
#endif

View file

@ -30,6 +30,7 @@
#include <AppKit/NSAffineTransform.h>
#include <AppKit/NSBezierPath.h>
#include <AppKit/NSColor.h>
#include <AppKit/NSGradient.h>
#include <AppKit/NSGraphics.h>
#include "cairo/CairoGState.h"
#include "cairo/CairoFontInfo.h"
@ -1413,3 +1414,86 @@ _set_op(cairo_t *ct, NSCompositingOperation op)
}
@end
@implementation CairoGState (NSGradient)
- (void) drawGradient: (NSGradient*)gradient
fromCenter: (NSPoint)startCenter
radius: (CGFloat)startRadius
toCenter: (NSPoint)endCenter
radius: (CGFloat)endRadius
options: (NSUInteger)options
{
int i;
int stops = [gradient numberOfColorStops];
NSPoint startP = [ctm transformPoint: startCenter];
NSPoint endP = [ctm transformPoint: endCenter];
cairo_pattern_t *cpattern = cairo_pattern_create_radial(startP.x, startP.y,
floatFromUserSpace(ctm, startRadius),
endP.x, endP.y,
floatFromUserSpace(ctm, endRadius));
for (i = 0; i < stops; i++)
{
NSColor *color;
CGFloat location;
double red;
double green;
double blue;
double alpha;
[gradient getColor: &color
location: &location
atIndex: i];
red = [color redComponent];
green = [color greenComponent];
blue = [color blueComponent];
alpha = [color alphaComponent];
cairo_pattern_add_color_stop_rgba(cpattern, location,
red, green, blue, alpha);
}
cairo_save(_ct);
cairo_set_source(_ct, cpattern);
cairo_pattern_destroy(cpattern);
cairo_paint(_ct);
cairo_restore(_ct);
}
- (void) drawGradient: (NSGradient*)gradient
fromPoint: (NSPoint)startPoint
toPoint: (NSPoint)endPoint
options: (NSUInteger)options
{
int i;
int stops = [gradient numberOfColorStops];
NSPoint startP = [ctm transformPoint: startPoint];
NSPoint endP = [ctm transformPoint: endPoint];
cairo_pattern_t *cpattern = cairo_pattern_create_linear(startP.x, startP.y,
endP.x, endP.y);
for (i = 0; i < stops; i++)
{
NSColor *color;
CGFloat location;
double red;
double green;
double blue;
double alpha;
[gradient getColor: &color
location: &location
atIndex: i];
red = [color redComponent];
green = [color greenComponent];
blue = [color blueComponent];
alpha = [color alphaComponent];
cairo_pattern_add_color_stop_rgba(cpattern, location,
red, green, blue, alpha);
}
cairo_save(_ct);
cairo_set_source(_ct, cpattern);
cairo_pattern_destroy(cpattern);
cairo_paint(_ct);
cairo_restore(_ct);
}
@end

View file

@ -1001,3 +1001,32 @@ static NSMapTable *gtable;
ctxt_pop(obj, opstack, NSObject);
}
@end
@implementation GSContext (NSGradient)
- (void) drawGradient: (NSGradient*)gradient
fromCenter: (NSPoint)startCenter
radius: (CGFloat)startRadius
toCenter: (NSPoint)endCenter
radius: (CGFloat)endRadius
options: (NSUInteger)options
{
[gstate drawGradient: gradient
fromCenter: startCenter
radius: startRadius
toCenter: endCenter
radius: endRadius
options: options];
}
- (void) drawGradient: (NSGradient*)gradient
fromPoint: (NSPoint)startPoint
toPoint: (NSPoint)endPoint
options: (NSUInteger)options
{
[gstate drawGradient: gradient
fromPoint: startPoint
toPoint: endPoint
options: options];
}
@end

View file

@ -1304,3 +1304,25 @@ typedef enum {
}
@end
@implementation GSGState (NSGradient)
- (void) drawGradient: (NSGradient*)gradient
fromCenter: (NSPoint)startCenter
radius: (CGFloat)startRadius
toCenter: (NSPoint)endCenter
radius: (CGFloat)endRadius
options: (NSUInteger)options
{
[self subclassResponsibility: _cmd];
}
- (void) drawGradient: (NSGradient*)gradient
fromPoint: (NSPoint)startPoint
toPoint: (NSPoint)endPoint
options: (NSUInteger)options
{
[self subclassResponsibility: _cmd];
}
@end