Changeset 47099 in webkit
- Timestamp:
- Aug 12, 2009 3:11:03 AM (15 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r47095 r47099 1 2009-08-12 Dirk Schulze <krit@webkit.org> 2 3 Reviewed by Oliver Hunt. 4 5 SVG Filter premultiplied color support for getImageDate/putImageData 6 [https://bugs.webkit.org/show_bug.cgi?id=27933] 7 8 Some SVG Filters need premultiplied ImageData for the calculation. Therefore getImageData 9 and putImageData of ImageBuffer need support for premultiplied colors. 10 11 * html/CanvasRenderingContext2D.cpp: 12 (WebCore::CanvasRenderingContext2D::getImageData): 13 (WebCore::CanvasRenderingContext2D::putImageData): 14 * platform/graphics/ImageBuffer.h: 15 (WebCore::): 16 * platform/graphics/cairo/ImageBufferCairo.cpp: 17 (WebCore::getImageData): 18 (WebCore::ImageBuffer::getUnmultipliedImageData): 19 (WebCore::ImageBuffer::getPremultipliedImageData): 20 (WebCore::putImageData): 21 (WebCore::ImageBuffer::putUnmultipliedImageData): 22 (WebCore::ImageBuffer::putPremultipliedImageData): 23 * platform/graphics/cg/ImageBufferCG.cpp: 24 (WebCore::getImageData): 25 (WebCore::ImageBuffer::getUnmultipliedImageData): 26 (WebCore::ImageBuffer::getPremultipliedImageData): 27 (WebCore::putImageData): 28 (WebCore::ImageBuffer::putUnmultipliedImageData): 29 (WebCore::ImageBuffer::putPremultipliedImageData): 30 * platform/graphics/qt/ImageBufferQt.cpp: 31 (WebCore::getImageData): 32 (WebCore::ImageBuffer::getUnmultipliedImageData): 33 (WebCore::ImageBuffer::getPremultipliedImageData): 34 (WebCore::putImageData): 35 (WebCore::ImageBuffer::putUnmultipliedImageData): 36 (WebCore::ImageBuffer::putPremultipliedImageData): 37 * platform/graphics/skia/ImageBufferSkia.cpp: 38 (WebCore::getImageData): 39 (WebCore::ImageBuffer::getUnmultipliedImageData): 40 (WebCore::ImageBuffer::getPremultipliedImageData): 41 (WebCore::putImageData): 42 (WebCore::ImageBuffer::putUnmultipliedImageData): 43 (WebCore::ImageBuffer::putPremultipliedImageData): 44 * platform/graphics/wx/ImageBufferWx.cpp: 45 (WebCore::ImageBuffer::getUnmultipliedImageData): 46 (WebCore::ImageBuffer::getPremultipliedImageData): 47 (WebCore::ImageBuffer::putUnmultipliedImageData): 48 (WebCore::ImageBuffer::putPremultipliedImageData): 49 * svg/graphics/SVGResourceMasker.cpp: 50 (WebCore::SVGResourceMasker::applyMask): 51 1 52 2009-08-12 Mikhail Naganov <mnaganov@chromium.org> 2 53 -
trunk/WebCore/html/canvas/CanvasRenderingContext2D.cpp
r46956 r47099 1307 1307 if (!buffer) 1308 1308 return createEmptyImageData(scaledRect.size()); 1309 return buffer->get ImageData(scaledRect);1309 return buffer->getUnmultipliedImageData(scaledRect); 1310 1310 } 1311 1311 … … 1358 1358 IntPoint destPoint(destOffset.width(), destOffset.height()); 1359 1359 1360 buffer->put ImageData(data, sourceRect, destPoint);1360 buffer->putUnmultipliedImageData(data, sourceRect, destPoint); 1361 1361 } 1362 1362 -
trunk/WebCore/platform/graphics/ImageBuffer.h
r46956 r47099 51 51 }; 52 52 53 enum Multiply { 54 Premultiplied, 55 Unmultiplied 56 }; 57 53 58 class ImageBuffer : public Noncopyable { 54 59 public: … … 72 77 void clearImage() { m_image.clear(); } 73 78 74 PassRefPtr<ImageData> getImageData(const IntRect& rect) const; 75 void putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint); 79 PassRefPtr<ImageData> getUnmultipliedImageData(const IntRect&) const; 80 PassRefPtr<ImageData> getPremultipliedImageData(const IntRect&) const; 81 82 void putUnmultipliedImageData(ImageData*, const IntRect& sourceRect, const IntPoint& destPoint); 83 void putPremultipliedImageData(ImageData*, const IntRect& sourceRect, const IntPoint& destPoint); 76 84 77 85 String toDataURL(const String& mimeType) const; -
trunk/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp
r46956 r47099 139 139 } 140 140 141 PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const 142 { 143 ASSERT(cairo_surface_get_type(m_data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); 141 template <Multiply multiplied> 142 PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& data, const IntSize& size) 143 { 144 ASSERT(cairo_surface_get_type(data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); 144 145 145 146 PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height()); 146 unsigned char* dataSrc = cairo_image_surface_get_data( m_data.m_surface);147 unsigned char* dataSrc = cairo_image_surface_get_data(data.m_surface); 147 148 unsigned char* dataDst = result->data()->data()->data(); 148 149 149 if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > m_size.width() || (rect.y() + rect.height()) > m_size.height())150 if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > size.width() || (rect.y() + rect.height()) > size.height()) 150 151 memset(dataSrc, 0, result->data()->length()); 151 152 … … 157 158 } 158 159 int endx = rect.x() + rect.width(); 159 if (endx > m_size.width())160 endx = m_size.width();160 if (endx > size.width()) 161 endx = size.width(); 161 162 int numColumns = endx - originx; 162 163 … … 168 169 } 169 170 int endy = rect.y() + rect.height(); 170 if (endy > m_size.height())171 endy = m_size.height();171 if (endy > size.height()) 172 endy = size.height(); 172 173 int numRows = endy - originy; 173 174 174 int stride = cairo_image_surface_get_stride( m_data.m_surface);175 int stride = cairo_image_surface_get_stride(data.m_surface); 175 176 unsigned destBytesPerRow = 4 * rect.width(); 176 177 … … 181 182 int basex = x * 4; 182 183 unsigned* pixel = row + x + originx; 183 Color pixelColor = colorFromPremultipliedARGB(*pixel); 184 Color pixelColor; 185 if (multiplied == Unmultiplied) 186 pixelColor = colorFromPremultipliedARGB(*pixel); 187 else 188 pixelColor = Color(*pixel); 184 189 destRows[basex] = pixelColor.red(); 185 190 destRows[basex + 1] = pixelColor.green(); … … 193 198 } 194 199 195 void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 196 { 197 ASSERT(cairo_surface_get_type(m_data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); 198 199 unsigned char* dataDst = cairo_image_surface_get_data(m_data.m_surface); 200 PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const 201 { 202 return getImageData<Unmultiplied>(rect, m_data, m_size); 203 } 204 205 PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const 206 { 207 return getImageData<Premultiplied>(rect, m_data, m_size); 208 } 209 210 template <Multiply multiplied> 211 void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, ImageBufferData& data, const IntSize& size) 212 { 213 ASSERT(cairo_surface_get_type(data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); 214 215 unsigned char* dataDst = cairo_image_surface_get_data(data.m_surface); 200 216 201 217 ASSERT(sourceRect.width() > 0); … … 205 221 int destx = destPoint.x() + sourceRect.x(); 206 222 ASSERT(destx >= 0); 207 ASSERT(destx < m_size.width());223 ASSERT(destx < size.width()); 208 224 ASSERT(originx >= 0); 209 225 ASSERT(originx <= sourceRect.right()); 210 226 211 227 int endx = destPoint.x() + sourceRect.right(); 212 ASSERT(endx <= m_size.width());228 ASSERT(endx <= size.width()); 213 229 214 230 int numColumns = endx - destx; … … 217 233 int desty = destPoint.y() + sourceRect.y(); 218 234 ASSERT(desty >= 0); 219 ASSERT(desty < m_size.height());235 ASSERT(desty < size.height()); 220 236 ASSERT(originy >= 0); 221 237 ASSERT(originy <= sourceRect.bottom()); 222 238 223 239 int endy = destPoint.y() + sourceRect.bottom(); 224 ASSERT(endy <= m_size.height());240 ASSERT(endy <= size.height()); 225 241 int numRows = endy - desty; 226 242 227 243 unsigned srcBytesPerRow = 4 * source->width(); 228 int stride = cairo_image_surface_get_stride( m_data.m_surface);244 int stride = cairo_image_surface_get_stride(data.m_surface); 229 245 230 246 unsigned char* srcRows = source->data()->data()->data() + originy * srcBytesPerRow + originx * 4; … … 238 254 srcRows[basex + 2], 239 255 srcRows[basex + 3]); 240 *pixel = premultipliedARGBFromColor(pixelColor); 256 if (multiplied == Unmultiplied) 257 *pixel = premultipliedARGBFromColor(pixelColor); 258 else 259 *pixel = pixelColor.rgb(); 241 260 } 242 261 srcRows += srcBytesPerRow; 243 262 } 263 } 264 265 void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 266 { 267 putImageData<Unmultiplied>(source, sourceRect, destPoint, m_data, m_size); 268 } 269 270 void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 271 { 272 putImageData<Premultiplied>(source, sourceRect, destPoint, m_data, m_size); 244 273 } 245 274 -
trunk/WebCore/platform/graphics/cg/ImageBufferCG.cpp
r47092 r47099 125 125 } 126 126 127 PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const 127 template <Multiply multiplied> 128 PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& imageData, const IntSize& size) 128 129 { 129 130 PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height()); 130 131 unsigned char* data = result->data()->data()->data(); 131 132 132 if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > m_size.width() || (rect.y() + rect.height()) > m_size.height())133 if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > size.width() || (rect.y() + rect.height()) > size.height()) 133 134 memset(data, 0, result->data()->length()); 134 135 … … 140 141 } 141 142 int endx = rect.x() + rect.width(); 142 if (endx > m_size.width())143 endx = m_size.width();143 if (endx > size.width()) 144 endx = size.width(); 144 145 int numColumns = endx - originx; 145 146 … … 151 152 } 152 153 int endy = rect.y() + rect.height(); 153 if (endy > m_size.height())154 endy = m_size.height();154 if (endy > size.height()) 155 endy = size.height(); 155 156 int numRows = endy - originy; 156 157 157 unsigned srcBytesPerRow = 4 * m_size.width();158 unsigned srcBytesPerRow = 4 * size.width(); 158 159 unsigned destBytesPerRow = 4 * rect.width(); 159 160 160 161 // ::create ensures that all ImageBuffers have valid data, so we don't need to check it here. 161 unsigned char* srcRows = reinterpret_cast<unsigned char*>( m_data.m_data) + originy * srcBytesPerRow + originx * 4;162 unsigned char* srcRows = reinterpret_cast<unsigned char*>(imageData.m_data) + originy * srcBytesPerRow + originx * 4; 162 163 unsigned char* destRows = data + desty * destBytesPerRow + destx * 4; 163 164 for (int y = 0; y < numRows; ++y) { 164 165 for (int x = 0; x < numColumns; x++) { 165 166 int basex = x * 4; 166 if (unsigned char alpha = srcRows[basex + 3]) { 167 unsigned char alpha = srcRows[basex + 3]; 168 if (multiplied == Unmultiplied && alpha) { 167 169 destRows[basex] = (srcRows[basex] * 255) / alpha; 168 170 destRows[basex + 1] = (srcRows[basex + 1] * 255) / alpha; … … 178 180 } 179 181 180 void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 182 PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const 183 { 184 return getImageData<Unmultiplied>(rect, m_data, m_size); 185 } 186 187 PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const 188 { 189 return getImageData<Premultiplied>(rect, m_data, m_size); 190 } 191 192 template <Multiply multiplied> 193 void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, ImageBufferData& imageData, const IntSize& size) 181 194 { 182 195 ASSERT(sourceRect.width() > 0); … … 186 199 int destx = destPoint.x() + sourceRect.x(); 187 200 ASSERT(destx >= 0); 188 ASSERT(destx < m_size.width());201 ASSERT(destx < size.width()); 189 202 ASSERT(originx >= 0); 190 203 ASSERT(originx <= sourceRect.right()); 191 204 192 205 int endx = destPoint.x() + sourceRect.right(); 193 ASSERT(endx <= m_size.width());206 ASSERT(endx <= size.width()); 194 207 195 208 int numColumns = endx - destx; … … 198 211 int desty = destPoint.y() + sourceRect.y(); 199 212 ASSERT(desty >= 0); 200 ASSERT(desty < m_size.height());213 ASSERT(desty < size.height()); 201 214 ASSERT(originy >= 0); 202 215 ASSERT(originy <= sourceRect.bottom()); 203 216 204 217 int endy = destPoint.y() + sourceRect.bottom(); 205 ASSERT(endy <= m_size.height());218 ASSERT(endy <= size.height()); 206 219 int numRows = endy - desty; 207 220 208 221 unsigned srcBytesPerRow = 4 * source->width(); 209 unsigned destBytesPerRow = 4 * m_size.width();222 unsigned destBytesPerRow = 4 * size.width(); 210 223 211 224 unsigned char* srcRows = source->data()->data()->data() + originy * srcBytesPerRow + originx * 4; 212 unsigned char* destRows = reinterpret_cast<unsigned char*>( m_data.m_data) + desty * destBytesPerRow + destx * 4;225 unsigned char* destRows = reinterpret_cast<unsigned char*>(imageData.m_data) + desty * destBytesPerRow + destx * 4; 213 226 for (int y = 0; y < numRows; ++y) { 214 227 for (int x = 0; x < numColumns; x++) { 215 228 int basex = x * 4; 216 229 unsigned char alpha = srcRows[basex + 3]; 217 if ( alpha != 255) {230 if (multiplied == Unmultiplied && alpha != 255) { 218 231 destRows[basex] = (srcRows[basex] * alpha + 254) / 255; 219 232 destRows[basex + 1] = (srcRows[basex + 1] * alpha + 254) / 255; … … 228 241 } 229 242 243 void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 244 { 245 putImageData<Unmultiplied>(source, sourceRect, destPoint, m_data, m_size); 246 } 247 248 void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 249 { 250 putImageData<Premultiplied>(source, sourceRect, destPoint, m_data, m_size); 251 } 252 230 253 static RetainPtr<CFStringRef> utiFromMIMEType(const String& mimeType) 231 254 { -
trunk/WebCore/platform/graphics/qt/ImageBufferQt.cpp
r46956 r47099 126 126 } 127 127 128 PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const 128 template <Multiply multiplied> 129 PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& imageData, const IntSize& size) 129 130 { 130 131 PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height()); 131 132 unsigned char* data = result->data()->data()->data(); 132 133 133 if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > m_size.width() || (rect.y() + rect.height()) > m_size.height())134 if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > size.width() || (rect.y() + rect.height()) > size.height()) 134 135 memset(data, 0, result->data()->length()); 135 136 … … 141 142 } 142 143 int endx = rect.x() + rect.width(); 143 if (endx > m_size.width())144 endx = m_size.width();144 if (endx > size.width()) 145 endx = size.width(); 145 146 int numColumns = endx - originx; 146 147 … … 152 153 } 153 154 int endy = rect.y() + rect.height(); 154 if (endy > m_size.height())155 endy = m_size.height();155 if (endy > size.height()) 156 endy = size.height(); 156 157 int numRows = endy - originy; 157 158 158 QImage image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32); 159 QImage image = imageData.m_pixmap.toImage(); 160 if (multiplied == Unmultiplied) 161 image = image.convertToFormat(QImage::Format_ARGB32); 162 else 163 image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); 164 159 165 ASSERT(!image.isNull()); 160 166 … … 177 183 } 178 184 179 void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 185 PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const 186 { 187 return getImageData<Unmultiplied>(rect, m_data, m_size); 188 } 189 190 PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const 191 { 192 return getImageData<Premultiplied>(rect, m_data, m_size); 193 } 194 195 template <Multiply multiplied> 196 void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, ImageBufferData& data, const IntSize& size) 180 197 { 181 198 ASSERT(sourceRect.width() > 0); … … 185 202 int destx = destPoint.x() + sourceRect.x(); 186 203 ASSERT(destx >= 0); 187 ASSERT(destx < m_size.width());204 ASSERT(destx < size.width()); 188 205 ASSERT(originx >= 0); 189 206 ASSERT(originx <= sourceRect.right()); 190 207 191 208 int endx = destPoint.x() + sourceRect.right(); 192 ASSERT(endx <= m_size.width());209 ASSERT(endx <= size.width()); 193 210 194 211 int numColumns = endx - destx; … … 197 214 int desty = destPoint.y() + sourceRect.y(); 198 215 ASSERT(desty >= 0); 199 ASSERT(desty < m_size.height());216 ASSERT(desty < size.height()); 200 217 ASSERT(originy >= 0); 201 218 ASSERT(originy <= sourceRect.bottom()); 202 219 203 220 int endy = destPoint.y() + sourceRect.bottom(); 204 ASSERT(endy <= m_size.height());221 ASSERT(endy <= size.height()); 205 222 int numRows = endy - desty; 206 223 207 224 unsigned srcBytesPerRow = 4 * source->width(); 208 225 209 bool isPainting = m_data.m_painter->isActive(); 210 if (isPainting) 211 m_data.m_painter->end(); 212 213 QImage image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32); 226 bool isPainting = data.m_painter->isActive(); 227 if (isPainting) 228 data.m_painter->end(); 229 230 QImage image = data.m_pixmap.toImage(); 231 if (multiplied == Unmultiplied) 232 image = image.convertToFormat(QImage::Format_ARGB32); 233 else 234 image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); 214 235 215 236 unsigned char* srcRows = source->data()->data()->data() + originy * srcBytesPerRow + originx * 4; … … 224 245 } 225 246 226 m_data.m_pixmap = QPixmap::fromImage(image); 227 228 if (isPainting) 229 m_data.m_painter->begin(&m_data.m_pixmap); 247 data.m_pixmap = QPixmap::fromImage(image); 248 249 if (isPainting) 250 data.m_painter->begin(&data.m_pixmap); 251 } 252 253 void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 254 { 255 putImageData<Unmultiplied>(source, sourceRect, destPoint, m_data, m_size); 256 } 257 258 void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 259 { 260 putImageData<Premultiplied>(source, sourceRect, destPoint, m_data, m_size); 230 261 } 231 262 -
trunk/WebCore/platform/graphics/skia/ImageBufferSkia.cpp
r46956 r47099 119 119 } 120 120 121 PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const 121 template <Multiply multiplied> 122 PassRefPtr<ImageData> getImageData(const IntRect& rect, const SkBitmap& bitmap, 123 const IntSize& size) 122 124 { 123 125 ASSERT(context()); … … 153 155 int numRows = endY - originY; 154 156 155 const SkBitmap& bitmap = *context()->platformContext()->bitmap();156 157 ASSERT(bitmap.config() == SkBitmap::kARGB_8888_Config); 157 158 SkAutoLockPixels bitmapLock(bitmap); … … 163 164 uint32_t* srcRow = bitmap.getAddr32(originX, originY + y); 164 165 for (int x = 0; x < numColumns; ++x) { 166 // TODO: Support for premultiplied colors 165 167 SkColor color = SkPMColorToColor(srcRow[x]); 166 168 unsigned char* destPixel = &destRow[x * 4]; … … 176 178 } 177 179 178 void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, 179 const IntPoint& destPoint) 180 PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const 181 { 182 return getImageData<Unmultiplied>(rect, *context()->platformContext()->bitmap(), m_size); 183 } 184 185 PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const 186 { 187 return getImageData<Premultiplied>(rect, *context()->platformContext()->bitmap(), m_size); 188 } 189 190 template <Multiply multiplied> 191 void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, 192 const SkBitmap& bitmap, const IntSize& size) 180 193 { 181 194 ASSERT(sourceRect.width() > 0); … … 205 218 int numRows = endY - destY; 206 219 207 const SkBitmap& bitmap = *context()->platformContext()->bitmap();208 220 ASSERT(bitmap.config() == SkBitmap::kARGB_8888_Config); 209 221 SkAutoLockPixels bitmapLock(bitmap); … … 216 228 uint32_t* destRow = bitmap.getAddr32(destX, destY + y); 217 229 for (int x = 0; x < numColumns; ++x) { 230 // TODO: Support for premultiplied colors 218 231 const unsigned char* srcPixel = &srcRow[x * 4]; 219 232 destRow[x] = SkPreMultiplyARGB(srcPixel[3], srcPixel[0], … … 224 237 } 225 238 239 void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 240 { 241 putImageData<Unmultiplied>(source, sourceRect, destPoint, *context()->platformContext()->bitmap(), m_size); 242 } 243 244 void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 245 { 246 putImageData<Premultiplied>(source, sourceRect, destPoint, *context()->platformContext()->bitmap(), m_size); 247 } 248 226 249 String ImageBuffer::toDataURL(const String&) const 227 250 { -
trunk/WebCore/platform/graphics/wx/ImageBufferWx.cpp
r46956 r47099 54 54 } 55 55 56 PassRefPtr<ImageData> ImageBuffer::get ImageData(const IntRect&) const56 PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const 57 57 { 58 58 notImplemented(); … … 60 60 } 61 61 62 void ImageBuffer::putImageData(ImageData*, const IntRect&, const IntPoint&) 62 PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const 63 { 64 notImplemented(); 65 return 0; 66 } 67 68 void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 69 { 70 notImplemented(); 71 } 72 73 void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) 63 74 { 64 75 notImplemented(); -
trunk/WebCore/svg/graphics/SVGResourceMasker.cpp
r46956 r47099 77 77 return; 78 78 79 PassRefPtr<CanvasPixelArray> srcPixelArray(m_mask->get ImageData(intImageRect)->data());80 PassRefPtr<ImageData> destImageData(luminancedImage->get ImageData(intImageRect));79 PassRefPtr<CanvasPixelArray> srcPixelArray(m_mask->getUnmultipliedImageData(intImageRect)->data()); 80 PassRefPtr<ImageData> destImageData(luminancedImage->getUnmultipliedImageData(intImageRect)); 81 81 82 82 for (unsigned pixelOffset = 0; pixelOffset < srcPixelArray->length(); pixelOffset++) { … … 94 94 } 95 95 96 luminancedImage->put ImageData(destImageData.get(), intImageRect, IntPoint(0, 0));96 luminancedImage->putUnmultipliedImageData(destImageData.get(), intImageRect, IntPoint(0, 0)); 97 97 98 98 context->clipToImageBuffer(m_maskRect, luminancedImage.get());
Note: See TracChangeset
for help on using the changeset viewer.