OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 | 498 |
499 ~ScopedTexture2DRestorer() | 499 ~ScopedTexture2DRestorer() |
500 { | 500 { |
501 m_context->restoreCurrentTexture2D(); | 501 m_context->restoreCurrentTexture2D(); |
502 } | 502 } |
503 | 503 |
504 private: | 504 private: |
505 RawPtrWillBeMember<WebGLRenderingContextBase> m_context; | 505 RawPtrWillBeMember<WebGLRenderingContextBase> m_context; |
506 }; | 506 }; |
507 | 507 |
| 508 class ScopedFramebufferRestorer { |
| 509 STACK_ALLOCATED(); |
| 510 public: |
| 511 explicit ScopedFramebufferRestorer(WebGLRenderingContextBase* context) |
| 512 : m_context(context) |
| 513 { |
| 514 } |
| 515 |
| 516 ~ScopedFramebufferRestorer() |
| 517 { |
| 518 m_context->restoreCurrentFramebuffer(); |
| 519 } |
| 520 |
| 521 private: |
| 522 RawPtrWillBeMember<WebGLRenderingContextBase> m_context; |
| 523 }; |
| 524 |
508 class WebGLRenderingContextLostCallback final : public NoBaseWillBeGarbageCollec
tedFinalized<WebGLRenderingContextLostCallback>, public blink::WebGraphicsContex
t3D::WebGraphicsContextLostCallback { | 525 class WebGLRenderingContextLostCallback final : public NoBaseWillBeGarbageCollec
tedFinalized<WebGLRenderingContextLostCallback>, public blink::WebGraphicsContex
t3D::WebGraphicsContextLostCallback { |
509 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; | 526 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; |
510 public: | 527 public: |
511 static PassOwnPtrWillBeRawPtr<WebGLRenderingContextLostCallback> create(WebG
LRenderingContextBase* context) | 528 static PassOwnPtrWillBeRawPtr<WebGLRenderingContextLostCallback> create(WebG
LRenderingContextBase* context) |
512 { | 529 { |
513 return adoptPtrWillBeNoop(new WebGLRenderingContextLostCallback(context)
); | 530 return adoptPtrWillBeNoop(new WebGLRenderingContextLostCallback(context)
); |
514 } | 531 } |
515 | 532 |
516 virtual ~WebGLRenderingContextLostCallback() { } | 533 virtual ~WebGLRenderingContextLostCallback() { } |
517 | 534 |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
905 return false; | 922 return false; |
906 | 923 |
907 bool mustClearNow = clearIfComposited() != Skipped; | 924 bool mustClearNow = clearIfComposited() != Skipped; |
908 if (!m_markedCanvasDirty && !mustClearNow) | 925 if (!m_markedCanvasDirty && !mustClearNow) |
909 return false; | 926 return false; |
910 | 927 |
911 canvas()->clearCopiedImage(); | 928 canvas()->clearCopiedImage(); |
912 m_markedCanvasDirty = false; | 929 m_markedCanvasDirty = false; |
913 | 930 |
914 ScopedTexture2DRestorer restorer(this); | 931 ScopedTexture2DRestorer restorer(this); |
| 932 ScopedFramebufferRestorer fboRestorer(this); |
915 | 933 |
916 drawingBuffer()->commit(); | 934 drawingBuffer()->commit(); |
917 if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer(drawingBuffer
(), sourceBuffer)) { | 935 if (!canvas()->buffer()->copyRenderingResultsFromDrawingBuffer(drawingBuffer
(), sourceBuffer)) { |
918 canvas()->ensureUnacceleratedImageBuffer(); | 936 canvas()->ensureUnacceleratedImageBuffer(); |
919 if (canvas()->hasImageBuffer()) | 937 if (canvas()->hasImageBuffer()) |
920 drawingBuffer()->paintRenderingResultsToCanvas(canvas()->buffer()); | 938 drawingBuffer()->paintRenderingResultsToCanvas(canvas()->buffer()); |
921 } | 939 } |
922 | 940 |
923 restoreCurrentFramebuffer(); | |
924 return true; | 941 return true; |
925 } | 942 } |
926 | 943 |
927 PassRefPtrWillBeRawPtr<ImageData> WebGLRenderingContextBase::paintRenderingResul
tsToImageData(SourceDrawingBuffer sourceBuffer) | 944 PassRefPtrWillBeRawPtr<ImageData> WebGLRenderingContextBase::paintRenderingResul
tsToImageData(SourceDrawingBuffer sourceBuffer) |
928 { | 945 { |
929 if (isContextLost()) | 946 if (isContextLost()) |
930 return nullptr; | 947 return nullptr; |
| 948 if (m_requestedAttributes.premultipliedAlpha()) |
| 949 return nullptr; |
931 | 950 |
932 clearIfComposited(); | 951 clearIfComposited(); |
933 drawingBuffer()->commit(); | 952 drawingBuffer()->commit(); |
| 953 ScopedFramebufferRestorer restorer(this); |
934 int width, height; | 954 int width, height; |
935 RefPtr<Uint8ClampedArray> imageDataPixels = | 955 RefPtr<Uint8ClampedArray> imageDataPixels = |
936 drawingBuffer()->paintRenderingResultsToImageData(width, height, sourceB
uffer); | 956 drawingBuffer()->paintRenderingResultsToImageData(width, height, sourceB
uffer); |
937 if (!imageDataPixels) | 957 if (!imageDataPixels) |
938 return nullptr; | 958 return nullptr; |
939 | 959 |
940 return ImageData::create(IntSize(width, height), imageDataPixels); | 960 return ImageData::create(IntSize(width, height), imageDataPixels); |
941 } | 961 } |
942 | 962 |
943 void WebGLRenderingContextBase::reshape(int width, int height) | 963 void WebGLRenderingContextBase::reshape(int width, int height) |
(...skipping 5006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5950 return m_sharedWebGraphicsContext3D ? m_sharedWebGraphicsContext3D->drawingB
uffer() : 0; | 5970 return m_sharedWebGraphicsContext3D ? m_sharedWebGraphicsContext3D->drawingB
uffer() : 0; |
5951 } | 5971 } |
5952 #else | 5972 #else |
5953 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const | 5973 DrawingBuffer* WebGLRenderingContextBase::drawingBuffer() const |
5954 { | 5974 { |
5955 return m_drawingBuffer.get(); | 5975 return m_drawingBuffer.get(); |
5956 } | 5976 } |
5957 #endif | 5977 #endif |
5958 | 5978 |
5959 } // namespace blink | 5979 } // namespace blink |
OLD | NEW |