• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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