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)

Обычно в палитрах передаются маски цветов, например для 32 и 24 бит это 0xFF0000, 0x00FF00, 0x0000FF
Для 16 бит по крайней мере похоже на то что в этом коде. Только маски лучше константами записать чтобы оно нормально читалось.
Я так понимаю, это декомпил, а не исходник. мод чтоль какой-то?
Вместо MotionEventCompat.ACTION_POINTER_INDEX_MASK,0x00FF00, у тебя декомпилятор обосрался. а число в 16 лямов это и есть 0xFF0000, а 255 это 0x0000ff
И убери компат, он там не нужен
Допустим, тебе надо 18 бит. Разберись как в этих 18 битах цвета расположены
Если это 666 (по 6 бит на канал) то маски будут задаваться так:
((1<<6)-1) << (6 + 6) - красный, старшие 6 бит, ((1<<6)-1) << 6 - зелёный, средние 6 бит и ((1<<6)-1) - синий, младшие 6 бит

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 4)

Ну для rgb565 (16 бит) маски:
((1 << 5)-1) << (6+5)
((1 << 6)-1) << 5
((1 << 5)-1)
для rgb555 (15 бит) маски:
((1 << 5)-1) << (5+5)
((1 << 5)-1) << 5
((1 << 5)-1)
Остальное сам по аналогии

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)

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

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от mittorn

Если вы понимаете как это устроено, можете прислать мне код с методыми create1/2/3/4/5/6/8/10/12/14/18/24depth? Я не совсем понимаю о чём вы

masteruser82841
() автор топика
Ответ на: комментарий от mittorn

Написать готовые методы с этими битностями, других мне не надо будет

masteruser82841
() автор топика
Ответ на: комментарий от mittorn

А что значит 5 и 6? А где вычисление значения красного цвета и максимального индекса? И мне не только 10-18 надо, но и 1-10, я не совсем понимаю это, поэтому просчитайте это пожалуйста сами и выложите методы с созданием этих depth, главное чтобы они были правильными, остальное я сам сделаю

masteruser82841
() автор топика

И для чего это? Видеокарты аппаратно поддерживают только 32бит и более цвет.

anonymous
()
Ответ на: комментарий от anonymous

В этом эмуляторе эмуляция цветовой глубины, там не важно какая видеокарта. Мне нужны все те цветовые глубины которые я перечислил

masteruser82841
() автор топика
Ответ на: комментарий от masteruser82841

А это не эмулятор. Это Android X Server - реализация иксов на яве. А вот exagear, декомпил которого в посте - эмулятор. Добавь exagear в теги, разрабы прибегут :)

mittorn ★★★★★
()
Ответ на: комментарий от masteruser82841

    public static GLDrawablesFactory create24Depth() {
        Visual makeDisplayableVisual = Visual.makeDisplayableVisual(SmallIdsGenerator.generateId(), 24, 24, 0xFF0000, 0x00FF00, 0x0000FF);
        Collection arrayList = new ArrayList();
        arrayList.add(makeDisplayableVisual);
        arrayList.add(Visual.makeNonDisplayableVisual(SmallIdsGenerator.generateId(), 1));
        Collection arrayList2 = new ArrayList();
        arrayList2.add(new ImageFormat(1, 1, 24));
        arrayList2.add(new ImageFormat(24,24,24));
        return new GLDrawablesFactory(arrayList, arrayList2, makeDisplayableVisual);
    }
mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)

А вообще лучше запусти нормальные иксы и не мучай этот явовый обрезок

mittorn ★★★★★
()

Попробуй это:
https://github.com/ptitSeb/box86
Может его будет достаточно
Ну если нет - покупай exagear desktop или юзай трагслятор из старых android версий (в doom by eltechs он работает как есть без костылей)

mittorn ★★★★★
()
Ответ на: комментарий от masteruser82841

Формат пикселя. Вот как бы ты в 2 байта запихал 3 цвета? Загугли какие есть. А они могут быть разными. Есть rgba4444 - тоже 16 бит. А есть и argb4444 и rgba5551 и rgbx5551. А ещё bgr565 и все остальные варианты с bgr. Откуда мне знать что ты там пускаешь ыкзагирой и что именно ему надо?
С 24 всё просто - там только rgb888 и bgr888 - по байту на цвет.
А для 16 выкручиваются - зелёный берут 6 т.к для глаза он наиболее важен, а для красного и синего 5.
Для 8 бит обычно 332, но чаще вообще индексы

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 2)
Ответ на: комментарий от fehhner

Да какой это development, он декомпилировал apk и пытается его замоддить

