- 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:
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.
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:
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:
Sonra aşağıdaki fonksiyonu bulun:
Aşağıda gösterdiğim şekilde ilgili kısımları silin.
Tekrar aşağıdaki fonksiyonu bulun ve bir üstteki işlemin aynısını yapın ve uScrDepthBits kısımlarını silin.
Aynı dosyada şu fonksiyonu bulun:
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:
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:
GrpDevice.cpp ile işimiz bitti.
PythonApplication.h dosyasını açın ve bulun:
Buradaki int bit = 32, argümanını silin.
PythonApplication.cpp açın ve bulun:
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:
Değiştirin:
PythonSystem.cpp dosyasını açın ve bulun:
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.):
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.
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:
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++:
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);
[...]
};
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++:
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;
}
Aşağıdaki gibi:
C++:
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++:
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;
}
C++:
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++:
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++:
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++:
int Create(HWND hWnd, int hres, int vres, bool Windowed = true, int bit = 32, int ReflashRate = 0);
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++:
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++:
bool CreateDevice(int width, int height, int Windowed, int bit = 32, int frequency = 0);
PythonApplication.cpp açın ve bulun:
C++:
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++:
if (!CreateDevice(m_pySystem.GetWidth(), m_pySystem.GetHeight(), Windowed, m_pySystem.GetBPP(), m_pySystem.GetFrequency()))
return false;
Değiştirin:
C++:
if (!CreateDevice(m_pySystem.GetWidth(), m_pySystem.GetHeight(), Windowed, m_pySystem.GetFrequency()))
return false;
PythonSystem.cpp dosyasını açın ve bulun:
C++:
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++:
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.