[webkit-changes] cvs commit: WebCore/kcanvas/device/quartz KCanvasFilterQuartz.mm

Eric eseidel at opensource.apple.com
Mon Dec 12 09:25:56 PST 2005


eseidel     05/12/12 09:25:56

  Modified:    .        ChangeLog
               kcanvas  KCanvasFilters.cpp KCanvasFilters.h
               kcanvas/device/quartz KCanvasFilterQuartz.mm
  Log:
  Bug #: 6039
  Submitted by: eseidel
  Reviewed by: darin
          No test cases needed, no functionality change.
          Corrected spacing, and conformance with style guidelines.
          http://bugzilla.opendarwin.org/show_bug.cgi?id=6039
  
          * kcanvas/KCanvasFilters.cpp:
          * kcanvas/KCanvasFilters.h:
          (KCanvasFEComponentTransfer::setRedFunction):
          (KCanvasFEComponentTransfer::setGreenFunction):
          (KCanvasFEComponentTransfer::setBlueFunction):
          (KCanvasFEComponentTransfer::setAlphaFunction):
          * kcanvas/device/quartz/KCanvasFilterQuartz.mm:
          (ciVector):
          (KCanvasFilterQuartz::prepareFilter):
          (KCanvasFilterQuartz::applyFilter):
          (KCanvasFilterQuartz::filterBBoxForItemBBox):
          (KCanvasFilterQuartz::getCIFilterStack):
          (KCanvasFilterQuartz::imageForName):
          (KCanvasFilterQuartz::setImageForName):
          (KCanvasFilterQuartz::setOutputImage):
          (alphaImageForImage):
          (KCanvasFilterQuartz::inputImage):
          (KCanvasFEBlendQuartz::getCIFilter):
          (KCanvasFEColorMatrixQuartz::getCIFilter):
          (KCanvasFECompositeQuartz::getCIFilter):
          (getPointLightVectors):
          (getLightVectors):
          (getNormalMap):
          (KCanvasFEDiffuseLightingQuartz::getCIFilter):
          (KCanvasFEFloodQuartz::getCIFilter):
          (KCanvasFEGaussianBlurQuartz::getCIFilter):
          (KCanvasFEMergeQuartz::getCIFilter):
          (KCanvasFEOffsetQuartz::getCIFilter):
          (KCanvasFESpecularLightingQuartz::getCIFilter):
          (KCanvasFETileQuartz::getCIFilter):
  
  Revision  Changes    Path
  1.512     +39 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.511
  retrieving revision 1.512
  diff -u -r1.511 -r1.512
  --- ChangeLog	12 Dec 2005 17:01:36 -0000	1.511
  +++ ChangeLog	12 Dec 2005 17:25:51 -0000	1.512
  @@ -1,3 +1,42 @@
  +2005-12-12  Eric Seidel  <eseidel at apple.com>
  +
  +        Reviewed by darin.
  +
  +        No test cases needed, no functionality change.
  +        Corrected spacing, and conformance with style guidelines.
  +        http://bugzilla.opendarwin.org/show_bug.cgi?id=6039
  +
  +        * kcanvas/KCanvasFilters.cpp:
  +        * kcanvas/KCanvasFilters.h:
  +        (KCanvasFEComponentTransfer::setRedFunction):
  +        (KCanvasFEComponentTransfer::setGreenFunction):
  +        (KCanvasFEComponentTransfer::setBlueFunction):
  +        (KCanvasFEComponentTransfer::setAlphaFunction):
  +        * kcanvas/device/quartz/KCanvasFilterQuartz.mm:
  +        (ciVector):
  +        (KCanvasFilterQuartz::prepareFilter):
  +        (KCanvasFilterQuartz::applyFilter):
  +        (KCanvasFilterQuartz::filterBBoxForItemBBox):
  +        (KCanvasFilterQuartz::getCIFilterStack):
  +        (KCanvasFilterQuartz::imageForName):
  +        (KCanvasFilterQuartz::setImageForName):
  +        (KCanvasFilterQuartz::setOutputImage):
  +        (alphaImageForImage):
  +        (KCanvasFilterQuartz::inputImage):
  +        (KCanvasFEBlendQuartz::getCIFilter):
  +        (KCanvasFEColorMatrixQuartz::getCIFilter):
  +        (KCanvasFECompositeQuartz::getCIFilter):
  +        (getPointLightVectors):
  +        (getLightVectors):
  +        (getNormalMap):
  +        (KCanvasFEDiffuseLightingQuartz::getCIFilter):
  +        (KCanvasFEFloodQuartz::getCIFilter):
  +        (KCanvasFEGaussianBlurQuartz::getCIFilter):
  +        (KCanvasFEMergeQuartz::getCIFilter):
  +        (KCanvasFEOffsetQuartz::getCIFilter):
  +        (KCanvasFESpecularLightingQuartz::getCIFilter):
  +        (KCanvasFETileQuartz::getCIFilter):
  +
   2005-12-11  Darin Adler  <darin at apple.com>
   
           Reviewed by Eric.
  
  
  
  1.11      +0 -4      WebCore/kcanvas/KCanvasFilters.cpp
  
  Index: KCanvasFilters.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/KCanvasFilters.cpp,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- KCanvasFilters.cpp	28 Nov 2005 23:33:58 -0000	1.10
  +++ KCanvasFilters.cpp	12 Dec 2005 17:25:55 -0000	1.11
  @@ -100,14 +100,12 @@
       m_result = result;
   }
   
  -
   static QTextStream &operator<<(QTextStream &ts, const KCanvasPoint3F p)
   {
       ts << "x=" << p.x() << " y=" << p.y() << " z=" << p.z();
       return ts;  
   }
   
  -
   QTextStream &KCanvasFilterEffect::externalRepresentation(QTextStream &ts) const
   {
       if (!in().isEmpty())
  @@ -144,8 +142,6 @@
       return ts;  
   }
   
  -
  -
   static QTextStream &operator<<(QTextStream &ts, QPointF p)
   {
       ts << "x=" << p.x() << " y=" << p.y();
  
  
  
  1.15      +9 -32     WebCore/kcanvas/KCanvasFilters.h
  
  Index: KCanvasFilters.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/KCanvasFilters.h,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- KCanvasFilters.h	11 Dec 2005 00:07:25 -0000	1.14
  +++ KCanvasFilters.h	12 Dec 2005 17:25:55 -0000	1.15
  @@ -243,31 +243,8 @@
       CT_GAMMA = 4
   } KCComponentTransferType;
   
  -/*
  - // Keep this around in case we want to make this a class:
  -     KCComponentTransferType type() const;
  -    void setType(KCComponentTransferType type) { m_type = type; }
  -    
  -    Q3ValueList<float> tableValues() const;
  -    void setTableValues(Q3ValueList<float> tableValues);
  -    
  -    float slope() const { return m_slope; }
  -    void setSlope(float slope) { m_slope = slope; }
  -    
  -    float intercept() const { return m_intercept; }
  -    void setIntercept(float intercept) { m_intercept = intercept; }
  -    
  -    float amplitude() const { return m_amplitude; }
  -    void setAmplitude(float amplitude) { m_amplitude = amplitude; }
  -    
  -    float exponent() const { return m_exponent; }
  -    void setExponent(float exponent) { m_exponent = exponent; }
  -    
  -    float offset() const { return m_offset; }
  -    void setOffset(float offset) { m_offset = offset; }
  -*/
  -
  -typedef struct {
  +struct KCComponentTransferFunction
  +{
       KCComponentTransferType type;
       Q3ValueList<float> tableValues;
       float slope;
  @@ -275,24 +252,24 @@
       float amplitude;
       float exponent;
       float offset;
  -} KCComponentTransferFunction;
  +};
   
   class KCanvasFEComponentTransfer : public KCanvasFilterEffect
   {
  -public:
  +public:    
       KCComponentTransferFunction redFunction() const { return m_redFunc; }
  -    void setRedFunction(const KCComponentTransferFunction &func) { m_redFunc = func; }
  +    void setRedFunction(const KCComponentTransferFunction& func) { m_redFunc = func; }
       
       KCComponentTransferFunction greenFunction() const { return m_greenFunc; }
  -    void setGreenFunction(const KCComponentTransferFunction &func) { m_greenFunc = func; }
  +    void setGreenFunction(const KCComponentTransferFunction& func) { m_greenFunc = func; }
       
       KCComponentTransferFunction blueFunction() const { return m_blueFunc; }
  -    void setBlueFunction(const KCComponentTransferFunction &func) { m_blueFunc = func; }
  +    void setBlueFunction(const KCComponentTransferFunction& func) { m_blueFunc = func; }
       
       KCComponentTransferFunction alphaFunction() const { return m_alphaFunc; }
  -    void setAlphaFunction(const KCComponentTransferFunction &func) { m_alphaFunc = func; }
  +    void setAlphaFunction(const KCComponentTransferFunction& func) { m_alphaFunc = func; }
   
  -    QTextStream &externalRepresentation(QTextStream &) const;
  +    QTextStream& externalRepresentation(QTextStream&) const;
   
   private:
       KCComponentTransferFunction m_redFunc;
  
  
  
  1.20      +349 -420  WebCore/kcanvas/device/quartz/KCanvasFilterQuartz.mm
  
  Index: KCanvasFilterQuartz.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kcanvas/device/quartz/KCanvasFilterQuartz.mm,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- KCanvasFilterQuartz.mm	11 Dec 2005 09:26:04 -0000	1.19
  +++ KCanvasFilterQuartz.mm	12 Dec 2005 17:25:56 -0000	1.20
  @@ -45,7 +45,7 @@
   
   #import <kxmlcore/Assertions.h>
   
  -static QString KCPreviousFilterOutputName = QString::fromLatin1("__previousOutput__");
  +static QString KCPreviousFilterOutputName = "__previousOutput__";
   
   static inline CIColor *ciColor(const QColor &c)
   {
  @@ -55,15 +55,16 @@
       return colorCI;
   }
   
  -static inline CIVector *ciVector(KCanvasPoint3F point) {
  +static inline CIVector *ciVector(KCanvasPoint3F point)
  +{
       return [CIVector vectorWithX:point.x() Y:point.y() Z:point.z()];
   }
   
  -static inline CIVector *ciVector(QPointF point) {
  +static inline CIVector *ciVector(QPointF point)
  +{
       return [CIVector vectorWithX:point.x() Y:point.y()];
   }
   
  -
   KCanvasFilterQuartz::KCanvasFilterQuartz() : m_filterCIContext(0), m_filterCGLayer(0), m_imagesByName(0)
   {
       m_imagesByName = [[NSMutableDictionary alloc] init];
  @@ -95,7 +96,6 @@
           contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], kCIContextUseSoftwareRenderer, nil];
       
       m_filterCIContext = [[CIContext contextWithCGContext:cgContext options:contextOptions] retain];
  -    
       m_filterCGLayer = [m_filterCIContext createCGLayerWithSize:CGRect(bbox).size info:NULL];
       
       CGContext *filterCGContext = CGLayerGetContext(m_filterCGLayer);
  @@ -108,7 +108,7 @@
   {
       if (!bbox.isValid() || !KRenderingDeviceQuartz::filtersEnabled() || m_effects.isEmpty())
           return;
  -    
  +
       // restore the previous context, delete the filter context.
       delete (device->popContext());
   
  @@ -117,23 +117,19 @@
       NSArray *filterStack = getCIFilterStack(inputImage);
       if ([filterStack count]) {
           CIImage *outputImage = [[filterStack lastObject] valueForKey:@"outputImage"];
  -        if (!outputImage) {
  +        if (outputImage) {
  +            CGRect filterRect = filterBBoxForItemBBox(CGRect(bbox));
  +            CGRect translated = filterRect;
  +            CGPoint bboxOrigin = CGRect(bbox).origin;
  +            CGRect sourceRect = CGRectIntersection(translated,[outputImage extent]);
  +            
  +            CGPoint destOrigin = sourceRect.origin;
  +            destOrigin.x += bboxOrigin.x;
  +            destOrigin.y += bboxOrigin.y;
  +            
  +            [m_filterCIContext drawImage:outputImage atPoint:destOrigin fromRect:sourceRect];
  +        } else
               NSLog(@"Failed to get ouputImage from filter stack, can't draw.");
  -            return;
  -        }
  -        
  -        // actually draw the result to the original context
  -        
  -        CGRect filterRect = filterBBoxForItemBBox(CGRect(bbox));
  -        CGRect translated = filterRect;
  -        CGPoint bboxOrigin = CGRect(bbox).origin;
  -        CGRect sourceRect = CGRectIntersection(translated,[outputImage extent]);
  -        
  -        CGPoint destOrigin = sourceRect.origin;
  -        destOrigin.x += bboxOrigin.x;
  -        destOrigin.y += bboxOrigin.y;
  -        
  -        [m_filterCIContext drawImage:outputImage atPoint:destOrigin fromRect:sourceRect];
       } else
           NSLog(@"No filter stack, can't draw filter.");
       
  @@ -143,98 +139,90 @@
   
   CGRect KCanvasFilterQuartz::filterBBoxForItemBBox(CGRect itemBBox) const
   {
  -	// FIXME: hack for now
  -	CGRect filterBBox = CGRect(filterRect());
  -	if(filterBoundingBoxMode())
  -            filterBBox = CGRectMake((filterBBox.origin.x/100.f * itemBBox.size.width), 
  -                                    (filterBBox.origin.y/100.f * itemBBox.size.height), 
  -                                    (filterBBox.size.width/100.f * itemBBox.size.width), 
  -                                    (filterBBox.size.height/100.f * itemBBox.size.height));
  -	return filterBBox;
  -}
  -
  -NSArray *KCanvasFilterQuartz::getCIFilterStack(CIImage *inputImage) {
  -	// iterate over each of the filter elements
  -	// passing each the necessary inputs...
  -	
  -	NSMutableArray *filterEffects = [NSMutableArray array];
  -	
  -	QValueListIterator<KCanvasFilterEffect *> it = m_effects.begin();
  -	QValueListIterator<KCanvasFilterEffect *> end = m_effects.end();
  -	
  -	// convert to an NSArray of CIFilters
  -	setImageForName(inputImage,QString::fromLatin1("SourceGraphic")); // input
  -	for (;it != end; it++) {
  -		CIFilter *filter = (*it)->getCIFilter(this);
  -		if (filter) [filterEffects addObject:filter];
  -		else NSLog(@"Failed to build filter for element: %p.", (*it));
  -	}
  -	if ([filterEffects count] != m_effects.count())
  -		NSLog(@"WARNING: Built stack of only %i filters from %i filter elements", [filterEffects count], m_effects.count());
  -	[m_imagesByName removeAllObjects]; // clean up before next time.
  -	
  -	return filterEffects;
  +    // FIXME: hack for now
  +    CGRect filterBBox = CGRect(filterRect());
  +    if(filterBoundingBoxMode())
  +        filterBBox = CGRectMake((filterBBox.origin.x/100.f * itemBBox.size.width), 
  +                                (filterBBox.origin.y/100.f * itemBBox.size.height), 
  +                                (filterBBox.size.width/100.f * itemBBox.size.width), 
  +                                (filterBBox.size.height/100.f * itemBBox.size.height));
  +    return filterBBox;
  +}
  +
  +NSArray *KCanvasFilterQuartz::getCIFilterStack(CIImage *inputImage)
  +{
  +    NSMutableArray *filterEffects = [NSMutableArray array];
  +
  +    QValueListIterator<KCanvasFilterEffect *> it = m_effects.begin();
  +    QValueListIterator<KCanvasFilterEffect *> end = m_effects.end();
  +
  +    setImageForName(inputImage, "SourceGraphic"); // input
  +    for (;it != end; it++) {
  +        CIFilter *filter = (*it)->getCIFilter(this);
  +        if (filter)
  +            [filterEffects addObject:filter];
  +        else
  +            NSLog(@"Failed to build filter for element: %p.", (*it));
  +    }
  +    if ([filterEffects count] != m_effects.count())
  +    NSLog(@"WARNING: Built stack of only %i filters from %i filter elements", [filterEffects count], m_effects.count());
  +    [m_imagesByName removeAllObjects]; // clean up before next time.
  +
  +    return filterEffects;
   }
   
   CIImage *KCanvasFilterQuartz::imageForName(const QString &name) const
   {
  -	NSString *imageName = name.getNSString();
  -	CIImage *foundImage = [m_imagesByName valueForKey:imageName];
  -	if (!foundImage && ![imageName isEqualToString:@"SourceAlpha"])
  -		NSLog(@"Failed to find image for name: %@", imageName);
  -	return foundImage;
  +    NSString *imageName = name.getNSString();
  +    CIImage *foundImage = [m_imagesByName valueForKey:imageName];
  +    if (!foundImage && ![imageName isEqualToString:@"SourceAlpha"])
  +        NSLog(@"Failed to find image for name: %@", imageName);
  +    return foundImage;
   }
   
   void KCanvasFilterQuartz::setImageForName(CIImage *image, const QString &name)
   {
  -	//NSLog(@"Setting image for name: %@", name.getNSString());
  -	[m_imagesByName setValue:image forKey:name.getNSString()];
  +    [m_imagesByName setValue:image forKey:name.getNSString()];
   }
   
  -void KCanvasFilterQuartz::setOutputImage(const KCanvasFilterEffect *filterEffect, CIImage *output) {
  -	if (!filterEffect->result().isEmpty()) {
  -		setImageForName(output, filterEffect->result());
  -	}
  -	setImageForName(output, KCPreviousFilterOutputName);
  +void KCanvasFilterQuartz::setOutputImage(const KCanvasFilterEffect *filterEffect, CIImage *output)
  +{
  +    if (!filterEffect->result().isEmpty())
  +        setImageForName(output, filterEffect->result());
  +    setImageForName(output, KCPreviousFilterOutputName);
  +}
  +
  +static inline CIImage *alphaImageForImage(CIImage *image)
  +{
  +    CIFilter *onlyAlpha = [CIFilter filterWithName:@"CIColorMatrix"];
  +    float zero[4] = {0.f, 0.f, 0.f, 0.f};
  +    [onlyAlpha setDefaults];
  +    [onlyAlpha setValue:image forKey:@"inputImage"];
  +    [onlyAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputRVector"];
  +    [onlyAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputGVector"];
  +    [onlyAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBVector"];
  +    return [onlyAlpha valueForKey:@"outputImage"];
   }
   
   CIImage *KCanvasFilterQuartz::inputImage(const KCanvasFilterEffect *filterEffect)
  -{	
  -	// not specified
  -	if (filterEffect->in().isEmpty()) {
  -		CIImage *inImage = imageForName(KCPreviousFilterOutputName);
  -		if (!inImage) inImage = imageForName(QString::fromLatin1("SourceGraphic"));
  -		return inImage;
  -	} else if (filterEffect->in() == QString::fromLatin1("SourceAlpha")) {
  -		CIImage *sourceAlpha = imageForName(filterEffect->in());
  -		if (!sourceAlpha) {
  -			CIFilter *onlyAlpha = [CIFilter filterWithName:@"CIColorMatrix"];
  -			float zero[4] = {0.f, 0.f, 0.f, 0.f};
  -			[onlyAlpha setDefaults];
  -			[onlyAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputRVector"];
  -			[onlyAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputGVector"];
  -			[onlyAlpha setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBVector"];
  -			CIImage *sourceGraphic = imageForName(QString::fromLatin1("SourceGraphic"));
  -            if (sourceGraphic) {
  -                [onlyAlpha setValue:sourceGraphic forKey:@"inputImage"];
  -                sourceAlpha = [onlyAlpha valueForKey:@"outputImage"];
  -                setImageForName(sourceAlpha,QString::fromLatin1("SourceAlpha"));
  -            }
  -		}
  -		return sourceAlpha;
  -	}
  -	
  -	// for now we just return what's in the dict
  -	// eventually we should be smarter.
  -	// and really build the alpha, etc.
  -	return imageForName(filterEffect->in());
  -	
  -	// SourceGraphic
  -	// SourceAlpha
  -	// BackgroundImage
  -	// BackgroundAlpha
  -	// FillPaint
  -	// StrokePaint
  +{
  +    if (filterEffect->in().isEmpty()) {
  +        CIImage *inImage = imageForName(KCPreviousFilterOutputName);
  +        if (!inImage)
  +            inImage = imageForName("SourceGraphic");
  +        return inImage;
  +    } else if (filterEffect->in() == "SourceAlpha") {
  +        CIImage *sourceAlpha = imageForName(filterEffect->in());
  +        if (!sourceAlpha) {
  +            CIImage *sourceGraphic = imageForName("SourceGraphic");
  +            if (!sourceGraphic)
  +                return nil;
  +            setImageForName(alphaImageForImage(sourceGraphic), "SourceAlpha");
  +        }
  +        return sourceAlpha;
  +    }
  +
  +    return imageForName(filterEffect->in());
   }
   
   #pragma mark -
  @@ -243,242 +231,192 @@
   #define FE_QUARTZ_SETUP_INPUT(name) \
       CIImage *inputImage = quartzFilter->inputImage(this); \
       FE_QUARTZ_CHECK_INPUT(inputImage) \
  -	KWQ_BLOCK_EXCEPTIONS \
  -	CIFilter *filter = [CIFilter filterWithName:name]; \
  -	[filter setDefaults]; \
  -	[filter setValue:inputImage forKey:@"inputImage"];
  +    KWQ_BLOCK_EXCEPTIONS \
  +    CIFilter *filter = [CIFilter filterWithName:name]; \
  +    [filter setDefaults]; \
  +    [filter setValue:inputImage forKey:@"inputImage"];
   
   #define FE_QUARTZ_CHECK_INPUT(input) \
  -	if (!input) { \
  -		NSLog(@"ERROR: Can't apply filter (%p) w/o input image.", this); \
  -		return nil; \
  -	}
  +    if (!input) { \
  +        NSLog(@"ERROR: Can't apply filter (%p) w/o input image.", this); \
  +        return nil; \
  +    }
   
   #define FE_QUARTZ_OUTPUT_RETURN \
  -	quartzFilter->setOutputImage(this, [filter valueForKey:@"outputImage"]); \
  -	return filter; \
  -	KWQ_UNBLOCK_EXCEPTIONS \
  -	return nil;
  +    quartzFilter->setOutputImage(this, [filter valueForKey:@"outputImage"]); \
  +    return filter; \
  +    KWQ_UNBLOCK_EXCEPTIONS \
  +    return nil;
   
   #define FE_QUARTZ_CROP_TO_RECT(rect) \
  -{ \
  -	CIFilter *crop = [CIFilter filterWithName:@"CICrop"]; \
  -	[crop setDefaults]; \
  -	[crop setValue:[filter valueForKey:@"outputImage"] forKey:@"inputImage"]; \
  -	[crop setValue:[CIVector vectorWithX:rect.origin.x Y:rect.origin.y Z:rect.size.width W:rect.size.height] forKey:@"inputRectangle"]; \
  -	filter = crop; \
  -}
  -
  -//static CGRect getFilterEffectSubRegion(KCanvasFilterQuartz *quartzFilter, KCanvasFilterEffect *effect)
  -//{
  -//	// FIXME!
  -//	
  -//	/*
  -//	spec:
  -//	x, y, width and height default to the union (i.e., tightest fitting bounding box) of the subregions defined for all referenced nodes. If there are no referenced nodes (e.g., for 'feImage' or 'feTurbulence'), or one or more of the referenced nodes is a standard input (one of SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint or StrokePaint), or for 'feTile' (which is special because its principal function is to replicate the referenced node in X and Y and thereby produce a usually larger result), the default subregion is 0%,0%,100%,100%, where percentages are relative to the dimensions of the filter region.
  -//	*/
  -//	return CGRectZero;
  -//}
  +    { \
  +        CIFilter *crop = [CIFilter filterWithName:@"CICrop"]; \
  +        [crop setDefaults]; \
  +        [crop setValue:[filter valueForKey:@"outputImage"] forKey:@"inputImage"]; \
  +        [crop setValue:[CIVector vectorWithX:rect.origin.x Y:rect.origin.y Z:rect.size.width W:rect.size.height] forKey:@"inputRectangle"]; \
  +        filter = crop; \
  +    }
   
   CIFilter *KCanvasFEBlendQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	KWQ_BLOCK_EXCEPTIONS
  -	CIFilter *filter = nil;
  -	
  -	switch(blendMode()) {
  -	case BM_NORMAL:
  -		// FIXME: I think this is correct....
  -		filter = [CIFilter filterWithName:@"CISourceOverCompositing"];
  -		break;
  -	case BM_MULTIPLY:
  -		filter = [CIFilter filterWithName:@"CIMultiplyBlendMode"];
  -		break;
  -	case BM_SCREEN:
  -		filter = [CIFilter filterWithName:@"CIScreenBlendMode"];
  -		break;
  -	case BM_DARKEN:
  -		filter = [CIFilter filterWithName:@"CIDarkenBlendMode"];
  -		break;
  -	case BM_LIGHTEN:
  -		filter = [CIFilter filterWithName:@"CILightenBlendMode"];
  -		break;
  -	default:
  -		NSLog(@"ERROR: Unhandled blend mode: %i", blendMode());
  -		return nil;
  -	}
  -	
  -	[filter setDefaults];
  -	CIImage *inputImage = quartzFilter->inputImage(this);
  +    KWQ_BLOCK_EXCEPTIONS
  +    CIFilter *filter = nil;
  +
  +    switch (blendMode()) {
  +    case BM_NORMAL:
  +        // FIXME: I think this is correct....
  +        filter = [CIFilter filterWithName:@"CISourceOverCompositing"];
  +        break;
  +    case BM_MULTIPLY:
  +        filter = [CIFilter filterWithName:@"CIMultiplyBlendMode"];
  +        break;
  +    case BM_SCREEN:
  +        filter = [CIFilter filterWithName:@"CIScreenBlendMode"];
  +        break;
  +    case BM_DARKEN:
  +        filter = [CIFilter filterWithName:@"CIDarkenBlendMode"];
  +        break;
  +    case BM_LIGHTEN:
  +        filter = [CIFilter filterWithName:@"CILightenBlendMode"];
  +        break;
  +    default:
  +        NSLog(@"ERROR: Unhandled blend mode: %i", blendMode());
  +        return nil;
  +    }
  +
  +    [filter setDefaults];
  +    CIImage *inputImage = quartzFilter->inputImage(this);
       FE_QUARTZ_CHECK_INPUT(inputImage);
  -	[filter setValue:inputImage forKey:@"inputImage"];
  -	CIImage *backgroundImage = quartzFilter->imageForName(in2());
  +    [filter setValue:inputImage forKey:@"inputImage"];
  +    CIImage *backgroundImage = quartzFilter->imageForName(in2());
       FE_QUARTZ_CHECK_INPUT(backgroundImage);
  -	[filter setValue:backgroundImage forKey:@"inputBackgroundImage"];
  -	
  -	FE_QUARTZ_OUTPUT_RETURN;
  +    [filter setValue:backgroundImage forKey:@"inputBackgroundImage"];
  +
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
   
   #define deg2rad(d) ((d * (2.0 * M_PI))/360.0)
   
   #define CMValuesCheck(expected, type) \
  -		if (values().count() != expected) { \
  -			NSLog(@"Error, incorrect number of values in ColorMatrix for type \"%s\", expected: %i actual: %i, ignoring filter.  Values:", type, expected, values().count()); \
  -			for (unsigned int x=0; x < values().count(); x++) fprintf(stderr, " %f", values()[x]); \
  -			fprintf(stderr, "\n"); \
  -			return nil; \
  -		}
  +    if (values().count() != expected) { \
  +        NSLog(@"Error, incorrect number of values in ColorMatrix for type \"%s\", expected: %i actual: %i, ignoring filter.  Values:", type, expected, values().count()); \
  +        for (unsigned int x=0; x < values().count(); x++) fprintf(stderr, " %f", values()[x]); \
  +        fprintf(stderr, "\n"); \
  +        return nil; \
  +    }
   
   CIFilter *KCanvasFEColorMatrixQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	CIFilter *filter = nil;
  -	KWQ_BLOCK_EXCEPTIONS
  -	switch(type()) {
  -	case CMT_MATRIX:
  -	{
  -		CMValuesCheck(20, "matrix");
  -		filter = [CIFilter filterWithName:@"CIColorMatrix"];
  -		[filter setDefaults];
  -		QValueList<float> v = values();
  -		[filter setValue:[CIVector vectorWithX:v[0] Y:v[1] Z:v[2] W:v[3]] forKey:@"inputRVector"];
  -		[filter setValue:[CIVector vectorWithX:v[5] Y:v[6] Z:v[7] W:v[8]] forKey:@"inputGVector"];
  -		[filter setValue:[CIVector vectorWithX:v[10] Y:v[11] Z:v[12] W:v[13]] forKey:@"inputBVector"];
  -		[filter setValue:[CIVector vectorWithX:v[15] Y:v[16] Z:v[17] W:v[18]] forKey:@"inputAVector"];
  -		[filter setValue:[CIVector vectorWithX:v[4] Y:v[9] Z:v[14] W:v[19]] forKey:@"inputBiasVector"];
  -		break;
  -	}
  -	case CMT_SATURATE:
  -	{
  -		CMValuesCheck(1, "saturate");
  -		filter = [CIFilter filterWithName:@"CIColorControls"];
  -		[filter setDefaults];
  -		float saturation = values()[0];
  -		if ((saturation < 0.0) || (saturation > 3.0))
  -			NSLog(@"WARNING: Saturation adjustment: %f outside supported range.");
  -		[filter setValue:[NSNumber numberWithFloat:saturation] forKey:@"inputSaturation"];
  -		break;
  -	}
  -	case CMT_HUE_ROTATE:
  -	{
  -		CMValuesCheck(1, "hueRotate");
  -		filter = [CIFilter filterWithName:@"CIHueAdjust"];
  -		[filter setDefaults];
  -		float radians = deg2rad(values()[0]);
  -		[filter setValue:[NSNumber numberWithFloat:radians] forKey:@"inputAngle"];
  -		break;
  -	}
  -	case CMT_LUMINANCE_TO_ALPHA:
  -	{
  -		CMValuesCheck(0, "luminanceToAlpha");
  -		// FIXME: I bet there is an easy filter to do this.
  -		filter = [CIFilter filterWithName:@"CIColorMatrix"];
  -		[filter setDefaults];
  -		float zero[4] = {0.f, 0.f, 0.f, 0.f};
  -		float alpha[4] = { 0.2125f, 0.7154f, 0.0721f, 0.f};
  -		[filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputRVector"];
  -		[filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputGVector"];
  -		[filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBVector"];
  -		[filter setValue:[CIVector vectorWithValues:alpha count:4] forKey:@"inputAVector"];
  -		[filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBiasVector"];
  -		break;
  -	}
  -	default:
  -		NSLog(@"ERROR: Unhandled ColorMatrix type: %i", type());
  -		return nil;
  -	}
  -	CIImage *inputImage = quartzFilter->inputImage(this);
  +    KWQ_BLOCK_EXCEPTIONS
  +    CIFilter *filter = nil;
  +    switch (type()) {
  +    case CMT_MATRIX:
  +    {
  +        CMValuesCheck(20, "matrix");
  +        filter = [CIFilter filterWithName:@"CIColorMatrix"];
  +        [filter setDefaults];
  +        QValueList<float> v = values();
  +        [filter setValue:[CIVector vectorWithX:v[0] Y:v[1] Z:v[2] W:v[3]] forKey:@"inputRVector"];
  +        [filter setValue:[CIVector vectorWithX:v[5] Y:v[6] Z:v[7] W:v[8]] forKey:@"inputGVector"];
  +        [filter setValue:[CIVector vectorWithX:v[10] Y:v[11] Z:v[12] W:v[13]] forKey:@"inputBVector"];
  +        [filter setValue:[CIVector vectorWithX:v[15] Y:v[16] Z:v[17] W:v[18]] forKey:@"inputAVector"];
  +        [filter setValue:[CIVector vectorWithX:v[4] Y:v[9] Z:v[14] W:v[19]] forKey:@"inputBiasVector"];
  +        break;
  +    }
  +    case CMT_SATURATE:
  +    {
  +        CMValuesCheck(1, "saturate");
  +        filter = [CIFilter filterWithName:@"CIColorControls"];
  +        [filter setDefaults];
  +        float saturation = values()[0];
  +        if ((saturation < 0.0) || (saturation > 3.0))
  +                NSLog(@"WARNING: Saturation adjustment: %f outside supported range.");
  +        [filter setValue:[NSNumber numberWithFloat:saturation] forKey:@"inputSaturation"];
  +        break;
  +    }
  +    case CMT_HUE_ROTATE:
  +    {
  +        CMValuesCheck(1, "hueRotate");
  +        filter = [CIFilter filterWithName:@"CIHueAdjust"];
  +        [filter setDefaults];
  +        float radians = deg2rad(values()[0]);
  +        [filter setValue:[NSNumber numberWithFloat:radians] forKey:@"inputAngle"];
  +        break;
  +    }
  +    case CMT_LUMINANCE_TO_ALPHA:
  +    {
  +        CMValuesCheck(0, "luminanceToAlpha");
  +        // FIXME: I bet there is an easy filter to do this.
  +        filter = [CIFilter filterWithName:@"CIColorMatrix"];
  +        [filter setDefaults];
  +        float zero[4] = {0.f, 0.f, 0.f, 0.f};
  +        float alpha[4] = { 0.2125f, 0.7154f, 0.0721f, 0.f};
  +        [filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputRVector"];
  +        [filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputGVector"];
  +        [filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBVector"];
  +        [filter setValue:[CIVector vectorWithValues:alpha count:4] forKey:@"inputAVector"];
  +        [filter setValue:[CIVector vectorWithValues:zero count:4] forKey:@"inputBiasVector"];
  +        break;
  +    }
  +    default:
  +        NSLog(@"ERROR: Unhandled ColorMatrix type: %i", type());
  +        return nil;
  +    }
  +    CIImage *inputImage = quartzFilter->inputImage(this);
       FE_QUARTZ_CHECK_INPUT(inputImage);
  -	[filter setValue:inputImage forKey:@"inputImage"];
  +    [filter setValue:inputImage forKey:@"inputImage"];
   
  -	FE_QUARTZ_OUTPUT_RETURN;
  -}
  -
  -/*
  -fillCIVectorAndBiasFromFunc(const KCComponentTransferFunction &func, KCChannelSelectorType color, CIVector *bias) {	
  -	float[4] vector = {0.f, 0.f, 0.f, 0.f};
  -	
  -	switch(func.type()) {
  -	case CT_IDENTITY:
  -		vector[color] = 1.f;
  -		break;
  -	case CT_TABLE:
  -		NSLog(@"Warning: Component Transfer \"table\" function not yet supported.");
  -		vector[color] = 1.f;
  -		break;
  -	case CT_DISCRETE:
  -		NSLog(@"Warning: Component Transfer \"discrete\" function not yet supported.");
  -		vector[color] = 1.f;
  -		break;
  -	case CT_LINEAR:
  -		vector[color] = func.slope;
  -		// FIXME: add intercept to bias.
  -		break;
  -	case CT_GAMMA:
  -		vector[color] = func.slope;
  -	}
  -	
  -	return [CIVector vectorWithValues:vector count:4];
  -}
  -
  -CIFilter *KCanvasFEComponentTransferQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
  -{
  -	FE_QUARTZ_SETUP_INPUT(@"CIColorMatrix");
  -	
  -	
  -	FE_QUARTZ_OUTPUT_RETURN;
  -	return nil;
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
  -*/
  -
   
   CIFilter *KCanvasFECompositeQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	KWQ_BLOCK_EXCEPTIONS
  -	CIFilter *filter = nil;
  -	switch(operation()) {
  -	case CO_OVER:
  -            filter = [CIFilter filterWithName:@"CISourceOverCompositing"];
  -            break;
  -	case CO_IN:
  -            filter = [CIFilter filterWithName:@"CISourceInCompositing"];
  -            break;
  -	case CO_OUT:
  -            filter = [CIFilter filterWithName:@"CISourceOutCompositing"];
  -            break;
  -	case CO_ATOP:
  -            filter = [CIFilter filterWithName:@"CISourceAtopCompositing"];
  -            break;
  -	case CO_XOR:
  -            //FIXME: I'm not sure this is right...
  -            filter = [CIFilter filterWithName:@"CIExclusionBlendMode"];
  -            break;
  -	case CO_ARITHMETIC:
  -            [WKArithmeticFilter class];
  -            filter = [CIFilter filterWithName:@"WKArithmeticFilter"];
  -            break;
  -	}
  -	
  -	[filter setDefaults];
  -	CIImage *inputImage = quartzFilter->inputImage(this);
  -	CIImage *backgroundImage = quartzFilter->imageForName(in2());
  -	FE_QUARTZ_CHECK_INPUT(inputImage);
  -	FE_QUARTZ_CHECK_INPUT(backgroundImage);
  -	[filter setValue:inputImage forKey:@"inputImage"];
  -	[filter setValue:backgroundImage forKey:@"inputBackgroundImage"];
  -	//FIXME: this seems ugly
  -	if (operation() == CO_ARITHMETIC) {
  -            [filter setValue:[NSNumber numberWithFloat:k1()] forKey:@"inputK1"];
  -            [filter setValue:[NSNumber numberWithFloat:k2()] forKey:@"inputK2"];
  -            [filter setValue:[NSNumber numberWithFloat:k3()] forKey:@"inputK3"];
  -            [filter setValue:[NSNumber numberWithFloat:k4()] forKey:@"inputK4"];
  -        }
  -	FE_QUARTZ_OUTPUT_RETURN;
  +    KWQ_BLOCK_EXCEPTIONS
  +    CIFilter *filter = nil;
  +    switch (operation()) {
  +    case CO_OVER:
  +        filter = [CIFilter filterWithName:@"CISourceOverCompositing"];
  +        break;
  +    case CO_IN:
  +        filter = [CIFilter filterWithName:@"CISourceInCompositing"];
  +        break;
  +    case CO_OUT:
  +        filter = [CIFilter filterWithName:@"CISourceOutCompositing"];
  +        break;
  +    case CO_ATOP:
  +        filter = [CIFilter filterWithName:@"CISourceAtopCompositing"];
  +        break;
  +    case CO_XOR:
  +        //FIXME: I'm not sure this is right...
  +        filter = [CIFilter filterWithName:@"CIExclusionBlendMode"];
  +        break;
  +    case CO_ARITHMETIC:
  +        [WKArithmeticFilter class];
  +        filter = [CIFilter filterWithName:@"WKArithmeticFilter"];
  +        break;
  +    }
  +    
  +    [filter setDefaults];
  +    CIImage *inputImage = quartzFilter->inputImage(this);
  +    CIImage *backgroundImage = quartzFilter->imageForName(in2());
  +    FE_QUARTZ_CHECK_INPUT(inputImage);
  +    FE_QUARTZ_CHECK_INPUT(backgroundImage);
  +    [filter setValue:inputImage forKey:@"inputImage"];
  +    [filter setValue:backgroundImage forKey:@"inputBackgroundImage"];
  +    //FIXME: this seems ugly
  +    if (operation() == CO_ARITHMETIC) {
  +        [filter setValue:[NSNumber numberWithFloat:k1()] forKey:@"inputK1"];
  +        [filter setValue:[NSNumber numberWithFloat:k2()] forKey:@"inputK2"];
  +        [filter setValue:[NSNumber numberWithFloat:k3()] forKey:@"inputK3"];
  +        [filter setValue:[NSNumber numberWithFloat:k4()] forKey:@"inputK4"];
  +    }
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
   
   static inline CIFilter *getPointLightVectors(CIFilter * normals, CIVector * lightPosition, float surfaceScale)
   {
  -    CIFilter *filter = nil;
       KWQ_BLOCK_EXCEPTIONS
  -    filter = [CIFilter filterWithName:@"WKPointLight"];
  +    CIFilter *filter = [CIFilter filterWithName:@"WKPointLight"];
       if (!filter)
           return nil;
       [filter setDefaults];
  @@ -489,76 +427,74 @@
       KWQ_UNBLOCK_EXCEPTIONS 
       return nil;
   }
  +
   static CIFilter *getLightVectors(CIFilter * normals, const KCLightSource * light, float surfaceScale)
   {
  -    //FIXME: there has to be a better way of making sure these get initialised
       [WKDistantLightFilter class];
       [WKPointLightFilter class];
       [WKSpotLightFilter class];
       
  -    CIFilter *filter = nil;
       KWQ_BLOCK_EXCEPTIONS
  +    CIFilter *filter = nil;
       
       switch (light->type()) {
  -        case LS_DISTANT:
  -        {
  -            const KCDistantLightSource *dlight = static_cast<const KCDistantLightSource *>(light);
  -            
  -            filter = [CIFilter filterWithName:@"WKDistantLight"];
  -            if (!filter)
  -                return nil;
  -            [filter setDefaults];
  -            
  -            float azimuth = dlight->azimuth();
  -            float elevation = dlight->elevation();
  -            azimuth=deg2rad(azimuth);
  -            elevation=deg2rad(elevation);
  -            float Lx = cos(azimuth)*cos(elevation);
  -            float Ly = sin(azimuth)*cos(elevation);
  -            float Lz = sin(elevation);
  -            
  -            [filter setValue:[normals valueForKey:@"outputImage"] forKey:@"inputNormalMap"];
  -            [filter setValue:[CIVector vectorWithX:Lx Y:Ly Z:Lz] forKey:@"inputLightDirection"];
  -            return filter;
  -        }
  -        case LS_POINT:
  -        {
  -            const KCPointLightSource *plight = static_cast<const KCPointLightSource *>(light);
  -            return getPointLightVectors(normals, [CIVector vectorWithX:plight->position().x() Y:plight->position().y() Z:plight->position().z()], surfaceScale);
  -        }
  -        case LS_SPOT:
  -        {
  -            const KCSpotLightSource *slight = static_cast<const KCSpotLightSource *>(light);
  -            filter = [CIFilter filterWithName:@"WKSpotLight"];
  -            if (!filter)
  -                return nil;
  -            
  -            CIFilter * pointLightFilter = getPointLightVectors(normals, [CIVector vectorWithX:slight->position().x() Y:slight->position().y() Z:slight->position().z()], surfaceScale);
  -            if (!pointLightFilter)
  -                return nil;
  -            [filter setDefaults];
  -            
  -            [filter setValue:[pointLightFilter valueForKey:@"outputImage"] forKey:@"inputLightVectors"];
  -            [filter setValue:[CIVector vectorWithX:slight->direction().x() Y:slight->direction().y() Z:slight->direction().z()] forKey:@"inputLightDirection"];
  -            [filter setValue:[NSNumber numberWithFloat:slight->specularExponent()] forKey:@"inputSpecularExponent"];
  -            [filter setValue:[NSNumber numberWithFloat:deg2rad(slight->limitingConeAngle())] forKey:@"inputLimitingConeAngle"];
  -            return filter;
  -        }
  +    case LS_DISTANT:
  +    {
  +        const KCDistantLightSource *dlight = static_cast<const KCDistantLightSource *>(light);
  +        
  +        filter = [CIFilter filterWithName:@"WKDistantLight"];
  +        if (!filter)
  +            return nil;
  +        [filter setDefaults];
  +        
  +        float azimuth = dlight->azimuth();
  +        float elevation = dlight->elevation();
  +        azimuth=deg2rad(azimuth);
  +        elevation=deg2rad(elevation);
  +        float Lx = cos(azimuth)*cos(elevation);
  +        float Ly = sin(azimuth)*cos(elevation);
  +        float Lz = sin(elevation);
  +        
  +        [filter setValue:[normals valueForKey:@"outputImage"] forKey:@"inputNormalMap"];
  +        [filter setValue:[CIVector vectorWithX:Lx Y:Ly Z:Lz] forKey:@"inputLightDirection"];
  +        return filter;
  +    }
  +    case LS_POINT:
  +    {
  +        const KCPointLightSource *plight = static_cast<const KCPointLightSource *>(light);
  +        return getPointLightVectors(normals, [CIVector vectorWithX:plight->position().x() Y:plight->position().y() Z:plight->position().z()], surfaceScale);
  +    }
  +    case LS_SPOT:
  +    {
  +        const KCSpotLightSource *slight = static_cast<const KCSpotLightSource *>(light);
  +        filter = [CIFilter filterWithName:@"WKSpotLight"];
  +        if (!filter)
  +            return nil;
  +        
  +        CIFilter * pointLightFilter = getPointLightVectors(normals, [CIVector vectorWithX:slight->position().x() Y:slight->position().y() Z:slight->position().z()], surfaceScale);
  +        if (!pointLightFilter)
  +            return nil;
  +        [filter setDefaults];
  +        
  +        [filter setValue:[pointLightFilter valueForKey:@"outputImage"] forKey:@"inputLightVectors"];
  +        [filter setValue:[CIVector vectorWithX:slight->direction().x() Y:slight->direction().y() Z:slight->direction().z()] forKey:@"inputLightDirection"];
  +        [filter setValue:[NSNumber numberWithFloat:slight->specularExponent()] forKey:@"inputSpecularExponent"];
  +        [filter setValue:[NSNumber numberWithFloat:deg2rad(slight->limitingConeAngle())] forKey:@"inputLimitingConeAngle"];
  +        return filter;
  +    }
       }
       KWQ_UNBLOCK_EXCEPTIONS 
       return nil;
   }
   
  -
   static CIFilter *getNormalMap(CIImage *bumpMap, float scale)
   {
       [WKNormalMapFilter class];
  -    CIFilter *filter = nil;
       KWQ_BLOCK_EXCEPTIONS
  -    filter = [CIFilter filterWithName:@"WKNormalMap"];   
  +    CIFilter *filter = [CIFilter filterWithName:@"WKNormalMap"];   
       [filter setDefaults];
       
  -    [filter setValue:bumpMap forKey:@"inputImage"];    
  +    [filter setValue:bumpMap forKey:@"inputImage"];  
       [filter setValue:[NSNumber numberWithFloat:scale] forKey:@"inputSurfaceScale"];
       return filter;
       KWQ_UNBLOCK_EXCEPTIONS 
  @@ -568,14 +504,13 @@
   CIFilter *KCanvasFEDiffuseLightingQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
       const KCLightSource *light = lightSource();
  -    if(!light)
  +    if (!light)
           return nil;
       
       [WKDiffuseLightingFilter class];
       
  -    CIFilter *filter = nil;
       KWQ_BLOCK_EXCEPTIONS
  -    filter = [CIFilter filterWithName:@"WKDiffuseLighting"];
  +    CIFilter *filter = [CIFilter filterWithName:@"WKDiffuseLighting"];
       if (!filter)
           return nil;
       
  @@ -601,23 +536,22 @@
   
   CIFilter *KCanvasFEFloodQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	CIFilter *filter = nil;
  -	KWQ_BLOCK_EXCEPTIONS
  -	filter = [CIFilter filterWithName:@"CIConstantColorGenerator"];
  -	[filter setDefaults];
  -	CGColorRef color = cgColor(floodColor());
  -	CGColorRef withAlpha = CGColorCreateCopyWithAlpha(color,CGColorGetAlpha(color) * floodOpacity());
  -	CIColor *inputColor = [CIColor colorWithCGColor:withAlpha];
  -	CGColorRelease(color);
  -	CGColorRelease(withAlpha);
  -	[filter setValue:inputColor forKey:@"inputColor"];
  -	
  -        CGRect cropRect = CGRectMake(0,0,1000,1000); // HACK
  -        if (subRegion().isValid())
  -            cropRect = CGRect(subRegion());
  -	FE_QUARTZ_CROP_TO_RECT(cropRect);
  -	
  -	FE_QUARTZ_OUTPUT_RETURN;
  +    KWQ_BLOCK_EXCEPTIONS
  +    CIFilter *filter = [CIFilter filterWithName:@"CIConstantColorGenerator"];
  +    [filter setDefaults];
  +    CGColorRef color = cgColor(floodColor());
  +    CGColorRef withAlpha = CGColorCreateCopyWithAlpha(color,CGColorGetAlpha(color) * floodOpacity());
  +    CIColor *inputColor = [CIColor colorWithCGColor:withAlpha];
  +    CGColorRelease(color);
  +    CGColorRelease(withAlpha);
  +    [filter setValue:inputColor forKey:@"inputColor"];
  +    
  +    CGRect cropRect = CGRectMake(0,0,1000,1000); // HACK
  +    if (subRegion().isValid())
  +        cropRect = CGRect(subRegion());
  +    FE_QUARTZ_CROP_TO_RECT(cropRect);
  +    
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
   
   CIFilter *KCanvasFEImageQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
  @@ -652,50 +586,49 @@
   
   CIFilter *KCanvasFEGaussianBlurQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	FE_QUARTZ_SETUP_INPUT(@"CIGaussianPyramid");
  -	
  -	float inputRadius = stdDeviationX();
  -	if (inputRadius != stdDeviationY()) {
  -		float inputAspectRatio = stdDeviationX()/stdDeviationY();
  -		if ( (inputAspectRatio < .5) || (inputAspectRatio > 2.0) )
  -			NSLog(@"WARNING: inputAspectRatio outside range supported by quartz for asymmetric Gaussian blurs! (x: %f  y: %f ratio: %f)", stdDeviationX(), stdDeviationY(), inputAspectRatio);
  -		[filter setValue:[NSNumber numberWithFloat:inputAspectRatio] forKey:@"inputAspectRatio"];
  -	}
  -	[filter setValue:[NSNumber numberWithFloat:inputRadius] forKey:@"inputRadius"];
  -	
  -	FE_QUARTZ_OUTPUT_RETURN;
  +    FE_QUARTZ_SETUP_INPUT(@"CIGaussianPyramid");
  +
  +    float inputRadius = stdDeviationX();
  +    if (inputRadius != stdDeviationY()) {
  +        float inputAspectRatio = stdDeviationX()/stdDeviationY();
  +        if ( (inputAspectRatio < .5) || (inputAspectRatio > 2.0) )
  +                NSLog(@"WARNING: inputAspectRatio outside range supported by quartz for asymmetric Gaussian blurs! (x: %f  y: %f ratio: %f)", stdDeviationX(), stdDeviationY(), inputAspectRatio);
  +        [filter setValue:[NSNumber numberWithFloat:inputAspectRatio] forKey:@"inputAspectRatio"];
  +    }
  +    [filter setValue:[NSNumber numberWithFloat:inputRadius] forKey:@"inputRadius"];
  +
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
   
   CIFilter *KCanvasFEMergeQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	// Just stack a bunch of composite source over filters together...
  -	KWQ_BLOCK_EXCEPTIONS
  -	CIFilter *filter = nil;
  -	QStringList inputs = mergeInputs();
  -	QValueListIterator<QString> it = inputs.begin();
  -	QValueListIterator<QString> end = inputs.end();
  -	
  -	CIImage *previousOutput = quartzFilter->inputImage(this);
  -	for (;it != end; it++) {
  -		CIImage *inputImage = quartzFilter->imageForName(*it);
  -        FE_QUARTZ_CHECK_INPUT(inputImage);
  -        FE_QUARTZ_CHECK_INPUT(previousOutput);
  -		filter = [CIFilter filterWithName:@"CISourceOverCompositing"];
  -		[filter setDefaults];
  -		[filter setValue:inputImage forKey:@"inputImage"];
  -		[filter setValue:previousOutput forKey:@"inputBackgroundImage"];
  -		previousOutput = [filter valueForKey:@"outputImage"];
  -	}
  -	FE_QUARTZ_OUTPUT_RETURN;
  +    KWQ_BLOCK_EXCEPTIONS
  +    CIFilter *filter = nil;
  +    QStringList inputs = mergeInputs();
  +    QValueListIterator<QString> it = inputs.begin();
  +    QValueListIterator<QString> end = inputs.end();
  +
  +    CIImage *previousOutput = quartzFilter->inputImage(this);
  +    for (;it != end; it++) {
  +        CIImage *inputImage = quartzFilter->imageForName(*it);
  +    FE_QUARTZ_CHECK_INPUT(inputImage);
  +    FE_QUARTZ_CHECK_INPUT(previousOutput);
  +        filter = [CIFilter filterWithName:@"CISourceOverCompositing"];
  +        [filter setDefaults];
  +        [filter setValue:inputImage forKey:@"inputImage"];
  +        [filter setValue:previousOutput forKey:@"inputBackgroundImage"];
  +        previousOutput = [filter valueForKey:@"outputImage"];
  +    }
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
   
   CIFilter *KCanvasFEOffsetQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	FE_QUARTZ_SETUP_INPUT(@"CIAffineTransform");
  -	NSAffineTransform *offsetTransform = [NSAffineTransform transform];
  -	[offsetTransform translateXBy:dx() yBy:dy()];
  -	[filter setValue:offsetTransform  forKey:@"inputTransform"];
  -	FE_QUARTZ_OUTPUT_RETURN;
  +    FE_QUARTZ_SETUP_INPUT(@"CIAffineTransform");
  +    NSAffineTransform *offsetTransform = [NSAffineTransform transform];
  +    [offsetTransform translateXBy:dx() yBy:dy()];
  +    [filter setValue:offsetTransform  forKey:@"inputTransform"];
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
   
   CIFilter *KCanvasFESpecularLightingQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
  @@ -706,9 +639,8 @@
       
       [WKSpecularLightingFilter class];  
       
  -    CIFilter *filter = nil;
       KWQ_BLOCK_EXCEPTIONS
  -    filter = [CIFilter filterWithName:@"WKSpecularLighting"];
  +    CIFilter *filter = [CIFilter filterWithName:@"WKSpecularLighting"];
       [filter setDefaults];
       CIFilter *normals = getNormalMap(quartzFilter->inputImage(this), surfaceScale());
       if (!normals) 
  @@ -728,11 +660,8 @@
       FE_QUARTZ_OUTPUT_RETURN;
   }
   
  -
   CIFilter *KCanvasFETileQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
   {
  -	FE_QUARTZ_SETUP_INPUT(@"CIAffineTile");
  -	// no interesting parameters...
  -	FE_QUARTZ_OUTPUT_RETURN;
  +    FE_QUARTZ_SETUP_INPUT(@"CIAffineTile");
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
  -
  
  
  



More information about the webkit-changes mailing list