/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cooliris.media;
import java.util.ArrayList;
import java.util.HashMap;
// CR: comment.
public final class DisplayList {
private DirectLinkedList<DisplayItem> mAnimatables = new DirectLinkedList<DisplayItem>();
private HashMap<MediaItem, DisplayItem> mDisplayMap = new HashMap<MediaItem, DisplayItem>(1024);
private ArrayList<DisplayItem> mItems = new ArrayList<DisplayItem>(1024);
public DisplayItem get(MediaItem item) {
HashMap<MediaItem, DisplayItem> displayMap = mDisplayMap;
DisplayItem displayItem = displayMap.get(item);
if (displayItem == null) {
displayItem = new DisplayItem(item);
displayMap.put(item, displayItem);
mItems.add(displayItem);
}
return displayItem;
}
public void setPositionAndStackIndex(DisplayItem item, Vector3f position, int stackId, boolean performTransition) {
item.set(position, stackId, performTransition);
if (!performTransition) {
item.commit();
} else {
markIfDirty(item);
}
}
public void setHasFocus(DisplayItem item, boolean hasFocus, boolean pushDown) {
boolean currentHasFocus = item.getHasFocus();
if (currentHasFocus != hasFocus) {
item.setHasFocus(hasFocus, pushDown);
markIfDirty(item);
}
}
public final void setOffset(DisplayItem item, boolean useOffset, boolean pushDown, float span, float dx1, float dy1, float dx2, float dy2) {
item.setOffset(useOffset, pushDown, span, dx1, dy1, dx2, dy2);
markIfDirty(item);
}
public final void setSingleOffset(DisplayItem item, boolean useOffset, boolean pushAway, float x, float y, float z, float spreadValue) {
item.setSingleOffset(useOffset, pushAway, x, y, z, spreadValue);
markIfDirty(item);
}
public ArrayList<DisplayItem> getAllDisplayItems() {
return mItems;
}
public void update(float timeElapsed) {
final DirectLinkedList<DisplayItem> animatables = mAnimatables;
synchronized (animatables) {
DirectLinkedList.Entry<DisplayItem> entry = animatables.getHead();
while (entry != null) {
DisplayItem item = entry.value;
item.update(timeElapsed);
if (!item.isAnimating()) {
entry = animatables.remove(entry);
} else {
entry = entry.next;
}
}
}
}
public int getNumAnimatables() {
return mAnimatables.size();
}
public void setAlive(DisplayItem item, boolean alive) {
item.mAlive = alive;
if (alive && item.isAnimating()) {
final DirectLinkedList.Entry<DisplayItem> entry = item.getAnimatablesEntry();
if (!entry.inserted) {
mAnimatables.add(entry);
}
}
}
public void commit(DisplayItem item) {
item.commit();
final DirectLinkedList<DisplayItem> animatables = mAnimatables;
synchronized (animatables) {
animatables.remove(item.getAnimatablesEntry());
}
}
public void addToAnimatables(DisplayItem item) {
final DirectLinkedList.Entry<DisplayItem> entry = item.getAnimatablesEntry();
if (!entry.inserted) {
final DirectLinkedList<DisplayItem> animatables = mAnimatables;
synchronized (animatables) {
animatables.add(entry);
}
}
}
private void markIfDirty(DisplayItem item) {
if (item.isAnimating()) {
addToAnimatables(item);
}
}
public void clear() {
mDisplayMap.clear();
synchronized (mItems) {
mItems.clear();
}
}
public void clearExcept(DisplayItem[] displayItems) {
HashMap<MediaItem, DisplayItem> displayMap = mDisplayMap;
displayMap.clear();
synchronized (mItems) {
mItems.clear();
int numItems = displayItems.length;
for (int i = 0; i < numItems; ++i) {
DisplayItem displayItem = displayItems[i];
if (displayItem != null) {
displayMap.put(displayItem.mItemRef, displayItem);
mItems.add(displayItem);
}
}
}
}
}