*Added Update Button to the Settings which can Update to newer Revs (only seen when in UnlockMode)

**Big Thanks to CorneliousJD for Hosting the DOLs)**

*Reverted ardi's stuff which made codedumps on the Download (sorry ardi commit it again when its fixed)
This commit is contained in:
dimok321 2009-05-28 12:12:52 +00:00
parent 37bfe50fe2
commit f793af2d39
17 changed files with 1664 additions and 1135 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,272 +1,288 @@
/* /*
* FreeTypeGX is a wrapper class for libFreeType which renders a compiled * FreeTypeGX is a wrapper class for libFreeType which renders a compiled
* FreeType parsable font into a GX texture for Wii homebrew development. * FreeType parsable font into a GX texture for Wii homebrew development.
* Copyright (C) 2008 Armin Tamzarian * Copyright (C) 2008 Armin Tamzarian
* Modified by Tantric, 2009 * Modified by Tantric, 2009
* *
* This file is part of FreeTypeGX. * This file is part of FreeTypeGX.
* *
* FreeTypeGX is free software: you can redistribute it and/or modify * FreeTypeGX is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published * it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or * by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* FreeTypeGX is distributed in the hope that it will be useful, * FreeTypeGX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details. * GNU Lesser General Public License for more details.
* *
* You should have received a copy of the GNU Lesser General Public License * You should have received a copy of the GNU Lesser General Public License
* along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>. * along with FreeTypeGX. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** \mainpage FreeTypeGX
* /** \mainpage FreeTypeGX
* \section sec_intro Introduction *
* * \section sec_intro Introduction
* FreeTypeGX is a wrapper class for libFreeType which renders a compiled FreeType parsable font into a GX texture for Wii homebrew development. *
* <br> * FreeTypeGX is a wrapper class for libFreeType which renders a compiled FreeType parsable font into a GX texture for Wii homebrew development.
* FreeTypeGX is written in C++ and makes use of a selectable pre-buffered or buffer-on-demand methodology to allow fast and efficient printing of text to the EFB. * <br>
* <p> * FreeTypeGX is written in C++ and makes use of a selectable pre-buffered or buffer-on-demand methodology to allow fast and efficient printing of text to the EFB.
* This library was developed in-full by Armin Tamzarian with the support of developers in \#wiibrew on EFnet. * <p>
* * This library was developed in-full by Armin Tamzarian with the support of developers in \#wiibrew on EFnet.
* \section sec_installation_source Installation (Source Code) *
* * \section sec_installation_source Installation (Source Code)
* -# Ensure that you have the <a href = "http://www.tehskeen.com/forums/showthread.php?t=9404">libFreeType</a> Wii library installed in your development environment with the library added to your Makefile where appropriate. *
* -# Ensure that you have the <a href = "http://code.google.com/p/metaphrasis">Metaphrasis</a> library installed in your development environment with the library added to your Makefile where appropriate. * -# Ensure that you have the <a href = "http://www.tehskeen.com/forums/showthread.php?t=9404">libFreeType</a> Wii library installed in your development environment with the library added to your Makefile where appropriate.
* -# Extract the FreeTypeGX archive. * -# Ensure that you have the <a href = "http://code.google.com/p/metaphrasis">Metaphrasis</a> library installed in your development environment with the library added to your Makefile where appropriate.
* -# Copy the contents of the <i>src</i> directory into your project's development path. * -# Extract the FreeTypeGX archive.
* -# Include the FreeTypeGX header file in your code using syntax such as the following: * -# Copy the contents of the <i>src</i> directory into your project's development path.
* \code * -# Include the FreeTypeGX header file in your code using syntax such as the following:
* #include "FreeTypeGX.h" * \code
* \endcode * #include "FreeTypeGX.h"
* * \endcode
* \section sec_installation_library Installation (Library) *
* * \section sec_installation_library Installation (Library)
* -# Ensure that you have the <a href = "http://www.tehskeen.com/forums/showthread.php?t=9404">libFreeType</a> Wii library installed in your development environment with the library added to your Makefile where appropriate. *
* -# Ensure that you have the <a href = "http://code.google.com/p/metaphrasis">Metaphrasis</a> library installed in your development environment with the library added to your Makefile where appropriate. * -# Ensure that you have the <a href = "http://www.tehskeen.com/forums/showthread.php?t=9404">libFreeType</a> Wii library installed in your development environment with the library added to your Makefile where appropriate.
* -# Extract the FreeTypeGX archive. * -# Ensure that you have the <a href = "http://code.google.com/p/metaphrasis">Metaphrasis</a> library installed in your development environment with the library added to your Makefile where appropriate.
* -# Copy the contents of the <i>lib</i> directory into your <i>devKitPro/libogc</i> directory. * -# Extract the FreeTypeGX archive.
* -# Include the FreeTypeGX header file in your code using syntax such as the following: * -# Copy the contents of the <i>lib</i> directory into your <i>devKitPro/libogc</i> directory.
* \code * -# Include the FreeTypeGX header file in your code using syntax such as the following:
* #include "FreeTypeGX.h" * \code
* \endcode * #include "FreeTypeGX.h"
* * \endcode
* \section sec_freetypegx_prerequisites FreeTypeGX Prerequisites *
* * \section sec_freetypegx_prerequisites FreeTypeGX Prerequisites
* Before you begin using FreeTypeGX in your project you must ensure that the desired font in compiled into your project. For this example I will assume you are building your project with a Makefile using devKitPro evironment and are attempting to include a font whose filename is rursus_compact_mono.ttf. *
* * Before you begin using FreeTypeGX in your project you must ensure that the desired font in compiled into your project. For this example I will assume you are building your project with a Makefile using devKitPro evironment and are attempting to include a font whose filename is rursus_compact_mono.ttf.
* -# Copy the font into a directory which will be processed by the project's Makefile. If you are unsure about where you should place your font just copy the it into your project's source directory. *
* \n\n * -# Copy the font into a directory which will be processed by the project's Makefile. If you are unsure about where you should place your font just copy the it into your project's source directory.
* -# Modify the Makefile to convert the font into an object file: * \n\n
* \code * -# Modify the Makefile to convert the font into an object file:
* %.ttf.o : %.ttf * \code
* @echo $(notdir $<) * %.ttf.o : %.ttf
* $(bin2o) * @echo $(notdir $<)
* \endcode * $(bin2o)
* \n * \endcode
* -# Include the font object's generated header file in your source code: * \n
* \code * -# Include the font object's generated header file in your source code:
* #include "rursus_compact_mono_ttf.h" * \code
* \endcode * #include "rursus_compact_mono_ttf.h"
* This header file defines the two variables that you will need for use within your project: * \endcode
* \code * This header file defines the two variables that you will need for use within your project:
* extern const u8 rursus_compact_mono_ttf[]; A pointer to the font buffer within the compiled project. * \code
* extern const u32 rursus_compact_mono_ttf_size; The size of the font's buffer in bytes. * extern const u8 rursus_compact_mono_ttf[]; A pointer to the font buffer within the compiled project.
* \endcode * extern const u32 rursus_compact_mono_ttf_size; The size of the font's buffer in bytes.
* * \endcode
* \section sec_freetypegx_usage FreeTypeGX Usage *
* * \section sec_freetypegx_usage FreeTypeGX Usage
* -# Within the file you included the FreeTypeGX.h header create an instance object of the FreeTypeGX class: *
* \code * -# Within the file you included the FreeTypeGX.h header create an instance object of the FreeTypeGX class:
* FreeTypeGX *freeTypeGX = new FreeTypeGX(); * \code
* \endcode * FreeTypeGX *freeTypeGX = new FreeTypeGX();
* Alternately you can specify a texture format to which you would like to render the font characters. Note that the default value for this parameter is GX_TF_RGBA8. * \endcode
* \code * Alternately you can specify a texture format to which you would like to render the font characters. Note that the default value for this parameter is GX_TF_RGBA8.
* FreeTypeGX *freeTypeGX = new FreeTypeGX(GX_TF_RGB565); * \code
* \endcode * FreeTypeGX *freeTypeGX = new FreeTypeGX(GX_TF_RGB565);
* Furthermore, you can also specify a vertex format index to avoid conflicts with concurrent libraries or other systems. Note that the default value for this parameter is GX_VTXFMT1. * \endcode
* \code * Furthermore, you can also specify a vertex format index to avoid conflicts with concurrent libraries or other systems. Note that the default value for this parameter is GX_VTXFMT1.
* FreeTypeGX *freeTypeGX = new FreeTypeGX(GX_TF_RGB565, GX_VTXFMT1); * \code
* \endcode * FreeTypeGX *freeTypeGX = new FreeTypeGX(GX_TF_RGB565, GX_VTXFMT1);
* \n * \endcode
* Currently supported textures are: * \n
* \li <i>GX_TF_I4</i> * Currently supported textures are:
* \li <i>GX_TF_I8</i> * \li <i>GX_TF_I4</i>
* \li <i>GX_TF_IA4</i> * \li <i>GX_TF_I8</i>
* \li <i>GX_TF_IA8</i> * \li <i>GX_TF_IA4</i>
* \li <i>GX_TF_RGB565</i> * \li <i>GX_TF_IA8</i>
* \li <i>GX_TF_RGB5A3</i> * \li <i>GX_TF_RGB565</i>
* \li <i>GX_TF_RGBA8</i> * \li <i>GX_TF_RGB5A3</i>
* * \li <i>GX_TF_RGBA8</i>
* \n *
* -# Using the allocated FreeTypeGX instance object call the loadFont function to load the font from the compiled buffer and specify the desired point size. Note that this function can be called multiple times to load a new: * \n
* \code * -# Using the allocated FreeTypeGX instance object call the loadFont function to load the font from the compiled buffer and specify the desired point size. Note that this function can be called multiple times to load a new:
* freeTypeGX->loadFont(rursus_compact_mono_ttf, rursus_compact_mono_ttf_size, 64); * \code
* \endcode * freeTypeGX->loadFont(rursus_compact_mono_ttf, rursus_compact_mono_ttf_size, 64);
* Alternately you can specify a flag which will load and cache all available font glyphs immidiately. Note that on large font sets enabling this feature could take a significant amount of time. * \endcode
* \code * Alternately you can specify a flag which will load and cache all available font glyphs immidiately. Note that on large font sets enabling this feature could take a significant amount of time.
* freeTypeGX->loadFont(rursus_compact_mono_ttf, rursus_compact_mono_ttf_size, 64, true); * \code
* \endcode * freeTypeGX->loadFont(rursus_compact_mono_ttf, rursus_compact_mono_ttf_size, 64, true);
* \n * \endcode
* -# If necessary you can enable compatibility modes with concurrent libraries or systems. For more information on this feature see the documentation for setCompatibilityMode: * \n
* \code * -# If necessary you can enable compatibility modes with concurrent libraries or systems. For more information on this feature see the documentation for setCompatibilityMode:
* freeTypeGX->setCompatibilityMode(FTGX_COMPATIBILITY_GRRLIB); * \code
* \endcode * freeTypeGX->setCompatibilityMode(FTGX_COMPATIBILITY_GRRLIB);
* -# Using the allocated FreeTypeGX instance object call the drawText function to print a string at the specified screen X and Y coordinates to the current EFB: * \endcode
* \code * -# Using the allocated FreeTypeGX instance object call the drawText function to print a string at the specified screen X and Y coordinates to the current EFB:
* freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!")); * \code
* \endcode * freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"));
* Alternately you can specify a <i>GXColor</i> object you would like to apply to the printed characters: * \endcode
* \code * Alternately you can specify a <i>GXColor</i> object you would like to apply to the printed characters:
* freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"), * \code
* (GXColor){0xff, 0xee, 0xaa, 0xff}); * freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"),
* \endcode * (GXColor){0xff, 0xee, 0xaa, 0xff});
* Furthermore you can also specify a group of styling parameters which will modify the positioning or style of the text: * \endcode
* \code * Furthermore you can also specify a group of styling parameters which will modify the positioning or style of the text:
* freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"), * \code
* (GXColor){0xff, 0xee, 0xaa, 0xff}, * freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"),
* FTGX_JUSTIFY_CENTER | FTGX_ALIGN_BOTTOM | FTGX_STYLE_UNDERLINE); * (GXColor){0xff, 0xee, 0xaa, 0xff},
* \endcode * FTGX_JUSTIFY_CENTER | FTGX_ALIGN_BOTTOM | FTGX_STYLE_UNDERLINE);
* \n * \endcode
* Currently style parameters are: * \n
* \li <i>FTGX_JUSTIFY_LEFT</i> * Currently style parameters are:
* \li <i>FTGX_JUSTIFY_CENTER</i> * \li <i>FTGX_JUSTIFY_LEFT</i>
* \li <i>FTGX_JUSTIFY_RIGHT</i> * \li <i>FTGX_JUSTIFY_CENTER</i>
* \li <i>FTGX_ALIGN_TOP</i> * \li <i>FTGX_JUSTIFY_RIGHT</i>
* \li <i>FTGX_ALIGN_MIDDLE</i> * \li <i>FTGX_ALIGN_TOP</i>
* \li <i>FTGX_ALIGN_BOTTOM</i> * \li <i>FTGX_ALIGN_MIDDLE</i>
* \li <i>FTGX_STYLE_UNDERLINE</i> * \li <i>FTGX_ALIGN_BOTTOM</i>
* \li <i>FTGX_STYLE_STRIKE</i> * \li <i>FTGX_STYLE_UNDERLINE</i>
* * \li <i>FTGX_STYLE_STRIKE</i>
* \section sec_license License *
* * \section sec_license License
* FreeTypeGX is distributed under the GNU Lesser General Public License. *
* * FreeTypeGX is distributed under the GNU Lesser General Public License.
* \section sec_contact Contact *
* * \section sec_contact Contact
* If you have any suggestions, questions, or comments regarding this library feel free to e-mail me at tamzarian1989 [at] gmail [dawt] com. *
*/ * If you have any suggestions, questions, or comments regarding this library feel free to e-mail me at tamzarian1989 [at] gmail [dawt] com.
*/
#ifndef FREETYPEGX_H_
#define FREETYPEGX_H_ #ifndef FREETYPEGX_H_
#define FREETYPEGX_H_
#include <gccore.h>
#include <ft2build.h> #include <gccore.h>
#include FT_FREETYPE_H #include <ft2build.h>
#include FT_BITMAP_H #include FT_FREETYPE_H
#include <Metaphrasis.h> #include FT_BITMAP_H
#include <Metaphrasis.h>
#include <malloc.h>
#include <string.h> #include <malloc.h>
#include <map> #include <string.h>
#include <map>
/*! forward deklaration of private structures
* /*! \struct ftgxCharData_
*/ *
typedef struct ftgxCharData_ ftgxCharData; * Font face character glyph relevant data structure.
typedef struct ftgxDataOffset_ ftgxDataOffset; */
typedef struct ftgxCharData_ {
#define _TEXT(t) L ## t /**< Unicode helper macro. */ int16_t renderOffsetX; /**< Texture X axis bearing offset. */
uint16_t glyphAdvanceX; /**< Character glyph X coordinate advance in pixels. */
#define FTGX_NULL 0x0000 uint16_t glyphIndex; /**< Charachter glyph index in the font face. */
#define FTGX_JUSTIFY_LEFT 0x0001
#define FTGX_JUSTIFY_CENTER 0x0002 uint16_t textureWidth; /**< Texture width in pixels/bytes. */
#define FTGX_JUSTIFY_RIGHT 0x0003 uint16_t textureHeight; /**< Texture glyph height in pixels/bytes. */
#define FTGX_JUSTIFY_MASK 0x000f
int16_t renderOffsetY; /**< Texture Y axis bearing offset. */
#define FTGX_ALIGN_TOP 0x0010 int16_t renderOffsetMax; /**< Texture Y axis bearing maximum value. */
#define FTGX_ALIGN_MIDDLE 0x0020 int16_t renderOffsetMin; /**< Texture Y axis bearing minimum value. */
#define FTGX_ALIGN_BOTTOM 0x0030
#define FTGX_ALIGN_BASELINE 0x0040 uint32_t* glyphDataTexture; /**< Glyph texture bitmap data buffer. */
#define FTGX_ALIGN_GLYPH_TOP 0x0050 } ftgxCharData;
#define FTGX_ALIGN_GLYPH_MIDDLE 0x0060
#define FTGX_ALIGN_GLYPH_BOTTOM 0x0070 /*! \struct ftgxDataOffset_
#define FTGX_ALIGN_MASK 0x00f0 *
* Offset structure which hold both a maximum and minimum value.
#define FTGX_STYLE_UNDERLINE 0x0100 */
#define FTGX_STYLE_STRIKE 0x0200 typedef struct ftgxDataOffset_ {
#define FTGX_STYLE_MASK 0x0f00 int16_t max; /**< Maximum data offset. */
int16_t min; /**< Minimum data offset. */
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE 0X0001 } ftgxDataOffset;
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL 0X0002
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_BLEND 0X0004 #define _TEXT(t) L ## t /**< Unicode helper macro. */
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_REPLACE 0X0008
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR 0X0010 #define FTGX_NULL 0x0000
#define FTGX_JUSTIFY_LEFT 0x0001
#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE 0X0100 #define FTGX_JUSTIFY_CENTER 0x0002
#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_DIRECT 0X0200 #define FTGX_JUSTIFY_RIGHT 0x0004
#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX8 0X0400
#define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX16 0X0800 #define FTGX_ALIGN_TOP 0x0010
#define FTGX_ALIGN_MIDDLE 0x0020
#define FTGX_COMPATIBILITY_NONE 0x0000 #define FTGX_ALIGN_BOTTOM 0x0040
#define FTGX_COMPATIBILITY_GRRLIB FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR | FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE
#define FTGX_COMPATIBILITY_LIBWIISPRITE FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE | FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_DIRECT #define FTGX_STYLE_UNDERLINE 0x0100
#define FTGX_STYLE_STRIKE 0x0200
const GXColor ftgxWhite = (GXColor){0xff, 0xff, 0xff, 0xff}; /**< Constant color value used only to sanitize Doxygen documentation. */
#define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE 0X0001
/*! \class FreeTypeGX #define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_DECAL 0X0002
* \brief Wrapper class for the libFreeType library with GX rendering. #define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_BLEND 0X0004
* \author Armin Tamzarian #define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_REPLACE 0X0008
* \version 0.2.4 #define FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR 0X0010
*
* FreeTypeGX acts as a wrapper class for the libFreeType library. It supports precaching of transformed glyph data into #define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE 0X0100
* a specified texture format. Rendering of the data to the EFB is accomplished through the application of high performance #define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_DIRECT 0X0200
* GX texture functions resulting in high throughput of string rendering. #define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX8 0X0400
*/ #define FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_INDEX16 0X0800
class FreeTypeGX {
#define FTGX_COMPATIBILITY_NONE 0x0000
private: #define FTGX_COMPATIBILITY_GRRLIB FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_PASSCLR | FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_NONE
FT_Library ftLibrary; /**< FreeType FT_Library instance. */ #define FTGX_COMPATIBILITY_LIBWIISPRITE FTGX_COMPATIBILITY_DEFAULT_TEVOP_GX_MODULATE | FTGX_COMPATIBILITY_DEFAULT_VTXDESC_GX_DIRECT
FT_Face ftFace; /**< FreeType reusable FT_Face typographic object. */
FT_GlyphSlot ftSlot; /**< FreeType reusable FT_GlyphSlot glyph container object. */ const GXColor ftgxWhite = (GXColor){0xff, 0xff, 0xff, 0xff}; /**< Constant color value used only to sanitize Doxygen documentation. */
FT_UInt ftPointSize; /**< Requested size of the rendered font. */
bool ftKerningEnabled; /**< Flag indicating the availability of font kerning data. */ /*! \class FreeTypeGX
* \brief Wrapper class for the libFreeType library with GX rendering.
uint8_t textureFormat; /**< Defined texture format of the target EFB. */ * \author Armin Tamzarian
uint8_t vertexIndex; /**< Vertex format descriptor index. */ * \version 0.2.4
uint32_t compatibilityMode; /**< Compatibility mode for default tev operations and vertex descriptors. */ *
std::map<wchar_t, ftgxCharData> fontData; /**< Map which holds the glyph data structures for the corresponding characters. */ * FreeTypeGX acts as a wrapper class for the libFreeType library. It supports precaching of transformed glyph data into
* a specified texture format. Rendering of the data to the EFB is accomplished through the application of high performance
static uint16_t adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat); * GX texture functions resulting in high throughput of string rendering.
static uint16_t adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat); */
class FreeTypeGX {
static int16_t getStyleOffsetWidth(uint16_t width, uint16_t format);
static int16_t getStyleOffsetHeight(ftgxDataOffset *offset, uint16_t format); private:
FT_Library ftLibrary; /**< FreeType FT_Library instance. */
void unloadFont(); FT_Face ftFace; /**< FreeType reusable FT_Face typographic object. */
ftgxCharData *cacheGlyphData(wchar_t charCode); FT_GlyphSlot ftSlot; /**< FreeType reusable FT_GlyphSlot glyph container object. */
uint16_t cacheGlyphDataComplete(); FT_UInt ftPointSize; /**< Requested size of the rendered font. */
void loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData); bool ftKerningEnabled; /**< Flag indicating the availability of font kerning data. */
void setDefaultMode(); uint8_t textureFormat; /**< Defined texture format of the target EFB. */
uint8_t vertexIndex; /**< Vertex format descriptor index. */
void drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset *offsetData, uint16_t format, GXColor color); uint32_t compatibilityMode; /**< Compatibility mode for default tev operations and vertex descriptors. */
void copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color); std::map<wchar_t, ftgxCharData> fontData; /**< Map which holds the glyph data structures for the corresponding characters. */
void copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color);
static uint16_t adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat);
public: static uint16_t adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat);
FreeTypeGX(uint8_t textureFormat = GX_TF_RGBA8, uint8_t vertexIndex = GX_VTXFMT1);
~FreeTypeGX(); static uint16_t getStyleOffsetWidth(uint16_t width, uint16_t format);
static uint16_t getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format);
static wchar_t* charToWideChar(char* p);
static wchar_t* charToWideChar(const char* p); void unloadFont();
void setVertexFormat(uint8_t vertexIndex); ftgxCharData *cacheGlyphData(wchar_t charCode);
void setCompatibilityMode(uint32_t compatibilityMode); uint16_t cacheGlyphDataComplete();
void loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData);
uint16_t loadFont(uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, bool cacheAll = false);
uint16_t loadFont(const uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, bool cacheAll = false); void setDefaultMode();
void changeSize(FT_UInt vPointSize, FT_UInt hPointSize=0);
void drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color);
uint16_t drawText(int16_t x, int16_t y, wchar_t *text, GXColor color = ftgxWhite, uint16_t textStyling = FTGX_NULL); void copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color);
uint16_t drawText(int16_t x, int16_t y, wchar_t const *text, GXColor color = ftgxWhite, uint16_t textStyling = FTGX_NULL); void copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color);
uint16_t getWidth(wchar_t *text); public:
uint16_t getWidth(wchar_t const *text); FreeTypeGX(uint8_t textureFormat = GX_TF_RGBA8, uint8_t vertexIndex = GX_VTXFMT1);
uint16_t getHeight(wchar_t *text); ~FreeTypeGX();
uint16_t getHeight(wchar_t const *text);
ftgxDataOffset* getOffset(wchar_t *text, ftgxDataOffset* offset); static wchar_t* charToWideChar(char* p);
ftgxDataOffset* getOffset(wchar_t const *text, ftgxDataOffset* offset); static wchar_t* charToWideChar(const char* p);
}; void setVertexFormat(uint8_t vertexIndex);
void setCompatibilityMode(uint32_t compatibilityMode);
#endif /* FREETYPEGX_H_ */
uint16_t loadFont(uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, bool cacheAll = false);
uint16_t loadFont(const uint8_t* fontBuffer, FT_Long bufferSize, FT_UInt pointSize, bool cacheAll = false);
void changeSize(FT_UInt vPointSize, FT_UInt hPointSize=0);
uint16_t drawText(int16_t x, int16_t y, wchar_t *text, GXColor color = ftgxWhite, uint16_t textStyling = FTGX_NULL);
uint16_t drawText(int16_t x, int16_t y, wchar_t const *text, GXColor color = ftgxWhite, uint16_t textStyling = FTGX_NULL);
uint16_t getWidth(wchar_t *text);
uint16_t getWidth(wchar_t const *text);
uint16_t getHeight(wchar_t *text);
uint16_t getHeight(wchar_t const *text);
ftgxDataOffset getOffset(wchar_t *text);
ftgxDataOffset getOffset(wchar_t const *text);
};
#endif /* FREETYPEGX_H_ */

