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