8 Commits

Author SHA1 Message Date
6fb31a3ae5 - [FIX] Fallaba al carregar fonts amb format de final de linea de Windows 2026-03-22 17:39:21 +01:00
89496fb8fb - [FIX] El nom dels arxius a pujar a gitea estaba mal 2026-03-21 11:53:41 +01:00
4774a1a806 - [FIX] Scripts de publicació 2026-03-21 11:46:47 +01:00
74cb8cb0f8 VERSIÓ 1.4.8:
- [NEW] draw.surfrot
2026-03-21 10:15:23 +01:00
d573c159fa - [FIX] Arreglat el make de macos
- [NEW] Publicació automàtica de releases
2026-03-20 11:46:11 +01:00
446f588cfe - [WIP] Treballant en que publique a gitea amb la API 2026-03-20 09:17:21 +01:00
8c9c1f2b47 - [WIP] Afegides DLLs de windows per a quan empaquete 2026-03-20 08:37:01 +01:00
6cccd44743 - [FIX] Eliminat un warning en macOS en jfile
- [WIP] Sistema de release automatic
2026-03-20 08:35:28 +01:00
16 changed files with 291 additions and 12 deletions

3
.gitignore vendored
View File

@@ -4,5 +4,6 @@ mini_debug.exe
mini_debug mini_debug
.vscode/* .vscode/*
info.plist info.plist
*.dll
build/* build/*
*.zip
*.tar.gz

View File

@@ -11,13 +11,13 @@ windows_debug:
g++ $(source) -D DEBUG -g -Wall -Os -lmingw32 -lSDL3 -lopengl32 -o "$(executable)_debug.exe" g++ $(source) -D DEBUG -g -Wall -Os -lmingw32 -lSDL3 -lopengl32 -o "$(executable)_debug.exe"
macos: macos:
clang++ $(source) -Wall -Os -std=c++11 -ffunction-sections -fdata-sections -lSDL3 -o "$(executable)" clang++ $(source) -Wall -Os -std=c++17 -Wno-deprecated -ffunction-sections -fdata-sections -lSDL3 -framework OpenGL -o "$(executable)"
macos_debug: macos_debug:
clang++ $(source) -D DEBUG -g -Wall -Os -std=c++11 -ffunction-sections -fdata-sections -lSDL3 -o "$(executable)_debug" clang++ $(source) -D DEBUG -g -Wall -Os -std=c++17 -Wno-deprecated -ffunction-sections -fdata-sections -lSDL3 -framework OpenGL -o "$(executable)_debug"
macos_bundle: macos_bundle:
clang++ $(source) -D MACOS_BUNDLE -Wall -Os -std=c++11 -framework SDL3 -F /Library/Frameworks -ffunction-sections -fdata-sections -o mini_bundle -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12 clang++ $(source) -D MACOS_BUNDLE -Wall -Os -std=c++17 -Wno-deprecated -framework SDL3 -framework OpenGL -F /Library/Frameworks -ffunction-sections -fdata-sections -o mini_bundle -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12
linux: linux:
g++ $(source) -D LUA_USE_LINUX -Wall -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -lSDL3 -lGL -o "$(executable)" g++ $(source) -D LUA_USE_LINUX -Wall -Os -ffunction-sections -fdata-sections -Wl,--gc-sections -lSDL3 -lGL -o "$(executable)"

BIN
bin/SDL3.dll Normal file

Binary file not shown.

BIN
bin/libgcc_s_seh-1.dll Normal file

Binary file not shown.

BIN
bin/libstdc++-6.dll Normal file

Binary file not shown.

BIN
bin/libwinpthread-1.dll Normal file

Binary file not shown.

View File

@@ -1,6 +1,7 @@
--require "ia.other" --require "ia.other"
x=0 x=0
rot=0
function mini.init() function mini.init()
s = surf.load("gfx/logo.gif") s = surf.load("gfx/logo.gif")
@@ -21,7 +22,7 @@ end
function mini.update() function mini.update()
surf.cls(0) surf.cls(0)
draw.surf(0, 0, 160, 144, 0, 0) draw.surfrot(0, 0, 160, 144, 120, 78, rot)
draw.text("PRESS START", 60, 110, 28) draw.text("PRESS START", 60, 110, 28)
if key.press(key.ESCAPE) then sys.quit() end if key.press(key.ESCAPE) then sys.quit() end
@@ -48,4 +49,5 @@ function mini.update()
font.spacing(0) font.spacing(0)
draw.text("0146",100,50,28) draw.text("0146",100,50,28)
font.current(font.DEFAULT) font.current(font.DEFAULT)
rot=rot+1
end end

27
do_release.bat Normal file
View File

@@ -0,0 +1,27 @@
@echo off
REM Comprobar parámetro
IF "%1"=="" (
echo Uso: build_windows.bat ^<PARAMETRO^>
exit /b 1
)
set PARAM=%1
echo Compilando windows...
make windows || exit /b 1
echo Compilando windows_debug...
make windows_debug || exit /b 1
echo Creando paquetes...
REM Crear ZIP release con mini.exe + DLLs
tar -a -c -f mini_%PARAM%_windows_release.zip mini.exe bin\*.dll || exit /b 1
REM Crear ZIP debug solo con mini_debug.exe
tar -a -c -f mini_%PARAM%_windows_debug.zip mini_debug.exe bin\*.dll || exit /b 1
echo Paquetes generados:
echo mini_%PARAM%_windows_release.zip
echo mini_%PARAM%_windows_debug.zip

41
do_release.sh Executable file
View File

@@ -0,0 +1,41 @@
#!/bin/bash
set -e
#if [ -z "$1" ]; then
# echo "Uso: $0 <PARAMETRO>"
# exit 1
#fi
# Leer versión desde version.h
VERSION=$(grep '#define MINI_VERSION' version.h | sed 's/.*"\(.*\)".*/\1/')
echo "Versión detectada: $VERSION"
#PARAM=$1
# Datos Windows
WIN_USER="raimon"
WIN_HOST="192.168.1.51"
WIN_PATH_SSH="C:\Users\raimon\dev\mini"
WIN_PATH_SCP="C:/Users/Raimon/dev/mini"
echo "=== Compilando Linux ==="
make linux
make linux_debug
echo "=== Empaquetando Linux ==="
tar -czf mini_v${VERSION}_linux_release.tar.gz mini
tar -czf mini_v${VERSION}_linux_debug.tar.gz mini_debug
echo "=== Ejecutando build remoto Windows ==="
ssh ${WIN_USER}@${WIN_HOST} "cd ${WIN_PATH_SSH} && do_release.bat v${VERSION}"
echo "=== Copiando ZIPs desde Windows ==="
scp ${WIN_USER}@${WIN_HOST}:"${WIN_PATH_SCP}/mini_v${VERSION}_windows_release.zip" .
scp ${WIN_USER}@${WIN_HOST}:"${WIN_PATH_SCP}/mini_v${VERSION}_windows_debug.zip" .
echo "=== Build completado correctamente ==="
echo "Generados:"
echo " mini_v${VERSION}_linux_release.tar.gz"
echo " mini_v${VERSION}_linux_debug.tar.gz"
echo " mini_v${VERSION}_windows_release.zip"
echo " mini_v${VERSION}_windows_debug.zip"

