• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.ide.eclipse.gltrace;
18 
19 import com.android.ide.eclipse.gltrace.GLProtoBuf.GLMessage;
20 
21 import org.eclipse.swt.graphics.Image;
22 import org.eclipse.swt.graphics.ImageData;
23 import org.eclipse.swt.graphics.PaletteData;
24 import org.eclipse.swt.widgets.Display;
25 import org.liblzf.CLZF;
26 
27 /** Utilities to deal with protobuf encoded {@link GLMessage}. */
28 public class ProtoBufUtils {
getImageData(GLMessage glMsg)29     private static ImageData getImageData(GLMessage glMsg) {
30         int width = glMsg.getFb().getWidth();
31         int height = glMsg.getFb().getHeight();
32 
33         if (width * height == 0) {
34             return null;
35         }
36 
37         byte[] compressed = glMsg.getFb().getContents(0).toByteArray();
38         byte[] uncompressed = new byte[width * height * 4];
39 
40         int size = CLZF.lzf_decompress(compressed, compressed.length,
41                                 uncompressed, uncompressed.length);
42         assert size == width * height * 4 : "Unexpected image size after decompression.";
43 
44         int redMask   = 0xff000000;
45         int greenMask = 0x00ff0000;
46         int blueMask  = 0x0000ff00;
47         PaletteData palette = new PaletteData(redMask, greenMask, blueMask);
48         ImageData imageData = new ImageData(
49                 width,
50                 height,
51                 32,         // depth
52                 palette,
53                 1,          // scan line padding
54                 uncompressed);
55         byte[] alpha = new byte[width*height];
56         for (int i = 0; i < width * height; i++) {
57             alpha[i] = uncompressed[i * 4 + 3];
58         }
59         imageData.alphaData = alpha;
60 
61         imageData = imageData.scaledTo(imageData.width, -imageData.height);
62         return imageData;
63     }
64 
65     /** Obtains the image stored in provided protocol buffer message. */
getImage(Display display, GLMessage glMsg)66     public static Image getImage(Display display, GLMessage glMsg) {
67         if (!glMsg.hasFb()) {
68             return null;
69         }
70 
71         ImageData imageData = null;
72         try {
73             imageData = getImageData(glMsg);
74         } catch (Exception e) {
75             GlTracePlugin.getDefault().logMessage(
76                     "Unexpected error while retrieving framebuffer image: " + e);
77             return null;
78         }
79 
80         if (imageData == null) {
81             return null;
82         }
83 
84         return new Image(display, imageData);
85     }
86 }
87