From 676f16b2846169d8bb1aea0e3cd44af389b8744c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 30 Jul 2012 00:08:07 +0200 Subject: [PATCH] (Xbox 1) Rewrite Surface.cpp --- xbox1/frontend/RetroLaunch/Surface.cpp | 138 +++++++++++-------------- xbox1/frontend/RetroLaunch/Surface.h | 87 ++++++---------- xbox1/frontend/menu.cpp | 17 +-- 3 files changed, 105 insertions(+), 137 deletions(-) diff --git a/xbox1/frontend/RetroLaunch/Surface.cpp b/xbox1/frontend/RetroLaunch/Surface.cpp index 450c14d6b4..ee53640570 100644 --- a/xbox1/frontend/RetroLaunch/Surface.cpp +++ b/xbox1/frontend/RetroLaunch/Surface.cpp @@ -1,52 +1,40 @@ -/** - * Surreal 64 Launcher (C) 2003 - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. To contact the - * authors: email: buttza@hotmail.com, lantus@lantus-x.com - * - * Additional code and cleanups: Surreal64 CE Team (http://www.emuxtras.net) - */ +/* RetroArch - A frontend for libretro. +* Copyright (C) 2010-2012 - Hans-Kristian Arntzen +* Copyright (C) 2011-2012 - Daniel De Matteis +* +* RetroArch is free software: you can redistribute it and/or modify it under the terms +* of the GNU General Public License as published by the Free Software Found- +* ation, either version 3 of the License, or (at your option) any later version. +* +* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with RetroArch. +* If not, see . +*/ #include "Surface.h" -#include "../../../general.h" #include "../../xdk_d3d8.h" -CSurface::CSurface() -{ - m_pTexture = NULL; - m_pVertexBuffer = NULL; - m_byR = 255; - m_byG = 255; - m_byB = 255; - m_bLoaded = false; - m_x = 0; - m_y = 0; -} - -CSurface::~CSurface() -{ - Destroy(); -} - -bool CSurface::Create(const char *szFilename) +bool d3d_surface_new(d3d_surface_t *surface, const char *filename) { xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data; - if (m_bLoaded) - Destroy(); + surface->m_pTexture = NULL; + surface->m_pVertexBuffer = NULL; + surface->m_byR = 255; + surface->m_byG = 255; + surface->m_byB = 255; + surface->m_bLoaded = false; + surface->m_x = 0; + surface->m_y = 0; - HRESULT g_hResult = D3DXCreateTextureFromFileExA(d3d->d3d_render_device, // d3d device - szFilename, // filename - D3DX_DEFAULT, D3DX_DEFAULT, // width/height + HRESULT ret = D3DXCreateTextureFromFileExA(d3d->d3d_render_device, // d3d device + filename, // filename + D3DX_DEFAULT, // width + D3DX_DEFAULT, // height D3DX_DEFAULT, // mipmaps 0, // usage D3DFMT_A8R8G8B8, // format @@ -54,61 +42,56 @@ bool CSurface::Create(const char *szFilename) D3DX_DEFAULT, // texture filter D3DX_DEFAULT, // mipmapping 0, // colorkey - &m_imageInfo, // image info + &surface->m_imageInfo, // image info NULL, // pallete - &m_pTexture); // texture + &surface->m_pTexture); // texture - if (FAILED(g_hResult)) + if (FAILED(ret)) { RARCH_ERR("Error occurred during D3DXCreateTextureFromFileExA().\n"); return false; } // create a vertex buffer for the quad that will display the texture - g_hResult = d3d->d3d_render_device->CreateVertexBuffer(4 * sizeof(DrawVerticeFormats), - D3DUSAGE_WRITEONLY, - D3DFVF_CUSTOMVERTEX, - D3DPOOL_MANAGED, &m_pVertexBuffer); - if (FAILED(g_hResult)) + ret = d3d->d3d_render_device->CreateVertexBuffer(4 * sizeof(DrawVerticeFormats), + D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &surface->m_pVertexBuffer); + + if (FAILED(ret)) { RARCH_ERR("Error occurred during CreateVertexBuffer().\n"); - m_pTexture->Release(); + surface->m_pTexture->Release(); return false; } - m_bLoaded = true; + surface->m_bLoaded = true; return true; } -void CSurface::Destroy() +void d3d_surface_free(d3d_surface_t *surface) { // free the vertex buffer - if (m_pVertexBuffer) + if (surface->m_pVertexBuffer) { - m_pVertexBuffer->Release(); - m_pVertexBuffer = NULL; + surface->m_pVertexBuffer->Release(); + surface->m_pVertexBuffer = NULL; } // free the texture - if (m_pTexture) + if (surface->m_pTexture) { - m_pTexture->Release(); - m_pTexture = NULL; + surface->m_pTexture->Release(); + surface->m_pTexture = NULL; } - m_bLoaded = false; + surface->m_bLoaded = false; } -bool CSurface::Render(int x, int y) -{ - return Render(x, y, m_imageInfo.Width, m_imageInfo.Height); -} - -bool CSurface::Render(int x, int y, int32_t w, int32_t h) +bool d3d_surface_render(d3d_surface_t *surface, int x, int y, int32_t w, int32_t h) { xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data; - if (m_pTexture == NULL || m_pVertexBuffer == NULL || m_bLoaded == false) + + if (surface->m_pTexture == NULL || surface->m_pVertexBuffer == NULL || surface->m_bLoaded == false) return false; float fX = static_cast(x); @@ -117,28 +100,28 @@ bool CSurface::Render(int x, int y, int32_t w, int32_t h) // create the new vertices DrawVerticeFormats newVerts[] = { - // x, y, z, color, u ,v - {fX, fY, 0.0f, /*D3DCOLOR_ARGB(m_byOpacity, m_byR, m_byG, m_byB),*/ 0, 0, 0}, - {fX + w, fY, 0.0f, /*D3DCOLOR_ARGB(m_byOpacity, m_byR, m_byG, m_byB),*/ 0, 1, 0}, - {fX + w, fY + h, 0.0f, /*D3DCOLOR_ARGB(m_byOpacity, m_byR, m_byG, m_byB),*/ 0, 1, 1}, - {fX, fY + h, 0.0f, /*D3DCOLOR_ARGB(m_byOpacity, m_byR, m_byG, m_byB),*/ 0, 0, 1} + // x, y, z, color, u ,v + {fX, fY, 0.0f, 0, 0, 0}, + {fX + w, fY, 0.0f, 0, 1, 0}, + {fX + w, fY + h, 0.0f, 0, 1, 1}, + {fX, fY + h, 0.0f, 0, 0, 1} }; // load the existing vertices - /*CustomVertex*/DrawVerticeFormats *pCurVerts; + DrawVerticeFormats *pCurVerts; - HRESULT g_hResult = m_pVertexBuffer->Lock(0, 0, (byte **)&pCurVerts, 0); + HRESULT ret = surface->m_pVertexBuffer->Lock(0, 0, (unsigned char**)&pCurVerts, 0); - if (FAILED(g_hResult)) + if (FAILED(ret)) { RARCH_ERR("Error occurred during m_pVertexBuffer->Lock().\n"); return false; } + // copy the new verts over the old verts memcpy(pCurVerts, newVerts, 4 * sizeof(DrawVerticeFormats)); - m_pVertexBuffer->Unlock(); - + surface->m_pVertexBuffer->Unlock(); d3d->d3d_render_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); d3d->d3d_render_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); @@ -150,9 +133,10 @@ bool CSurface::Render(int x, int y, int32_t w, int32_t h) d3d->d3d_render_device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); // draw the quad - d3d->d3d_render_device->SetTexture(0, m_pTexture); - d3d->d3d_render_device->SetStreamSource(0, m_pVertexBuffer, sizeof(DrawVerticeFormats)); + d3d->d3d_render_device->SetTexture(0, surface->m_pTexture); + d3d->d3d_render_device->SetStreamSource(0, surface->m_pVertexBuffer, sizeof(DrawVerticeFormats)); d3d->d3d_render_device->SetVertexShader(D3DFVF_CUSTOMVERTEX); d3d->d3d_render_device->DrawPrimitive(D3DPT_QUADLIST, 0, 1); + return true; } diff --git a/xbox1/frontend/RetroLaunch/Surface.h b/xbox1/frontend/RetroLaunch/Surface.h index 15f7aa7670..d54ffee498 100644 --- a/xbox1/frontend/RetroLaunch/Surface.h +++ b/xbox1/frontend/RetroLaunch/Surface.h @@ -1,58 +1,39 @@ -/** - * Surreal 64 Launcher (C) 2003 - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. To contact the - * authors: email: buttza@hotmail.com, lantus@lantus-x.com - * - * Additional code and cleanups: Surreal64 CE Team (http://www.emuxtras.net) - */ +/* RetroArch - A frontend for libretro. +* Copyright (C) 2010-2012 - Hans-Kristian Arntzen +* Copyright (C) 2011-2012 - Daniel De Matteis +* +* RetroArch is free software: you can redistribute it and/or modify it under the terms +* of the GNU General Public License as published by the Free Software Found- +* ation, either version 3 of the License, or (at your option) any later version. +* +* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with RetroArch. +* If not, see . +*/ -#pragma once +#ifndef _D3D_SURFACE_H_ +#define _D3D_SURFACE_H_ -class CSurface +#include "../../../xdk/xdk_defines.h" + +typedef struct { -public: - CSurface(); - ~CSurface(); - - /** - * Do functions - */ - bool Create(const char *szFilename); - void Destroy(); - - bool Render(int x, int y); - bool Render(int x, int y, int32_t w, int32_t h); -private: - /** - * A d3d texture object that will contain the loaded texture - * and a d3d vertex buffer object that will contain the vertex - * buffer for the quad which will display the texture - */ - IDirect3DTexture8 *m_pTexture; - IDirect3DVertexBuffer8 *m_pVertexBuffer; - - /** - * The default render position of the texture - */ - int m_x, m_y; - - /** - * The width and height of the texture - */ + LPDIRECT3DTEXTURE m_pTexture; + LPDIRECT3DVERTEXBUFFER m_pVertexBuffer; + int m_x; + int m_y; D3DXIMAGE_INFO m_imageInfo; - byte m_byR, m_byG, m_byB; + unsigned char m_byR; + unsigned char m_byG; + unsigned char m_byB; + bool m_bLoaded; +} d3d_surface_t; - /** - * Whether the texture has been created or not - */ - bool m_bLoaded; -}; +bool d3d_surface_new(d3d_surface_t *surface, const char *filename); +void d3d_surface_free(d3d_surface_t *surface); +bool d3d_surface_render(d3d_surface_t *surface, int x, int y, int32_t w, int32_t h); + +#endif \ No newline at end of file diff --git a/xbox1/frontend/menu.cpp b/xbox1/frontend/menu.cpp index 1dceee7aa7..469df4141a 100644 --- a/xbox1/frontend/menu.cpp +++ b/xbox1/frontend/menu.cpp @@ -34,9 +34,9 @@ filebrowser_t browser; // Rom selector panel with coords -CSurface m_menuMainRomSelectPanel; +d3d_surface_t m_menuMainRomSelectPanel; // Background image with coords -CSurface m_menuMainBG; +d3d_surface_t m_menuMainBG; // Rom list coords int m_menuMainRomListPos_x; @@ -54,7 +54,8 @@ static uint16_t old_input_st = 0; static void display_menubar(void) { //Render background image - m_menuMainBG.Render(MENU_MAIN_BG_X, MENU_MAIN_BG_Y); + d3d_surface_render(&m_menuMainBG, MENU_MAIN_BG_X, MENU_MAIN_BG_Y, + m_menuMainBG.m_imageInfo.Width, m_menuMainBG.m_imageInfo.Height); } typedef enum { @@ -137,7 +138,7 @@ static void browser_render(filebrowser_t *b, float current_x, float current_y, f //check if this is the currently selected file const char *current_pathname = filebrowser_get_current_path(b); if(strcmp(current_pathname, b->current_dir.list->elems[i].data) == 0) - m_menuMainRomSelectPanel.Render(currentX, currentY, ROM_PANEL_WIDTH, ROM_PANEL_HEIGHT); + d3d_surface_render(&m_menuMainRomSelectPanel, currentX, currentY, ROM_PANEL_WIDTH, ROM_PANEL_HEIGHT); convert_char_to_wchar(rom_basename_w, rom_basename, sizeof(rom_basename_w)); d3d->d3d_render_device->GetBackBuffer(-1, D3DBACKBUFFER_TYPE_MONO, &d3d->pFrontBuffer); @@ -254,19 +255,19 @@ int menu_init(void) // Load background image if(width == 640) { - m_menuMainBG.Create("D:\\Media\\menuMainBG.png"); + d3d_surface_new(&m_menuMainBG, "D:\\Media\\menuMainBG.png"); m_menuMainRomListPos_x = 100; m_menuMainRomListPos_y = 100; } else if(width == 1280) { - m_menuMainBG.Create("D:\\Media\\menuMainBG_720p.png"); + d3d_surface_new(&m_menuMainBG, "D:\\Media\\menuMainBG_720p.png"); m_menuMainRomListPos_x = 400; m_menuMainRomListPos_y = 150; } // Load rom selector panel - m_menuMainRomSelectPanel.Create("D:\\Media\\menuMainRomSelectPanel.png"); + d3d_surface_new(&m_menuMainRomSelectPanel, "D:\\Media\\menuMainRomSelectPanel.png"); g_console.mode_switch = MODE_MENU; @@ -276,6 +277,8 @@ int menu_init(void) void menu_free(void) { filebrowser_free(&browser); + d3d_surface_free(&m_menuMainBG); + d3d_surface_free(&m_menuMainRomSelectPanel); } void menu_loop(void)