picker.cpp revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/picker.cpp 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Copyright 2006, The Android Open Source Project 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** you may not use this file except in compliance with the License. 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** You may obtain a copy of the License at 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** See the License for the specific language governing permissions and 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** limitations under the License. 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project*/ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "buffer.h" 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "scanline.h" 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "picker.h" 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android { 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_init_picker(context_t* c) 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_pick(context_t* c) 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ggl_likely(!c->dirty)) 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // compute needs, see if they changed... 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t enables = c->state.enables; 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project needs_t new_needs(c->state.needs); 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->dirty & GGL_CB_STATE) { 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_needs.n &= ~GGL_NEEDS_CB_FORMAT_MASK; 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_needs.n |= GGL_BUILD_NEEDS(c->state.buffers.color.format, CB_FORMAT); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_BLENDING) 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->dirty |= GGL_PIXEL_PIPELINE_STATE; 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->dirty & GGL_PIXEL_PIPELINE_STATE) { 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t n = GGL_BUILD_NEEDS(c->state.buffers.color.format, CB_FORMAT); 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t p = 0; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_BLENDING) { 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t src = c->state.blend.src; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t dst = c->state.blend.dst; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t src_alpha = c->state.blend.src_alpha; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t dst_alpha = c->state.blend.dst_alpha; 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLFormat& cbf = c->formats[ c->state.buffers.color.format ]; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!cbf.c[GGLFormat::ALPHA].h) { 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((src == GGL_ONE_MINUS_DST_ALPHA) || 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (src == GGL_DST_ALPHA)) { 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src = GGL_ONE; 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((src_alpha == GGL_ONE_MINUS_DST_ALPHA) || 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (src_alpha == GGL_DST_ALPHA)) { 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src_alpha = GGL_ONE; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((dst == GGL_ONE_MINUS_DST_ALPHA) || 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (dst == GGL_DST_ALPHA)) { 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst = GGL_ONE; 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((dst_alpha == GGL_ONE_MINUS_DST_ALPHA) || 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (dst_alpha == GGL_DST_ALPHA)) { 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst_alpha = GGL_ONE; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src = ggl_blendfactor_to_needs(src); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst = ggl_blendfactor_to_needs(dst); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src_alpha = ggl_blendfactor_to_needs(src_alpha); 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst_alpha = ggl_blendfactor_to_needs(dst_alpha); 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( src, BLEND_SRC ); 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( dst, BLEND_DST ); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.blend.alpha_separate) { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( src_alpha, BLEND_SRCA ); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( dst_alpha, BLEND_DSTA ); 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( src, BLEND_SRCA ); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( dst, BLEND_DSTA ); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( GGL_ONE, BLEND_SRC ); 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( GGL_ZERO, BLEND_DST ); 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( GGL_ONE, BLEND_SRCA ); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS( GGL_ZERO, BLEND_DSTA ); 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS(c->state.mask.color^0xF, MASK_ARGB); 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_SMOOTH) ?1:0, SHADE); 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_TMUS) { 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_W) ?1:0, W); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_DITHER) ?1:0, P_DITHER); 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_AA) ?1:0, P_AA); 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS((enables & GGL_ENABLE_FOG) ?1:0, P_FOG); 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_LOGIC_OP) { 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS(c->state.logic_op.opcode, LOGIC_OP); 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project n |= GGL_BUILD_NEEDS(GGL_COPY, LOGIC_OP); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_ALPHA_TEST) { 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS(c->state.alpha_test.func, P_ALPHA_TEST); 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS(GGL_ALWAYS, P_ALPHA_TEST); 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_DEPTH_TEST) { 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS(c->state.depth_test.func, P_DEPTH_TEST); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS(c->state.mask.depth&1, P_MASK_Z); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p |= GGL_BUILD_NEEDS(GGL_ALWAYS, P_DEPTH_TEST); 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // writing to the z-buffer is always disabled if depth-test 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // is disabled. 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_needs.n = n; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_needs.p = p; 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->dirty & GGL_TMU_STATE) { 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int idx = 0; 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const texture_t& tx = c->state.texture[i]; 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.enable) { 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t t = 0; 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(tx.surface.format, T_FORMAT); 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(ggl_env_to_needs(tx.env), T_ENV); 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(0, T_POT); // XXX: not used yet 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.s_coord==GGL_ONE_TO_ONE && tx.t_coord==GGL_ONE_TO_ONE) { 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we encode 1-to-1 into the wrap mode 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(GGL_NEEDS_WRAP_11, T_S_WRAP); 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(GGL_NEEDS_WRAP_11, T_T_WRAP); 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(ggl_wrap_to_needs(tx.s_wrap), T_S_WRAP); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(ggl_wrap_to_needs(tx.t_wrap), T_T_WRAP); 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.mag_filter == GGL_LINEAR) { 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(1, T_LINEAR); 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.min_filter == GGL_LINEAR) { 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t |= GGL_BUILD_NEEDS(1, T_LINEAR); 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_needs.t[idx++] = t; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new_needs.t[i] = 0; 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (new_needs != c->state.needs) { 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->state.needs = new_needs; 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ggl_pick_texture(c); 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ggl_pick_cb(c); 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ggl_pick_scanline(c); 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->dirty = 0; 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 174