| /* |
| * 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; |
| |
| import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage; |
| |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.ImageData; |
| import org.eclipse.swt.graphics.PaletteData; |
| import org.eclipse.swt.widgets.Display; |
| import org.liblzf.CLZF; |
| |
| /** Utilities to deal with protobuf encoded {@link GLMessage}. */ |
| public class ProtoBufUtils { |
| private static ImageData getImageData(GLMessage glMsg) { |
| int width = glMsg.getFb().getWidth(); |
| int height = glMsg.getFb().getHeight(); |
| |
| if (width * height == 0) { |
| return null; |
| } |
| |
| byte[] compressed = glMsg.getFb().getContents(0).toByteArray(); |
| byte[] uncompressed = new byte[width * height * 4]; |
| |
| int size = CLZF.lzf_decompress(compressed, compressed.length, |
| uncompressed, uncompressed.length); |
| assert size == width * height * 4 : "Unexpected image size after decompression."; |
| |
| int redMask = 0xff000000; |
| int greenMask = 0x00ff0000; |
| int blueMask = 0x0000ff00; |
| PaletteData palette = new PaletteData(redMask, greenMask, blueMask); |
| ImageData imageData = new ImageData( |
| width, |
| height, |
| 32, // depth |
| palette, |
| 1, // scan line padding |
| uncompressed); |
| byte[] alpha = new byte[width*height]; |
| for (int i = 0; i < width * height; i++) { |
| alpha[i] = uncompressed[i * 4 + 3]; |
| } |
| imageData.alphaData = alpha; |
| |
| imageData = imageData.scaledTo(imageData.width, -imageData.height); |
| return imageData; |
| } |
| |
| /** Obtains the image stored in provided protocol buffer message. */ |
| public static Image getImage(Display display, GLMessage glMsg) { |
| if (!glMsg.hasFb()) { |
| return null; |
| } |
| |
| ImageData imageData = null; |
| try { |
| imageData = getImageData(glMsg); |
| } catch (Exception e) { |
| GlTracePlugin.getDefault().logMessage( |
| "Unexpected error while retrieving framebuffer image: " + e); |
| return null; |
| } |
| |
| if (imageData == null) { |
| return null; |
| } |
| |
| return new Image(display, imageData); |
| } |
| } |