/*
** Copyright 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.glesv2debugger;
import com.android.glesv2debugger.DebuggerMessage.Message;
import com.android.glesv2debugger.DebuggerMessage.Message.Function;
import com.android.glesv2debugger.DebuggerMessage.Message.Type;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.widgets.Display;
public class MessageData {
public final Message msg;
private Image image = null; // texture
public String shader = null; // shader source
public String text;
public String[] columns = new String[3];
float[][] attribs = null;
short[] indices;
public MessageData(final Device device, final Message msg, final Context context) {
this.msg = msg;
StringBuilder builder = new StringBuilder();
final Function function = msg.getFunction();
if (function != Message.Function.ACK && msg.getType() != Type.BeforeCall)
assert msg.hasTime();
builder.append(columns[0] = function.name());
while (builder.length() < 30)
builder.append(' ');
columns[1] = String.format("%.3f", msg.getTime());
if (msg.hasClock())
columns[1] += String.format(":%.3f", msg.getClock());
builder.append(columns[1]);
builder.append(" ");
builder.append(String.format("0x%08X", msg.getContextId()));
builder.append(" ");
columns[2] = "";
if (msg.getType() == Type.BeforeCall) // incomplete call, client SKIPPED
columns[2] = "[BeforeCall(AfterCall missing)] ";
else if (msg.getType() == Type.AfterGeneratedCall)
columns[2] = "[AfterGeneratedCall] ";
else
assert msg.getType() == Type.CompleteCall;
columns[2] += MessageFormatter.format(msg, false);
builder.append(columns[2]);
switch (function) {
case glDrawArrays:
if (!msg.hasArg7())
break;
context.serverVertex.glDrawArrays(this);
break;
case glDrawElements:
if (!msg.hasArg7())
break;
context.serverVertex.glDrawElements(this);
break;
case glShaderSource:
shader = msg.getData().toStringUtf8();
break;
}
text = builder.toString();
}
public Image getImage() {
if (image != null)
return image;
ImageData imageData = null;
switch (msg.getFunction()) {
case glTexImage2D:
if (!msg.hasData())
return null;
imageData = MessageProcessor.receiveImage(msg.getArg3(), msg
.getArg4(), msg.getArg6(), msg.getArg7(), msg.getData());
return image = new Image(Display.getCurrent(), imageData);
case glTexSubImage2D:
assert msg.hasData();
imageData = MessageProcessor.receiveImage(msg.getArg4(), msg
.getArg5(), msg.getArg6(), msg.getArg7(), msg.getData());
return image = new Image(Display.getCurrent(), imageData);
case glCopyTexImage2D:
imageData = MessageProcessor.receiveImage(msg.getArg5(), msg.getArg6(),
msg.getPixelFormat(), msg.getPixelType(), msg.getData());
imageData = imageData.scaledTo(imageData.width, -imageData.height);
return image = new Image(Display.getCurrent(), imageData);
case glCopyTexSubImage2D:
imageData = MessageProcessor.receiveImage(msg.getArg6(), msg.getArg7(),
msg.getPixelFormat(), msg.getPixelType(), msg.getData());
imageData = imageData.scaledTo(imageData.width, -imageData.height);
return image = new Image(Display.getCurrent(), imageData);
case glReadPixels:
if (!msg.hasData())
return null;
imageData = MessageProcessor.receiveImage(msg.getArg2(), msg.getArg3(),
msg.getArg4(), msg.getArg5(), msg.getData());
imageData = imageData.scaledTo(imageData.width, -imageData.height);
return image = new Image(Display.getCurrent(), imageData);
case eglSwapBuffers:
if (!msg.hasData())
return null;
imageData = MessageProcessor.receiveImage(msg.getImageWidth(),
msg.getImageHeight(), msg.getPixelFormat(), msg.getPixelType(),
msg.getData());
imageData = imageData.scaledTo(imageData.width, -imageData.height);
return image = new Image(Display.getCurrent(), imageData);
default:
return null;
}
}
}