View File

@ -244,6 +244,7 @@ void CFG_Default(int widescreen) // -1 = non forced Mode
snprintf(CFG.unlockCode, sizeof(CFG.unlockCode), "ab121b"); // default password snprintf(CFG.unlockCode, sizeof(CFG.unlockCode), "ab121b"); // default password
snprintf(CFG.language_path, sizeof(CFG.language_path), "SD:/config/language/"); snprintf(CFG.language_path, sizeof(CFG.language_path), "SD:/config/language/");
snprintf(CFG.oggload_path, sizeof(CFG.oggload_path), "SD:/config/backgroundmusic/"); snprintf(CFG.oggload_path, sizeof(CFG.oggload_path), "SD:/config/backgroundmusic/");
snprintf(CFG.update_path, sizeof(CFG.update_path), "SD:/apps/usbloader_gx/");
sprintf(CFG.ogg_path, "notset"); sprintf(CFG.ogg_path, "notset");
CFG.parentalcontrol = 0; CFG.parentalcontrol = 0;
@ -494,6 +495,10 @@ void cfg_set(char *name, char *val)
strcopy(CFG.language_path, val, sizeof(CFG.language_path)); strcopy(CFG.language_path, val, sizeof(CFG.language_path));
return; return;
} }
if (strcmp(name, "update_path") == 0) {
strcopy(CFG.update_path, val, sizeof(CFG.update_path));
return;
}
if (strcmp(name, "oggload_path") == 0) { if (strcmp(name, "oggload_path") == 0) {
strcopy(CFG.oggload_path, val, sizeof(CFG.oggload_path)); strcopy(CFG.oggload_path, val, sizeof(CFG.oggload_path));
return; return;
@ -1090,6 +1095,7 @@ bool cfg_save_global()// save global settings
fprintf(f, "ogg_path = %s\n ", CFG.ogg_path); fprintf(f, "ogg_path = %s\n ", CFG.ogg_path);
fprintf(f, "wiilight = %d\n ", Settings.wiilight); fprintf(f, "wiilight = %d\n ", Settings.wiilight);
fprintf(f, "gameDisplay = %d\n ", Settings.gameDisplay); fprintf(f, "gameDisplay = %d\n ", Settings.gameDisplay);
fprintf(f, "update_path = %s\n ", CFG.update_path);
fclose(f); fclose(f);
return true; return true;
} }

