Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: Source/core/platform/graphics/ImageBuffer.cpp

Issue 19705006: Use SkImage as a backing store for copying 2d Contexts to ImageBitmaps. Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Change SkImage to use srcRect pointer. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2008, Google Inc. All rights reserved. 2 * Copyright (c) 2008, Google Inc. All rights reserved.
3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are 7 * modification, are permitted provided that the following conditions are
8 * met: 8 * met:
9 * 9 *
10 * * Redistributions of source code must retain the above copyright 10 * * Redistributions of source code must retain the above copyright
(...skipping 23 matching lines...) Expand all
34 #include "core/platform/graphics/ImageBuffer.h" 34 #include "core/platform/graphics/ImageBuffer.h"
35 35
36 #include "core/html/ImageData.h" 36 #include "core/html/ImageData.h"
37 #include "core/platform/MIMETypeRegistry.h" 37 #include "core/platform/MIMETypeRegistry.h"
38 #include "core/platform/PlatformMemoryInstrumentation.h" 38 #include "core/platform/PlatformMemoryInstrumentation.h"
39 #include "core/platform/graphics/BitmapImage.h" 39 #include "core/platform/graphics/BitmapImage.h"
40 #include "core/platform/graphics/Extensions3D.h" 40 #include "core/platform/graphics/Extensions3D.h"
41 #include "core/platform/graphics/GraphicsContext.h" 41 #include "core/platform/graphics/GraphicsContext.h"
42 #include "core/platform/graphics/GraphicsContext3D.h" 42 #include "core/platform/graphics/GraphicsContext3D.h"
43 #include "core/platform/graphics/IntRect.h" 43 #include "core/platform/graphics/IntRect.h"
44 #include "core/platform/graphics/SkiaImage.h"
44 #include "core/platform/graphics/chromium/Canvas2DLayerBridge.h" 45 #include "core/platform/graphics/chromium/Canvas2DLayerBridge.h"
45 #include "core/platform/graphics/gpu/SharedGraphicsContext3D.h" 46 #include "core/platform/graphics/gpu/SharedGraphicsContext3D.h"
46 #include "core/platform/graphics/skia/MemoryInstrumentationSkia.h" 47 #include "core/platform/graphics/skia/MemoryInstrumentationSkia.h"
47 #include "core/platform/graphics/skia/NativeImageSkia.h" 48 #include "core/platform/graphics/skia/NativeImageSkia.h"
48 #include "core/platform/graphics/skia/SkiaUtils.h" 49 #include "core/platform/graphics/skia/SkiaUtils.h"
49 #include "core/platform/image-encoders/skia/JPEGImageEncoder.h" 50 #include "core/platform/image-encoders/skia/JPEGImageEncoder.h"
50 #include "core/platform/image-encoders/skia/PNGImageEncoder.h" 51 #include "core/platform/image-encoders/skia/PNGImageEncoder.h"
51 #include "core/platform/image-encoders/skia/WEBPImageEncoder.h" 52 #include "core/platform/image-encoders/skia/WEBPImageEncoder.h"
52 #include "public/platform/Platform.h" 53 #include "public/platform/Platform.h"
53 #include "skia/ext/platform_canvas.h" 54 #include "skia/ext/platform_canvas.h"
54 #include "third_party/skia/include/core/SkColorPriv.h" 55 #include "third_party/skia/include/core/SkColorPriv.h"
55 #include "third_party/skia/include/core/SkSurface.h" 56 #include "third_party/skia/include/core/SkSurface.h"
56 #include "third_party/skia/include/gpu/GrContext.h" 57 #include "third_party/skia/include/gpu/GrContext.h"
57 #include "third_party/skia/include/gpu/SkGpuDevice.h" 58 #include "third_party/skia/include/gpu/SkGpuDevice.h"
58 #include "wtf/MathExtras.h" 59 #include "wtf/MathExtras.h"
59 #include "wtf/text/Base64.h" 60 #include "wtf/text/Base64.h"
60 #include "wtf/text/WTFString.h" 61 #include "wtf/text/WTFString.h"
61 62
62 using namespace std; 63 using namespace std;
63 64
64 namespace WebCore { 65 namespace WebCore {
65 66
66 static SkCanvas* createAcceleratedCanvas(const IntSize& size, OwnPtr<Canvas2DLay erBridge>* outLayerBridge, OpacityMode opacityMode) 67 SkCanvas* ImageBuffer::createAcceleratedCanvas(const IntSize& size, OwnPtr<Canva s2DLayerBridge>* outLayerBridge, OpacityMode opacityMode)
67 { 68 {
68 RefPtr<GraphicsContext3D> context3D = SharedGraphicsContext3D::get(); 69 RefPtr<GraphicsContext3D> context3D = SharedGraphicsContext3D::get();
69 if (!context3D) 70 if (!context3D)
70 return 0; 71 return 0;
71 GrContext* gr = context3D->grContext(); 72 GrContext* gr = context3D->grContext();
72 if (!gr) 73 if (!gr)
73 return 0; 74 return 0;
74 gr->resetContext(); 75 gr->resetContext();
75 Canvas2DLayerBridge::OpacityMode bridgeOpacityMode = opacityMode == Opaque ? Canvas2DLayerBridge::Opaque : Canvas2DLayerBridge::NonOpaque; 76 Canvas2DLayerBridge::OpacityMode bridgeOpacityMode = opacityMode == Opaque ? Canvas2DLayerBridge::Opaque : Canvas2DLayerBridge::NonOpaque;
76 SkImage::Info info; 77 SkImage::Info info;
77 info.fWidth = size.width(); 78 info.fWidth = size.width();
78 info.fHeight = size.height(); 79 info.fHeight = size.height();
79 info.fColorType = SkImage::kPMColor_ColorType; 80 info.fColorType = SkImage::kPMColor_ColorType;
80 info.fAlphaType = SkImage::kPremul_AlphaType; 81 info.fAlphaType = SkImage::kPremul_AlphaType;
81 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context3D->grCont ext(), info)); 82 m_surface = SkSurface::NewRenderTarget(context3D->grContext(), info);
Justin Novosad 2013/07/22 15:35:41 You will need adoptPtr here, once m_surface is an
82 if (!surface.get()) 83 if (!m_surface.get())
83 return 0; 84 return 0;
84 SkDeferredCanvas* canvas = new SkDeferredCanvas(surface.get()); 85 SkDeferredCanvas* canvas = new SkDeferredCanvas(m_surface.get());
85 *outLayerBridge = Canvas2DLayerBridge::create(context3D.release(), canvas, b ridgeOpacityMode); 86 *outLayerBridge = Canvas2DLayerBridge::create(context3D.release(), canvas, b ridgeOpacityMode);
86 // If canvas buffer allocation failed, debug build will have asserted 87 // If canvas buffer allocation failed, debug build will have asserted
87 // For release builds, we must verify whether the device has a render target 88 // For release builds, we must verify whether the device has a render target
88 return canvas; 89 return canvas;
Justin Novosad 2013/07/22 15:35:41 Now that createAcceleratedCanvas is a member of Im
89 } 90 }
90 91
91 static SkCanvas* createNonPlatformCanvas(const IntSize& size) 92 SkCanvas* ImageBuffer::createNonPlatformCanvas(const IntSize& size)
92 { 93 {
93 SkAutoTUnref<SkDevice> device(new SkDevice(SkBitmap::kARGB_8888_Config, size .width(), size.height())); 94 SkImage::Info info;
94 SkPixelRef* pixelRef = device->accessBitmap(false).pixelRef(); 95 info.fWidth = size.width();
95 return pixelRef ? new SkCanvas(device) : 0; 96 info.fHeight = size.height();
97 info.fColorType = SkImage::kPMColor_ColorType;
98 info.fAlphaType = SkImage::kPremul_AlphaType;
99 m_surface = SkSurface::NewRaster(info);
100 if (!m_surface.get())
101 return 0;
102 SkCanvas* canvas = m_surface->getCanvas();
103 return canvas;
96 } 104 }
97 105
98 PassOwnPtr<ImageBuffer> ImageBuffer::createCompatibleBuffer(const IntSize& size, float resolutionScale, const GraphicsContext* context, bool hasAlpha) 106 PassOwnPtr<ImageBuffer> ImageBuffer::createCompatibleBuffer(const IntSize& size, float resolutionScale, const GraphicsContext* context, bool hasAlpha)
99 { 107 {
100 bool success = false; 108 bool success = false;
101 OwnPtr<ImageBuffer> buf = adoptPtr(new ImageBuffer(size, resolutionScale, co ntext, hasAlpha, success)); 109 OwnPtr<ImageBuffer> buf = adoptPtr(new ImageBuffer(size, resolutionScale, co ntext, hasAlpha, success));
102 if (!success) 110 if (!success)
103 return nullptr; 111 return nullptr;
104 return buf.release(); 112 return buf.release();
105 } 113 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 196
189 static SkBitmap deepSkBitmapCopy(const SkBitmap& bitmap) 197 static SkBitmap deepSkBitmapCopy(const SkBitmap& bitmap)
190 { 198 {
191 SkBitmap tmp; 199 SkBitmap tmp;
192 if (!bitmap.deepCopyTo(&tmp, bitmap.config())) 200 if (!bitmap.deepCopyTo(&tmp, bitmap.config()))
193 bitmap.copyTo(&tmp, bitmap.config()); 201 bitmap.copyTo(&tmp, bitmap.config());
194 202
195 return tmp; 203 return tmp;
196 } 204 }
197 205
206 PassRefPtr<Image> ImageBuffer::imageSnapshot() const
207 {
208 if (!m_surface.get())
Justin Novosad 2013/07/22 15:35:41 Inside this 'if' you add ASSERT(!m_canvas) With th
209 return 0;
210 return SkiaImage::create(m_surface->newImageSnapshot());
211 }
212
198 PassRefPtr<Image> ImageBuffer::copyImage(BackingStoreCopy copyBehavior, ScaleBeh avior) const 213 PassRefPtr<Image> ImageBuffer::copyImage(BackingStoreCopy copyBehavior, ScaleBeh avior) const
199 { 214 {
200 const SkBitmap& bitmap = *context()->bitmap(); 215 const SkBitmap& bitmap = *context()->bitmap();
201 // FIXME: Start honoring ScaleBehavior to scale 2x buffers down to 1x. 216 // FIXME: Start honoring ScaleBehavior to scale 2x buffers down to 1x.
202 return BitmapImage::create(NativeImageSkia::create(copyBehavior == CopyBacki ngStore ? deepSkBitmapCopy(bitmap) : bitmap, m_resolutionScale)); 217 return BitmapImage::create(NativeImageSkia::create(copyBehavior == CopyBacki ngStore ? deepSkBitmapCopy(bitmap) : bitmap, m_resolutionScale));
203 } 218 }
204 219
205 BackingStoreCopy ImageBuffer::fastCopyImageMode() 220 BackingStoreCopy ImageBuffer::fastCopyImageMode()
206 { 221 {
207 return DontCopyBackingStore; 222 return DontCopyBackingStore;
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 504
490 void ImageBuffer::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const 505 void ImageBuffer::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
491 { 506 {
492 MemoryClassInfo info(memoryObjectInfo, this, PlatformMemoryTypes::Image); 507 MemoryClassInfo info(memoryObjectInfo, this, PlatformMemoryTypes::Image);
493 info.addMember(m_canvas, "canvas"); 508 info.addMember(m_canvas, "canvas");
494 info.addMember(m_context, "context"); 509 info.addMember(m_context, "context");
495 info.addMember(m_layerBridge, "layerBridge"); 510 info.addMember(m_layerBridge, "layerBridge");
496 } 511 }
497 512
498 } // namespace WebCore 513 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698