[C++] 16Bit Renk Desteğini Kaldırma

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Seçkin
  • Yanıt Yanıt 3
  • Gösterim Gösterim 306

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
4.545
Çözümler
451
Beğeni
5.400
Puan
2.849
Ticaret Puanı
0
Grafik çalışmalarım esnasında kodları geziniyordum ve "çöp" diyebileceğimiz ne var ne yok diye göz atıyordum, Ki 16bit renk kontrollerini gördüm.
16bit devri aşağı yukarı Windows 7 döneminde tamamen tarihe karıştı ve artık günümüzde hiçbir monitör fiziksel olarak 16bit ile sınırlı değil.
Şu an en kötü monitörler bile 24bit ve bu da dolaylı yoldan 32bit mod desteğine sahip demek.

Dolayısıyla kaynak kodlarında bunun için ekstra kontroller sağlayan, veya var oldukları halde hiçbir işe yaramayan kodları temizleme kararı aldım.
Eğer şöyle bir monitör kullanmıyorsanız siz de bu temizlik işlemini rahatlıkla yapabilirsiniz:
i.webp

O halde başlayalım, fakat yine de belirteyim; anlatımı dikkatli okuyup işlemleri dikkatle uygulayın.

EterLib/GrpDetector.h:

Bu dosyanın içinde 3 farklı sınıf içinde tanımlı Find fonksiyonunu göreceksiniz.
C++:
Genişlet Daralt Kopyala
class D3D_CDeviceInfo
{
    public:
        [...]
        BOOL Find(UINT uScrWidth, UINT uScrHeight, UINT uScrDepthBits, BOOL isWindowed, UINT* piD3DModeInfo);

        [...]
};

class D3D_CAdapterInfo
{
    public:
        [...]
        BOOL Find(UINT uScrWidth, UINT uScrHeight, UINT uScrDepthBits, BOOL isWindowed, UINT* piD3DModeInfo, UINT* piD3DDevInfo);
        [...]
};

class D3D_CDisplayModeAutoDetector
{
    public:
        [...]
        BOOL Find(UINT uScrWidth, UINT uScrHeight, UINT uScrDepthBits, BOOL isWindowed, UINT* piD3DModeInfo, UINT* piD3DDevInfo, UINT* piD3DAdapterInfo);
        [...]
};
Bu 3 imzadan "UINT uScrDepthBits," argümanını silin.

EterLib/GrpDetector.cpp:
Şimdi bu dosyada üstteki düzenlediğimiz fonksiyonların gövdesini ve yine imzasını düzenleyeceğiz.
Adım adım gidiyoruz, öncelikle aşağıdaki fonksiyonu bulun:
C++:
Genişlet Daralt Kopyala
BOOL D3D_CDeviceInfo::Find(UINT uScrWidth, UINT uScrHeight, UINT uScrDepthBits, BOOL isWindowed, UINT* piD3DModeInfo)
{
    if (isWindowed)
        if (!m_isWindowed)
            return FALSE;

    for (UINT iD3D_SModeInfo=0; iD3D_SModeInfo<m_uD3DModeInfoNum; ++iD3D_SModeInfo)
    {
        D3D_SModeInfo& rkModeInfo=m_akD3DModeInfo[iD3D_SModeInfo];
        if (rkModeInfo.m_uScrWidth==uScrWidth && rkModeInfo.m_uScrHeight==uScrHeight)
        {
            if (uScrDepthBits==16)
            {
                switch (rkModeInfo.m_eD3DFmtPixel)
                {
                    case D3DFMT_R5G6B5:
                    case D3DFMT_X1R5G5B5:
                    case D3DFMT_A1R5G5B5:
                        *piD3DModeInfo=iD3D_SModeInfo;
                        return TRUE;
                        break;
                }
            }
            else
            {
                switch (rkModeInfo.m_eD3DFmtPixel)
                {
                    case D3DFMT_X8R8G8B8:
                    case D3DFMT_A8R8G8B8:
                    case D3DFMT_R8G8B8:
                        *piD3DModeInfo=iD3D_SModeInfo;
                        return TRUE;
                        break;
                }
            }
        }
    }
    return FALSE;
}
Bu fonksiyondan da "UINT uScrDepthBits," argümanını silin ve içerisindeki if-else bloğunu tamamen kaldırıp sadece else içindeki switch kısmını bırakın.
Aşağıdaki gibi:
C++:
Genişlet Daralt Kopyala
BOOL D3D_CDeviceInfo::Find(UINT uScrWidth, UINT uScrHeight, BOOL isWindowed, UINT* piD3DModeInfo)
{
    if (isWindowed)
        if (!m_isWindowed)
            return FALSE;

    for (UINT iD3D_SModeInfo=0; iD3D_SModeInfo<m_uD3DModeInfoNum; ++iD3D_SModeInfo)
    {
        D3D_SModeInfo& rkModeInfo=m_akD3DModeInfo[iD3D_SModeInfo];
        if (rkModeInfo.m_uScrWidth==uScrWidth && rkModeInfo.m_uScrHeight==uScrHeight)
        {
            switch (rkModeInfo.m_eD3DFmtPixel)
            {
                case D3DFMT_X8R8G8B8:
                case D3DFMT_A8R8G8B8:
                case D3DFMT_R8G8B8:
                    *piD3DModeInfo=iD3D_SModeInfo;
                    return TRUE;
                    break;
            }
        }    
    }
    return FALSE;
}

