Index: Source/platform/graphics/gpu/DrawingBuffer.h |
diff --git a/Source/platform/graphics/gpu/DrawingBuffer.h b/Source/platform/graphics/gpu/DrawingBuffer.h |
index 5c8b82b0e15bd7d841ba046cd5b30fc646ce3207..1b6bed6618db8909c24470c24d62ab71ea2fb061 100644 |
--- a/Source/platform/graphics/gpu/DrawingBuffer.h |
+++ b/Source/platform/graphics/gpu/DrawingBuffer.h |
@@ -38,6 +38,8 @@ |
#include "public/platform/WebExternalTextureLayerClient.h" |
#include "public/platform/WebExternalTextureMailbox.h" |
+#include "public/platform/WebGraphicsContext3D.h" |
+#include "third_party/skia/include/core/SkBitmap.h" |
#include "wtf/Noncopyable.h" |
#include "wtf/OwnPtr.h" |
#include "wtf/PassOwnPtr.h" |
@@ -76,7 +78,7 @@ public: |
Discard |
}; |
- static PassRefPtr<DrawingBuffer> create(GraphicsContext3D*, const IntSize&, PreserveDrawingBuffer, PassRefPtr<ContextEvictionManager>); |
+ static PassRefPtr<DrawingBuffer> create(blink::WebGraphicsContext3D*, const IntSize&, PreserveDrawingBuffer, PassRefPtr<ContextEvictionManager>); |
~DrawingBuffer(); |
@@ -120,6 +122,8 @@ public: |
Platform3DObject framebuffer() const; |
void markContentsChanged(); |
+ void markLayerComposited(); |
+ bool layerComposited() const; |
blink::WebLayer* platformLayer(); |
void paintCompositedResultsToCanvas(ImageBuffer*); |
@@ -132,8 +136,13 @@ public: |
bool copyToPlatformTexture(GraphicsContext3D&, Platform3DObject texture, GLenum internalFormat, |
GLenum destType, GLint level, bool premultiplyAlpha, bool flipY); |
+ void setPackAlignment(GLint param); |
+ |
+ void paintRenderingResultsToCanvas(ImageBuffer*); |
+ PassRefPtr<Uint8ClampedArray> paintRenderingResultsToImageData(int&, int&); |
+ |
private: |
- DrawingBuffer(GraphicsContext3D*, const IntSize&, bool multisampleExtensionSupported, |
+ DrawingBuffer(blink::WebGraphicsContext3D*, GraphicsContext3D*, const IntSize&, bool multisampleExtensionSupported, |
bool packedDepthStencilExtensionSupported, PreserveDrawingBuffer, PassRefPtr<ContextEvictionManager>); |
void initialize(const IntSize&); |
@@ -163,13 +172,33 @@ private: |
// Returns true if the buffer will only fit if the oldest WebGL context is forcibly lost |
IntSize adjustSizeWithContextEviction(const IntSize&, bool& evictContext); |
+ void paintFramebufferToCanvas(int framebuffer, int width, int height, bool premultiplyAlpha, ImageBuffer*); |
+ |
+ // This is the order of bytes to use when doing a readback. |
+ enum ReadbackOrder { |
+ ReadbackRGBA, |
+ ReadbackSkia |
+ }; |
+ |
+ // Helper function which does a readback from the currently-bound |
+ // framebuffer into a buffer of a certain size with 4-byte pixels. |
+ void readBackFramebuffer(unsigned char* pixels, int width, int height, ReadbackOrder, GraphicsContext3D::AlphaOp); |
+ |
+ // Helper function to flip a bitmap vertically. |
+ void flipVertically(uint8_t* data, int width, int height); |
+ |
+ // Helper to texImage2D with pixel==0 case: pixels are initialized to 0. |
+ // By default, alignment is 4, the OpenGL default setting. |
+ void texImage2DResourceSafe(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLint alignment = 4); |
+ |
PreserveDrawingBuffer m_preserveDrawingBuffer; |
bool m_scissorEnabled; |
Platform3DObject m_texture2DBinding; |
Platform3DObject m_framebufferBinding; |
GLenum m_activeTextureUnit; |
- RefPtr<GraphicsContext3D> m_context; |
+ blink::WebGraphicsContext3D* m_context; |
+ RefPtr<GraphicsContext3D> m_contextSupport; |
IntSize m_size; |
bool m_multisampleExtensionSupported; |
bool m_packedDepthStencilExtensionSupported; |
@@ -194,13 +223,15 @@ private: |
// True if commit() has been called since the last time markContentsChanged() had been called. |
bool m_contentsChangeCommitted; |
+ bool m_layerComposited; |
- GraphicsContext3D::Attributes m_attributes; |
+ blink::WebGraphicsContext3D::Attributes m_attributes; |
unsigned m_internalColorFormat; |
unsigned m_colorFormat; |
unsigned m_internalRenderbufferFormat; |
int m_maxTextureSize; |
int m_sampleCount; |
+ int m_packAlignment; |
OwnPtr<blink::WebExternalTextureLayer> m_layer; |
@@ -210,6 +241,16 @@ private: |
Vector<RefPtr<MailboxInfo> > m_recycledMailboxes; |
RefPtr<ContextEvictionManager> m_contextEvictionManager; |
+ |
+ // If the width and height of the Canvas's backing store don't |
+ // match those that we were given in the most recent call to |
+ // reshape(), then we need an intermediate bitmap to read back the |
+ // frame buffer into. This seems to happen when CSS styles are |
+ // used to resize the Canvas. |
+ SkBitmap m_resizingBitmap; |
+ |
+ // Used to flip a bitmap vertically. |
+ Vector<uint8_t> m_scanline; |
}; |
} // namespace WebCore |