View File

@@ -78,10 +78,11 @@ bool file_getdictionary() {
fi.read( (char*)&file_size, 4 ); fi.read( (char*)&file_size, 4 );
uint8_t path_size; uint8_t path_size;
fi.read( (char*)&path_size, 1 ); fi.read( (char*)&path_size, 1 );
char file_name[path_size+1]; char *file_name = (char*)malloc(path_size+1);
fi.read( file_name, path_size ); fi.read( file_name, path_size );
file_name[path_size] = 0; file_name[path_size] = 0;
std::string filename = file_name; std::string filename = file_name;
free(file_name);
toc.push_back({filename, file_size, file_offset}); toc.push_back({filename, file_size, file_offset});
} }
fi.close(); fi.close();

View File

@@ -577,7 +577,11 @@ extern "C" {
int dx = luaL_checknumber(L, 5); int dx = luaL_checknumber(L, 5);
int dy = luaL_checknumber(L, 6); int dy = luaL_checknumber(L, 6);
float a = luaL_checknumber(L, 7); float a = luaL_checknumber(L, 7);
blit_r(sx, sy, sw, sh, dx, dy, a); int dw = luaL_optnumber(L, 8, 0);
int dh = luaL_optnumber(L, 9, 0);
bool flip_x = lua_toboolean(L, 10);
bool flip_y = lua_toboolean(L, 11);
blit_r(sx, sy, sw, sh, dx, dy, dw, dh, flip_x, flip_y, a);
return 0; return 0;
} }