View File

@ -72,6 +72,7 @@ struct CFG
char language_path[100]; char language_path[100];
char oggload_path[100]; char oggload_path[100];
char ogg_path[150]; char ogg_path[150];
char update_path[150];
short keyset; short keyset;
}; };

View File

@ -51,7 +51,7 @@ return -1;
void SDCard_deInit() void SDCard_deInit()
{ {
//First unmount all the devs... //First unmount all the devs...
fatUnmount("SD"); fatUnmount("SD:/");
//...and then shutdown em! //...and then shutdown em!
__io_wiisd.shutdown(); __io_wiisd.shutdown();
} }

View File

@ -287,4 +287,7 @@ extern const u32 arrangeList_gray_png_size;
extern const u8 arrangeCarosselle_gray_png[]; extern const u8 arrangeCarosselle_gray_png[];
extern const u32 arrangeCarosselle_gray_png_size; extern const u32 arrangeCarosselle_gray_png_size;
extern const u8 updateRev_png[];
extern const u32 updateRev_png_size;
#endif #endif

View File

@ -231,4 +231,15 @@ struct block downloadfile(const char *url)
free(response.data); free(response.data);
return file; return file;
}
s32 GetConnection(char * domain) {
u32 ipaddress = getipbynamecached(domain);
if(ipaddress == 0) {
return -1;
}
s32 connection = server_connect(ipaddress, 80);
return connection;
} }

