[webkit-changes] cvs commit: WebCore/kwq KWQWMatrix.h KWQWMatrix.mm

Eric eseidel at opensource.apple.com
Sat Nov 26 14:27:08 PST 2005


eseidel     05/11/26 14:27:07

  Modified:    .        ChangeLog
               WebCore.xcodeproj project.pbxproj
               kcanvas/device/quartz KCanvasFilterQuartz.mm
                        KCanvasResourcesQuartz.mm
               khtml/rendering render_object.cpp
               ksvg2/scripts make_names.pl
               ksvg2/svg SVGClipPathElementImpl.cpp
                        SVGFEColorMatrixElementImpl.cpp
               kwq      KWQWMatrix.h KWQWMatrix.mm
  Log:
  Bug #: 5810
  Submitted by: eseidel
  Reviewed by: mjs
          No additional test cases needed, this fixes 5 existing tests.
  
          This patch fixes feImage (to scale and flip).
          Also fixes feColorMatrix (previously inadvertently disabled)
          Fixes <svg> in <svg> (sub-elements establishing viewports)
          Fixes clip-rule, by fixing style resolution on <clipPath> children
  
          * WebCore.xcodeproj/project.pbxproj: removed svgattr.[ch]
          * kcanvas/device/quartz/KCanvasFilterQuartz.mm:
          (KCanvasFEFloodQuartz::getCIFilter): respect subregion
          (KCanvasFEImageQuartz::getCIFilter): respect subregion, scale, flip
          * kcanvas/device/quartz/KCanvasResourcesQuartz.mm:
          (CGPathFromKCPathDataList): style/spacing update
          (KCanvasContainerQuartz::paint):  handle viewport, singular filters
          * khtml/rendering/render_object.cpp:
          (RenderObject::absoluteTransform): use QMatrix operator *
          * ksvg2/scripts/make_names.pl: allow FEColorMatrixElementImpl
          * ksvg2/svg/SVGClipPathElementImpl.cpp:
          (SVGClipPathElementImpl::canvasResource): resolve style manually
          * ksvg2/svg/SVGFEColorMatrixElementImpl.cpp:
          (SVGFEColorMatrixElementImpl::filterEffect): spacing fix
          * kwq/KWQWMatrix.h:
          * kwq/KWQWMatrix.mm:
          (QWMatrix::operator* ): added
  
  Revision  Changes    Path
  1.400     +29 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.399
  retrieving revision 1.400
  diff -u -r1.399 -r1.400
  --- ChangeLog	26 Nov 2005 22:18:58 -0000	1.399
  +++ ChangeLog	26 Nov 2005 22:26:59 -0000	1.400
  @@ -1,5 +1,34 @@
   2005-11-26  Eric Seidel  <eseidel at apple.com>
   
  +        Reviewed by mjs.
  +
  +        No additional test cases needed, this fixes 5 existing tests.
  +
  +        This patch fixes feImage (to scale and flip).
  +        Also fixes feColorMatrix (previously inadvertently disabled)
  +        Fixes <svg> in <svg> (sub-elements establishing viewports)
  +        Fixes clip-rule, by fixing style resolution on <clipPath> children
  +
  +        * WebCore.xcodeproj/project.pbxproj: removed svgattr.[ch]
  +        * kcanvas/device/quartz/KCanvasFilterQuartz.mm:
  +        (KCanvasFEFloodQuartz::getCIFilter): respect subregion
  +        (KCanvasFEImageQuartz::getCIFilter): respect subregion, scale, flip
  +        * kcanvas/device/quartz/KCanvasResourcesQuartz.mm:
  +        (CGPathFromKCPathDataList): style/spacing update
  +        (KCanvasContainerQuartz::paint):  handle viewport, singular filters
  +        * khtml/rendering/render_object.cpp: 
  +        (RenderObject::absoluteTransform): use QMatrix operator *
  +        * ksvg2/scripts/make_names.pl: allow FEColorMatrixElementImpl
  +        * ksvg2/svg/SVGClipPathElementImpl.cpp:
  +        (SVGClipPathElementImpl::canvasResource): resolve style manually
  +        * ksvg2/svg/SVGFEColorMatrixElementImpl.cpp:
  +        (SVGFEColorMatrixElementImpl::filterEffect): spacing fix
  +        * kwq/KWQWMatrix.h:
  +        * kwq/KWQWMatrix.mm:
  +        (QWMatrix::operator* ): added
  +
  +2005-11-26  Eric Seidel  <eseidel at apple.com>
  +
           Reviewed by darin.
   
           Removed all usage of ref(), deref() from ksvg2
  
  
  
  1.46      +0 -6      WebCore/WebCore.xcodeproj/project.pbxproj
  
  Index: project.pbxproj
  ===================================================================
  RCS file: /cvs/root/WebCore/WebCore.xcodeproj/project.pbxproj,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- project.pbxproj	22 Nov 2005 02:22:05 -0000	1.45
  +++ project.pbxproj	26 Nov 2005 22:27:03 -0000	1.46
  @@ -1485,7 +1485,6 @@
   		A8C0FD76089701FA00BA5114 /* SVGSwitchElementImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = A8C0F8CD089701F400BA5114 /* SVGSwitchElementImpl.h */; };
   		A8C0FD77089701FA00BA5114 /* SVGSymbolElementImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8C0F8CE089701F400BA5114 /* SVGSymbolElementImpl.cpp */; };
   		A8C0FD78089701FA00BA5114 /* SVGSymbolElementImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = A8C0F8CF089701F400BA5114 /* SVGSymbolElementImpl.h */; };
  -		A8C0FD7A089701FA00BA5114 /* svgtags.h in Headers */ = {isa = PBXBuildFile; fileRef = A8C0F8D1089701F400BA5114 /* svgtags.h */; };
   		A8C0FD7C089701FA00BA5114 /* SVGTestsImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8C0F8D3089701F400BA5114 /* SVGTestsImpl.cpp */; };
   		A8C0FD7D089701FA00BA5114 /* SVGTestsImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = A8C0F8D4089701F400BA5114 /* SVGTestsImpl.h */; };
   		A8C0FD7E089701FA00BA5114 /* SVGTextContentElementImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8C0F8D5089701F400BA5114 /* SVGTextContentElementImpl.cpp */; };
  @@ -2425,8 +2424,6 @@
   		A8C0F8CD089701F400BA5114 /* SVGSwitchElementImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGSwitchElementImpl.h; sourceTree = "<group>"; };
   		A8C0F8CE089701F400BA5114 /* SVGSymbolElementImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGSymbolElementImpl.cpp; sourceTree = "<group>"; };
   		A8C0F8CF089701F400BA5114 /* SVGSymbolElementImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGSymbolElementImpl.h; sourceTree = "<group>"; };
  -		A8C0F8D0089701F400BA5114 /* svgtags.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svgtags.c; sourceTree = "<group>"; };
  -		A8C0F8D1089701F400BA5114 /* svgtags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = svgtags.h; sourceTree = "<group>"; };
   		A8C0F8D2089701F400BA5114 /* svgtags.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = svgtags.in; sourceTree = "<group>"; };
   		A8C0F8D3089701F400BA5114 /* SVGTestsImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTestsImpl.cpp; sourceTree = "<group>"; };
   		A8C0F8D4089701F400BA5114 /* SVGTestsImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTestsImpl.h; sourceTree = "<group>"; };
  @@ -3823,8 +3820,6 @@
   				A8C0F8CD089701F400BA5114 /* SVGSwitchElementImpl.h */,
   				A8C0F8CE089701F400BA5114 /* SVGSymbolElementImpl.cpp */,
   				A8C0F8CF089701F400BA5114 /* SVGSymbolElementImpl.h */,
  -				A8C0F8D0089701F400BA5114 /* svgtags.c */,
  -				A8C0F8D1089701F400BA5114 /* svgtags.h */,
   				A8C0F8D2089701F400BA5114 /* svgtags.in */,
   				A8C0F8D3089701F400BA5114 /* SVGTestsImpl.cpp */,
   				A8C0F8D4089701F400BA5114 /* SVGTestsImpl.h */,
  @@ -5494,7 +5489,6 @@
   				A8C0FD74089701FA00BA5114 /* SVGSVGElementImpl.h in Headers */,
   				A8C0FD76089701FA00BA5114 /* SVGSwitchElementImpl.h in Headers */,
   				A8C0FD78089701FA00BA5114 /* SVGSymbolElementImpl.h in Headers */,
  -				A8C0FD7A089701FA00BA5114 /* svgtags.h in Headers */,
   				A8C0FD7D089701FA00BA5114 /* SVGTestsImpl.h in Headers */,
   				A8C0FD7F089701FA00BA5114 /* SVGTextContentElementImpl.h in Headers */,
   				A8C0FD81089701FA00BA5114 /* SVGTextElementImpl.h in Headers */,
  
  
  
  1.15      +28 -9     SVGSupport/kcanvas/device/quartz/KCanvasFilterQuartz.mm
  
  Index: KCanvasFilterQuartz.mm
  ===================================================================
  RCS file: /cvs/root/SVGSupport/kcanvas/device/quartz/KCanvasFilterQuartz.mm,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- KCanvasFilterQuartz.mm	23 Nov 2005 15:14:07 -0000	1.14
  +++ KCanvasFilterQuartz.mm	26 Nov 2005 22:27:05 -0000	1.15
  @@ -465,23 +465,42 @@
   	CGColorRelease(withAlpha);
   	[filter setValue:inputColor forKey:@"inputColor"];
   	
  -	FE_QUARTZ_CROP_TO_RECT(CGRectMake(0,0,1000,1000)); // HACK
  +        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
   {
  -    // FIXME: This is just a hack for now, and only support pixmaps
  +    KWQ_BLOCK_EXCEPTIONS
  +    // FIXME: This is only partially implemented (only supports pixmaps)
       CIImage *ciImage = [CIImage imageWithCGImage:pixmap().imageRef()];
  -    quartzFilter->setOutputImage(this, ciImage);
       
  -    // FIXME: we really want a noop filter... or better design.
  -    CIFilter *crop = [CIFilter filterWithName:@"CIExposureAdjust"];
  -    [crop setDefaults];
  -    [crop setValue:ciImage forKey:@"inputImage"];
  -    [crop setValue:[NSNumber numberWithInt:0] forKey:@"inputEV"];
  -    return crop;
  +    // FIXME: There is probably a nicer way to perform both of these transforms.
  +    CIFilter *filter = [CIFilter filterWithName:@"CIAffineTransform"];
  +    [filter setDefaults];
  +    [filter setValue:ciImage forKey:@"inputImage"];
  +    
  +    CGAffineTransform cgTransform = CGAffineTransformMake(1,0,0,-1,0,pixmap().rect().bottom());
  +    NSAffineTransform *nsTransform = [NSAffineTransform transform];
  +    [nsTransform setTransformStruct:*((NSAffineTransformStruct *)&cgTransform)];
  +    [filter setValue:nsTransform forKey:@"inputTransform"];
  +    
  +    if (subRegion().isValid()) {
  +        CIFilter *scaleImage = [CIFilter filterWithName:@"CIAffineTransform"];
  +        [scaleImage setDefaults];
  +        [scaleImage setValue:[filter valueForKey:@"outputImage"] forKey:@"inputImage"];
  +        
  +        cgTransform = CGAffineTransformMakeMapBetweenRects(CGRect(pixmap().rect()), subRegion());
  +        [nsTransform setTransformStruct:*((NSAffineTransformStruct *)&cgTransform)];
  +        [scaleImage setValue:nsTransform forKey:@"inputTransform"];
  +        filter = scaleImage;
  +    }
  +    
  +    FE_QUARTZ_OUTPUT_RETURN;
   }
   
   CIFilter *KCanvasFEGaussianBlurQuartz::getCIFilter(KCanvasFilterQuartz *quartzFilter) const
  
  
  
  1.9       +39 -24    SVGSupport/kcanvas/device/quartz/KCanvasResourcesQuartz.mm
  
  Index: KCanvasResourcesQuartz.mm
  ===================================================================
  RCS file: /cvs/root/SVGSupport/kcanvas/device/quartz/KCanvasResourcesQuartz.mm,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- KCanvasResourcesQuartz.mm	23 Nov 2005 15:14:07 -0000	1.8
  +++ KCanvasResourcesQuartz.mm	26 Nov 2005 22:27:05 -0000	1.9
  @@ -39,25 +39,30 @@
   
   CGPathRef CGPathFromKCPathDataList(KCPathDataList pathData)
   {
  -	CGMutablePathRef path = CGPathCreateMutable();
  -	
  -	KCPathDataList::ConstIterator it = pathData.begin();
  -	KCPathDataList::ConstIterator end = pathData.end();
  -	for(; it != end; ++it)
  -	{
  -		KCPathData data = *it;
  -
  -		if(data.cmd == CMD_MOVE) {
  -			CGPathMoveToPoint(path, NULL, data.x3, data.y3);
  -		} else if(data.cmd == CMD_LINE) {
  -			CGPathAddLineToPoint(path, NULL, data.x3, data.y3);
  -		} else if(data.cmd == CMD_CLOSE_SUBPATH) {
  -			CGPathCloseSubpath(path);
  -		} else {
  -			CGPathAddCurveToPoint(path, NULL, data.x1, data.y1, data.x2, data.y2, data.x3, data.y3);
  -		}
  -	}
  -	return path;
  +    CGMutablePathRef path = CGPathCreateMutable();
  +
  +    KCPathDataList::ConstIterator it = pathData.begin();
  +    KCPathDataList::ConstIterator end = pathData.end();
  +    for(; it != end; ++it)
  +    {
  +        KCPathData data = *it;
  +        
  +        switch (data.cmd) {
  +        case CMD_MOVE: 
  +            CGPathMoveToPoint(path, NULL, data.x3, data.y3);
  +            break;
  +        case CMD_LINE:
  +            CGPathAddLineToPoint(path, NULL, data.x3, data.y3);
  +            break;
  +        case CMD_CURVE:
  +            CGPathAddCurveToPoint(path, NULL, data.x1, data.y1, data.x2, data.y2, data.x3, data.y3);
  +            break;
  +        case CMD_CLOSE_SUBPATH:
  +            CGPathCloseSubpath(path);
  +            break;
  +        }
  +    }
  +    return path;
   }
   
   void KCanvasContainerQuartz::calcMinMaxWidth()
  @@ -103,16 +108,23 @@
       if (paintInfo.phase == PaintActionOutline && style()->outlineWidth() && style()->visibility() == khtml::VISIBLE)
           paintOutline(paintInfo.p, absoluteX, absoluteY, width(), height(), style());
       
  -    if (paintInfo.phase != PaintActionForeground || !firstChild() || !drawsContents())
  +    if (paintInfo.phase != PaintActionForeground || !drawsContents())
           return;
       
  +    KCanvasFilter *filter = getFilterById(document(), style()->svgStyle()->filter().mid(1));
  +    if (!firstChild() && !filter)
  +        return; // Spec: groups w/o children still may render filter content.
  +    
       KRenderingDeviceQuartz *quartzDevice = static_cast<KRenderingDeviceQuartz *>(canvas()->renderingDevice());
       quartzDevice->pushContext(paintInfo.p->createRenderingDeviceContext());
       paintInfo.p->save();
       
       CGContextRef context = paintInfo.p->currentContext();
       
  -    if(!localTransform().isIdentity())
  +    if (viewport().isValid())
  +        CGContextConcatCTM(context, CGAffineTransformMakeTranslation(viewport().x(), viewport().y()));
  +    
  +    if (!localTransform().isIdentity())
           CGContextConcatCTM(context, CGAffineTransform(localTransform()));
       
       QRect dirtyRect = paintInfo.r;
  @@ -126,12 +138,15 @@
       if (opacity < 1.0f)
           paintInfo.p->beginTransparencyLayer(opacity);
   
  -    KCanvasFilter *filter = getFilterById(document(), style()->svgStyle()->filter().mid(1));
       if (filter)
           filter->prepareFilter(quartzDevice, relativeBBox(true));
       
  -    if (!viewBox().isNull())
  -        CGContextConcatCTM(paintInfo.p->currentContext(), CGAffineTransform(getAspectRatio(viewBox(), QRect(viewport().x(), viewport().y(), width(), height())).qmatrix()));
  +    if (!viewBox().isNull()) {
  +        QRect viewportRect = viewport();
  +        if (!parent()->isKCanvasContainer())
  +            viewportRect = QRect(viewport().x(), viewport().y(), width(), height());
  +        CGContextConcatCTM(paintInfo.p->currentContext(), CGAffineTransform(getAspectRatio(viewBox(), viewportRect).qmatrix()));
  +    }
       
       RenderContainer::paint(paintInfo, absoluteX, absoluteY);
       
  
  
  
  1.228     +3 -5      WebCore/khtml/rendering/render_object.cpp
  
  Index: render_object.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_object.cpp,v
  retrieving revision 1.227
  retrieving revision 1.228
  diff -u -r1.227 -r1.228
  --- render_object.cpp	23 Nov 2005 15:14:08 -0000	1.227
  +++ render_object.cpp	26 Nov 2005 22:27:05 -0000	1.228
  @@ -2568,11 +2568,9 @@
   #if SVG_SUPPORT
   QMatrix RenderObject::absoluteTransform() const
   {
  -    if (parent()) {
  -        QMatrix transform = parent()->absoluteTransform();
  -        transform *= localTransform();
  -        return transform;
  -    } else
  +    if (parent())
  +        return parent()->absoluteTransform() * localTransform();
  +    else
           return localTransform();
   }
   #endif
  
  
  
  1.2       +1 -1      SVGSupport/ksvg2/scripts/make_names.pl
  
  Index: make_names.pl
  ===================================================================
  RCS file: /cvs/root/SVGSupport/ksvg2/scripts/make_names.pl,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- make_names.pl	21 Nov 2005 08:29:32 -0000	1.1
  +++ make_names.pl	26 Nov 2005 22:27:06 -0000	1.2
  @@ -151,7 +151,7 @@
   		next if /tref/i;
   		next if /textpath/i;
   		next if /foreign/i;
  -		next if /matrix/i;
  +		next if /convolve/i;
   		next if /map/i;
   		next if /morph/i;
   		push(@filtered, $_);
  
  
  
  1.10      +6 -6      SVGSupport/ksvg2/svg/SVGClipPathElementImpl.cpp
  
  Index: SVGClipPathElementImpl.cpp
  ===================================================================
  RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGClipPathElementImpl.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- SVGClipPathElementImpl.cpp	26 Nov 2005 22:19:05 -0000	1.9
  +++ SVGClipPathElementImpl.cpp	26 Nov 2005 22:27:06 -0000	1.10
  @@ -78,22 +78,22 @@
   
   KCanvasClipper *SVGClipPathElementImpl::canvasResource()
   {
  -    if(!canvas())
  +    if (!canvas())
           return 0;
  -    if(!m_clipper)
  +    if (!m_clipper)
           m_clipper = static_cast<KCanvasClipper *>(canvas()->renderingDevice()->createResource(RS_CLIPPER));
       else
           m_clipper->resetClipData();
   
       bool bbox = clipPathUnits()->baseVal() == SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
   
  -    for(KDOM::NodeImpl *n = firstChild(); n != 0; n = n->nextSibling())
  +    khtml::RenderStyle *clipPathStyle = styleForRenderer(parent()->renderer());
  +    for (KDOM::NodeImpl *n = firstChild(); n != 0; n = n->nextSibling())
       {
           SVGElementImpl *e = svg_dynamic_cast(n);
  -        if(e && e->isStyled())
  -        {
  +        if (e && e->isStyled()) {
               SVGStyledElementImpl *styled = static_cast<SVGStyledElementImpl *>(e);
  -            SVGRenderStyle *style = styleForRenderer(parentNode()->renderer())->svgStyle();
  +            SVGRenderStyle *style = getDocument()->styleSelector()->styleForElement(styled, clipPathStyle)->svgStyle();
               m_clipper->addClipData(styled->toPathData(), (KCWindRule) style->clipRule(), bbox);
           }
       }
  
  
  
  1.12      +1 -1      SVGSupport/ksvg2/svg/SVGFEColorMatrixElementImpl.cpp
  
  Index: SVGFEColorMatrixElementImpl.cpp
  ===================================================================
  RCS file: /cvs/root/SVGSupport/ksvg2/svg/SVGFEColorMatrixElementImpl.cpp,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- SVGFEColorMatrixElementImpl.cpp	26 Nov 2005 22:19:08 -0000	1.11
  +++ SVGFEColorMatrixElementImpl.cpp	26 Nov 2005 22:27:06 -0000	1.12
  @@ -96,7 +96,7 @@
   KCanvasFEColorMatrix *SVGFEColorMatrixElementImpl::filterEffect() const
   {
       if (!m_filterEffect)
  -          m_filterEffect = static_cast<KCanvasFEColorMatrix *>(canvas()->renderingDevice()->createFilterEffect(FE_COLOR_MATRIX));
  +        m_filterEffect = static_cast<KCanvasFEColorMatrix *>(canvas()->renderingDevice()->createFilterEffect(FE_COLOR_MATRIX));
       if (!m_filterEffect)
           return 0;
           
  
  
  
  1.4       +1 -0      WebCore/kwq/KWQWMatrix.h
  
  Index: KWQWMatrix.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQWMatrix.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- KWQWMatrix.h	21 Nov 2005 04:02:02 -0000	1.3
  +++ KWQWMatrix.h	26 Nov 2005 22:27:07 -0000	1.4
  @@ -64,6 +64,7 @@
       
       bool operator== (const QWMatrix &) const;
       QWMatrix &operator*= (const QWMatrix &);
  +    QWMatrix operator* (const QWMatrix &m2);
       
   private:
       CGAffineTransform m_transform;
  
  
  
  1.11      +5 -0      WebCore/kwq/KWQWMatrix.mm
  
  Index: KWQWMatrix.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQWMatrix.mm,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- KWQWMatrix.mm	23 Nov 2005 15:14:11 -0000	1.10
  +++ KWQWMatrix.mm	26 Nov 2005 22:27:07 -0000	1.11
  @@ -127,3 +127,8 @@
       m_transform = CGAffineTransformConcat(m_transform, CGAffineTransform(m2));
       return *this;
   }
  +
  +QWMatrix QWMatrix::operator* (const QWMatrix &m2)
  +{
  +    return CGAffineTransformConcat(m_transform, CGAffineTransform(m2));
  +}
  
  
  



More information about the webkit-changes mailing list