139
mini.cpp
View File

@@ -435,6 +435,7 @@ uint8_t loadfont_from_buffer(const char* buffer, uint8_t index, const char* name
memcpy(line, ptr, len); memcpy(line, ptr, len);
line[len] = '\0'; line[len] = '\0';
ptr += (ptr[len] == '\n') ? len + 1 : len; // Advance pointer ptr += (ptr[len] == '\n') ? len + 1 : len; // Advance pointer
if (len > 0 && line[len - 1] == '\r') line[len - 1] = '\0';
if (strncmp(line, "bitmap=", 7) != 0) return false; // Parse first line if (strncmp(line, "bitmap=", 7) != 0) return false; // Parse first line
@@ -453,6 +454,7 @@ uint8_t loadfont_from_buffer(const char* buffer, uint8_t index, const char* name
memcpy(line, ptr, len); memcpy(line, ptr, len);
line[len] = '\0'; line[len] = '\0';
ptr += (ptr[len] == '\n') ? len + 1 : len; // Advance pointer ptr += (ptr[len] == '\n') ? len + 1 : len; // Advance pointer
if (len > 0 && line[len - 1] == '\r') line[len - 1] = '\0';
// Remove comments // Remove comments
char* hash = strchr(line, '#'); char* hash = strchr(line, '#');
@@ -1351,6 +1353,7 @@ void blit(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, bool f
} }
} }
/*
void blit_r(int sx, int sy, int sw, int sh, int x, int y, float a) void blit_r(int sx, int sy, int sw, int sh, int x, int y, float a)
{ {
const int x0 = sw>>1; const int x0 = sw>>1;
@@ -1373,6 +1376,142 @@ void blit_r(int sx, int sy, int sw, int sh, int x, int y, float a)
} }
} }
} }
*/
void blit_r(int sx, int sy, int sw, int sh,
int dx, int dy, int dw, int dh,
bool flip_x, bool flip_y,
float angle_deg)
{
if (dw == 0) dw = sw;
if (dh == 0) dh = sh;
// Centro del destino (rectángulo sin rotar)
float dcx = dx + dw * 0.5f;
float dcy = dy + dh * 0.5f;
// Centro del subrectángulo origen
float scx = sx + sw * 0.5f;
float scy = sy + sh * 0.5f;
// Escalado destino -> origen
float inv_scale_x = float(sw) / float(dw);
float inv_scale_y = float(sh) / float(dh);
// Flips integrados en la escala
if (flip_x) inv_scale_x = -inv_scale_x;
if (flip_y) inv_scale_y = -inv_scale_y;
// Ángulo en radianes
float a = angle_deg * 3.14159265f / 180.0f;
float ca = SDL_cosf(a);
float sa = SDL_sinf(a);
// --- 1. Bounding box rotado del rectángulo destino ---
float hx = dw * 0.5f;
float hy = dh * 0.5f;
float vx[4] = { -hx, hx, -hx, hx };
float vy[4] = { -hy, -hy, hy, hy };
float min_x = 1e9f, max_x = -1e9f;
float min_y = 1e9f, max_y = -1e9f;
for (int i = 0; i < 4; ++i) {
float rr_x = vx[i] * ca - vy[i] * sa;
float rr_y = vx[i] * sa + vy[i] * ca;
float dxp = dcx + rr_x;
float dyp = dcy + rr_y;
if (dxp < min_x) min_x = dxp;
if (dxp > max_x) max_x = dxp;
if (dyp < min_y) min_y = dyp;
if (dyp > max_y) max_y = dyp;
}
int bb_x0 = (int)SDL_floorf(min_x);
int bb_x1 = (int)SDL_ceilf (max_x);
int bb_y0 = (int)SDL_floorf(min_y);
int bb_y1 = (int)SDL_ceilf (max_y);
// --- 2. Rotación inversa + escalado + clipping estricto ---
for (int y = bb_y0; y <= bb_y1; ++y) {
for (int x = bb_x0; x <= bb_x1; ++x) {
// Coordenadas relativas al centro destino
float rx = x - dcx;
float ry = y - dcy;
// Rotación inversa
float ux = rx * ca + ry * sa;
float uy = -rx * sa + ry * ca;
// Escalado destino -> origen (con flips)
float sxp = scx + ux * inv_scale_x;
float syp = scy + uy * inv_scale_y;
// Clipping estricto al subrectángulo origen
if (sxp < sx || sxp >= sx + sw ||
syp < sy || syp >= sy + sh)
continue; // no pintamos nada
uint8_t color = sget((int)sxp, (int)syp);
pset(x, y, color);
}
}
}
/*void blit_r(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, bool flip_x, bool flip_y, float angle_deg)
{
if (dw == 0) dw = sw;
if (dh == 0) dh = sh;
// Escalado origen→destino
float sdx = float(sw) / float(dw);
float sdy = float(sh) / float(dh);
// Centro del destino
float dcx = dx + dw * 0.5f;
float dcy = dy + dh * 0.5f;
// Centro del origen
float scx = sx + sw * 0.5f;
float scy = sy + sh * 0.5f;
// Flips: invertir escala
if (flip_x) sdx = -sdx;
if (flip_y) sdy = -sdy;
// Ángulo en radianes
float a = angle_deg * 3.14159265f / 180.0f;
float ca = SDL_cosf(a);
float sa = SDL_sinf(a);
// Bucle principal
for (int y = dy; y < dy + dh; ++y) {
for (int x = dx; x < dx + dw; ++x) {
// Coordenadas destino relativas al centro
float rx = x - dcx;
float ry = y - dcy;
// Rotación inversa (para muestreo)
float orx = rx * ca + ry * sa;
float ory = -rx * sa + ry * ca;
// Convertir a coordenadas de la fuente
float sxp = scx + orx * sdx;
float syp = scy + ory * sdy;
// Muestreo nearest neighbor
uint8_t color = sget(int(sxp), int(syp));
pset(x, y, color);
}
}
}*/
void tline(int x0, int y0, int x1, int y1, float mx, float my, float mdx, float mdy) { void tline(int x0, int y0, int x1, int y1, float mx, float my, float mdx, float mdy) {
int x, y; int x, y;

3
mini.h
View File

@@ -217,7 +217,8 @@ void sset(int x, int y, uint8_t color);
void spr(uint8_t n, int x, int y, float w = 1.0f, float h = 1.0f, bool flip_x = false, bool flip_y = false); void spr(uint8_t n, int x, int y, float w = 1.0f, float h = 1.0f, bool flip_x = false, bool flip_y = false);
void blit(int sx, int sy, int sw, int sh, int dx, int dy, int dw=0, int dh=0, bool flip_x = false, bool flip_y = false, bool invert = false); void blit(int sx, int sy, int sw, int sh, int dx, int dy, int dw=0, int dh=0, bool flip_x = false, bool flip_y = false, bool invert = false);
void blit_r(int sx, int sy, int sw, int sh, int x, int y, float a); //void blit_r(int sx, int sy, int sw, int sh, int x, int y, float a);
void blit_r(int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, bool flip_x, bool flip_y, float angle_deg);
void tline(int x0, int y0, int x1, int y1, float mx, float my, float mdx=0.125f, float mdy=0.0f); void tline(int x0, int y0, int x1, int y1, float mx, float my, float mdx=0.125f, float mdy=0.0f);
void thline(int x0, int y, int x1, float mx, float my, float mdx=0.125f, float mdy=0.0f); void thline(int x0, int y, int x1, float mx, float my, float mdx=0.125f, float mdy=0.0f);

57
publish_gitea.sh Executable file
View File

@@ -0,0 +1,57 @@
#!/bin/bash
set -e
#if [ -z "$1" ]; then
# echo "Uso: $0 <PARAMETRO>"
# exit 1
#fi
GITEA_TOKEN="eb44d9c0142f5038c61c5afd17f5a41177bfaedc"
if [ -z "$GITEA_TOKEN" ]; then
echo "ERROR: Debes exportar GITEA_TOKEN"
exit 1
fi
# Leer versión desde version.h
VERSION=$(grep '#define MINI_VERSION' version.h | sed 's/.*"\(.*\)".*/\1/')
echo "Versión detectada: $VERSION"
#PARAM=$1
API="https://gitea.sustancia.synology.me/api/v1"
REPO="JailDoctor/mini"
echo "=== Creando release ${VERSION} en Gitea ==="
RELEASE_ID=$(curl -s -X POST "${API}/repos/${REPO}/releases" \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"tag_name\": \"${VERSION}\",
\"name\": \"Release ${VERSION}\",
\"draft\": false,
\"prerelease\": false
}" | jq -r '.id')
if [ "$RELEASE_ID" = "null" ]; then
echo "ERROR: No se pudo crear el release"
exit 1
fi
echo "Release creado con ID: $RELEASE_ID"
echo "=== Subiendo artefactos ==="
for f in mini_v${VERSION}_linux_release.tar.gz \
mini_v${VERSION}_linux_debug.tar.gz \
mini_v${VERSION}_windows_release.zip \
mini_v${VERSION}_windows_debug.zip
do
echo "Subiendo $f..."
curl -s -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-F "attachment=@${f}" \
"${API}/repos/${REPO}/releases/${RELEASE_ID}/assets" > /dev/null
done
echo "=== Publicación completada ==="

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define MINI_VERSION "1.4.7" #define MINI_VERSION "1.4.9"

View File

@@ -320,9 +320,15 @@ function draw.surf(sx, sy, sw, sh, dx, dy, dw, dh, flip_x, flip_y, invert) end
---@param x number ---@param x number
---@param y number ---@param y number
---@param a number ---@param a number
---@optional dw number
---@optional dh number
---@optional boolean flip_x
---@optional boolean flip_y
---@optional boolean invert
---Blit the region starting at (sx,sy) and size (sw, sh) from the source surface ---Blit the region starting at (sx,sy) and size (sw, sh) from the source surface
---to the position (dx, dy) of the target surface, rotating it by a degrees ---to the position (dx, dy) of the target surface, rotating it by a degrees,
function draw.surfrot(sx, sy, sw, sh, x, y, a) end ---(and optionally of size (dw, dh)) optionally flipping it horizontally or vertically
function draw.surfrot(sx, sy, sw, sh, x, y, a, dw, dh, flip_x, flip_y) end
---@param text string ---@param text string
---@param x number ---@param x number