LINUX.ORG.RU

Нужно добавить новые глубины цвета в кастомный X сервер

 ,


0

1

Есть у меня программа-эмулятор, в ней кастомный 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);
    }

Если кто-то знает, в чём тут дело, и как туда внедрить любую глубину экрана, по формуле, дайте ссылку на документацию или программу, я хочу понять как это устроено.



Последнее исправление: masteruser82841 (всего исправлений: 5)

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.