View File

@ -19,7 +19,7 @@ extern "C"
#include "dns.h" #include "dns.h"
/** /**
* A simple structure to keep track of the size of a malloc()ated block of memory * A simple structure to keep track of the size of a malloc()ated block of memory
*/ */
struct block struct block
{ {
@ -29,7 +29,8 @@ struct block
extern const struct block emptyblock; extern const struct block emptyblock;
struct block downloadfile(const char *url); struct block downloadfile(const char *url);
s32 GetConnection(char * domain);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -74,7 +74,7 @@ snprintf(LANGUAGE.Display, sizeof(LANGUAGE.Display), "Display");
snprintf(LANGUAGE.Doyouwanttoformat, sizeof(LANGUAGE.Doyouwanttoformat), "Do you want to format:"); snprintf(LANGUAGE.Doyouwanttoformat, sizeof(LANGUAGE.Doyouwanttoformat), "Do you want to format:");
snprintf(LANGUAGE.Doyoureallywanttodelete, sizeof(LANGUAGE.Doyoureallywanttodelete), "Do you really want to delete:"); snprintf(LANGUAGE.Doyoureallywanttodelete, sizeof(LANGUAGE.Doyoureallywanttodelete), "Do you really want to delete:");
snprintf(LANGUAGE.Doyouwanttoretryfor30secs, sizeof(LANGUAGE.Doyouwanttoretryfor30secs), "Do you want to retry for 30 secs?"); snprintf(LANGUAGE.Doyouwanttoretryfor30secs, sizeof(LANGUAGE.Doyouwanttoretryfor30secs), "Do you want to retry for 30 secs?");
snprintf(LANGUAGE.Downloadingfile, sizeof(LANGUAGE.Downloadingfile), "Downloading file:"); snprintf(LANGUAGE.Downloadingfile, sizeof(LANGUAGE.Downloadingfile), "Downloading file");
snprintf(LANGUAGE.DownloadBoxartimage, sizeof(LANGUAGE.DownloadBoxartimage), "Download Boxart image?"); snprintf(LANGUAGE.DownloadBoxartimage, sizeof(LANGUAGE.DownloadBoxartimage), "Download Boxart image?");
snprintf(LANGUAGE.Downloadfinished, sizeof(LANGUAGE.Downloadfinished), "Download finished"); snprintf(LANGUAGE.Downloadfinished, sizeof(LANGUAGE.Downloadfinished), "Download finished");
snprintf(LANGUAGE.Defaultgamesettings, sizeof(LANGUAGE.Defaultgamesettings), "Default Gamesettings"); snprintf(LANGUAGE.Defaultgamesettings, sizeof(LANGUAGE.Defaultgamesettings), "Default Gamesettings");
@ -202,6 +202,9 @@ snprintf(LANGUAGE.Timeleft, sizeof(LANGUAGE.Timeleft), "Time left:");
snprintf(LANGUAGE.Unlock, sizeof(LANGUAGE.Unlock), "Unlock"); snprintf(LANGUAGE.Unlock, sizeof(LANGUAGE.Unlock), "Unlock");
snprintf(LANGUAGE.Unicodefix, sizeof(LANGUAGE.Unicodefix), "Unicode Fix"); snprintf(LANGUAGE.Unicodefix, sizeof(LANGUAGE.Unicodefix), "Unicode Fix");
snprintf(LANGUAGE.Uninstall, sizeof(LANGUAGE.Uninstall), "Uninstall"); snprintf(LANGUAGE.Uninstall, sizeof(LANGUAGE.Uninstall), "Uninstall");
snprintf(LANGUAGE.Updatepath, sizeof(LANGUAGE.Updatepath), "Updatepath");
snprintf(LANGUAGE.Updatepathchanged, sizeof(LANGUAGE.Updatepathchanged), "Updatepath changed.");
snprintf(LANGUAGE.Updatefailed, sizeof(LANGUAGE.Updatefailed), "Update failed");
snprintf(LANGUAGE.USBLoaderisprotected, sizeof(LANGUAGE.USBLoaderisprotected), "USB Loader GX is protected"); snprintf(LANGUAGE.USBLoaderisprotected, sizeof(LANGUAGE.USBLoaderisprotected), "USB Loader GX is protected");
snprintf(LANGUAGE.USBDevicenotfound, sizeof(LANGUAGE.USBDevicenotfound), "USB Device not found"); snprintf(LANGUAGE.USBDevicenotfound, sizeof(LANGUAGE.USBDevicenotfound), "USB Device not found");
snprintf(LANGUAGE.VideoMode, sizeof(LANGUAGE.VideoMode), "Video Mode"); snprintf(LANGUAGE.VideoMode, sizeof(LANGUAGE.VideoMode), "Video Mode");
@ -936,6 +939,18 @@ void language_set(char *name, char *val)
strcopy(LANGUAGE.Uninstall, val, sizeof(LANGUAGE.Uninstall)); strcopy(LANGUAGE.Uninstall, val, sizeof(LANGUAGE.Uninstall));
return; return;
} }
if (strcmp(name, "Updatepath") == 0) {
strcopy(LANGUAGE.Updatepath, val, sizeof(LANGUAGE.Updatepath));
return;
}
if (strcmp(name, "Updatepathchanged") == 0) {
strcopy(LANGUAGE.Updatepathchanged, val, sizeof(LANGUAGE.Updatepathchanged));
return;
}
if (strcmp(name, "Updatefailed") == 0) {
strcopy(LANGUAGE.Updatefailed, val, sizeof(LANGUAGE.Updatefailed));
return;
}
if (strcmp(name, "USBLoaderisprotected") == 0) { if (strcmp(name, "USBLoaderisprotected") == 0) {
strcopy(LANGUAGE.USBLoaderisprotected, val, sizeof(LANGUAGE.USBLoaderisprotected)); strcopy(LANGUAGE.USBLoaderisprotected, val, sizeof(LANGUAGE.USBLoaderisprotected));
return; return;

View File

@ -188,6 +188,9 @@ struct LANGUAGE
char Uninstall[50]; char Uninstall[50];
char USBLoaderisprotected[80]; char USBLoaderisprotected[80];
char USBDevicenotfound[80]; char USBDevicenotfound[80];
char Updatepath[50];
char Updatepathchanged[50];
char Updatefailed[40];
char VideoMode[50]; char VideoMode[50];
char VIDTVPatch[50]; char VIDTVPatch[50];
char Volume[50]; char Volume[50];

View File

@ -664,7 +664,7 @@ class GuiText : public GuiElement
//!\param s Font style //!\param s Font style
//!\param h Text alignment (horizontal) //!\param h Text alignment (horizontal)
//!\param v Text alignment (vertical) //!\param v Text alignment (vertical)
static void SetPresets(int sz, GXColor c, int w, int wrap, u16 s, int h, int v); void SetPresets(int sz, GXColor c, int w, u16 s, int h, int v);
//!Sets the font size //!Sets the font size
//!\param s Font size //!\param s Font size
void SetFontSize(int s); void SetFontSize(int s);
@ -672,12 +672,14 @@ class GuiText : public GuiElement
//!If the text exceeds this, it is wrapped to the next line //!If the text exceeds this, it is wrapped to the next line
//!\param w Maximum width //!\param w Maximum width
//!\param m WrapMode //!\param m WrapMode
/*
enum { enum {
WRAP, WRAP,
DOTTED, DOTTED,
SCROLL, SCROLL,
MARQUEE MARQUEE
}; };
*/
void SetMaxWidth(int w, short m=GuiText::WRAP); void SetMaxWidth(int w, short m=GuiText::WRAP);
//!Sets the font color //!Sets the font color
//!\param c Font color //!\param c Font color
@ -685,7 +687,7 @@ class GuiText : public GuiElement
//!Sets the FreeTypeGX style attributes //!Sets the FreeTypeGX style attributes
//!\param s Style attributes //!\param s Style attributes
//!\param m Style-Mask attributes //!\param m Style-Mask attributes
void SetStyle(u16 s, u16 m=0xffff); void SetStyle(u16 s/*, u16 m=0xffff*/);
//!Sets the text alignment //!Sets the text alignment
//!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE) //!\param hor Horizontal alignment (ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTRE)
//!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE) //!\param vert Vertical alignment (ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE)
@ -699,6 +701,12 @@ class GuiText : public GuiElement
void SetWidescreen(bool w); void SetWidescreen(bool w);
//!Constantly called to draw the text //!Constantly called to draw the text
void Draw(); void Draw();
enum {
WRAP,
DOTTED,
SCROLL,
MARQUEE
};
protected: protected:
wchar_t* text; //!< Unicode text value wchar_t* text; //!< Unicode text value
int size; //!< Font size int size; //!< Font size

View File

@ -13,12 +13,12 @@
static int currentSize = 0; static int currentSize = 0;
static int currentWidescreen = 0; static int currentWidescreen = 0;
static int presetSize = 0; static int presetSize = 0;
static GXColor presetColor = (GXColor){255, 255, 255, 255};
static int presetMaxWidth = 0; static int presetMaxWidth = 0;
static int presetWrapMode = 0; static int presetWrapMode = GuiText::WRAP;
static u16 presetStyle = 0;
static int presetAlignmentHor = 0; static int presetAlignmentHor = 0;
static int presetAlignmentVert = 0; static int presetAlignmentVert = 0;
static u16 presetStyle = 0;
static GXColor presetColor = (GXColor){255, 255, 255, 255};
/** /**
* Constructor for the GuiText class. * Constructor for the GuiText class.
@ -35,14 +35,14 @@ GuiText::GuiText(const char * t, int s, GXColor c)
scrollPos1 = 0; scrollPos1 = 0;
scrollPos2 = 0; scrollPos2 = 0;
scrollDelay = 0; scrollDelay = 0;
font = fontSystem; font = NULL;
widescreen = 0; //added widescreen = 0; //added
alignmentHor = ALIGN_CENTRE; alignmentHor = ALIGN_CENTRE;
alignmentVert = ALIGN_MIDDLE; alignmentVert = ALIGN_MIDDLE;
if(t) if(t)
text = FreeTypeGX::charToWideChar((char *)t); text = fontSystem->charToWideChar((char *)t);
} }
/** /**
@ -60,14 +60,14 @@ GuiText::GuiText(const char * t)
scrollPos1 = 0; scrollPos1 = 0;
scrollPos2 = 0; scrollPos2 = 0;
scrollDelay = 0; scrollDelay = 0;
font = fontSystem; font = NULL;
widescreen = 0; //added widescreen = 0; //added
alignmentHor = presetAlignmentHor; alignmentHor = presetAlignmentHor;
alignmentVert = presetAlignmentVert; alignmentVert = presetAlignmentVert;
if(t) if(t)
text = FreeTypeGX::charToWideChar((char *)t); text = fontSystem->charToWideChar((char *)t);
} }
/** /**
@ -90,18 +90,17 @@ void GuiText::SetText(const char * t)
text = NULL; text = NULL;
if(t) if(t)
text = FreeTypeGX::charToWideChar((char *)t); text = fontSystem->charToWideChar((char *)t);
scrollPos2 = 0; scrollPos2 = 0;
scrollDelay = 0; scrollDelay = 0;
} }
void GuiText::SetPresets(int sz, GXColor c, int w, int wrap, u16 s, int h, int v) void GuiText::SetPresets(int sz, GXColor c, int w, u16 s, int h, int v)
{ {
presetSize = sz; presetSize = sz;
presetColor = c; presetColor = c;
presetMaxWidth = w;
presetWrapMode = wrap;
presetStyle = s; presetStyle = s;
presetMaxWidth = w;
presetAlignmentHor = h; presetAlignmentHor = h;
presetAlignmentVert = v; presetAlignmentVert = v;
} }
@ -126,17 +125,16 @@ void GuiText::SetColor(GXColor c)
alpha = c.a; alpha = c.a;
} }
void GuiText::SetStyle(u16 s, u16 m/*=0xffff*/) void GuiText::SetStyle(u16 s)
{ {
LOCK(this); LOCK(this);
style &= ~m; style = s;
style |= s & m;
} }
void GuiText::SetAlignment(int hor, int vert) void GuiText::SetAlignment(int hor, int vert)
{ {
LOCK(this); LOCK(this);
style = FTGX_NULL; style = 0;
switch(hor) switch(hor)
{ {
@ -172,7 +170,7 @@ void GuiText::SetAlignment(int hor, int vert)
void GuiText::SetFont(FreeTypeGX *f) void GuiText::SetFont(FreeTypeGX *f)
{ {
LOCK(this); LOCK(this);
font = f ? f : fontSystem; font = f;
} }
int GuiText::GetTextWidth() int GuiText::GetTextWidth()
@ -182,12 +180,13 @@ int GuiText::GetTextWidth()
if(newSize != currentSize || currentWidescreen != widescreen) if(newSize != currentSize || currentWidescreen != widescreen)
{ {
font->changeSize(newSize, widescreen ? newSize*0.8 : 0); //fontSystem->changeSize(newSize);
(font ? font : fontSystem)->changeSize(newSize, widescreen ? newSize*0.8 : 0);
currentSize = newSize; currentSize = newSize;
currentWidescreen = widescreen; currentWidescreen = widescreen;
} }
return font->getWidth(text); return (font ? font : fontSystem)->getWidth(text);
} }
void GuiText::SetWidescreen(bool w) void GuiText::SetWidescreen(bool w)
{ {
@ -213,17 +212,18 @@ void GuiText::Draw()
if(newSize != currentSize || currentWidescreen != widescreen) if(newSize != currentSize || currentWidescreen != widescreen)
{ {
font->changeSize(newSize, widescreen ? newSize*0.8 : 0); //fontSystem->changeSize(newSize);
(font ? font : fontSystem)->changeSize(newSize, widescreen ? newSize*0.8 : 0);
currentSize = newSize; currentSize = newSize;
currentWidescreen = widescreen; currentWidescreen = widescreen;
} }
int voffset = 0; int voffset = 0;
// if(alignmentVert == ALIGN_MIDDLE) if(alignmentVert == ALIGN_MIDDLE)
// voffset = -newSize/2 + 2; voffset = -newSize/2 + 2;
if(maxWidth > 0 && font->getWidth(text) > maxWidth) if(maxWidth > 0 && (font ? font : fontSystem)->getWidth(text) > maxWidth)
{ {
if(wrapMode == GuiText::WRAP) // text wrapping if(wrapMode == GuiText::WRAP) // text wrapping
{ {
@ -246,7 +246,8 @@ void GuiText::Draw()
if(text[ch] == ' ' || ch == strlen-1) if(text[ch] == ' ' || ch == strlen-1)
{ {
if(font->getWidth(tmptext[linenum]) >= maxWidth) if((font ? font : fontSystem)->getWidth(tmptext[linenum]) >= maxWidth)
//if(fontSystem->getWidth(tmptext[linenum]) >= maxWidth)
{ {
if(lastSpace >= 0) if(lastSpace >= 0)
{ {
@ -277,7 +278,7 @@ void GuiText::Draw()
for(i=0; i < linenum; i++) for(i=0; i < linenum; i++)
{ {
font->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset+i*lineheight, tmptext[i], c, style);
delete tmptext[i]; delete tmptext[i];
} }
} }
@ -295,32 +296,31 @@ void GuiText::Draw()
save[i] = text[dotPos+i]; save[i] = text[dotPos+i];
text[dotPos+i] = (i != 3 ? _TEXT('.') : 0); text[dotPos+i] = (i != 3 ? _TEXT('.') : 0);
} }
if((font->getWidth(text)) <= maxWidth) if(((font ? font : fontSystem)->getWidth(text)) <= maxWidth)
{ {
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
drawed = true; drawed = true;
} }
for(i=0; i<4; i++) // write saved Text back for(i=0; i<4; i++) // write saved Text back
text[dotPos+i] = save[i]; text[dotPos+i] = save[i];
dotPos--; dotPos--;
} }
if(!drawed) if(!drawed)
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
} }
else if(wrapMode == GuiText::SCROLL) // text scroller else if(wrapMode == GuiText::SCROLL) // text scroller
{ {
wchar_t save; wchar_t save;
if(scrollPos2 == 0 || frameCount > scrollDelay+5) if(scrollPos2 == 0 || frameCount > scrollDelay+5)
{ {
scrollPos1 = 0; scrollPos1 = 0;
scrollOffset = 0;
for(scrollPos2 = wcslen(text); scrollPos2 > 1; scrollPos2--) for(scrollPos2 = wcslen(text); scrollPos2 > 1; scrollPos2--)
{ {
save = text[scrollPos2]; // save Pos2 save = text[scrollPos2]; // save Pos2
text[scrollPos2] = 0; text[scrollPos2] = 0;
int textWidth = font->getWidth(text); int textWidth = (font ? font : fontSystem)->getWidth(text);
text[scrollPos2] = save; // restore Pos2 text[scrollPos2] = save; // restore Pos2
if(textWidth <= maxWidth) if(textWidth <= maxWidth)
break; break;
@ -329,22 +329,15 @@ void GuiText::Draw()
} }
else if(scrollPos2 > 0 && frameCount >= scrollDelay) else if(scrollPos2 > 0 && frameCount >= scrollDelay)
{ {
scrollPos1++;
if(--scrollOffset < 0)
{
wchar_t tmp[] = { text[scrollPos1], text[scrollPos1+1], 0 };
scrollOffset += font->getWidth(tmp) - font->getWidth(tmp+1);
scrollPos1++;
}
int strlen = wcslen(text); int strlen = wcslen(text);
for(; scrollPos2 < strlen; scrollPos2++) for(; scrollPos2 < strlen; scrollPos2++)
{ {
save = text[scrollPos2+1]; // save Pos2 save = text[scrollPos2+1]; // save Pos2
text[scrollPos2+1] = 0; text[scrollPos2+1] = 0;
int textWidth = font->getWidth(&text[scrollPos1]); int textWidth = (font ? font : fontSystem)->getWidth(&text[scrollPos1]);
text[scrollPos2+1] = save; // restore Pos2 text[scrollPos2+1] = save; // restore Pos2
if(textWidth+scrollOffset > maxWidth) if(textWidth > maxWidth)
break; break;
} }
if(scrollPos2 == strlen) if(scrollPos2 == strlen)
@ -353,28 +346,20 @@ void GuiText::Draw()
scrollDelay = frameCount+25; // when dir-change wait 25 Frames scrollDelay = frameCount+25; // when dir-change wait 25 Frames
} }
else else
scrollDelay = frameCount+1; // wait 1 Frames scrollDelay = frameCount+10; // wait 10 Frames
} }
else if(frameCount >= scrollDelay) else if(frameCount >= scrollDelay)
{ {
scrollPos2 = -scrollPos2; scrollPos2 = -scrollPos2;
scrollOffset++;
wchar_t tmp[] = { text[scrollPos1-1], text[scrollPos1], 0 };
int tmpOffset = font->getWidth(tmp) - font->getWidth(tmp+1);
if(scrollOffset >= tmpOffset)
{
scrollOffset -= tmpOffset;
scrollPos1--;
}
scrollPos1--;
for(; scrollPos2 > scrollPos1; scrollPos2--) for(; scrollPos2 > scrollPos1; scrollPos2--)
{ {
save = text[scrollPos2]; // save Pos2 save = text[scrollPos2]; // save Pos2
text[scrollPos2] = 0; text[scrollPos2] = 0;
int textWidth = font->getWidth(&text[scrollPos1]); int textWidth = (font ? font : fontSystem)->getWidth(&text[scrollPos1]);
text[scrollPos2] = save; // restore Pos2 text[scrollPos2] = save; // restore Pos2
if(textWidth+scrollOffset <= maxWidth) if(textWidth <= maxWidth)
break; break;
} }
if(scrollPos1 == 0) if(scrollPos1 == 0)
@ -383,34 +368,19 @@ void GuiText::Draw()
scrollDelay = frameCount+25; // when dir-change wait 25 Frames scrollDelay = frameCount+25; // when dir-change wait 25 Frames
} }
else else
scrollDelay = frameCount+1; // wait 10 Frames scrollDelay = frameCount+10; // wait 10 Frames
scrollPos2 = -scrollPos2; scrollPos2 = -scrollPos2;
} }
uint16_t drawStyle = style;
uint16_t drawX = this->GetLeft() + scrollOffset;
if((drawStyle & FTGX_JUSTIFY_MASK) == FTGX_JUSTIFY_CENTER)
{
drawStyle = (drawStyle & ~FTGX_JUSTIFY_MASK) | FTGX_JUSTIFY_LEFT;
drawX -= maxWidth >> 1;
}
else if((drawStyle & FTGX_JUSTIFY_MASK) == FTGX_JUSTIFY_RIGHT)
{
drawStyle = (drawStyle & ~FTGX_JUSTIFY_MASK) | FTGX_JUSTIFY_LEFT;
drawX -= maxWidth;
}
save = text[abs(scrollPos2)]; // save Pos2 save = text[abs(scrollPos2)]; // save Pos2
text[abs(scrollPos2)] = 0; text[abs(scrollPos2)] = 0;
font->drawText(drawX, this->GetTop()+voffset, &text[scrollPos1], c, drawStyle); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, &text[scrollPos1], c, style);
text[abs(scrollPos2)] = save; // restore Pos2 text[abs(scrollPos2)] = save; // restore Pos2
} }
} }
else else
{ {
font->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style); (font ? font : fontSystem)->drawText(this->GetLeft(), this->GetTop()+voffset, text, c, style);
} }
this->UpdateEffects(); this->UpdateEffects();
} }

