Changeset 48896 in webkit
- Timestamp:
- Sep 29, 2009 1:29:30 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r48891 r48896 1 2009-09-29 Dirk Schulze <krit@webkit.org> 2 3 Reviewed by Nikolas Zimmermann. 4 5 Tests the feComposite implementation for SVG. 6 7 * platform/mac/svg/filters/feComposite-expected.checksum: Added. 8 * platform/mac/svg/filters/feComposite-expected.png: Added. 9 * platform/mac/svg/filters/feComposite-expected.txt: Added. 10 * svg/filters/feComposite.svg: Added. 11 1 12 2009-09-29 Shinichiro Hamaji <hamaji@chromium.org> 2 13 -
trunk/WebCore/ChangeLog
r48894 r48896 1 2009-09-29 Dirk Schulze <krit@webkit.org> 2 3 Reviewed by Nikolas Zimmermann. 4 5 SVG Filter feComposite implementation is missing 6 [https://bugs.webkit.org/show_bug.cgi?id=28362] 7 8 feComposite implementation for SVG. 9 10 Test: svg/filters/feComposite.svg 11 12 * platform/graphics/filters/FEComposite.cpp: 13 (WebCore::arithmetic): 14 (WebCore::FEComposite::apply): 15 1 16 2009-09-29 Dumitru Daniliuc <dumi@chromium.org> 2 17 -
trunk/WebCore/platform/graphics/filters/FEComposite.cpp
r44296 r48896 3 3 2004, 2005 Rob Buis <buis@kde.org> 4 4 2005 Eric Seidel <eric@webkit.org> 5 2009 Dirk Schulze <krit@webkit.org> 5 6 6 7 This library is free software; you can redistribute it and/or … … 25 26 #include "FEComposite.h" 26 27 28 #include "CanvasPixelArray.h" 27 29 #include "Filter.h" 30 #include "GraphicsContext.h" 31 #include "ImageData.h" 28 32 29 33 namespace WebCore { … … 98 102 } 99 103 100 void FEComposite::apply(Filter*) 104 inline void arithmetic(const RefPtr<CanvasPixelArray>& srcPixelArrayA, CanvasPixelArray*& srcPixelArrayB, 105 float k1, float k2, float k3, float k4) 101 106 { 107 float scaledK1 = k1 / 255.f; 108 float scaledK4 = k4 * 255.f; 109 for (unsigned pixelOffset = 0; pixelOffset < srcPixelArrayA->length(); pixelOffset += 4) { 110 for (unsigned channel = 0; channel < 4; ++channel) { 111 unsigned char i1 = srcPixelArrayA->get(pixelOffset + channel); 112 unsigned char i2 = srcPixelArrayB->get(pixelOffset + channel); 113 114 unsigned char result = scaledK1 * i1 * i2 + k2 * i1 + k3 * i2 + scaledK4; 115 if (channel == 3 && i1 == 0 && i2 == 0) 116 result = 0; 117 srcPixelArrayB->set(pixelOffset + channel, result); 118 } 119 } 120 } 121 122 void FEComposite::apply(Filter* filter) 123 { 124 m_in->apply(filter); 125 m_in2->apply(filter); 126 if (!m_in->resultImage() || !m_in2->resultImage()) 127 return; 128 129 GraphicsContext* filterContext = getEffectContext(); 130 if (!filterContext) 131 return; 132 133 FloatRect srcRect = FloatRect(0.f, 0.f, -1.f, -1.f); 134 switch (m_type) { 135 case FECOMPOSITE_OPERATOR_OVER: 136 filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion())); 137 filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion())); 138 break; 139 case FECOMPOSITE_OPERATOR_IN: 140 filterContext->save(); 141 filterContext->clipToImageBuffer(calculateDrawingRect(m_in2->subRegion()), m_in2->resultImage()); 142 filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion())); 143 filterContext->restore(); 144 break; 145 case FECOMPOSITE_OPERATOR_OUT: 146 filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion())); 147 filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion()), srcRect, CompositeDestinationOut); 148 break; 149 case FECOMPOSITE_OPERATOR_ATOP: 150 filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion())); 151 filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()), srcRect, CompositeSourceAtop); 152 break; 153 case FECOMPOSITE_OPERATOR_XOR: 154 filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion())); 155 filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()), srcRect, CompositeXOR); 156 break; 157 case FECOMPOSITE_OPERATOR_ARITHMETIC: { 158 IntRect effectADrawingRect = calculateDrawingIntRect(m_in->subRegion()); 159 RefPtr<CanvasPixelArray> srcPixelArrayA(m_in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data()); 160 161 IntRect effectBDrawingRect = calculateDrawingIntRect(m_in2->subRegion()); 162 RefPtr<ImageData> imageData(m_in2->resultImage()->getPremultipliedImageData(effectBDrawingRect)); 163 CanvasPixelArray* srcPixelArrayB(imageData->data()); 164 165 arithmetic(srcPixelArrayA, srcPixelArrayB, m_k1, m_k2, m_k3, m_k4); 166 resultImage()->putPremultipliedImageData(imageData.get(), IntRect(IntPoint(), resultImage()->size()), IntPoint()); 167 } 168 break; 169 default: 170 break; 171 } 102 172 } 103 173
Note: See TracChangeset
for help on using the changeset viewer.