diff options
Diffstat (limited to 'WebCore/platform/graphics/cairo/ImageBufferCairo.cpp')
-rw-r--r-- | WebCore/platform/graphics/cairo/ImageBufferCairo.cpp | 69 |
1 files changed, 20 insertions, 49 deletions
diff --git a/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp b/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp index 0213944..c905ee8 100644 --- a/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp +++ b/WebCore/platform/graphics/cairo/ImageBufferCairo.cpp @@ -138,17 +138,16 @@ void ImageBuffer::platformTransformColorSpace(const Vector<int>& lookUpTable) } } -template <Multiply multiplied> -PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& data, const IntSize& size) +PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const { - ASSERT(cairo_surface_get_type(data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); + ASSERT(cairo_surface_get_type(m_data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height()); - unsigned char* dataSrc = cairo_image_surface_get_data(data.m_surface); + unsigned char* dataSrc = cairo_image_surface_get_data(m_data.m_surface); unsigned char* dataDst = result->data()->data()->data(); - if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > size.width() || (rect.y() + rect.height()) > size.height()) - memset(dataDst, 0, result->data()->length()); + if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > m_size.width() || (rect.y() + rect.height()) > m_size.height()) + memset(dataSrc, 0, result->data()->length()); int originx = rect.x(); int destx = 0; @@ -157,8 +156,8 @@ PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& d originx = 0; } int endx = rect.x() + rect.width(); - if (endx > size.width()) - endx = size.width(); + if (endx > m_size.width()) + endx = m_size.width(); int numColumns = endx - originx; int originy = rect.y(); @@ -168,11 +167,11 @@ PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& d originy = 0; } int endy = rect.y() + rect.height(); - if (endy > size.height()) - endy = size.height(); + if (endy > m_size.height()) + endy = m_size.height(); int numRows = endy - originy; - int stride = cairo_image_surface_get_stride(data.m_surface); + int stride = cairo_image_surface_get_stride(m_data.m_surface); unsigned destBytesPerRow = 4 * rect.width(); unsigned char* destRows = dataDst + desty * destBytesPerRow + destx * 4; @@ -181,11 +180,7 @@ PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& d for (int x = 0; x < numColumns; x++) { int basex = x * 4; unsigned* pixel = row + x + originx; - Color pixelColor; - if (multiplied == Unmultiplied) - pixelColor = colorFromPremultipliedARGB(*pixel); - else - pixelColor = Color(*pixel); + Color pixelColor = colorFromPremultipliedARGB(*pixel); destRows[basex] = pixelColor.red(); destRows[basex + 1] = pixelColor.green(); destRows[basex + 2] = pixelColor.blue(); @@ -197,22 +192,11 @@ PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& d return result; } -PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const -{ - return getImageData<Unmultiplied>(rect, m_data, m_size); -} - -PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const -{ - return getImageData<Premultiplied>(rect, m_data, m_size); -} - -template <Multiply multiplied> -void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, ImageBufferData& data, const IntSize& size) +void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) { - ASSERT(cairo_surface_get_type(data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); + ASSERT(cairo_surface_get_type(m_data.m_surface) == CAIRO_SURFACE_TYPE_IMAGE); - unsigned char* dataDst = cairo_image_surface_get_data(data.m_surface); + unsigned char* dataDst = cairo_image_surface_get_data(m_data.m_surface); ASSERT(sourceRect.width() > 0); ASSERT(sourceRect.height() > 0); @@ -220,28 +204,28 @@ void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& int originx = sourceRect.x(); int destx = destPoint.x() + sourceRect.x(); ASSERT(destx >= 0); - ASSERT(destx < size.width()); + ASSERT(destx < m_size.width()); ASSERT(originx >= 0); ASSERT(originx <= sourceRect.right()); int endx = destPoint.x() + sourceRect.right(); - ASSERT(endx <= size.width()); + ASSERT(endx <= m_size.width()); int numColumns = endx - destx; int originy = sourceRect.y(); int desty = destPoint.y() + sourceRect.y(); ASSERT(desty >= 0); - ASSERT(desty < size.height()); + ASSERT(desty < m_size.height()); ASSERT(originy >= 0); ASSERT(originy <= sourceRect.bottom()); int endy = destPoint.y() + sourceRect.bottom(); - ASSERT(endy <= size.height()); + ASSERT(endy <= m_size.height()); int numRows = endy - desty; unsigned srcBytesPerRow = 4 * source->width(); - int stride = cairo_image_surface_get_stride(data.m_surface); + int stride = cairo_image_surface_get_stride(m_data.m_surface); unsigned char* srcRows = source->data()->data()->data() + originy * srcBytesPerRow + originx * 4; for (int y = 0; y < numRows; ++y) { @@ -253,25 +237,12 @@ void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& srcRows[basex + 1], srcRows[basex + 2], srcRows[basex + 3]); - if (multiplied == Unmultiplied) - *pixel = premultipliedARGBFromColor(pixelColor); - else - *pixel = pixelColor.rgb(); + *pixel = premultipliedARGBFromColor(pixelColor); } srcRows += srcBytesPerRow; } } -void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) -{ - putImageData<Unmultiplied>(source, sourceRect, destPoint, m_data, m_size); -} - -void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) -{ - putImageData<Premultiplied>(source, sourceRect, destPoint, m_data, m_size); -} - static cairo_status_t writeFunction(void* closure, const unsigned char* data, unsigned int length) { Vector<char>* in = reinterpret_cast<Vector<char>*>(closure); |