1 /*
2 * Copyright 2011, The Android Open Source Project
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 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26 #define LOG_TAG "RasterRenderer"
27 #define LOG_NDEBUG 1
28
29 #include "config.h"
30 #include "RasterRenderer.h"
31
32 #if USE(ACCELERATED_COMPOSITING)
33
34 #include "AndroidLog.h"
35 #include "GLUtils.h"
36 #include "SkBitmap.h"
37 #include "SkBitmapRef.h"
38 #include "SkCanvas.h"
39 #include "SkDevice.h"
40 #include "Tile.h"
41 #include "TilesManager.h"
42
43 namespace WebCore {
44
45 SkBitmap* RasterRenderer::g_bitmap = 0;
46
RasterRenderer()47 RasterRenderer::RasterRenderer() : BaseRenderer(BaseRenderer::Raster)
48 {
49 #ifdef DEBUG_COUNT
50 ClassTracker::instance()->increment("RasterRenderer");
51 #endif
52 if (!g_bitmap) {
53 g_bitmap = new SkBitmap();
54 g_bitmap->setConfig(SkBitmap::kARGB_8888_Config,
55 TilesManager::instance()->tileWidth(),
56 TilesManager::instance()->tileHeight());
57 g_bitmap->allocPixels();
58 }
59 }
60
~RasterRenderer()61 RasterRenderer::~RasterRenderer()
62 {
63 #ifdef DEBUG_COUNT
64 ClassTracker::instance()->decrement("RasterRenderer");
65 #endif
66 }
67
setupCanvas(const TileRenderInfo & renderInfo,SkCanvas * canvas)68 void RasterRenderer::setupCanvas(const TileRenderInfo& renderInfo, SkCanvas* canvas)
69 {
70 if (renderInfo.baseTile->isLayerTile()) {
71 g_bitmap->setIsOpaque(false);
72 g_bitmap->eraseARGB(0, 0, 0, 0);
73 } else {
74 Color defaultBackground = Color::white;
75 Color* background = renderInfo.tilePainter->background();
76 if (!background) {
77 ALOGV("No background color for base layer!");
78 background = &defaultBackground;
79 }
80 ALOGV("setupCanvas use background on Base Layer %x", background->rgb());
81 g_bitmap->setIsOpaque(!background->hasAlpha());
82 g_bitmap->eraseARGB(background->alpha(), background->red(),
83 background->green(), background->blue());
84 }
85
86 SkDevice* device = new SkDevice(*g_bitmap);
87
88 canvas->setDevice(device);
89
90 device->unref();
91 }
92
renderingComplete(const TileRenderInfo & renderInfo,SkCanvas * canvas)93 void RasterRenderer::renderingComplete(const TileRenderInfo& renderInfo, SkCanvas* canvas)
94 {
95 const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(false);
96 GLUtils::paintTextureWithBitmap(&renderInfo, bitmap);
97 }
98
checkForPureColor(TileRenderInfo & renderInfo,SkCanvas * canvas)99 void RasterRenderer::checkForPureColor(TileRenderInfo& renderInfo, SkCanvas* canvas)
100 {
101 const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(false);
102 renderInfo.isPureColor = GLUtils::isPureColorBitmap(bitmap, renderInfo.pureColor);
103 }
104
105 } // namespace WebCore
106
107 #endif // USE(ACCELERATED_COMPOSITING)
108