mittorn ★★★★★
()
Ответ на: комментарий от mittorn
package com.eltechs.axs.xserver.impl.drawables.gl;

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();

    public static GLDrawablesFactory create(int i) {
        switch (i) {
            case 15:
                return create15Depth();
            case 16:
                return create16Depth();
            case 24:
                return create24Depth();
            case 32:
                return create32Depth();
            default:
                return (GLDrawablesFactory) null;
        }
    }

    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, 65280, 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 create24Depth() {
        Visual makeDisplayableVisual = Visual.makeDisplayableVisual(SmallIdsGenerator.generateId(), 24, 24, 16711680, -256, 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, 24));
        arrayList2.add(new ImageFormat(24, 24, 24));
        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 Drawable create(int i, Window window, int i2, int i3, Visual visual) {
        PersistentGLDrawable persistentGLDrawable = new PersistentGLDrawable(i, window, i2, i3, visual);
        drawablesFinalisationThread.registerFinalisationHandler(persistentGLDrawable, new PersistentGLDrawableDestroyer(persistentGLDrawable));
        return persistentGLDrawable;
    }
}

Вроде всё сделал правильно, но работают только те, которые были там изначально, а когда пытаюсь запустить в 24 бит, бесконечная загрузка без ошибок. Что-то вы неправильно там написали, вот, я декомпилировал то что у меня получилось

masteruser82841
() автор топика
Ответ на: комментарий от masteruser82841

Откуда там -256? Должно так же получиться 65280
А не работать может потому что это не единственное место где есть проблемы

mittorn ★★★★★
()
Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от mittorn
package com.eltechs.axs.xserver.impl.drawables.gl;

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();

    public static GLDrawablesFactory create(int i) {
        switch (i) {
            case 15:
                return create15Depth();
            case 16:
                return create16Depth();
            case 24:
                return create24Depth();
            case 32:
                return create32Depth();
            default:
                return (GLDrawablesFactory) null;
        }
    }

    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, 65280, 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 create24Depth() {
        Visual makeDisplayableVisual = Visual.makeDisplayableVisual(SmallIdsGenerator.generateId(), 24, 24, 16711680, 65280, 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, 24));
        arrayList2.add(new ImageFormat(24, 24, 24));
        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 Drawable create(int i, Window window, int i2, int i3, Visual visual) {
        PersistentGLDrawable persistentGLDrawable = new PersistentGLDrawable(i, window, i2, i3, visual);
        drawablesFinalisationThread.registerFinalisationHandler(persistentGLDrawable, new PersistentGLDrawableDestroyer(persistentGLDrawable));
        return persistentGLDrawable;
    }
}

Я исправил, теперь всё в порядке, но он продолжает бесконечно загружаться. Наверное что-то тут неправильно, прочитайте внимательно эти методы, может поймёте что означают параметры в arraylist. Там например в 15 бит почему-то прописано 16, может и в 24 надо 32 прописывать

masteruser82841
() автор топика
Ответ на: комментарий от masteruser82841

в 15 прописано 16 потому что 15битный drawable всё равно 16битный. просто там 15 бит отдано под цвет, а один пустой. 24 для которого прописано 32 - он и есть 32. Ибо в 32битном цвете всегда под цвет задействовано только 24 бита.
А в 24битном цвете как и в 16битном всё под цвет используется. Ищи проблемы в wine, самом приложении, либо в протоколе. И я советую запустить полноценные иксы. Есть 3 подходящих реализации - xvnc, XSDL и lorie. Может ещё появятся

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Я что-то найти не могу ни одного exagear с 24 битами, только 15, 16, 32. Даже образец не достать..... Там ещё а классах прорисовки завязано на 32 битах, вообщем сложно там я не разработчик не знаю что делать

masteruser82841
() автор топика
Ответ на: комментарий от masteruser82841

А разработчик сволочь игнонирует меня и оскорбляет, ибо не будет на меня школьника тупорылого время тратить. Пидор

ахахаха. правда классно?

Deleted
()
Ответ на: комментарий от Deleted

Ничего хорошего. Всё разруливать мне придётся, разработчики все ушли

masteruser82841
() автор топика
Ответ на: комментарий от masteruser82841

забей на те иксы что там встроены и юзай свои

mittorn ★★★★★
()
Ответ на: комментарий от masteruser82841

образец это нормальные иксы с 24 битами

mittorn ★★★★★
()
Ответ на: комментарий от masteruser82841

и я не хочу время тратить. Ты даже не знаешь из-за иксов проблема или нет. В exagear хватает своих проблем чисто в трансляторе. Банальный маткад не запускается

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Проблема была в том, что я не только здесь должен был код изменять, там есть ещё классы прорисовки, завязанные на 15/16/32 depth. А так как у меня 24, то условия прорисовки не срабатывают

masteruser82841
() автор топика
Ответ на: комментарий от masteruser82841

Дописывай. Научишься. Будешь понимать лучше

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Не знаю на счёт ПК, мне на мобильном Exagear помогло для тех программ которые вылетали из-за ошибки памяти. Это не поможет с ошибкой x сервера

masteruser82841
() автор топика
Ответ на: комментарий от mittorn

Если ты не понял, то сожалею, разбирайся сам с ошибками.

masteruser82841
() автор топика
Ответ на: комментарий от mittorn

Вроде запустилось, но с багами и вылет через 5 секунд. Подправлять как-то придётся

https://uca991f9d04242d7c25b124ecf25.previews.dropboxusercontent.com/p/thumb/...

Эту бредятину не я придумал https://4pda.ru/forum/index.php?showtopic=378043&st=3200#entry80049583

Хотя может я неправильно понял о чем там говорят

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