summaryrefslogtreecommitdiffstats
path: root/menu_demo/button.c
diff options
context:
space:
mode:
Diffstat (limited to 'menu_demo/button.c')
-rw-r--r--menu_demo/button.c111
1 files changed, 63 insertions, 48 deletions
diff --git a/menu_demo/button.c b/menu_demo/button.c
index e63143a..588e0e1 100644
--- a/menu_demo/button.c
+++ b/menu_demo/button.c
@@ -9,6 +9,7 @@
#include <math.h>
#include "button.h"
+#include "font.h"
@@ -24,40 +25,41 @@ struct ButtonStruct ButtonCreate(int f_dXPos, int f_dYPos, int f_dWidth, int f_d
l_sButton.m_dWidth = f_dWidth;
// copy title
- memcpy(l_sButton.m_pcTitle, f_pcTitle, sizeof(f_pcTitle));
+ memset(&l_sButton.m_pcTitle, 0, sizeof(l_sButton.m_pcTitle));
+ memcpy(l_sButton.m_pcTitle, f_pcTitle, strlen(f_pcTitle));
switch (f_iType)
{
case BUTTON_CLICK:
- l_sButton.m_piImgNormal[0] = BitmapLoad("img/button_click_left.bmp");
- l_sButton.m_piImgNormal[1] = BitmapLoad("img/button_click_center.bmp");
- l_sButton.m_piImgNormal[2] = BitmapLoad("img/button_click_right.bmp");
+ l_sButton.m_psImgNormal[0] = BitmapLoad("img/button_click_left.bmp");
+ l_sButton.m_psImgNormal[1] = BitmapLoad("img/button_click_center.bmp");
+ l_sButton.m_psImgNormal[2] = BitmapLoad("img/button_click_right.bmp");
- l_sButton.m_piImgHover[0] = BitmapLoad("img/button_click_left_hover.bmp");
- l_sButton.m_piImgHover[1] = BitmapLoad("img/button_click_center_hover.bmp");
- l_sButton.m_piImgHover[2] = BitmapLoad("img/button_click_right_hover.bmp");
+ l_sButton.m_psImgHover[0] = BitmapLoad("img/button_click_left_hover.bmp");
+ l_sButton.m_psImgHover[1] = BitmapLoad("img/button_click_center_hover.bmp");
+ l_sButton.m_psImgHover[2] = BitmapLoad("img/button_click_right_hover.bmp");
- BitmapConvertWidth(&l_sButton.m_piImgNormal[0], f_dHeight);
- BitmapConvertWidth(&l_sButton.m_piImgNormal[1], f_dHeight);
- BitmapConvertWidth(&l_sButton.m_piImgNormal[2], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgNormal[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgNormal[1], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgNormal[2], f_dHeight);
- BitmapConvertWidth(&l_sButton.m_piImgHover[0], f_dHeight);
- BitmapConvertWidth(&l_sButton.m_piImgHover[1], f_dHeight);
- BitmapConvertWidth(&l_sButton.m_piImgHover[2], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgHover[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgHover[1], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgHover[2], f_dHeight);
// calculate (center)width of image
- l_sButton.m_dCenterWidth = max(f_dWidth - l_sButton.m_piImgNormal[0].m_iWidth - l_sButton.m_piImgNormal[2].m_iWidth, 0);
- l_sButton.m_dWidth = l_sButton.m_dCenterWidth + l_sButton.m_piImgNormal[0].m_iWidth + l_sButton.m_piImgNormal[2].m_iWidth;
+ l_sButton.m_dCenterWidth = max(f_dWidth - l_sButton.m_psImgNormal[0].m_iWidth - l_sButton.m_psImgNormal[2].m_iWidth, 0);
+ l_sButton.m_dWidth = l_sButton.m_dCenterWidth + l_sButton.m_psImgNormal[0].m_iWidth + l_sButton.m_psImgNormal[2].m_iWidth;
break;
case BUTTON_RADIO:
- l_sButton.m_piImgNormal[0] = BitmapLoad("img/button_radio.bmp");
- l_sButton.m_piImgHover[0] = BitmapLoad("img/button_radio_hover.bmp");
- l_sButton.m_piImgPressed[0] = BitmapLoad("img/button_radio_pressed.bmp");
+ l_sButton.m_psImgNormal[0] = BitmapLoad("img/button_radio.bmp");
+ l_sButton.m_psImgHover[0] = BitmapLoad("img/button_radio_hover.bmp");
+ l_sButton.m_psImgPressed[0] = BitmapLoad("img/button_radio_pressed.bmp");
- BitmapConvertWidth(&l_sButton.m_piImgNormal[0], f_dHeight);
- BitmapConvertWidth(&l_sButton.m_piImgHover[0], f_dHeight);
- BitmapConvertWidth(&l_sButton.m_piImgPressed[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgNormal[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgHover[0], f_dHeight);
+ BitmapConvertWidth(&l_sButton.m_psImgPressed[0], f_dHeight);
l_sButton.m_dCenterWidth = 0;
l_sButton.m_dHeight = f_dHeight;
@@ -88,23 +90,23 @@ int ButtonGetType(struct ButtonStruct *f_sButton)
void ButtonClickRender(struct ButtonStruct *f_sButton)
{
- char l_pcTitle[BUTTON_MAX_TITLE];
+ char l_pcTitle[BUTTON_MAX_TITLE];
struct BitmapStruct *l_sImgButton;
- int l_iImgWidth, l_iImageIdLeft, l_iImageIdCenter, l_iImageIdRight;
+ int l_iImgWidth, l_iImageIdLeft, l_iImageIdCenter, l_iImageIdRight;
+ int l_iLen, l_iXOffset, l_iYOffset;
double l_dXOffset, l_dYOffset;
- double l_dYCoordTop = 1;
- double l_dYCoordBot = 0;
-
// copy button attributes
double l_dCnWdt = f_sButton->m_dCenterWidth;
double l_dHeight = f_sButton->m_dHeight;
double l_dXPos = f_sButton->m_dXPos;
double l_dYPos = f_sButton->m_dYPos;
+ l_iLen = (int)strlen(f_sButton->m_pcTitle);
+ l_iXOffset = (int)(0.5 * f_sButton->m_dWidth - 0.5 * l_iLen * FONT_SPACING);
+ l_iYOffset = (int)(0.5 * f_sButton->m_dHeight - 0.5 * FONT_HEIGHT);
+
if (f_sButton->m_bPressed) {
- //l_dYCoordBot += l_dYCoordTop;
- //l_dYCoordTop -= l_dYCoordTop;
glColor3d(0.8, 0.9, 1);
}
else {
@@ -113,10 +115,10 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
// get the right image struct
if (f_sButton->m_bHover) {
- l_sImgButton = f_sButton->m_piImgHover;
+ l_sImgButton = f_sButton->m_psImgHover;
}
else {
- l_sImgButton = f_sButton->m_piImgNormal;
+ l_sImgButton = f_sButton->m_psImgNormal;
}
// copy buttom images
@@ -125,8 +127,7 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
l_iImageIdRight = l_sImgButton[2].m_iImageId;
// copy button title
- memset(&l_pcTitle, 0, sizeof(l_pcTitle));
- memcpy(&l_pcTitle, f_sButton->m_pcTitle, sizeof(f_sButton->m_pcTitle));
+ memcpy(&l_pcTitle, f_sButton->m_pcTitle, strlen(f_sButton->m_pcTitle));
// render left side of button
glBindTexture(GL_TEXTURE_2D, l_iImageIdLeft);
@@ -136,10 +137,10 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
l_dYOffset = l_dYPos;
glBegin(GL_TRIANGLE_STRIP);
- glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset + 1, l_dYOffset, 0);
- glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
- glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset + 1, l_dYOffset + l_dHeight, 0);
- glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(0, 1); glVertex3d(l_dXOffset + 1, l_dYOffset, 0);
+ glTexCoord2d(1, 1); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
+ glTexCoord2d(0, 0); glVertex3d(l_dXOffset + 1, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(1, 0); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
glEnd();
l_dXOffset = l_dXPos + l_iImgWidth + l_dCnWdt;
@@ -150,10 +151,10 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
l_iImgWidth = l_sImgButton[2].m_iWidth;
glBegin(GL_TRIANGLE_STRIP);
- glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset - 1, l_dYOffset, 0);
- glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
- glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset - 1, l_dYOffset + l_dHeight, 0);
- glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(0, 1); glVertex3d(l_dXOffset - 1, l_dYOffset, 0);
+ glTexCoord2d(1, 1); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset, 0);
+ glTexCoord2d(0, 0); glVertex3d(l_dXOffset - 1, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(1, 0); glVertex3d(l_dXOffset + l_iImgWidth, l_dYOffset + l_dHeight, 0);
glEnd();
l_dXOffset = l_dXOffset - l_dCnWdt;
@@ -164,10 +165,10 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
glBindTexture(GL_TEXTURE_2D, l_iImageIdCenter);
glBegin(GL_TRIANGLE_STRIP);
- glTexCoord2d(0, l_dYCoordTop); glVertex3d(l_dXOffset - 1, l_dYOffset, 0);
- glTexCoord2d(1, l_dYCoordTop); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset, 0);
- glTexCoord2d(0, l_dYCoordBot); glVertex3d(l_dXOffset - 1, l_dYOffset + l_dHeight, 0);
- glTexCoord2d(1, l_dYCoordBot); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(0, 1); glVertex3d(l_dXOffset - 1, l_dYOffset, 0);
+ glTexCoord2d(1, 1); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset, 0);
+ glTexCoord2d(0, 0); glVertex3d(l_dXOffset - 1, l_dYOffset + l_dHeight, 0);
+ glTexCoord2d(1, 0); glVertex3d(l_dXOffset + l_dCnWdt, l_dYOffset + l_dHeight, 0);
glEnd();
}
@@ -176,6 +177,10 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
glColor3d(1, 1, 1);
}
+ glPrint(f_sButton->m_dXPos + l_iXOffset,
+ f_sButton->m_dYPos + l_iYOffset,
+ f_sButton->m_pcTitle);
+
} // ButtonClickRender
@@ -183,7 +188,7 @@ void ButtonClickRender(struct ButtonStruct *f_sButton)
void ButtonRadioRender(struct ButtonStruct *f_sButton)
{
struct BitmapStruct *l_sImgButton;
- int l_iImageId;
+ int l_iLen, l_iXOffset, l_iYOffset, l_iImageId;
// copy button attributes
double l_dWidth = f_sButton->m_dWidth;
@@ -191,14 +196,20 @@ void ButtonRadioRender(struct ButtonStruct *f_sButton)
double l_dXPos = f_sButton->m_dXPos;
double l_dYPos = f_sButton->m_dYPos;
+ l_iLen = (int)strlen(f_sButton->m_pcTitle);
+ l_iXOffset = (int)(f_sButton->m_dWidth + FONT_SPACING);
+ l_iYOffset = (int)(0.5 * f_sButton->m_dHeight - 0.5 * FONT_HEIGHT);
+
+ glColor3d(1, 1, 1);
+
// get the right image struct
if (f_sButton->m_bHover)
{
- l_sImgButton = f_sButton->m_piImgHover;
+ l_sImgButton = f_sButton->m_psImgHover;
}
else
{
- l_sImgButton = f_sButton->m_piImgNormal;
+ l_sImgButton = f_sButton->m_psImgNormal;
}
// copy buttom images
@@ -216,7 +227,7 @@ void ButtonRadioRender(struct ButtonStruct *f_sButton)
if (f_sButton->m_bPressed)
{
- l_iImageId = f_sButton->m_piImgPressed[0].m_iImageId;
+ l_iImageId = f_sButton->m_psImgPressed[0].m_iImageId;
glBindTexture(GL_TEXTURE_2D, l_iImageId);
glBegin(GL_TRIANGLE_STRIP);
@@ -227,6 +238,10 @@ void ButtonRadioRender(struct ButtonStruct *f_sButton)
glEnd();
}
+ glPrint(f_sButton->m_dXPos + l_iXOffset,
+ f_sButton->m_dYPos + l_iYOffset,
+ f_sButton->m_pcTitle);
+
} // ButtonRadioRender