View File

@ -42,6 +42,7 @@
#include "libwiigui/gui_diskcover.h" #include "libwiigui/gui_diskcover.h"
#include "mp3s.h" #include "mp3s.h"
#include "fatmounter.h" #include "fatmounter.h"
#include "updater.h"
#define MAX_CHARACTERS 38 #define MAX_CHARACTERS 38
extern FreeTypeGX *fontClock; //CLOCK extern FreeTypeGX *fontClock; //CLOCK
@ -228,7 +229,7 @@ static void WindowCredits(void * ptr)
txt[i] = new GuiText(LANGUAGE.OfficialSite, 20, (GXColor){255, 255, 255, 255}); txt[i] = new GuiText(LANGUAGE.OfficialSite, 20, (GXColor){255, 255, 255, 255});
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(-180,y); i++; y+=28; txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(-180,y); i++; y+=28;
GuiText::SetPresets(22, (GXColor){255, 255, 255, 255}, 0, GuiText::WRAP, txt[i]->SetPresets(22, (GXColor){255, 255, 255, 255}, 0,
FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP); FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
txt[i] = new GuiText("Coding:"); txt[i] = new GuiText("Coding:");
@ -2173,9 +2174,9 @@ ProgressDownloadWindow(int choice2)
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
progressbarImg.SetPosition(80,40); progressbarImg.SetPosition(80,40);
progressbarImg.SetTile(80*i/cntMissFiles); progressbarImg.SetTile(80*i/cntMissFiles);
} else {
progressbarImg.SetTile(100*i/cntMissFiles);
} }
else{
progressbarImg.SetTile(100*i/cntMissFiles);}
sprintf(msg, "%i %s", cntMissFiles - i, LANGUAGE.filesleft); sprintf(msg, "%i %s", cntMissFiles - i, LANGUAGE.filesleft);
msgTxt.SetText(msg); msgTxt.SetText(msg);
@ -2268,6 +2269,315 @@ ProgressDownloadWindow(int choice2)
} }
} }
/****************************************************************************
* ProgressWindow
*
* Opens a window, which displays progress to the user. Can either display a
* progress bar showing % completion, or a throbber that only shows that an
* action is in progress.
***************************************************************************/
int
ProgressUpdateWindow()
{
int ret = 0, failed = 0;
const unsigned int blocksize = 1024;
char hostip[16];
char * IP = NULL;
u8 blockbuffer[blocksize] ATTRIBUTE_ALIGN(32);
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
char imgPath[100];
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
GuiImageData btnOutline(imgPath, button_dialogue_box_png);
snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", CFG.theme_path);
GuiImageData dialogBox(imgPath, dialogue_box_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiImage dialogBoxImg(&dialogBox);
if (Settings.wsprompt == yes){
dialogBoxImg.SetWidescreen(CFG.widescreen);}
snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", CFG.theme_path);
GuiImageData progressbarOutline(imgPath, progressbar_outline_png);
GuiImage progressbarOutlineImg(&progressbarOutline);
if (Settings.wsprompt == yes){
progressbarOutlineImg.SetWidescreen(CFG.widescreen);}
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarOutlineImg.SetPosition(25, 7);
snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", CFG.theme_path);
GuiImageData progressbarEmpty(imgPath, progressbar_empty_png);
GuiImage progressbarEmptyImg(&progressbarEmpty);
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarEmptyImg.SetPosition(25, 7);
progressbarEmptyImg.SetTile(100);
snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", CFG.theme_path);
GuiImageData progressbar(imgPath, progressbar_png);
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarImg.SetPosition(25, 7);
char title[50];
sprintf(title, "%s", "Checking for Updates");
GuiText titleTxt(title, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,50);
char msg[50];
sprintf(msg, "%s", LANGUAGE.InitializingNetwork);
GuiText msgTxt(msg, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
msgTxt.SetPosition(0,140);
char msg2[50] = " ";
GuiText msg2Txt(msg2, 26, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
msg2Txt.SetPosition(0, 50);
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
prTxt.SetPosition(0, 7);
GuiText btn1Txt(LANGUAGE.Cancel, 22, (GXColor){THEME.prompttxt_r, THEME.prompttxt_g, THEME.prompttxt_b, 255}); //{0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
if (Settings.wsprompt == yes){
btn1Txt.SetWidescreen(CFG.widescreen);
btn1Img.SetWidescreen(CFG.widescreen);}
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
btn1.SetPosition(0, -40);
btn1.SetLabel(&btn1Txt);
btn1.SetImage(&btn1Img);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
progressbarOutlineImg.SetPosition(0, 7);
progressbarEmptyImg.SetPosition(80,7);
progressbarEmptyImg.SetTile(78);
progressbarImg.SetPosition(80, 7);
}
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&msgTxt);
promptWindow.Append(&msg2Txt);
promptWindow.Append(&btn1);
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
HaltGui();
mainWindow->SetState(STATE_DISABLED);
mainWindow->Append(&promptWindow);
mainWindow->ChangeFocus(&promptWindow);
ResumeGui();
struct stat st;
if(stat(CFG.update_path, &st) != 0) {
char dir[100];
snprintf(dir,strlen(CFG.update_path),"%s",CFG.update_path);
if (mkdir(dir, 0777) == -1) {
if(subfoldercheck(dir) != 1) {
WindowPrompt(LANGUAGE.Error,LANGUAGE.Cantcreatedirectory,LANGUAGE.ok,0,0,0);
ret = -1;
failed = -1;
}
}
}
char dolpath[150];
char dolpathsuccess[150];
snprintf(dolpath, sizeof(dolpath), "%sbootnew.dol", CFG.update_path);
snprintf(dolpathsuccess, sizeof(dolpathsuccess), "%sboot.dol", CFG.update_path);
while (!IP && !(ret < 0)) {
VIDEO_WaitVSync();
ret = Net_Init(hostip);
if (ret > 0) {
IP = hostip;
msgTxt.SetText(IP);
}
if (ret <= 0) {
msgTxt.SetText(LANGUAGE.Couldnotinitializenetwork);
}
if(btn1.GetState() == STATE_CLICKED) {
IP = 0;
ret = -1;
failed = -1;
btn1.ResetState();
break;
}
}
if(IP && ret >= 0) {
networkisinitialized = 1;
int revnumber = 0;
int currentrev = atoi(SVN_REV);
SDCard_deInit();
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/rev.txt");
FILE *pfile;
SDCard_Init();
if(file.data != NULL)
{
char revtxt[10];
pfile = fopen("SD:/rev.txt", "w");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
//has to be repeated or it isnt working (first file download bug)
pfile = fopen("SD:/rev.txt", "w");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
//"w+" doesnt work, needs to be reopened as "r"
pfile = fopen("SD:/rev.txt", "r");
int c = 0, i = 0;
while(c != EOF || i < 10) {
c = fgetc(pfile);
if (c != EOF) {
revtxt[i] = c;
} else {
revtxt[i] = 0x00;
break;
}
i++;
}
fclose(pfile);
revnumber = atoi(revtxt);
remove("SD:/rev.txt");
free(file.data);
}
if(revnumber > currentrev) {
sprintf(msg, "Rev%i available.", revnumber);
int choice = WindowPrompt(msg, "Do you want to update?", LANGUAGE.Yes, LANGUAGE.No, 0, 0);
if(choice == 1) {
sprintf(title, "%s", "Updating USB Loader GX");
titleTxt.SetText(title);
msgTxt.SetPosition(0,100);
promptWindow.Append(&progressbarEmptyImg);
promptWindow.Append(&progressbarImg);
promptWindow.Append(&progressbarOutlineImg);
promptWindow.Append(&prTxt);
sprintf(msg, "Updating to Rev%i", revnumber);
msgTxt.SetText(msg);
int filesize = downloadrev("http://www.techjawa.com/usbloadergx/boot.dol");
if(filesize > 0) {
pfile = fopen(dolpath, "wb");
for (int i = 0; i < filesize; i += blocksize) {
sprintf(prozent, "%i%%", 100*i/filesize);
prTxt.SetText(prozent);
if ((Settings.wsprompt == yes) && (CFG.widescreen)){/////////////adjust for widescreen
progressbarImg.SetTile(80*i/filesize);
} else {
progressbarImg.SetTile(100*i/filesize);
}
sprintf(msg2, "%iKB/%iKB", i/1024, filesize/1024);
msg2Txt.SetText(msg2);
if(btn1.GetState() == STATE_CLICKED) {
fclose(pfile);
remove(dolpath);
failed = -1;
btn1.ResetState();
break;
}
u32 blksize;
blksize = (u32)(filesize - i);
if (blksize > blocksize)
blksize = blocksize;
ret = network_read(blockbuffer, blksize);
if ((u32)ret != blksize) {
failed = -1;
ret = -1;
fclose(pfile);
remove(dolpath);
break;
}
fwrite(blockbuffer,1,blksize, pfile);
}
fclose(pfile);
if(!failed) {
//remove old
if(checkfile(dolpathsuccess)){
remove(dolpathsuccess);
}
//rename new to old
rename(dolpath, dolpathsuccess);
//get the icon.png and the meta.xml
char xmliconpath[150];
file = downloadfile("http://www.techjawa.com/usbloadergx/meta.file");
if(file.data != NULL){
sprintf(xmliconpath, "%smeta.xml", CFG.update_path);
pfile = fopen(xmliconpath, "wb");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
free(file.data);
}
file = downloadfile("http://www.techjawa.com/usbloadergx/icon.png");
if(file.data != NULL){
sprintf(xmliconpath, "%sicon.png", CFG.update_path);
pfile = fopen(xmliconpath, "wb");
fwrite(file.data,1,file.size,pfile);
fclose(pfile);
free(file.data);
}
}
} else {
failed = -1;
}
} else {
ret = -1;
}
} else {
WindowPrompt("No new updates", 0, "OK", 0, 0, 0);
ret = -1;
}
}
CloseConnection();
if(!failed && ret >= 0) {
WindowPrompt("Successfully updated ", "Restarting the Loader", "OK", 0, 0, 0);
if (*((u32*) 0x80001800)) exit(0);
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
while(promptWindow.GetEffect() > 0) usleep(50);
HaltGui();
mainWindow->Remove(&promptWindow);
mainWindow->SetState(STATE_DEFAULT);
ResumeGui();
if(failed != 0)
return failed;
return 1;
}
/**************************************************************************** /****************************************************************************
* UpdateGUI * UpdateGUI
@ -4140,7 +4450,6 @@ static int MenuSettings()
char imgPath[100]; char imgPath[100];
snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path); snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", CFG.theme_path);
GuiImageData btnOutline(imgPath, button_dialogue_box_png); GuiImageData btnOutline(imgPath, button_dialogue_box_png);
snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path); snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path);
@ -4151,6 +4460,8 @@ static int MenuSettings()
GuiImageData tab2(imgPath, tab_bg2_png); GuiImageData tab2(imgPath, tab_bg2_png);
snprintf(imgPath, sizeof(imgPath), "%stab_bg3.png", CFG.theme_path); snprintf(imgPath, sizeof(imgPath), "%stab_bg3.png", CFG.theme_path);
GuiImageData tab3(imgPath, tab_bg3_png); GuiImageData tab3(imgPath, tab_bg3_png);
snprintf(imgPath, sizeof(imgPath), "%supdateRev.png", CFG.theme_path);
GuiImageData updateRevImgData(imgPath, updateRev_png);
GuiTrigger trigA; GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
@ -4249,6 +4560,19 @@ static int MenuSettings()
lockBtn.SetTrigger(&trigA); lockBtn.SetTrigger(&trigA);
lockBtn.SetEffectGrow(); lockBtn.SetEffectGrow();
GuiImage updateBtnImg(&updateRevImgData);
updateBtnImg.SetWidescreen(CFG.widescreen);
GuiButton updateBtn(updateBtnImg.GetWidth(), updateBtnImg.GetHeight());
updateBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
updateBtn.SetPosition(70, 400);
updateBtn.SetImage(&updateBtnImg);
updateBtn.SetSoundOver(&btnSoundOver);
updateBtn.SetSoundClick(&btnClick);
updateBtn.SetTrigger(&trigA);
updateBtn.SetVisible(false);
updateBtn.SetClickable(false);
updateBtn.SetEffectGrow();
GuiImageData logo(credits_button_png); GuiImageData logo(credits_button_png);
GuiImage logoImg(&logo); GuiImage logoImg(&logo);
GuiImageData logoOver(credits_button_over_png); GuiImageData logoOver(credits_button_over_png);
@ -4295,6 +4619,7 @@ static int MenuSettings()
w.Append(&titleTxt); w.Append(&titleTxt);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
w.Append(btnLogo); w.Append(btnLogo);
w.Append(&homo); w.Append(&homo);
//set triggers for tabs //set triggers for tabs
@ -4372,7 +4697,7 @@ static int MenuSettings()
sprintf(options2.name[3], "%s",LANGUAGE.Unicodefix); sprintf(options2.name[3], "%s",LANGUAGE.Unicodefix);
sprintf(options2.name[4], "%s",LANGUAGE.Backgroundmusic); sprintf(options2.name[4], "%s",LANGUAGE.Backgroundmusic);
sprintf(options2.name[5], "%s",LANGUAGE.Wiilight); sprintf(options2.name[5], "%s",LANGUAGE.Wiilight);
sprintf(options2.name[6], " "); sprintf(options2.name[6], "%s",LANGUAGE.Updatepath);
sprintf(options2.name[7], "%s",LANGUAGE.MP3Menu); sprintf(options2.name[7], "%s",LANGUAGE.MP3Menu);
sprintf(options2.name[8], "%s",LANGUAGE.Defaultsettings); sprintf(options2.name[8], "%s",LANGUAGE.Defaultsettings);
@ -4572,6 +4897,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[20] = ""; char entered[20] = "";
strncpy(entered, Settings.unlockCode, sizeof(entered)); strncpy(entered, Settings.unlockCode, sizeof(entered));
int result = OnScreenKeyboard(entered, 20,0); int result = OnScreenKeyboard(entered, 20,0);
@ -4582,6 +4908,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
strncpy(Settings.unlockCode, entered, sizeof(Settings.unlockCode)); strncpy(Settings.unlockCode, entered, sizeof(Settings.unlockCode));
@ -4620,6 +4947,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.covers_path, sizeof(entered)); strncpy(entered, CFG.covers_path, sizeof(entered));
int result = OnScreenKeyboard(entered,43,4); int result = OnScreenKeyboard(entered,43,4);
@ -4630,6 +4958,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4657,6 +4986,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.disc_path, sizeof(entered)); strncpy(entered, CFG.disc_path, sizeof(entered));
int result = OnScreenKeyboard(entered, 43,4); int result = OnScreenKeyboard(entered, 43,4);
@ -4667,6 +4997,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4694,6 +5025,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.theme_path, sizeof(entered)); strncpy(entered, CFG.theme_path, sizeof(entered));
int result = OnScreenKeyboard(entered, 43,4); int result = OnScreenKeyboard(entered, 43,4);
@ -4704,6 +5036,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4745,6 +5078,7 @@ static int MenuSettings()
w.Append(&titleTxt); w.Append(&titleTxt);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
w.Append(btnLogo); w.Append(btnLogo);
mainWindow->Append(&optionBrowser2); mainWindow->Append(&optionBrowser2);
@ -4754,6 +5088,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
} }
} }
else else
@ -4818,7 +5153,15 @@ static int MenuSettings()
else if (Settings.wiilight == 1) sprintf (options2.value[5],"%s",LANGUAGE.ON); else if (Settings.wiilight == 1) sprintf (options2.value[5],"%s",LANGUAGE.ON);
else if (Settings.wiilight == 2) sprintf (options2.value[5],"%s",LANGUAGE.OnlyInstall); else if (Settings.wiilight == 2) sprintf (options2.value[5],"%s",LANGUAGE.OnlyInstall);
sprintf(options2.value[6], " "); if (strlen(CFG.update_path) < (9 + 3)) {
sprintf(cfgtext, "%s", CFG.update_path);
} else {
strncpy(cfgtext, CFG.update_path, 9);
cfgtext[9] = '\0';
strncat(cfgtext, "...", 3);
}
sprintf(options2.value[6], "%s", cfgtext);
sprintf(options2.value[7], "not working!"); sprintf(options2.value[7], "not working!");
sprintf(options2.value[8], " "); sprintf(options2.value[8], " ");
@ -4836,6 +5179,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = ""; char entered[43] = "";
strncpy(entered, CFG.titlestxt_path, sizeof(entered)); strncpy(entered, CFG.titlestxt_path, sizeof(entered));
int result = OnScreenKeyboard(entered,43,4); int result = OnScreenKeyboard(entered,43,4);
@ -4846,6 +5190,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ {
int len = (strlen(entered)-1); int len = (strlen(entered)-1);
@ -4876,6 +5221,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[40] = ""; char entered[40] = "";
strncpy(entered, CFG.language_path, sizeof(entered)); strncpy(entered, CFG.language_path, sizeof(entered));
int result = OnScreenKeyboard(entered, 40,0); int result = OnScreenKeyboard(entered, 40,0);
@ -4886,6 +5232,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 ) if ( result == 1 )
{ strncpy(CFG.language_path, entered, sizeof(CFG.language_path)); { strncpy(CFG.language_path, entered, sizeof(CFG.language_path));
if(isSdInserted()) { if(isSdInserted()) {
@ -4932,6 +5279,40 @@ static int MenuSettings()
WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0); WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0);
} }
break; break;
case 6:
if ( CFG.godmode == 1)
{
mainWindow->Remove(&optionBrowser2);
mainWindow->Remove(&page1Btn);
mainWindow->Remove(&page2Btn);
mainWindow->Remove(&tabBtn);
mainWindow->Remove(&page3Btn);
w.Remove(&backBtn);
w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[43] = "";
strncpy(entered, CFG.update_path, sizeof(entered));
int result = OnScreenKeyboard(entered,43,4);
mainWindow->Append(&optionBrowser2);
mainWindow->Append(&page1Btn);
mainWindow->Append(&page2Btn);
mainWindow->Append(&tabBtn);
mainWindow->Append(&page3Btn);
w.Append(&backBtn);
w.Append(&lockBtn);
w.Append(&updateBtn);
if ( result == 1 )
{
int len = (strlen(entered)-1);
if(entered[len] !='/')
strncat (entered, "/", 1);
strncpy(CFG.update_path, entered, sizeof(CFG.update_path));
WindowPrompt(LANGUAGE.Updatepathchanged,0,LANGUAGE.ok,0,0,0);
}
} else {
WindowPrompt(0,LANGUAGE.Consoleshouldbeunlockedtomodifyit,LANGUAGE.ok,0,0,0);
}
break;
case 8: case 8:
int choice = WindowPrompt(LANGUAGE.Areyousure, 0, LANGUAGE.Yes, LANGUAGE.Cancel, 0, 0); int choice = WindowPrompt(LANGUAGE.Areyousure, 0, LANGUAGE.Yes, LANGUAGE.Cancel, 0, 0);
if(choice == 1) { if(choice == 1) {
@ -4992,6 +5373,34 @@ static int MenuSettings()
break; break;
} }
if(updateBtn.GetState() == STATE_CLICKED) {
if(isSdInserted() && CFG.godmode) {
mainWindow->Remove(&optionBrowser2);
mainWindow->Remove(&page1Btn);
mainWindow->Remove(&page2Btn);
mainWindow->Remove(&tabBtn);
mainWindow->Remove(&page3Btn);
w.Remove(&backBtn);
w.Remove(&lockBtn);
w.Remove(&updateBtn);
int ret = ProgressUpdateWindow();
if(ret < 0) {
WindowPrompt(LANGUAGE.Updatefailed,0,LANGUAGE.ok,0,0,0);
}
mainWindow->Append(&optionBrowser2);
mainWindow->Append(&page1Btn);
mainWindow->Append(&page2Btn);
mainWindow->Append(&tabBtn);
mainWindow->Append(&page3Btn);
w.Append(&backBtn);
w.Append(&lockBtn);
w.Append(&updateBtn);
} else {
WindowPrompt(LANGUAGE.NoSDcardinserted, LANGUAGE.InsertaSDCardtousethatoption, LANGUAGE.ok, 0,0,0);
}
updateBtn.ResetState();
}
if(lockBtn.GetState() == STATE_CLICKED) if(lockBtn.GetState() == STATE_CLICKED)
{ {
if (!strcmp("", Settings.unlockCode)) if (!strcmp("", Settings.unlockCode))
@ -5008,6 +5417,7 @@ static int MenuSettings()
mainWindow->Remove(&page3Btn); mainWindow->Remove(&page3Btn);
w.Remove(&backBtn); w.Remove(&backBtn);
w.Remove(&lockBtn); w.Remove(&lockBtn);
w.Remove(&updateBtn);
char entered[20] = ""; char entered[20] = "";
int result = OnScreenKeyboard(entered, 20,0); int result = OnScreenKeyboard(entered, 20,0);
mainWindow->Append(&optionBrowser2); mainWindow->Append(&optionBrowser2);
@ -5017,6 +5427,7 @@ static int MenuSettings()
mainWindow->Append(&page3Btn); mainWindow->Append(&page3Btn);
w.Append(&backBtn); w.Append(&backBtn);
w.Append(&lockBtn); w.Append(&lockBtn);
w.Append(&updateBtn);
mainWindow->Append(&tabBtn); mainWindow->Append(&tabBtn);
if ( result == 1 ) { if ( result == 1 ) {
if (!strcmp(entered, Settings.unlockCode)) //if password correct if (!strcmp(entered, Settings.unlockCode)) //if password correct
@ -5087,6 +5498,13 @@ static int MenuSettings()
homo.ResetState(); homo.ResetState();
} }
} }
if(CFG.godmode) {
updateBtn.SetVisible(true);
updateBtn.SetClickable(true);
} else {
updateBtn.SetVisible(false);
updateBtn.SetClickable(false);
}
if(settingsbackgroundbtn.GetState() == STATE_CLICKED) if(settingsbackgroundbtn.GetState() == STATE_CLICKED)
{ {
optionBrowser2.SetFocus(1); optionBrowser2.SetFocus(1);

116
source/updater.c Normal file
View File

@ -0,0 +1,116 @@
#include <stdio.h>
#include <string.h>
#include <ogcsys.h>
#include <network.h>
#include "http.h"
static s32 connection;
s32 network_request(const char * request)
{
char buf[1024];
char *ptr = NULL;
u32 cnt, size;
s32 ret;
/* Send request */
ret = net_send(connection, request, strlen(request), 0);
if (ret < 0)
return ret;
/* Clear buffer */
memset(buf, 0, sizeof(buf));
/* Read HTTP header */
for (cnt = 0; !strstr(buf, "\r\n\r\n"); cnt++)
if (net_recv(connection, buf + cnt, 1, 0) <= 0)
return -1;
/* HTTP request OK? */
if (!strstr(buf, "HTTP/1.1 200 OK"))
return -1;
/* Retrieve content size */
ptr = strstr(buf, "Content-Length:");
if (!ptr)
return -1;
sscanf(ptr, "Content-Length: %u", &size);
return size;
}
s32 network_read(void *buf, u32 len)
{
s32 read = 0, ret;
/* Data to be read */
while (read < len) {
/* Read network data */
ret = net_read(connection, buf + read, len - read);
if (ret < 0)
return ret;
/* Read finished */
if (!ret)
break;
/* Increment read variable */
read += ret;
}
return read;
}
s32 downloadrev(const char * url) {
//Check if the url starts with "http://", if not it is not considered a valid url
if(strncmp(url, "http://", strlen("http://")) != 0)
{
//printf("URL '%s' doesn't start with 'http://'\n", url);
return -1;
}
//Locate the path part of the url by searching for '/' past "http://"
char *path = strchr(url + strlen("http://"), '/');
//At the very least the url has to end with '/', ending with just a domain is invalid
if(path == NULL)
{
//printf("URL '%s' has no PATH part\n", url);
return -1;
}
//Extract the domain part out of the url
int domainlength = path - url - strlen("http://");
if(domainlength == 0)
{
//printf("No domain part in URL '%s'\n", url);
return -1;
}
char domain[domainlength + 1];
strncpy(domain, url + strlen("http://"), domainlength);
domain[domainlength] = '\0';
connection = GetConnection(domain);
if(connection < 0) {
return -1;
}
//Form a nice request header to send to the webserver
char* headerformat = "GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n";;
char header[strlen(headerformat) + strlen(domain) + strlen(path)];
sprintf(header, headerformat, path, domain);
s32 filesize = network_request(header);
return filesize;
}
void CloseConnection() {
net_close(connection);
}

18
source/updater.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef _UPDATER_H_
#define _UPDATER_H_
#ifdef __cplusplus
extern "C"
{
#endif
s32 network_request(const char * request);
s32 network_read(void *buf, u32 len);
s32 downloadrev(const char * url);
void CloseConnection();
#ifdef __cplusplus
}
#endif
#endif