[chromium] Replace destRect with destOffset in texture upload
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / BitmapCanvasLayerTextureUpdater.cpp
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26
27 #include "config.h"
28
29 #if USE(ACCELERATED_COMPOSITING)
30
31 #include "BitmapCanvasLayerTextureUpdater.h"
32
33 #include "LayerPainterChromium.h"
34 #include "PlatformColor.h"
35 #include "skia/ext/platform_canvas.h"
36
37 namespace WebCore {
38
39 BitmapCanvasLayerTextureUpdater::Texture::Texture(BitmapCanvasLayerTextureUpdater* textureUpdater, PassOwnPtr<CCPrioritizedTexture> texture)
40     : LayerTextureUpdater::Texture(texture)
41     , m_textureUpdater(textureUpdater)
42 {
43 }
44
45 BitmapCanvasLayerTextureUpdater::Texture::~Texture()
46 {
47 }
48
49 void BitmapCanvasLayerTextureUpdater::Texture::updateRect(CCResourceProvider* resourceProvider, const IntRect& sourceRect, const IntSize& destOffset)
50 {
51     textureUpdater()->updateTextureRect(resourceProvider, texture(), sourceRect, destOffset);
52 }
53
54 PassRefPtr<BitmapCanvasLayerTextureUpdater> BitmapCanvasLayerTextureUpdater::create(PassOwnPtr<LayerPainterChromium> painter)
55 {
56     return adoptRef(new BitmapCanvasLayerTextureUpdater(painter));
57 }
58
59 BitmapCanvasLayerTextureUpdater::BitmapCanvasLayerTextureUpdater(PassOwnPtr<LayerPainterChromium> painter)
60     : CanvasLayerTextureUpdater(painter)
61     , m_opaque(false)
62 {
63 }
64
65 BitmapCanvasLayerTextureUpdater::~BitmapCanvasLayerTextureUpdater()
66 {
67 }
68
69 PassOwnPtr<LayerTextureUpdater::Texture> BitmapCanvasLayerTextureUpdater::createTexture(CCPrioritizedTextureManager* manager)
70 {
71     return adoptPtr(new Texture(this, CCPrioritizedTexture::create(manager)));
72 }
73
74 LayerTextureUpdater::SampledTexelFormat BitmapCanvasLayerTextureUpdater::sampledTexelFormat(GC3Denum textureFormat)
75 {
76     // The component order may be bgra if we uploaded bgra pixels to rgba textures.
77     return PlatformColor::sameComponentOrder(textureFormat) ?
78             LayerTextureUpdater::SampledTexelFormatRGBA : LayerTextureUpdater::SampledTexelFormatBGRA;
79 }
80
81 void BitmapCanvasLayerTextureUpdater::prepareToUpdate(const IntRect& contentRect, const IntSize& tileSize, float contentsWidthScale, float contentsHeightScale, IntRect& resultingOpaqueRect, CCRenderingStats& stats)
82 {
83     if (m_canvasSize != contentRect.size()) {
84         m_canvasSize = contentRect.size();
85         m_canvas = adoptPtr(skia::CreateBitmapCanvas(m_canvasSize.width(), m_canvasSize.height(), m_opaque));
86     }
87
88     paintContents(m_canvas.get(), contentRect, contentsWidthScale, contentsHeightScale, resultingOpaqueRect, stats);
89 }
90
91 void BitmapCanvasLayerTextureUpdater::updateTextureRect(CCResourceProvider* resourceProvider, CCPrioritizedTexture* texture, const IntRect& sourceRect, const IntSize& destOffset)
92 {
93     const SkBitmap& bitmap = m_canvas->getDevice()->accessBitmap(false);
94     bitmap.lockPixels();
95
96     texture->upload(resourceProvider, static_cast<const uint8_t*>(bitmap.getPixels()), contentRect(), sourceRect, destOffset);
97     bitmap.unlockPixels();
98 }
99
100 void BitmapCanvasLayerTextureUpdater::setOpaque(bool opaque)
101 {
102     if (opaque != m_opaque) {
103         m_canvas.clear();
104         m_canvasSize = IntSize();
105     }
106     m_opaque = opaque;
107 }
108
109 } // namespace WebCore
110 #endif // USE(ACCELERATED_COMPOSITING)