diff options
author | Siva Velusamy <vsiva@google.com> | 2012-01-24 16:28:18 -0800 |
---|---|---|
committer | Siva Velusamy <vsiva@google.com> | 2012-01-24 16:50:08 -0800 |
commit | edca7488ef5ebb2bc10d551a3367c683fa93aef8 (patch) | |
tree | 78f62764871a46397ff84f6f03de689a355579c3 | |
parent | 1735cb6f41d8ccbc705056565f344ac0cda1365b (diff) | |
download | sdk-edca7488ef5ebb2bc10d551a3367c683fa93aef8.zip sdk-edca7488ef5ebb2bc10d551a3367c683fa93aef8.tar.gz sdk-edca7488ef5ebb2bc10d551a3367c683fa93aef8.tar.bz2 |
gltrace: add a texture view to display the texture image
This patch adds a new view that displays the texture image
in an ImageCanvas.
The code shared between the FrameBufferView and the TextureView
have now been moved to an abstract ImageViewPart class.
The GL state view provides selection events that are listened
to by the texture view. When a texture property is selected,
the appropriate texture image is displayed in the texture view.
Change-Id: I5f192c88ace447e267d1b3c110ab9bfd39864321
8 files changed, 283 insertions, 77 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml index 798175b..9d0accb 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml @@ -31,6 +31,14 @@ name="GL State"
restorable="true">
</view>
+ <view
+ category="com.android.ide.eclipse.gltrace"
+ class="com.android.ide.eclipse.gltrace.views.TextureView"
+ icon="icons/opengl.png"
+ id="com.android.ide.eclipse.gltrace.views.Texture"
+ name="Texture"
+ restorable="true">
+ </view>
</extension>
<extension
point="org.eclipse.ui.editors">
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java index 6f4ee7e..6ff0419 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java @@ -18,25 +18,39 @@ package com.android.ide.eclipse.gltrace; import com.android.ide.eclipse.gltrace.views.GLFramebufferView; import com.android.ide.eclipse.gltrace.views.StateView; +import com.android.ide.eclipse.gltrace.views.TextureView; import org.eclipse.ui.IFolderLayout; import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPerspectiveFactory; public class GLTracePerspective implements IPerspectiveFactory { - private static final String STATE_FOLDER_ID = "right"; //$NON-NLS-1$ - private static final String FB_FOLDER_ID = "rightBottom"; //$NON-NLS-1$ + private static final String STATE_FOLDER_ID = "stateFolder"; //$NON-NLS-1$ + private static final String FB_FOLDER_ID = "fbFolder"; //$NON-NLS-1$ + private static final String TEXTURE_VIEW_FOLDER_ID = "textureViewFolder"; //$NON-NLS-1$ @Override public void createInitialLayout(IPageLayout layout) { + // Create a 3 column layout + // The first column contains the function trace in an editor. + // The second column contains the GL State View. + // The third column contains the texture view and the top and the framebuffer at the bottom. + // Add the OpenGL state view to the right of the editor - IFolderLayout right = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.7f, + IFolderLayout column2 = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.65f, layout.getEditorArea()); - right.addView(StateView.ID); + column2.addView(StateView.ID); - // Add the OpenGL Framebuffer view below the state view - IFolderLayout rightBottom = layout.createFolder(FB_FOLDER_ID, IPageLayout.BOTTOM, 0.6f, + // Add the Texture View in the 3rd column + IFolderLayout column3 = layout.createFolder(FB_FOLDER_ID, IPageLayout.RIGHT, 0.6f, STATE_FOLDER_ID); - rightBottom.addView(GLFramebufferView.ID); + column3.addView(TextureView.ID); + + // Add the OpenGL Framebuffer view below the texture view (bottom of 3rd column) + IFolderLayout column3bottom = layout.createFolder(TEXTURE_VIEW_FOLDER_ID, + IPageLayout.BOTTOM, + 0.5f, + FB_FOLDER_ID); + column3bottom.addView(GLFramebufferView.ID); } } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java index 40e0a2a..5635825 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java @@ -28,6 +28,8 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; @@ -52,7 +54,7 @@ import java.util.Set; * A tree view of the OpenGL state. It listens to the current GLCall that is selected * in the Function Trace view, and updates its view to reflect the state as of the selected call. */ -public class StateViewPage extends Page implements ISelectionListener { +public class StateViewPage extends Page implements ISelectionListener, ISelectionProvider { public static final String ID = "com.android.ide.eclipse.gltrace.views.GLState"; //$NON-NLS-1$ private final GLTrace mTrace; @@ -261,4 +263,24 @@ public class StateViewPage extends Page implements ISelectionListener { return changedProperties; } + + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + mTreeViewer.addSelectionChangedListener(listener); + } + + @Override + public ISelection getSelection() { + return mTreeViewer.getSelection(); + } + + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + mTreeViewer.removeSelectionChangedListener(listener); + } + + @Override + public void setSelection(ISelection selection) { + mTreeViewer.setSelection(selection); + } } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java index af435af..14a93e3 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java @@ -57,6 +57,6 @@ public class GLStringProperty extends GLAbstractAtomicProperty { @Override public String toString() { - return mCurrentValue; + return getType() + "=" + getStringValue(); //$NON-NLS-1$ }; } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java index d7718109..634a733 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java @@ -16,90 +16,26 @@ package com.android.ide.eclipse.gltrace.views; -import com.android.ide.eclipse.gldebugger.Activator; import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer; import com.android.ide.eclipse.gltrace.model.GLCall; import com.android.ide.eclipse.gltrace.model.GLTrace; -import com.android.ide.eclipse.gltrace.widgets.ImageCanvas; -import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.ISelectionListener; -import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.part.ViewPart; import java.util.List; -public class GLFramebufferView extends ViewPart implements ISelectionListener { - public static final String ID = "com.android.ide.eclipse.gltrace.views.GLFrameBuffer"; //$NON-NLS-1$ - private static final boolean FIT_TO_CANVAS_DEFAULT = true; - private ImageCanvas mImageCanvas; - +public class GLFramebufferView extends ImageViewPart { public GLFramebufferView() { + super(true); } - @Override - public void createPartControl(Composite parent) { - createImageCanvas(parent); - createToolbar(); - - ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); - selectionService.addPostSelectionListener(this); - } - - @Override - public void dispose() { - if (mImageCanvas != null) { - mImageCanvas.dispose(); - mImageCanvas = null; - } - - ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); - selectionService.removePostSelectionListener(this); - super.dispose(); - } - - @Override - public void setFocus() { - if (mImageCanvas != null) { - mImageCanvas.setFocus(); - } - } - - private class FitToCanvasAction extends Action { - public FitToCanvasAction() { - super("Fit to Canvas", Activator.getImageDescriptor("/icons/zoomfit.png")); //$NON-NLS-2$ - setToolTipText("Fit Image to Canvas"); - setChecked(FIT_TO_CANVAS_DEFAULT); - } - - @Override - public void run() { - mImageCanvas.setFitToCanvas(isChecked()); - } - } - - private void createImageCanvas(Composite parent) { - mImageCanvas = new ImageCanvas(parent); - mImageCanvas.setFitToCanvas(FIT_TO_CANVAS_DEFAULT); - } - - private void createToolbar() { - getViewSite().getActionBars().getToolBarManager().add(new FitToCanvasAction()); - } + public static final String ID = "com.android.ide.eclipse.gltrace.views.GLFrameBuffer"; //$NON-NLS-1$ public void displayFB(final Image image) { - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() { - mImageCanvas.setImage(image); - } - }); + setImage(image); } @Override diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java new file mode 100644 index 0000000..67b879a --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2012 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.views; + +import com.android.ide.eclipse.gldebugger.Activator; +import com.android.ide.eclipse.gltrace.widgets.ImageCanvas; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.ISelectionService; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.part.ViewPart; + +/** + * The {@link ImageViewPart} is an abstract implementation of an Eclipse View + * that holds an image canvas. This class registers itself to listen to the workbench + * selection service. Subclasses must implement the + * {@link #selectionChanged(IWorkbenchPart, ISelection)} method, and call {@link #setImage(Image)} + * to update the image to be displayed. + */ +public abstract class ImageViewPart extends ViewPart implements ISelectionListener { + private boolean mFitToCanvasDefault = true; + private ImageCanvas mImageCanvas; + + public ImageViewPart(boolean fitToCanvasByDefault) { + mFitToCanvasDefault = fitToCanvasByDefault; + } + + @Override + public void createPartControl(Composite parent) { + createImageCanvas(parent); + createToolbar(); + + ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); + selectionService.addPostSelectionListener(this); + } + + @Override + public void dispose() { + if (mImageCanvas != null) { + mImageCanvas.dispose(); + mImageCanvas = null; + } + + ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService(); + selectionService.removePostSelectionListener(this); + super.dispose(); + } + + @Override + public void setFocus() { + if (mImageCanvas != null) { + mImageCanvas.setFocus(); + } + } + + private class FitToCanvasAction extends Action { + public FitToCanvasAction() { + super("Fit to Canvas", Activator.getImageDescriptor("/icons/zoomfit.png")); //$NON-NLS-2$ + setToolTipText("Fit Image to Canvas"); + setChecked(mFitToCanvasDefault); + } + + @Override + public void run() { + mImageCanvas.setFitToCanvas(isChecked()); + } + } + + private void createImageCanvas(Composite parent) { + mImageCanvas = new ImageCanvas(parent); + mImageCanvas.setFitToCanvas(mFitToCanvasDefault); + } + + private void createToolbar() { + getViewSite().getActionBars().getToolBarManager().add(new FitToCanvasAction()); + } + + protected void setImage(final Image image) { + Display.getDefault().asyncExec(new Runnable() { + @Override + public void run() { + mImageCanvas.setImage(image); + } + }); + }; + + @Override + public abstract void selectionChanged(IWorkbenchPart part, ISelection selection); +} diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java index cd7669d..c3782ca 100644 --- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java @@ -19,9 +19,11 @@ package com.android.ide.eclipse.gltrace.views; import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer; import com.android.ide.eclipse.gltrace.editors.StateViewPage; +import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.IPage; +import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.part.MessagePage; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.part.PageBookView; @@ -84,4 +86,16 @@ public class StateView extends PageBookView { public void partBroughtToTop(IWorkbenchPart part) { partActivated(part); } + + @Override + protected void showPageRec(PageRec pageRec) { + IPageSite pageSite = getPageSite(pageRec.page); + if (pageRec.page instanceof ISelectionProvider) { + pageSite.setSelectionProvider((ISelectionProvider) pageRec.page); + } else { + pageSite.setSelectionProvider(null); // clear selection provider + } + + super.showPageRec(pageRec); + } } diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java new file mode 100644 index 0000000..a355bae --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2012 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.views; + +import com.android.ide.eclipse.gltrace.state.GLCompositeProperty; +import com.android.ide.eclipse.gltrace.state.GLStateType; +import com.android.ide.eclipse.gltrace.state.GLStringProperty; +import com.android.ide.eclipse.gltrace.state.IGLProperty; + +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbenchPart; + +import java.util.List; + +public class TextureView extends ImageViewPart { + public TextureView() { + super(false); + } + + public static final String ID = "com.android.ide.eclipse.gltrace.views.Texture"; //$NON-NLS-1$ + + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + if (!(part instanceof StateView)) { + return; + } + + if (!(selection instanceof IStructuredSelection)) { + return; + } + + IStructuredSelection ssel = (IStructuredSelection) selection; + @SuppressWarnings("rawtypes") + List objects = ssel.toList(); + if (objects.size() > 0) { + Object data = objects.get(0); + if (!(data instanceof IGLProperty)) { + return; + } + + String textureImagePath = getTextureImage((IGLProperty) data); + if (textureImagePath == null) { + setImage(null); + return; + } + + setImage(getImage(textureImagePath)); + } + } + + private Image getImage(String imagePath) { + return new Image(Display.getDefault(), imagePath); + } + + /** + * Extract the TEXTURE_IMAGE property from the gl state hierarchy. + * The TEXTURE_IMAGE property fits in the hierarchy like so: + * ... + * |---PER_TEXTURE_STATE + * |-- + * |-- TEXTURE_IMAGE + * + * So we can extract the TEXTURE_IMAGE if the given property is either PER_TEXTURE_STATE, + * or a child of PER_TEXTURE_STATE. + */ + private String getTextureImage(IGLProperty property) { + // if the selected property is the texture image, then we just return its value + if (property.getType() == GLStateType.TEXTURE_IMAGE) { + return ((GLStringProperty) property).getStringValue(); + } + + if (property.getType() != GLStateType.PER_TEXTURE_STATE) { + // See if the property is a child of PER_TEXTURE_STATE + IGLProperty parent = property.getParent(); + if (parent == null || parent.getType() != GLStateType.PER_TEXTURE_STATE) { + return null; + } else { + property = parent; + } + } + + // property is now the parent property of TEXTURE_IMAGE + GLCompositeProperty perTextureState = (GLCompositeProperty) property; + IGLProperty imageProperty = perTextureState.getProperty(GLStateType.TEXTURE_IMAGE); + return ((GLStringProperty) imageProperty).getStringValue(); + } +} |