1cfd74d65d832137e20e193c960802afba73b5d38sm/*
23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project
3cfd74d65d832137e20e193c960802afba73b5d38sm *
4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License");
5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License.
6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at
7cfd74d65d832137e20e193c960802afba73b5d38sm *
8cfd74d65d832137e20e193c960802afba73b5d38sm *      http://www.apache.org/licenses/LICENSE-2.0
9cfd74d65d832137e20e193c960802afba73b5d38sm *
10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software
11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS,
12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and
14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License.
15cfd74d65d832137e20e193c960802afba73b5d38sm */
16cfd74d65d832137e20e193c960802afba73b5d38sm
17cfd74d65d832137e20e193c960802afba73b5d38sm
18cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland;
19cfd74d65d832137e20e193c960802afba73b5d38sm
20cfd74d65d832137e20e193c960802afba73b5d38sm/**
21cfd74d65d832137e20e193c960802afba73b5d38sm * This class manages drawable objects that have short lifetimes (one or two frames).  It provides
22cfd74d65d832137e20e193c960802afba73b5d38sm * type-specific allocator functions and a type-insensitive release function.  This class manages
23cfd74d65d832137e20e193c960802afba73b5d38sm * pools of objects so no actual allocations occur after bootstrap.
24cfd74d65d832137e20e193c960802afba73b5d38sm */
25cfd74d65d832137e20e193c960802afba73b5d38smpublic class DrawableFactory extends BaseObject {
262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm    private final static int BITMAP_POOL_SIZE = 768;
27cfd74d65d832137e20e193c960802afba73b5d38sm
28cfd74d65d832137e20e193c960802afba73b5d38sm    private DrawableBitmapPool mBitmapPool;
29cfd74d65d832137e20e193c960802afba73b5d38sm    private ScrollableBitmapPool mScrollableBitmapPool;
30cfd74d65d832137e20e193c960802afba73b5d38sm    private TiledBackgroundVertexGridPool mTiledBackgroundVertexGridPool;
31cfd74d65d832137e20e193c960802afba73b5d38sm
32cfd74d65d832137e20e193c960802afba73b5d38sm    // This class wraps several object pools and provides a type-sensitive release function.
33cfd74d65d832137e20e193c960802afba73b5d38sm    public DrawableFactory() {
34cfd74d65d832137e20e193c960802afba73b5d38sm        super();
35cfd74d65d832137e20e193c960802afba73b5d38sm        mBitmapPool = new DrawableBitmapPool(BITMAP_POOL_SIZE);
36cfd74d65d832137e20e193c960802afba73b5d38sm        mTiledBackgroundVertexGridPool = new TiledBackgroundVertexGridPool();
37cfd74d65d832137e20e193c960802afba73b5d38sm        mScrollableBitmapPool = new ScrollableBitmapPool();
38cfd74d65d832137e20e193c960802afba73b5d38sm    }
39cfd74d65d832137e20e193c960802afba73b5d38sm
40cfd74d65d832137e20e193c960802afba73b5d38sm    @Override
41cfd74d65d832137e20e193c960802afba73b5d38sm    public void reset() {
42cfd74d65d832137e20e193c960802afba73b5d38sm    }
43cfd74d65d832137e20e193c960802afba73b5d38sm
44cfd74d65d832137e20e193c960802afba73b5d38sm    public DrawableBitmap allocateDrawableBitmap() {
45cfd74d65d832137e20e193c960802afba73b5d38sm        return mBitmapPool.allocate();
46cfd74d65d832137e20e193c960802afba73b5d38sm    }
47cfd74d65d832137e20e193c960802afba73b5d38sm
48cfd74d65d832137e20e193c960802afba73b5d38sm    public TiledBackgroundVertexGrid allocateTiledBackgroundVertexGrid() {
49cfd74d65d832137e20e193c960802afba73b5d38sm        return mTiledBackgroundVertexGridPool.allocate();
50cfd74d65d832137e20e193c960802afba73b5d38sm    }
51cfd74d65d832137e20e193c960802afba73b5d38sm
52cfd74d65d832137e20e193c960802afba73b5d38sm    public ScrollableBitmap allocateScrollableBitmap() {
53cfd74d65d832137e20e193c960802afba73b5d38sm        return mScrollableBitmapPool.allocate();
54cfd74d65d832137e20e193c960802afba73b5d38sm    }
55cfd74d65d832137e20e193c960802afba73b5d38sm
56cfd74d65d832137e20e193c960802afba73b5d38sm    public void release(DrawableObject object) {
57cfd74d65d832137e20e193c960802afba73b5d38sm        ObjectPool pool = object.getParentPool();
58cfd74d65d832137e20e193c960802afba73b5d38sm        if (pool != null) {
59cfd74d65d832137e20e193c960802afba73b5d38sm            pool.release(object);
60cfd74d65d832137e20e193c960802afba73b5d38sm        }
61cfd74d65d832137e20e193c960802afba73b5d38sm        // Objects with no pool weren't created by this factory.  Ignore them.
62cfd74d65d832137e20e193c960802afba73b5d38sm    }
63cfd74d65d832137e20e193c960802afba73b5d38sm
64cfd74d65d832137e20e193c960802afba73b5d38sm    private class DrawableBitmapPool extends TObjectPool<DrawableBitmap> {
65cfd74d65d832137e20e193c960802afba73b5d38sm
66cfd74d65d832137e20e193c960802afba73b5d38sm        public DrawableBitmapPool(int size) {
67cfd74d65d832137e20e193c960802afba73b5d38sm            super(size);
68cfd74d65d832137e20e193c960802afba73b5d38sm        }
69cfd74d65d832137e20e193c960802afba73b5d38sm
70cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
71cfd74d65d832137e20e193c960802afba73b5d38sm        public void reset() {
72cfd74d65d832137e20e193c960802afba73b5d38sm        }
73cfd74d65d832137e20e193c960802afba73b5d38sm
74cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
75cfd74d65d832137e20e193c960802afba73b5d38sm        protected void fill() {
76cfd74d65d832137e20e193c960802afba73b5d38sm            int size = getSize();
77cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < size; x++) {
78cfd74d65d832137e20e193c960802afba73b5d38sm                DrawableBitmap entry = new DrawableBitmap(null, 0, 0);
79cfd74d65d832137e20e193c960802afba73b5d38sm                entry.setParentPool(this);
80cfd74d65d832137e20e193c960802afba73b5d38sm                getAvailable().add(entry);
81cfd74d65d832137e20e193c960802afba73b5d38sm            }
82cfd74d65d832137e20e193c960802afba73b5d38sm        }
83cfd74d65d832137e20e193c960802afba73b5d38sm
84cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
85cfd74d65d832137e20e193c960802afba73b5d38sm        public void release(Object entry) {
86cfd74d65d832137e20e193c960802afba73b5d38sm            ((DrawableBitmap)entry).reset();
87cfd74d65d832137e20e193c960802afba73b5d38sm            super.release(entry);
88cfd74d65d832137e20e193c960802afba73b5d38sm        }
89cfd74d65d832137e20e193c960802afba73b5d38sm
90cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
91cfd74d65d832137e20e193c960802afba73b5d38sm        public DrawableBitmap allocate() {
92cfd74d65d832137e20e193c960802afba73b5d38sm            DrawableBitmap result = super.allocate();
93cfd74d65d832137e20e193c960802afba73b5d38sm            ContextParameters params = sSystemRegistry.contextParameters;
94cfd74d65d832137e20e193c960802afba73b5d38sm            if (result != null && params != null) {
95cfd74d65d832137e20e193c960802afba73b5d38sm                result.setViewSize(params.gameWidth, params.gameHeight);
96cfd74d65d832137e20e193c960802afba73b5d38sm            }
97cfd74d65d832137e20e193c960802afba73b5d38sm            return result;
98cfd74d65d832137e20e193c960802afba73b5d38sm        }
99cfd74d65d832137e20e193c960802afba73b5d38sm    }
100cfd74d65d832137e20e193c960802afba73b5d38sm
101cfd74d65d832137e20e193c960802afba73b5d38sm    private class ScrollableBitmapPool extends TObjectPool<ScrollableBitmap> {
102cfd74d65d832137e20e193c960802afba73b5d38sm
103cfd74d65d832137e20e193c960802afba73b5d38sm        public ScrollableBitmapPool() {
104cfd74d65d832137e20e193c960802afba73b5d38sm            super();
105cfd74d65d832137e20e193c960802afba73b5d38sm        }
106cfd74d65d832137e20e193c960802afba73b5d38sm
107cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
108cfd74d65d832137e20e193c960802afba73b5d38sm        public void reset() {
109cfd74d65d832137e20e193c960802afba73b5d38sm        }
110cfd74d65d832137e20e193c960802afba73b5d38sm
111cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
112cfd74d65d832137e20e193c960802afba73b5d38sm        protected void fill() {
113cfd74d65d832137e20e193c960802afba73b5d38sm            int size = getSize();
114cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < size; x++) {
115cfd74d65d832137e20e193c960802afba73b5d38sm                ScrollableBitmap entry = new ScrollableBitmap(null, 0, 0);
116cfd74d65d832137e20e193c960802afba73b5d38sm                entry.setParentPool(this);
117cfd74d65d832137e20e193c960802afba73b5d38sm                getAvailable().add(entry);
118cfd74d65d832137e20e193c960802afba73b5d38sm            }
119cfd74d65d832137e20e193c960802afba73b5d38sm        }
120cfd74d65d832137e20e193c960802afba73b5d38sm
121cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
122cfd74d65d832137e20e193c960802afba73b5d38sm        public void release(Object entry) {
123cfd74d65d832137e20e193c960802afba73b5d38sm            ((ScrollableBitmap)entry).reset();
124cfd74d65d832137e20e193c960802afba73b5d38sm            super.release(entry);
125cfd74d65d832137e20e193c960802afba73b5d38sm        }
126cfd74d65d832137e20e193c960802afba73b5d38sm
127cfd74d65d832137e20e193c960802afba73b5d38sm
128cfd74d65d832137e20e193c960802afba73b5d38sm    }
129cfd74d65d832137e20e193c960802afba73b5d38sm
130cfd74d65d832137e20e193c960802afba73b5d38sm    private class TiledBackgroundVertexGridPool extends TObjectPool<TiledBackgroundVertexGrid> {
131cfd74d65d832137e20e193c960802afba73b5d38sm
132cfd74d65d832137e20e193c960802afba73b5d38sm        public TiledBackgroundVertexGridPool() {
133cfd74d65d832137e20e193c960802afba73b5d38sm            super();
134cfd74d65d832137e20e193c960802afba73b5d38sm        }
135cfd74d65d832137e20e193c960802afba73b5d38sm
136cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
137cfd74d65d832137e20e193c960802afba73b5d38sm        public void reset() {
138cfd74d65d832137e20e193c960802afba73b5d38sm        }
139cfd74d65d832137e20e193c960802afba73b5d38sm
140cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
141cfd74d65d832137e20e193c960802afba73b5d38sm        protected void fill() {
142cfd74d65d832137e20e193c960802afba73b5d38sm            int size = getSize();
143cfd74d65d832137e20e193c960802afba73b5d38sm            for (int x = 0; x < size; x++) {
144cfd74d65d832137e20e193c960802afba73b5d38sm                TiledBackgroundVertexGrid entry = new TiledBackgroundVertexGrid();
145cfd74d65d832137e20e193c960802afba73b5d38sm                entry.setParentPool(this);
146cfd74d65d832137e20e193c960802afba73b5d38sm                getAvailable().add(entry);
147cfd74d65d832137e20e193c960802afba73b5d38sm            }
148cfd74d65d832137e20e193c960802afba73b5d38sm        }
149cfd74d65d832137e20e193c960802afba73b5d38sm
150cfd74d65d832137e20e193c960802afba73b5d38sm        @Override
151cfd74d65d832137e20e193c960802afba73b5d38sm        public void release(Object entry) {
152cfd74d65d832137e20e193c960802afba73b5d38sm            TiledBackgroundVertexGrid bg = (TiledBackgroundVertexGrid)entry;
153cfd74d65d832137e20e193c960802afba73b5d38sm            bg.reset();
154cfd74d65d832137e20e193c960802afba73b5d38sm            super.release(entry);
155cfd74d65d832137e20e193c960802afba73b5d38sm        }
156cfd74d65d832137e20e193c960802afba73b5d38sm
157cfd74d65d832137e20e193c960802afba73b5d38sm    }
158cfd74d65d832137e20e193c960802afba73b5d38sm}
159