Sonra aşağıdaki fonksiyonu bulun:
C++:
Genişlet Daralt Kopyala
BOOL D3D_CAdapterInfo::Find(UINT uScrWidth, UINT uScrHeight, UINT uScrDepthBits, BOOL isWindowed, UINT* piD3DModeInfo, UINT* piD3DDevInfo)
{
    for (UINT iDevInfo=0; iDevInfo<m_uD3DDevInfoNum; ++iDevInfo)
    {
        D3D_CDeviceInfo& rkD3DDevInfo=m_akD3DDevInfo[iDevInfo];
        if (rkD3DDevInfo.Find(uScrWidth, uScrHeight, uScrDepthBits, isWindowed, piD3DModeInfo))
        {
            *piD3DDevInfo=iDevInfo;
            return TRUE;
        }
    }
    return FALSE;
}
Aşağıda gösterdiğim şekilde ilgili kısımları silin.
C++:
Genişlet Daralt Kopyala
BOOL D3D_CAdapterInfo::Find(UINT uScrWidth, UINT uScrHeight, /*UINT uScrDepthBits,*/ BOOL isWindowed, UINT* piD3DModeInfo, UINT* piD3DDevInfo)
{
    for (UINT iDevInfo=0; iDevInfo<m_uD3DDevInfoNum; ++iDevInfo)
    {
        D3D_CDeviceInfo& rkD3DDevInfo=m_akD3DDevInfo[iDevInfo];
        if (rkD3DDevInfo.Find(uScrWidth, uScrHeight, /*uScrDepthBits,*/ isWindowed, piD3DModeInfo))
        {
            *piD3DDevInfo=iDevInfo;
            return TRUE;
        }
    }
    return FALSE;
}

Tekrar aşağıdaki fonksiyonu bulun ve bir üstteki işlemin aynısını yapın ve uScrDepthBits kısımlarını silin.
C++:
Genişlet Daralt Kopyala
BOOL D3D_CDisplayModeAutoDetector::Find(UINT uScrWidth, UINT uScrHeight, UINT uScrDepthBits, BOOL isWindowed, UINT* piD3DModeInfo, UINT* piD3DDevInfo, UINT* piD3DAdapterInfo)
{
    for (UINT iD3DAdapterInfo=0; iD3DAdapterInfo<m_uD3DAdapterInfoCount; ++iD3DAdapterInfo)
    {
        D3D_CAdapterInfo& rkAdapterInfo=m_akD3DAdapterInfo[iD3DAdapterInfo];
        if (rkAdapterInfo.Find(uScrWidth, uScrHeight, uScrDepthBits, isWindowed, piD3DModeInfo, piD3DDevInfo))
        {
            *piD3DAdapterInfo=iD3DAdapterInfo;
            return TRUE;
        }
    }
    return FALSE;
}

Aynı dosyada şu fonksiyonu bulun:
C++:
Genişlet Daralt Kopyala
VOID D3D_SModeInfo::GetString(std::string* pstEnumList)
{
    UINT uScrDepthBits=16;
    switch (m_eD3DFmtPixel)
    {
        case D3DFMT_X8R8G8B8:
        case D3DFMT_A8R8G8B8:
        case D3DFMT_R8G8B8:
            uScrDepthBits=32;
            break;
    }

    int iVP=0;

    [...]
}

Bu fonksiyonun üst kısmındaki UINT uScrDepthBits=16; kısmını UINT uScrDepthBits=32; olarak değiştirin ve altındaki switch bloğunu tamamen silin.
GrpDetector ile işimiz bitti.

GrpDevice.h dosyasını açın ve bulun:
C++:
Genişlet Daralt Kopyala
int                Create(HWND hWnd, int hres, int vres, bool Windowed = true, int bit = 32, int ReflashRate = 0);
Gördüğünüz gibi burda zaten 32 olarak sabitlenmiş. Yani ekstradan 16bit için sorguların vs. yapılması manasız.
Bu yüzden bu satırdaki int bit = 32, kısmını silin.

GrpDevice.cpp içinden bu fonksiyonu bulun ve onun da başlığını düzeltip aşağıdaki gibi yapın:
C++:
Genişlet Daralt Kopyala
int CGraphicDevice::Create(HWND hWnd, int iHres, int iVres, bool Windowed, int iReflashRate)
{
    ...
}

GrpDevice.cpp ile işimiz bitti.

PythonApplication.h dosyasını açın ve bulun:
C++:
Genişlet Daralt Kopyala
bool CreateDevice(int width, int height, int Windowed, int bit = 32, int frequency = 0);
Buradaki int bit = 32, argümanını silin.

