Есть у меня программа-эмулятор, в ней кастомный X сервер. Но мне не хватает 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 18 и 24 битных экранов. Как их туда прописать?
Вот код:
package com.eltechs.axs.xserver.impl.drawables.gl;
import android.support.v4.view.MotionEventCompat;
import com.eltechs.axs.helpers.Assert;
import com.eltechs.axs.xserver.Drawable;
import com.eltechs.axs.xserver.Window;
import com.eltechs.axs.xserver.impl.SmallIdsGenerator;
import com.eltechs.axs.xserver.impl.drawables.DrawablesFactoryImplBase;
import com.eltechs.axs.xserver.impl.drawables.ImageFormat;
import com.eltechs.axs.xserver.impl.drawables.Visual;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.util.ArrayList;
import java.util.Collection;
public class GLDrawablesFactory extends DrawablesFactoryImplBase {
private static final GLDrawablesFinaliserThread drawablesFinalisationThread = new GLDrawablesFinaliserThread(finalisedDrawablesReferenceQueue);
private static final ReferenceQueue<Reference<Drawable>> finalisedDrawablesReferenceQueue = new ReferenceQueue();
static {
drawablesFinalisationThread.start();
}
private GLDrawablesFactory(Collection<Visual> collection, Collection<ImageFormat> collection2, Visual visual) {
super(collection, collection2, visual);
}
public static GLDrawablesFactory create32Depth() {
Visual makeDisplayableVisual = Visual.makeDisplayableVisual(SmallIdsGenerator.generateId(), 32, 24, 16711680, MotionEventCompat.ACTION_POINTER_INDEX_MASK, 255);
Collection arrayList = new ArrayList();
arrayList.add(makeDisplayableVisual);
arrayList.add(Visual.makeNonDisplayableVisual(SmallIdsGenerator.generateId(), 1));
Collection arrayList2 = new ArrayList();
arrayList2.add(new ImageFormat(1, 1, 32));
arrayList2.add(new ImageFormat(24, 32, 32));
arrayList2.add(new ImageFormat(32, 32, 32));
return new GLDrawablesFactory(arrayList, arrayList2, makeDisplayableVisual);
}
public static GLDrawablesFactory create16Depth() {
Visual makeDisplayableVisual = Visual.makeDisplayableVisual(SmallIdsGenerator.generateId(), 16, 16, 63488, 2016, 31);
Collection arrayList = new ArrayList();
arrayList.add(makeDisplayableVisual);
arrayList.add(Visual.makeNonDisplayableVisual(SmallIdsGenerator.generateId(), 1));
Collection arrayList2 = new ArrayList();
arrayList2.add(new ImageFormat(1, 1, 16));
arrayList2.add(new ImageFormat(16, 16, 16));
return new GLDrawablesFactory(arrayList, arrayList2, makeDisplayableVisual);
}
public static GLDrawablesFactory create15Depth() {
Visual makeDisplayableVisual = Visual.makeDisplayableVisual(SmallIdsGenerator.generateId(), 15, 16, 31744, 992, 31);
Collection arrayList = new ArrayList();
arrayList.add(makeDisplayableVisual);
arrayList.add(Visual.makeNonDisplayableVisual(SmallIdsGenerator.generateId(), 1));
Collection arrayList2 = new ArrayList();
arrayList2.add(new ImageFormat(1, 1, 16));
arrayList2.add(new ImageFormat(15, 16, 16));
return new GLDrawablesFactory(arrayList, arrayList2, makeDisplayableVisual);
}
public static GLDrawablesFactory create(int i) {
if (i == 32) {
return create32Depth();
}
switch (i) {
case 15:
return create15Depth();
case 16:
return create16Depth();
default:
Assert.isTrue(0, "Invalid BPP.");
return 0;
}
}
public Drawable create(int i, Window window, int i2, int i3, Visual visual) {
Drawable persistentGLDrawable = new PersistentGLDrawable(i, window, i2, i3, visual);
drawablesFinalisationThread.registerFinalisationHandler(persistentGLDrawable, new PersistentGLDrawableDestroyer(persistentGLDrawable));
return persistentGLDrawable;
}
}
Всё, что я там понял, это то, что последний параметр в makeDisplayableVisual это максимальный индекс красного цвета (например в 32 бит это 255, а в 16 это 31); Первый и второй параметр это какая-то непонятная перемешка двух значений, третий параметр это десятичный ID чистого красного цвета в палитре (например RGB-32bit: 16711680 (255 0 0), RGB-16bit: 63488 (31, 0, 0), 15 битный так и не понял как расчитывается.
Остальные параметры я вообще не понял, куча разных значений, непонятно по каким критериям это туда прописали, то в ArrayList 2 элемента, то 3, вообще не понятно от чего это зависит.
В классе Visual вроде ничего интересного нет:
private Visual(int i, boolean z, int i2, int i3, int i4, int i5, int i6) {
this.id = i;
this.displayable = z;
this.depth = i2;
this.bitsPerRgbValue = i3;
this.redMask = i4;
this.greenMask = i5;
this.blueMask = i6;
}
public static Visual makeDisplayableVisual(int i, int i2, int i3, int i4, int i5, int i6) {
return new Visual(i, true, i2, i3, i4, i5, i6);
}
public static Visual makeNonDisplayableVisual(int i, int i2) {
return new Visual(i, false, i2, i2, 0, 0, 0);
}
Если кто-то знает, в чём тут дело, и как туда внедрить любую глубину экрана, по формуле, дайте ссылку на документацию или программу, я хочу понять как это устроено.