Reviewers: Justin Novosad,
Message:
Hi Justin,
Please review this CL.
Thanks.
Description:
Fixing performance issue of creating imagebitmap from ImageData.
There is no bug related to this issue, maybe we should create one?
Please review this at
https://codereview.chromium.org/1382883002/
Base URL:
https://chromium.googlesource.com/chromium/src.git@master
Affected files (+29, -17 lines):
M third_party/WebKit/Source/core/frame/ImageBitmap.cpp
M third_party/WebKit/Source/platform/blink_platform.gypi
M third_party/WebKit/Source/platform/graphics/ImageBuffer.h
M third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
A +
third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.h
A +
third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.cpp
Index: third_party/WebKit/Source/core/frame/ImageBitmap.cpp
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
index
62388bc0fb578bd02059e4556ea598892a587f45..f07d175c2d6b0b1c3ce2dd5d80f1c0ed9899890c
100644
--- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
+++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
@@ -98,7 +98,9 @@ ImageBitmap::ImageBitmap(ImageData* data, const IntRect&
cropRect)
, m_bitmapOffset(IntPoint())
{
IntRect srcRect = intersection(cropRect, IntRect(IntPoint(),
data->size()));
- OwnPtr<ImageBuffer> buffer = ImageBuffer::create(data->size());
+ OpacityMode opacityMode = Opaque;
+ OwnPtr<ImageBuffer> buffer = ImageBuffer::createSimple(data->size(),
opacityMode);
+
if (!buffer)
return;
Index: third_party/WebKit/Source/platform/blink_platform.gypi
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi
b/third_party/WebKit/Source/platform/blink_platform.gypi
index
2a8a406a455f37e2fd1fe24e1499d7da1f187f43..be0e390c36fff9f24ec91588c859d42cbb8972f7
100644
--- a/third_party/WebKit/Source/platform/blink_platform.gypi
+++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -582,6 +582,8 @@
'graphics/ThreadSafeDataTransport.h',
'graphics/UnacceleratedImageBufferSurface.cpp',
'graphics/UnacceleratedImageBufferSurface.h',
+ 'graphics/UnacceleratedSimpleImageBufferSurface.cpp',
+ 'graphics/UnacceleratedSimpleImageBufferSurface.h',
'graphics/cpu/arm/WebGLImageConversionNEON.h',
'graphics/cpu/x86/WebGLImageConversionSSE.h',
'graphics/filters/DistantLightSource.cpp',
Index: third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
index
d63909e4b47783dfea59bfdc68f16d8b8df9cda8..df902c960517c4c27b1e137126dee76fa1e68c57
100644
--- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
@@ -41,6 +41,7 @@
#include "platform/graphics/ImageBufferClient.h"
#include "platform/graphics/StaticBitmapImage.h"
#include "platform/graphics/UnacceleratedImageBufferSurface.h"
+#include "platform/graphics/UnacceleratedSimpleImageBufferSurface.h"
#include "platform/graphics/gpu/DrawingBuffer.h"
#include "platform/graphics/gpu/Extensions3DUtil.h"
#include "platform/graphics/skia/SkiaUtils.h"
@@ -75,6 +76,14 @@ PassOwnPtr<ImageBuffer> ImageBuffer::create(const
IntSize& size, OpacityMode opa
return adoptPtr(new ImageBuffer(surface.release()));
}
+PassOwnPtr<ImageBuffer> ImageBuffer::createSimple(const IntSize& size,
OpacityMode opacityMode)
+{
+ OwnPtr<ImageBufferSurface> surface(adoptPtr(new
UnacceleratedSimpleImageBufferSurface(size, opacityMode)));
+ if (!surface->isValid())
+ return nullptr;
+ return adoptPtr(new ImageBuffer(surface.release()));
+}
+
ImageBuffer::ImageBuffer(PassOwnPtr<ImageBufferSurface> surface)
: m_snapshotState(InitialSnapshotState)
, m_surface(surface)
Index: third_party/WebKit/Source/platform/graphics/ImageBuffer.h
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.h
b/third_party/WebKit/Source/platform/graphics/ImageBuffer.h
index
7d73455e2fc3ce7dde70951906fea587e7e6f0d1..47c9754b41b094d774bd7f9f922cfc1035c47b13
100644
--- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.h
+++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.h
@@ -72,6 +72,7 @@ class PLATFORM_EXPORT ImageBuffer {
public:
static PassOwnPtr<ImageBuffer> create(const IntSize&, OpacityMode =
NonOpaque);
static PassOwnPtr<ImageBuffer> create(PassOwnPtr<ImageBufferSurface>);
+ static PassOwnPtr<ImageBuffer> createSimple(const IntSize&,
OpacityMode = NonOpaque);
~ImageBuffer();
Index:
third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.cpp
diff --git
a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
b/third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.cpp
similarity index 81%
copy from
third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
copy to
third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.cpp
index
f01b7a7c7a05ab75ca9b3ab42603c815cefebff0..060b198070edb2f06d3b3ead77bb914886029826
100644
---
a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.cpp
+++
b/third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.cpp
@@ -29,7 +29,7 @@
*/
#include "config.h"
-#include "platform/graphics/UnacceleratedImageBufferSurface.h"
+#include "platform/graphics/UnacceleratedSimpleImageBufferSurface.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkDevice.h"
@@ -38,37 +38,34 @@
namespace blink {
-UnacceleratedImageBufferSurface::UnacceleratedImageBufferSurface(const
IntSize& size, OpacityMode opacityMode)
+UnacceleratedSimpleImageBufferSurface::UnacceleratedSimpleImageBufferSurface(const
IntSize&
size, OpacityMode opacityMode)
: ImageBufferSurface(size, opacityMode)
{
SkAlphaType alphaType = (Opaque == opacityMode) ?
kOpaque_SkAlphaType : kPremul_SkAlphaType;
SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(),
alphaType);
SkSurfaceProps disableLCDProps(0, kUnknown_SkPixelGeometry);
m_surface = adoptRef(SkSurface::NewRaster(info, Opaque ==
opacityMode ? 0 : &disableLCDProps));
-
- if (m_surface)
- clear();
}
-UnacceleratedImageBufferSurface::~UnacceleratedImageBufferSurface() { }
+UnacceleratedSimpleImageBufferSurface::~UnacceleratedSimpleImageBufferSurface()
{
}
-SkCanvas* UnacceleratedImageBufferSurface::canvas()
+SkCanvas* UnacceleratedSimpleImageBufferSurface::canvas()
{
return m_surface->getCanvas();
}
-const SkBitmap&
UnacceleratedImageBufferSurface::deprecatedBitmapForOverwrite()
+const SkBitmap&
UnacceleratedSimpleImageBufferSurface::deprecatedBitmapForOverwrite()
{
m_surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);
return m_surface->getCanvas()->getDevice()->accessBitmap(false);
}
-bool UnacceleratedImageBufferSurface::isValid() const
+bool UnacceleratedSimpleImageBufferSurface::isValid() const
{
return m_surface;
}
-PassRefPtr<SkImage>
UnacceleratedImageBufferSurface::newImageSnapshot(AccelerationHint)
+PassRefPtr<SkImage>
UnacceleratedSimpleImageBufferSurface::newImageSnapshot(AccelerationHint)
{
return adoptRef(m_surface->newImageSnapshot());
}
Index:
third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.h
diff --git
a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.h
b/third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.h
similarity index 81%
copy from
third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.h
copy to
third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.h
index
bc1139c1e23027497922aae1bd19948ff6d04559..d337c1c2bca3ff58634b27a7298375f5a244c1db
100644
---
a/third_party/WebKit/Source/platform/graphics/UnacceleratedImageBufferSurface.h
+++
b/third_party/WebKit/Source/platform/graphics/UnacceleratedSimpleImageBufferSurface.h
@@ -28,8 +28,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef UnacceleratedImageBufferSurface_h
-#define UnacceleratedImageBufferSurface_h
+#ifndef UnacceleratedSimpleImageBufferSurface_h
+#define UnacceleratedSimpleImageBufferSurface_h
#include "platform/graphics/ImageBufferSurface.h"
#include "wtf/RefPtr.h"
@@ -38,11 +38,11 @@ class SkSurface;
namespace blink {
-class PLATFORM_EXPORT UnacceleratedImageBufferSurface : public
ImageBufferSurface {
- WTF_MAKE_NONCOPYABLE(UnacceleratedImageBufferSurface);
WTF_MAKE_FAST_ALLOCATED(UnacceleratedImageBufferSurface);
+class PLATFORM_EXPORT UnacceleratedSimpleImageBufferSurface : public
ImageBufferSurface {
+ WTF_MAKE_NONCOPYABLE(UnacceleratedSimpleImageBufferSurface);
WTF_MAKE_FAST_ALLOCATED(UnacceleratedSimpleImageBufferSurface);
public:
- UnacceleratedImageBufferSurface(const IntSize&, OpacityMode =
NonOpaque);
- ~UnacceleratedImageBufferSurface() override;
+ UnacceleratedSimpleImageBufferSurface(const IntSize&, OpacityMode =
NonOpaque);
+ ~UnacceleratedSimpleImageBufferSurface() override;
SkCanvas* canvas() override;
bool isValid() const override;
@@ -56,3 +56,4 @@ private:
} // namespace blink
#endif
+