OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. |
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
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 | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 return adoptPtr(new UnacceleratedImageBufferSurface(deviceSize, opac
ityMode)); | 584 return adoptPtr(new UnacceleratedImageBufferSurface(deviceSize, opac
ityMode)); |
585 return adoptPtr(new WebGLImageBufferSurface(deviceSize, opacityMode)); | 585 return adoptPtr(new WebGLImageBufferSurface(deviceSize, opacityMode)); |
586 } | 586 } |
587 | 587 |
588 OwnPtr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory = createSu
rfaceFactory(deviceSize, msaaSampleCount); | 588 OwnPtr<RecordingImageBufferFallbackSurfaceFactory> surfaceFactory = createSu
rfaceFactory(deviceSize, msaaSampleCount); |
589 | 589 |
590 if (shouldUseDisplayList(deviceSize)) { | 590 if (shouldUseDisplayList(deviceSize)) { |
591 OwnPtr<ImageBufferSurface> surface = adoptPtr(new RecordingImageBufferSu
rface(deviceSize, surfaceFactory.release(), opacityMode)); | 591 OwnPtr<ImageBufferSurface> surface = adoptPtr(new RecordingImageBufferSu
rface(deviceSize, surfaceFactory.release(), opacityMode)); |
592 if (surface->isValid()) | 592 if (surface->isValid()) |
593 return surface.release(); | 593 return surface.release(); |
594 surfaceFactory = createSurfaceFactory(deviceSize, msaaSampleCount); // r
ecreate because old previous one was released | 594 surfaceFactory = createSurfaceFactory(deviceSize, msaaSampleCount); // r
ecreate because previous one was released |
595 } | 595 } |
596 | 596 |
597 return surfaceFactory->createSurface(deviceSize, opacityMode); | 597 return surfaceFactory->createSurface(deviceSize, opacityMode); |
598 } | 598 } |
599 | 599 |
600 void HTMLCanvasElement::createImageBuffer() | 600 void HTMLCanvasElement::createImageBuffer() |
601 { | 601 { |
602 createImageBufferInternal(); | 602 createImageBufferInternal(nullptr); |
603 if (m_didFailToCreateImageBuffer && m_context->is2d()) | 603 if (m_didFailToCreateImageBuffer && m_context->is2d()) |
604 toCanvasRenderingContext2D(m_context.get())->loseContext(); | 604 toCanvasRenderingContext2D(m_context.get())->loseContext(); |
605 } | 605 } |
606 | 606 |
607 void HTMLCanvasElement::createImageBufferInternal() | 607 void HTMLCanvasElement::createImageBufferInternal(PassOwnPtr<ImageBufferSurface>
externalSurface) |
608 { | 608 { |
609 ASSERT(!m_imageBuffer); | 609 ASSERT(!m_imageBuffer); |
610 ASSERT(!m_contextStateSaver); | 610 ASSERT(!m_contextStateSaver); |
611 | 611 |
612 m_didFailToCreateImageBuffer = true; | 612 m_didFailToCreateImageBuffer = true; |
613 m_imageBufferIsClear = true; | 613 m_imageBufferIsClear = true; |
614 | 614 |
615 if (!canCreateImageBuffer(size())) | 615 if (!canCreateImageBuffer(size())) |
616 return; | 616 return; |
617 | 617 |
618 int msaaSampleCount; | 618 int msaaSampleCount = 0; |
619 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaS
ampleCount); | 619 OwnPtr<ImageBufferSurface> surface; |
| 620 if (externalSurface) { |
| 621 surface = externalSurface; |
| 622 } else { |
| 623 surface = createImageBufferSurface(size(), &msaaSampleCount); |
| 624 } |
620 m_imageBuffer = ImageBuffer::create(surface.release()); | 625 m_imageBuffer = ImageBuffer::create(surface.release()); |
621 if (!m_imageBuffer) | 626 if (!m_imageBuffer) |
622 return; | 627 return; |
623 m_imageBuffer->setClient(this); | 628 m_imageBuffer->setClient(this); |
624 | 629 |
625 document().updateRenderTreeIfNeeded(); | 630 document().updateRenderTreeIfNeeded(); |
626 RenderStyle* style = computedStyle(); | 631 RenderStyle* style = computedStyle(); |
627 m_imageBuffer->setFilterLevel((style && (style->imageRendering() == ImageRen
deringPixelated)) ? SkPaint::kNone_FilterLevel : SkPaint::kLow_FilterLevel); | 632 m_imageBuffer->setFilterLevel((style && (style->imageRendering() == ImageRen
deringPixelated)) ? SkPaint::kNone_FilterLevel : SkPaint::kLow_FilterLevel); |
628 | 633 |
629 m_didFailToCreateImageBuffer = false; | 634 m_didFailToCreateImageBuffer = false; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 } | 730 } |
726 | 731 |
727 ImageBuffer* HTMLCanvasElement::buffer() const | 732 ImageBuffer* HTMLCanvasElement::buffer() const |
728 { | 733 { |
729 ASSERT(m_context); | 734 ASSERT(m_context); |
730 if (!hasImageBuffer() && !m_didFailToCreateImageBuffer) | 735 if (!hasImageBuffer() && !m_didFailToCreateImageBuffer) |
731 const_cast<HTMLCanvasElement*>(this)->createImageBuffer(); | 736 const_cast<HTMLCanvasElement*>(this)->createImageBuffer(); |
732 return m_imageBuffer.get(); | 737 return m_imageBuffer.get(); |
733 } | 738 } |
734 | 739 |
| 740 void HTMLCanvasElement::createImageBufferUsingSurface(PassOwnPtr<ImageBufferSurf
ace> surface) |
| 741 { |
| 742 discardImageBuffer(); |
| 743 createImageBufferInternal(surface); |
| 744 } |
| 745 |
735 void HTMLCanvasElement::ensureUnacceleratedImageBuffer() | 746 void HTMLCanvasElement::ensureUnacceleratedImageBuffer() |
736 { | 747 { |
737 ASSERT(m_context); | 748 ASSERT(m_context); |
738 if ((hasImageBuffer() && !m_imageBuffer->isAccelerated()) || m_didFailToCrea
teImageBuffer) | 749 if ((hasImageBuffer() && !m_imageBuffer->isAccelerated()) || m_didFailToCrea
teImageBuffer) |
739 return; | 750 return; |
740 discardImageBuffer(); | 751 discardImageBuffer(); |
741 OpacityMode opacityMode = m_context->hasAlpha() ? NonOpaque : Opaque; | 752 OpacityMode opacityMode = m_context->hasAlpha() ? NonOpaque : Opaque; |
742 m_imageBuffer = ImageBuffer::create(size(), opacityMode); | 753 m_imageBuffer = ImageBuffer::create(size(), opacityMode); |
743 m_didFailToCreateImageBuffer = !m_imageBuffer; | 754 m_didFailToCreateImageBuffer = !m_imageBuffer; |
744 } | 755 } |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const | 859 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const |
849 { | 860 { |
850 return !originClean(); | 861 return !originClean(); |
851 } | 862 } |
852 | 863 |
853 FloatSize HTMLCanvasElement::sourceSize() const | 864 FloatSize HTMLCanvasElement::sourceSize() const |
854 { | 865 { |
855 return FloatSize(width(), height()); | 866 return FloatSize(width(), height()); |
856 } | 867 } |
857 | 868 |
| 869 bool HTMLCanvasElement::isOpaque() const |
| 870 { |
| 871 return m_context && !m_context->hasAlpha(); |
858 } | 872 } |
| 873 |
| 874 } // blink |
OLD | NEW |