summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/progressbar.cpp189
1 files changed, 141 insertions, 48 deletions
diff --git a/src/gui/progressbar.cpp b/src/gui/progressbar.cpp
index fdaefa73..6ada672b 100644
--- a/src/gui/progressbar.cpp
+++ b/src/gui/progressbar.cpp
@@ -24,6 +24,10 @@
#include "progressbar.h"
#include "gui.h"
+// To draw primitives without dependencies
+void DrawPixel(SDL_Surface * screen, int x, int y, Uint8 R, Uint8 G, Uint8 B);
+void DrawLine(SDL_Surface * screen, int x1, int y1, int x2, int y2, unsigned char Red, unsigned char Green, unsigned char Blue);
+
ProgressBar::ProgressBar(float progress, int x, int y, int width, unsigned char red, unsigned green, unsigned char blue)
{
@@ -40,71 +44,34 @@ void ProgressBar::draw(gcn::Graphics *graphics)
{
int absx, absy;
getAbsolutePosition(absx, absy);
- /*
+
// outer bar
- int MyColor = makecol(abs(Red-70), abs(Green-70), abs(Blue-70));
- hline(buffer, absx+X+7, absy+Y, absx+X+Width, MyColor);
- hline(buffer, absx+X, absy+Y+7, absx+X+Width-7, MyColor);
- line(buffer, absx+X+7, absy+Y, absx+X, absy+Y+7, MyColor);
- line(buffer, absx+X+Width, absy+Y, absx+X+Width-7, absy+Y+7, MyColor);
+ DrawLine(screen, absx+X+7, absy+Y, absx+X+Width, absy+Y, abs(Red-70), abs(Green-70), abs(Blue-70));
+ DrawLine(screen, absx+X, absy+Y+7, absx+X+Width-7, absy+Y+7, abs(Red-70), abs(Green-70), abs(Blue-70));
+ DrawLine(screen, absx+X+7, absy+Y, absx+X, absy+Y+7, abs(Red-70), abs(Green-70), abs(Blue-70));
+ DrawLine(screen, absx+X+Width, absy+Y, absx+X+Width-7, absy+Y+7, abs(Red-70), abs(Green-70), abs(Blue-70));
// Shadow of outer bar
- MyColor = makeacol(0, 0, 0, 80);
- hline(buffer, absx+X+1, absy+Y+7+1, absx+X+Width-7, MyColor);
- line(buffer, absx+X+Width+1, absy+Y, absx+X+Width-7+1, absy+Y+7, MyColor);
+ DrawLine(screen, absx+X+1, absy+Y+7+1, absx+X+Width-7, absy+Y+7+1, 20, 20, 20);
+ DrawLine(screen, absx+X+Width+1, absy+Y, absx+X+Width-7+1, absy+Y+7, 20, 20, 20);
// Inner bar
- MyColor = makecol(Red, Green, Blue);
-
int Temp = 0;
-
for(int i = 1; i < 7; i++)
{
Temp = absx+X+int(float(Width)*progress)-i-1;
if (Temp < (absx + X + 8 - i)) Temp = (absx + X + 8 - i);
- hline(buffer, absx+X+8-i, absy+Y+i, Temp, MyColor);
+ DrawLine(screen, absx+X+8-i, absy+Y+i, Temp, absy+Y+i, Red, Green, Blue);
}
// Shadow of inner bar
Temp = absx+X+int(float(Width)*progress)-2;
if ( Temp < (absx+X+7+1) ) Temp = absx+X+7;
- MyColor = makeacol(abs(Red-40), abs(Green-40), abs(Blue-40), 80);
- hline(buffer, absx+X+7+1, absy+Y+1, Temp, MyColor);
- line(buffer, absx+X+7, absy+Y+1, absx+X+2, absy+Y+7-1, MyColor);
-
- //rectfill(buffer, absx+7, absy+7, absx+39, absy+9, MyColor);
- */
-/*
- if (progress != 0) {
- masked_blit(gui_skin.bar.bg.grid[3], buffer,
- 0, 0, x, y, buffer->w, buffer->h);
- }
- else {
- masked_blit(gui_skin.bar.bg.grid[0], buffer,
- 0, 0, x, y, buffer->w, buffer->h);
- }
-
- for (int i = 3; i < (w - 3); i++) {
- if (i < progress * w - 3) {
- masked_blit(gui_skin.bar.bg.grid[4], buffer,
- 0, 0, x + 1 * i, y, buffer->w, buffer->h);
- }
- else {
- masked_blit(gui_skin.bar.bg.grid[1], buffer,
- 0, 0, x + 1 * i, y, buffer->w, buffer->h);
- }
- }
-
- if (progress == 1) {
- masked_blit(gui_skin.bar.bg.grid[5], buffer,
- 0, 0, x + w - 3, y, buffer->w, buffer->h);
- }
- else {
- masked_blit(gui_skin.bar.bg.grid[2], buffer,
- 0, 0, x + w - 3, y, buffer->w, buffer->h);
- }*/
+ DrawLine(screen, absx+X+7+1, absy+Y+1, Temp, absy+Y+1, abs(Red-40), abs(Green-40), abs(Blue-40));
+ DrawLine(screen, absx+X+7, absy+Y+1, absx+X+2, absy+Y+7-1, abs(Red-40), abs(Green-40), abs(Blue-40));
+
}
void ProgressBar::setProgress(float progress)
@@ -116,3 +83,129 @@ float ProgressBar::getProgress()
{
return progress;
}
+
+// Cette fonction permet de dessiner facilement une pixel sur l'écran, en gérant automatiquement le nombre de couleurs
+ // de ce dernier...
+ // Il suffit de lui passer la surface à peindre, les coordonnées (x,y), et la couleur (R,G,B) [0 ... 255]
+ void DrawPixel(SDL_Surface * screen, int x, int y, Uint8 R, Uint8 G, Uint8 B)
+{
+ Uint32 color = SDL_MapRGB(screen->format, R, G, B);
+ if ( (x >= screen->w) || (x < 0) )
+ return;
+ if ( (y >= screen->h) || (y < 0) )
+ return;
+
+ switch (screen->format->BytesPerPixel)
+ {
+ case 1: // Pour 8 BPP
+ {
+ Uint8 *bufp;
+ bufp = (Uint8 *) screen->pixels + y * screen ->pitch + x;
+ *bufp = color;
+ }
+ break;
+
+ case 2: // 15 ou 16 BPP
+ {
+ Uint16 * bufp;
+ bufp = (Uint16 *)screen->pixels + y * screen->pitch/2 + x;
+ *bufp = color;
+ }
+ break;
+
+ case 3: // 24 BPP, peu utilisé, mais bon ...
+ {
+ Uint8 *bufp;
+ bufp = (Uint8 *)screen->pixels + y * screen->pitch + x * 3;
+
+ if (SDL_BYTEORDER == SDL_LIL_ENDIAN)
+ {
+ bufp[0] = color;
+ bufp[1] = color >> 8;
+ bufp[2] = color >> 16;
+ } else {
+ bufp[2] = color;
+ bufp[1] = color >> 8;
+ bufp[0] = color >> 16;
+ }
+ }
+ break;
+
+ case 4: // 32 BPP, le plus utilisé !
+ {
+ Uint32 *bufp;
+ bufp = (Uint32 *)screen->pixels + y * screen->pitch/4 + x;
+ *bufp = color;
+ }
+ break;
+ }
+} // Fin DrawLine
+
+// Dessine une ligne à l'écran avec une couleur et des coordonnées fournies.
+void DrawLine(SDL_Surface * screen, int x1, int y1, int x2, int y2, unsigned char Red, unsigned char Green, unsigned char Blue)
+{
+ float a, b, Temp_x1, Temp_x2, Temp_y1, Temp_y2;
+
+ Temp_x1 = x1;
+ Temp_x2 = x2;
+ Temp_y1 = y1;
+ Temp_y2 = y2;
+
+ if ( (x1-x2) != 0)
+ {
+ a=(Temp_y1-Temp_y2)/(Temp_x1-Temp_x2); // La pente // -350/-410=0.00
+ }
+ else // la ligne est verticale !
+ {
+ if ( y1 < y2)
+ {
+ for (int Y=y1; Y<=y2; Y++)
+ {
+ DrawPixel(screen, x1, Y, Red, Green, Blue);
+ }
+ }
+ else
+ {
+ for (int Y=y2; Y<=y1; Y++)
+ {
+ DrawPixel(screen, x1, Y, Red, Green, Blue);
+ }
+ }
+
+ return;
+ }
+
+ b=y1-a*x1;
+
+ if ( x1 < x2)
+ {
+ for (int X = x1; X <= x2; X++)
+ {
+ DrawPixel(screen, X, int(a*X+b), Red, Green, Blue);
+ }
+ }
+ else
+ {
+ for (int X = x2; X <= x1; X++)
+ {
+ DrawPixel(screen, X, int(a*X+b), Red, Green, Blue);
+ }
+ }
+
+ if ( y1 < y2)
+ {
+ for (int Y = y1; Y <= y2; Y++)
+ {
+ if (a != 0) DrawPixel(screen, int((Y-b)/a), Y, Red, Green, Blue);
+ }
+ }
+ else
+ {
+ for (int Y = y2; Y <= y1; Y++)
+ {
+ if (a != 0) DrawPixel(screen, int((Y-b)/a), Y, Red, Green, Blue);
+ }
+ }
+
+} // Fin DrawLine
+