/* * 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; } }