| /* |
| * Copyright (C) 2011 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.android.ide.eclipse.gltrace.model; |
| |
| import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage; |
| import com.android.ide.eclipse.gltrace.ProtoBufUtils; |
| import com.android.ide.eclipse.gltrace.TraceFileInfo; |
| import com.android.ide.eclipse.gltrace.TraceFileReader; |
| |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Display; |
| |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.io.RandomAccessFile; |
| import java.util.Collections; |
| import java.util.List; |
| |
| /** GLTrace is the in memory model of a OpenGL trace file. */ |
| public class GLTrace { |
| private static final TraceFileReader sTraceFileReader = new TraceFileReader(); |
| |
| /** Information regarding the trace file. */ |
| private final TraceFileInfo mTraceFileInfo; |
| |
| /** List of frames in the trace. */ |
| private final List<GLFrame> mGLFrames; |
| |
| /** List of GL Calls comprising the trace. */ |
| private final List<GLCall> mGLCalls; |
| |
| /** List of context ids used by the application. */ |
| private List<Integer> mContextIds; |
| |
| public GLTrace(TraceFileInfo traceFileInfo, List<GLFrame> glFrames, List<GLCall> glCalls, |
| List<Integer> contextIds) { |
| mTraceFileInfo = traceFileInfo; |
| mGLFrames = glFrames; |
| mGLCalls = glCalls; |
| mContextIds = contextIds; |
| } |
| |
| public List<GLFrame> getFrames() { |
| return mGLFrames; |
| } |
| |
| public GLFrame getFrame(int i) { |
| return mGLFrames.get(i); |
| } |
| |
| public List<GLCall> getGLCalls() { |
| return mGLCalls; |
| } |
| |
| public List<GLCall> getGLCallsForFrame(int frameIndex) { |
| if (frameIndex >= mGLFrames.size()) { |
| return Collections.emptyList(); |
| } |
| |
| GLFrame frame = mGLFrames.get(frameIndex); |
| return mGLCalls.subList(frame.getStartIndex(), frame.getEndIndex()); |
| } |
| |
| public Image getImage(GLCall c) { |
| if (!c.hasFb()) { |
| return null; |
| } |
| |
| if (isTraceFileModified()) { |
| return null; |
| } |
| |
| RandomAccessFile file; |
| try { |
| file = new RandomAccessFile(mTraceFileInfo.getPath(), "r"); //$NON-NLS-1$ |
| } catch (FileNotFoundException e1) { |
| return null; |
| } |
| |
| GLMessage m = null; |
| try { |
| m = sTraceFileReader.getMessageAtOffset(file, c.getOffsetInTraceFile()); |
| } catch (Exception e) { |
| return null; |
| } finally { |
| try { |
| file.close(); |
| } catch (IOException e) { |
| // ignore exception while closing file |
| } |
| } |
| |
| return ProtoBufUtils.getImage(Display.getCurrent(), m); |
| } |
| |
| private boolean isTraceFileModified() { |
| File f = new File(mTraceFileInfo.getPath()); |
| return f.length() != mTraceFileInfo.getSize() |
| || f.lastModified() != mTraceFileInfo.getLastModificationTime(); |
| } |
| |
| public List<Integer> getContexts() { |
| return mContextIds; |
| } |
| } |