Index: Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp |
=================================================================== |
--- Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp (revision 106816) |
+++ Source/WebCore/platform/graphics/skia/ImageBufferSkia.cpp (working copy) |
@@ -226,65 +226,18 @@ |
|| rect.maxY() > size.height()) |
memset(data, 0, result->length()); |
- int originX = rect.x(); |
- int destX = 0; |
- if (originX < 0) { |
- destX = -originX; |
- originX = 0; |
- } |
- int endX = rect.maxX(); |
- if (endX > size.width()) |
- endX = size.width(); |
- int numColumns = endX - originX; |
- |
- if (numColumns <= 0) |
- return result.release(); |
- |
- int originY = rect.y(); |
- int destY = 0; |
- if (originY < 0) { |
- destY = -originY; |
- originY = 0; |
- } |
- int endY = rect.maxY(); |
- if (endY > size.height()) |
- endY = size.height(); |
- int numRows = endY - originY; |
- |
- if (numRows <= 0) |
- return result.release(); |
- |
- SkBitmap srcBitmap; |
- if (!canvas->readPixels(SkIRect::MakeXYWH(originX, originY, numColumns, numRows), &srcBitmap)) |
- return result.release(); |
- |
unsigned destBytesPerRow = 4 * rect.width(); |
- unsigned char* destRow = data + destY * destBytesPerRow + destX * 4; |
+ SkBitmap destBitmap; |
+ destBitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height(), destBytesPerRow); |
+ destBitmap.setPixels(data); |
- // Do conversion of byte order and alpha divide (if necessary) |
- for (int y = 0; y < numRows; ++y) { |
- SkPMColor* srcBitmapRow = srcBitmap.getAddr32(0, y); |
- for (int x = 0; x < numColumns; ++x) { |
- SkPMColor srcPMColor = srcBitmapRow[x]; |
- unsigned char* destPixel = &destRow[x * 4]; |
- if (multiplied == Unmultiplied) { |
- unsigned char a = SkGetPackedA32(srcPMColor); |
- destPixel[0] = a ? SkGetPackedR32(srcPMColor) * 255 / a : 0; |
- destPixel[1] = a ? SkGetPackedG32(srcPMColor) * 255 / a : 0; |
- destPixel[2] = a ? SkGetPackedB32(srcPMColor) * 255 / a : 0; |
- destPixel[3] = a; |
- } else { |
- // Input and output are both pre-multiplied, we just need to re-arrange the |
- // bytes from the bitmap format to RGBA. |
- destPixel[0] = SkGetPackedR32(srcPMColor); |
- destPixel[1] = SkGetPackedG32(srcPMColor); |
- destPixel[2] = SkGetPackedB32(srcPMColor); |
- destPixel[3] = SkGetPackedA32(srcPMColor); |
- } |
- } |
- destRow += destBytesPerRow; |
- } |
+ SkCanvas::Config8888 config8888; |
+ if (multiplied == Premultiplied) |
+ config8888 = SkCanvas::kRGBA_Premul_Config8888; |
+ else |
+ config8888 = SkCanvas::kRGBA_Unpremul_Config8888; |
+ canvas->readPixels(&destBitmap, rect.x(), rect.y(), config8888); |
return result.release(); |
} |