Implemented GSReadRect: for the cairo backend.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@24498 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
fredkiefer 2007-02-10 23:21:29 +00:00
parent 97d2a7ebda
commit 3699e2104d
2 changed files with 74 additions and 33 deletions

View file

@ -1,3 +1,7 @@
2007-02-11 Fred Kiefer <FredKiefer@gmx.de>
* Source/cairo/CairoGState.m (-GSReadRect:): Implemented this method.
2007-02-10 Fred Kiefer <FredKiefer@gmx.de>
* Source/gsc/GSGState.m (-bezierPath): New method.

View file

@ -753,57 +753,96 @@
- (NSDictionary *) GSReadRect: (NSRect)r
{
NSMutableDictionary *dict;
NSData *data;
NSSize ssize;
NSAffineTransform *matrix;
double x, y;
cairo_format_t format;
int ix, iy;
cairo_format_t format = CAIRO_FORMAT_ARGB32;
cairo_surface_t *surface;
cairo_surface_t *isurface;
cairo_t *ct;
int size;
int i;
NSMutableData *data;
unsigned char *cdata;
surface = cairo_get_target(_ct);
dict = [NSMutableDictionary dictionary];
x = NSWidth(r);
y = NSHeight(r);
cairo_user_to_device_distance(_ct, &x, &y);
ssize = NSMakeSize(x, y);
ix = floor(x);
iy = -floor(y);
ssize = NSMakeSize(ix, iy);
/*
NSLog(@"rect %@ size %@", NSStringFromRect(r), NSStringFromSize(ssize));
*/
dict = [NSMutableDictionary dictionary];
[dict setObject: [NSValue valueWithSize: ssize] forKey: @"Size"];
[dict setObject: NSDeviceRGBColorSpace forKey: @"ColorSpace"];
format = cairo_image_surface_get_format(surface);
if (format == CAIRO_FORMAT_ARGB32)
{
[dict setObject: [NSNumber numberWithUnsignedInt: 8] forKey: @"BitsPerSample"];
[dict setObject: [NSNumber numberWithUnsignedInt: 32]
forKey: @"Depth"];
[dict setObject: [NSNumber numberWithUnsignedInt: 4]
forKey: @"SamplesPerPixel"];
[dict setObject: [NSNumber numberWithUnsignedInt: 1]
forKey: @"HasAlpha"];
}
else if (format == CAIRO_FORMAT_RGB24)
{
[dict setObject: [NSNumber numberWithUnsignedInt: 8] forKey: @"BitsPerSample"];
[dict setObject: [NSNumber numberWithUnsignedInt: 24]
forKey: @"Depth"];
[dict setObject: [NSNumber numberWithUnsignedInt: 3]
forKey: @"SamplesPerPixel"];
[dict setObject: [NSNumber numberWithUnsignedInt: 0]
forKey: @"HasAlpha"];
}
[dict setObject: [NSNumber numberWithUnsignedInt: 8] forKey: @"BitsPerSample"];
[dict setObject: [NSNumber numberWithUnsignedInt: 32]
forKey: @"Depth"];
[dict setObject: [NSNumber numberWithUnsignedInt: 4]
forKey: @"SamplesPerPixel"];
[dict setObject: [NSNumber numberWithUnsignedInt: 1]
forKey: @"HasAlpha"];
matrix = [self GSCurrentCTM];
[matrix translateXBy: -r.origin.x - offset.x
yBy: r.origin.y + NSHeight(r) - offset.y];
[dict setObject: matrix forKey: @"Matrix"];
DESTROY(matrix);
// FIXME
size = ix*iy*4;
data = [NSMutableData dataWithLength: size];
if (data == nil)
return nil;
cdata = [data mutableBytes];
surface = cairo_get_target(_ct);
isurface = cairo_image_surface_create_for_data(cdata, format, ix, iy, 4*ix);
ct = cairo_create(isurface);
if (viewIsFlipped)
{
cairo_matrix_t local_matrix;
cairo_matrix_init_scale(&local_matrix, 1, -1);
cairo_matrix_translate(&local_matrix, 0, -iy);
cairo_set_matrix(ct, &local_matrix);
}
cairo_set_source_surface(ct, surface, -r.origin.x, -r.origin.y);
cairo_rectangle(ct, 0, 0, ix, iy);
cairo_fill(ct);
cairo_destroy(ct);
cairo_surface_destroy(isurface);
for (i = 0; i < ix * iy; i++)
{
unsigned char d = cdata[4*i];
#if GS_WORDS_BIGENDIAN
cdata[4*i] = cdata[4*i + 1];
cdata[4*i + 1] = cdata[4*i + 2];
cdata[4*i + 2] = cdata[4*i + 3];
cdata[4*i + 3] = d;
#else
cdata[4*i] = cdata[4*i + 2];
//cdata[4*i + 1] = cdata[4*i + 1];
cdata[4*i + 2] = d;
//cdata[4*i + 3] = cdata[4*i + 3];
#endif
}
[dict setObject: data forKey: @"Data"];
return dict;
}
static void
_set_op(cairo_t * ct, NSCompositingOperation op)
_set_op(cairo_t *ct, NSCompositingOperation op)
{
switch (op)
{
@ -875,7 +914,7 @@ _set_op(cairo_t * ct, NSCompositingOperation op)
/*
NSLog(@"%@ DPSimage %dx%d (%p)", self, pixelsWide, pixelsHigh,
cairo_current_target_surface (_ct));
cairo_get_target(_ct));
*/
if (isPlanar || !([colorSpaceName isEqualToString: NSDeviceRGBColorSpace] ||
[colorSpaceName isEqualToString: NSCalibratedRGBColorSpace]))
@ -1080,13 +1119,11 @@ _set_op(cairo_t * ct, NSCompositingOperation op)
{
if (!source->viewIsFlipped)
{
NSLog(@"Fall 1 %g, %g", height, dh);
cairo_set_source_surface(_ct, src, aPoint.x - minx, aPoint.y - miny - dh);
//cairo_set_source_surface(_ct, src, aPoint.x - minx, aPoint.y - miny - height);
}
else
{
NSLog(@"Fall 2 %g, %g", height, dh);
// Both flipped
cairo_pattern_t *cpattern;
cairo_matrix_t local_matrix;