PythonApplication.cpp açın ve bulun:
C++:
Genişlet Daralt Kopyala
bool CPythonApplication::CreateDevice(int width, int height, int Windowed, int bit /* = 32*/, int frequency /* = 0*/)
{
    int iRet;

    m_grpDevice.InitBackBufferCount(2);
    m_grpDevice.RegisterWarningString(CGraphicDevice::CREATE_BAD_DRIVER, ApplicationStringTable_GetStringz(IDS_WARN_BAD_DRIVER, "WARN_BAD_DRIVER"));

    iRet = m_grpDevice.Create(GetWindowHandle(), width, height, Windowed ? true : false, bit, frequency);
    [...]
}

Bu fonksionun başlığından int bit /* = 32*/, kısmını silin ve sonrasında iRet = m_grpDevice.Create... satırındaki bit kısmını da silin.

Aynı dosya içinden şu satırı bulun:
C++:
Genişlet Daralt Kopyala
if (!CreateDevice(m_pySystem.GetWidth(), m_pySystem.GetHeight(), Windowed, m_pySystem.GetBPP(), m_pySystem.GetFrequency()))
        return false;

Değiştirin:
C++:
Genişlet Daralt Kopyala
if (!CreateDevice(m_pySystem.GetWidth(), m_pySystem.GetHeight(), Windowed, m_pySystem.GetFrequency()))
    return false;

PythonSystem.cpp dosyasını açın ve bulun:
C++:
Genişlet Daralt Kopyala
void CPythonSystem::GetDisplaySettings()
{
    memset(m_ResolutionList, 0, sizeof(TResolution) * RESOLUTION_MAX_NUM);
    m_ResolutionCount = 0;

    LPDIRECT3D9 lpD3D = CPythonGraphic::Instance().GetD3D();

    D3DADAPTER_IDENTIFIER9 d3dAdapterIdentifier;
    D3DDISPLAYMODE d3ddmDesktop;

    lpD3D->GetAdapterIdentifier(0, D3DENUM_WHQL_LEVEL, &d3dAdapterIdentifier);
    lpD3D->GetAdapterDisplayMode(0, &d3ddmDesktop);

    DWORD dwNumAdapterModes = lpD3D->GetAdapterModeCount(0, d3ddmDesktop.Format);

    for (UINT iMode = 0; iMode < dwNumAdapterModes; iMode++)
    {
        D3DDISPLAYMODE DisplayMode;
        lpD3D->EnumAdapterModes(0, d3ddmDesktop.Format, iMode, &DisplayMode); // Bu satır dx8-dx9 duyarlıdır. Sizde nasılsa öyle kalsın.
        DWORD bpp = 0;

        if (DisplayMode.Width < 800 || DisplayMode.Height < 600)
            continue;

        if (DisplayMode.Format == D3DFMT_R5G6B5)
            bpp = 16;
        else if (DisplayMode.Format == D3DFMT_X8R8G8B8)
            bpp = 32;
        else
            continue;

        int check_res = false;
        [...]
}

int check_res = false satırının üst kısmını gösterdiğim şekilde düzenleyin(KOMPLE DEĞİŞTİRMEYİN, SADECE DÜZENLEYİN.):
C++:
Genişlet Daralt Kopyala
D3DDISPLAYMODE DisplayMode;
lpD3D->EnumAdapterModes(0, d3ddmDesktop.Format, iMode, &DisplayMode);// Bu satır dx8-dx9 duyarlıdır. Sizde nasılsa öyle kalsın.

if (DisplayMode.Width < 800 || DisplayMode.Height < 600)
    continue;

if (DisplayMode.Format != D3DFMT_X8R8G8B8 && DisplayMode.Format != D3DFMT_A8R8G8B8)
    continue;

DWORD bpp = 32;
int check_res = false;

Tüm işlemler bu kadar, dileyenler bu düzenlemeleri her ihtimale karşı makrolu olarak yapabilirler.
Projenizde yaptığınız harici düzenlemeler ile herhangi bir çakışma yaşanırsa bu sizin sorumluluğunuzdadır.
 
Bahsettiğiniz gibi taş devrinde kaldı 16bit. Gerekisiz kod temizliği açısından güzel faydalı paylaşım olmuş elinize sağlık <3
 
bu şekilde hata aldım

Kod:
Genişlet Daralt Kopyala
PythonSystem.cpp(50,10): error C2660: 'IDirect3D8::EnumAdapterModes': işlev 4 bağımsız değişken almıyor
 
bu şekilde hata aldım

Kod:
Genişlet Daralt Kopyala
PythonSystem.cpp(50,10): error C2660: 'IDirect3D8::EnumAdapterModes': işlev 4 bağımsız değişken almıyor
Sanırım sebebi dx8-dx9 farkından dolayı..
Hata veren kısmı şu şekilde düzenlemen yeterli. Yani o çağrıdaki orjinal mantığı koruyabilirsin.
C++:
Genişlet Daralt Kopyala
lpD3D->EnumAdapterModes(0, iMode, &DisplayMode);

Bununla ilgili konuya not düşüyorum, bildiri için teşekkürler.
 
Geri
Üst