From 752ef92645267ad6453ab1ec79ffe86ac8c82680 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Mon, 4 Jul 2022 23:56:04 +0300 Subject: [PATCH 01/11] updated SDL2-2.0.22 builds with a minor backport from SDL2 main branch. --- Windows/SDL2/include/SDL_revision.h | 2 +- Windows/SDL2/lib/SDL2.dll | Bin 1138176 -> 1138176 bytes Windows/SDL2/lib64/SDL2.dll | Bin 1343488 -> 1343488 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Windows/SDL2/include/SDL_revision.h b/Windows/SDL2/include/SDL_revision.h index dd918507..31f1ade1 100644 --- a/Windows/SDL2/include/SDL_revision.h +++ b/Windows/SDL2/include/SDL_revision.h @@ -1,2 +1,2 @@ -#define SDL_REVISION "@a788189020ac220e3c44e1383e0a1621b3309f8f" +#define SDL_REVISION "@09aae5c0ddc04f28f89801b2ef14a63a4365b8d3" #define SDL_REVISION_NUMBER 0 diff --git a/Windows/SDL2/lib/SDL2.dll b/Windows/SDL2/lib/SDL2.dll index 73d48e2e3101742a5c4334f242fe92e4985787d3..31b3db9b0f10e52bcc13af176f9bb64f7e29517f 100644 GIT binary patch delta 197 zcmZqJrFA(!>Ut`O!8>wMnnV6Vrnrx7gl5Aj-W@M3OVQFDtm}Hci mW@wUVW}IkZY-XBdkz%}^aXLS99>}@v?5qOY*;xgDMgRaLR!Xk` delta 197 zcmZqJb2Y&lRO+#Sj@ zfq<>q8|xU5<>7EeA?J8Xt%~+W6O&X!V+-R{ lgG56!Bf}(PV*|@Hi?r>G)A^b6K+bJvXBF7a&MNpb0sxU9O>+PM diff --git a/Windows/SDL2/lib64/SDL2.dll b/Windows/SDL2/lib64/SDL2.dll index d135d53c9f6cf07ab551664d68aaaa82390c1f7c..38b50b8ffe8469cd444fc3e1195e389e7dbc5a58 100644 GIT binary patch delta 83714 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 z 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≤3H(ppxnA0(n24 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 From 52a3873d441047bb47e3d1730f47f39b8533163e Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Tue, 5 Jul 2022 08:50:02 +0300 Subject: [PATCH 02/11] removed several unused r_speeds globals. --- Quake/gl_rmain.c | 17 ++++++++--------- Quake/glquake.h | 3 +-- Quake/r_part.c | 8 ++++---- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Quake/gl_rmain.c b/Quake/gl_rmain.c index e9cee614..87015240 100644 --- a/Quake/gl_rmain.c +++ b/Quake/gl_rmain.c @@ -34,9 +34,8 @@ int r_framecount; // used for dlight push checking mplane_t frustum[4]; //johnfitz -- rendering statistics -int rs_brushpolys, rs_aliaspolys, rs_skypolys, rs_particles, rs_fogpolys; +int rs_brushpolys, rs_aliaspolys, rs_skypolys; int rs_dynamiclightmaps, rs_brushpasses, rs_aliaspasses, rs_skypasses; -float rs_megatexels; // // view origin @@ -1043,7 +1042,7 @@ void R_RenderView (void) time1 = Sys_DoubleTime (); //johnfitz -- rendering statistics - rs_brushpolys = rs_aliaspolys = rs_skypolys = rs_particles = rs_fogpolys = rs_megatexels = + rs_brushpolys = rs_aliaspolys = rs_skypolys = rs_dynamiclightmaps = rs_aliaspasses = rs_skypasses = rs_brushpasses = 0; } else if (gl_finish.value) @@ -1093,12 +1092,12 @@ void R_RenderView (void) time2 = Sys_DoubleTime (); if (r_pos.value) Con_Printf ("x %i y %i z %i (pitch %i yaw %i roll %i)\n", - (int)cl_entities[cl.viewentity].origin[0], - (int)cl_entities[cl.viewentity].origin[1], - (int)cl_entities[cl.viewentity].origin[2], - (int)cl.viewangles[PITCH], - (int)cl.viewangles[YAW], - (int)cl.viewangles[ROLL]); + (int)cl_entities[cl.viewentity].origin[0], + (int)cl_entities[cl.viewentity].origin[1], + (int)cl_entities[cl.viewentity].origin[2], + (int)cl.viewangles[PITCH], + (int)cl.viewangles[YAW], + (int)cl.viewangles[ROLL]); else if (r_speeds.value == 2) Con_Printf ("%3i ms %4i/%4i wpoly %4i/%4i epoly %3i lmap %4i/%4i sky %1.1f mtex\n", (int)((time2-time1)*1000), diff --git a/Quake/glquake.h b/Quake/glquake.h index 495311c1..efe9e0e2 100644 --- a/Quake/glquake.h +++ b/Quake/glquake.h @@ -263,9 +263,8 @@ extern qboolean gl_texture_env_combine; extern qboolean gl_texture_env_add; // for GL_EXT_texture_env_add //johnfitz -- rendering statistics -extern int rs_brushpolys, rs_aliaspolys, rs_skypolys, rs_particles, rs_fogpolys; +extern int rs_brushpolys, rs_aliaspolys, rs_skypolys; extern int rs_dynamiclightmaps, rs_brushpasses, rs_aliaspasses, rs_skypasses; -extern float rs_megatexels; //johnfitz -- track developer statistics that vary every frame extern cvar_t devstats; diff --git a/Quake/r_part.c b/Quake/r_part.c index a72c4d5b..94204856 100644 --- a/Quake/r_part.c +++ b/Quake/r_part.c @@ -575,7 +575,9 @@ void R_TeleportSplash (vec3_t org) vec3_t dir; for (i=-16 ; i<16 ; i+=4) + { for (j=-16 ; j<16 ; j+=4) + { for (k=-24 ; k<32 ; k+=4) { if (!free_particles) @@ -601,6 +603,8 @@ void R_TeleportSplash (vec3_t org) vel = 50 + (rand()&63); VectorScale (dir, vel, p->vel); } + } + } } /* @@ -890,8 +894,6 @@ void R_DrawParticles (void) glTexCoord2f (0,0.5); VectorMA (p->org, scale, right, p_right); glVertex3fv (p_right); - - rs_particles++; //johnfitz //FIXME: just use r_numparticles } glEnd (); } @@ -931,8 +933,6 @@ void R_DrawParticles (void) glTexCoord2f (0,1); VectorMA (p->org, scale, right, p_right); glVertex3fv (p_right); - - rs_particles++; //johnfitz //FIXME: just use r_numparticles } glEnd (); } From 2dd6a14ccff93f252989fe625b5db3c6fcb102b5 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Tue, 5 Jul 2022 08:50:02 +0300 Subject: [PATCH 03/11] removed r_cache_thrash, showram & co. --- Quake/gl_rmain.c | 4 ---- Quake/gl_screen.c | 23 ----------------------- Quake/glquake.h | 1 - Quake/render.h | 1 - 4 files changed, 29 deletions(-) diff --git a/Quake/gl_rmain.c b/Quake/gl_rmain.c index 87015240..332ab1ec 100644 --- a/Quake/gl_rmain.c +++ b/Quake/gl_rmain.c @@ -23,8 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -qboolean r_cache_thrash; // compatability - vec3_t modelorg, r_entorigin; entity_t *currententity; @@ -538,8 +536,6 @@ void R_SetupView (void) V_SetContentsColor (r_viewleaf->contents); V_CalcBlend (); - r_cache_thrash = false; - //johnfitz -- calculate r_fovx and r_fovy here r_fovx = r_refdef.fov_x; r_fovy = r_refdef.fov_y; diff --git a/Quake/gl_screen.c b/Quake/gl_screen.c index bc209d2f..962c0ebb 100644 --- a/Quake/gl_screen.c +++ b/Quake/gl_screen.c @@ -94,7 +94,6 @@ cvar_t scr_fov = {"fov","90",CVAR_NONE}; // 10 - 170 cvar_t scr_fov_adapt = {"fov_adapt","1",CVAR_ARCHIVE}; cvar_t scr_conspeed = {"scr_conspeed","500",CVAR_ARCHIVE}; cvar_t scr_centertime = {"scr_centertime","2",CVAR_NONE}; -cvar_t scr_showram = {"showram","1",CVAR_NONE}; cvar_t scr_showturtle = {"showturtle","0",CVAR_NONE}; cvar_t scr_showpause = {"showpause","1",CVAR_NONE}; cvar_t scr_printspeed = {"scr_printspeed","8",CVAR_NONE}; @@ -106,7 +105,6 @@ extern cvar_t crosshair; qboolean scr_initialized; // ready to draw -qpic_t *scr_ram; qpic_t *scr_net; qpic_t *scr_turtle; @@ -386,7 +384,6 @@ SCR_LoadPics -- johnfitz */ void SCR_LoadPics (void) { - scr_ram = Draw_PicFromWad ("ram"); scr_net = Draw_PicFromWad ("net"); scr_turtle = Draw_PicFromWad ("turtle"); } @@ -419,7 +416,6 @@ void SCR_Init (void) Cvar_RegisterVariable (&scr_fov_adapt); Cvar_RegisterVariable (&scr_viewsize); Cvar_RegisterVariable (&scr_conspeed); - Cvar_RegisterVariable (&scr_showram); Cvar_RegisterVariable (&scr_showturtle); Cvar_RegisterVariable (&scr_showpause); Cvar_RegisterVariable (&scr_centertime); @@ -556,24 +552,6 @@ void SCR_DrawDevStats (void) Draw_String (x, (y++)*8-x, str); } -/* -============== -SCR_DrawRam -============== -*/ -void SCR_DrawRam (void) -{ - if (!scr_showram.value) - return; - - if (!r_cache_thrash) - return; - - GL_SetCanvas (CANVAS_DEFAULT); //johnfitz - - Draw_Pic (scr_vrect.x+32, scr_vrect.y, scr_ram); -} - /* ============== SCR_DrawTurtle @@ -1116,7 +1094,6 @@ void SCR_UpdateScreen (void) else { SCR_DrawCrosshair (); //johnfitz - SCR_DrawRam (); SCR_DrawNet (); SCR_DrawTurtle (); SCR_DrawPause (); diff --git a/Quake/glquake.h b/Quake/glquake.h index efe9e0e2..2912d08c 100644 --- a/Quake/glquake.h +++ b/Quake/glquake.h @@ -102,7 +102,6 @@ typedef struct particle_s //==================================================== -extern qboolean r_cache_thrash; // compatability extern vec3_t modelorg, r_entorigin; extern entity_t *currententity; extern int r_visframecount; // ??? what difs? diff --git a/Quake/render.h b/Quake/render.h index 4ecb9733..bf057b0e 100644 --- a/Quake/render.h +++ b/Quake/render.h @@ -166,7 +166,6 @@ void R_PushDlights (void); // surface cache related // extern int reinit_surfcache; // if 1, surface cache is currently empty and -extern qboolean r_cache_thrash; // set if thrashing the surface cache int D_SurfaceCacheForRes (int width, int height); void D_FlushCaches (void); From 00530bda9b4effa5a31b7b14b0a5aa21c728f130 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Tue, 5 Jul 2022 08:50:02 +0300 Subject: [PATCH 04/11] gl_model.c: made a lot of procs and vars static only user of 'loadmodel' outside of gl_model.c was Sky_LoadTexture, so changed it to accept a model pointer. TODO: remove need for globals such as mod_base, loadmodel, loadname --- Quake/gl_model.c | 138 +++++++++++++++++++++++++--------------------- Quake/gl_model.h | 6 +- Quake/gl_sky.c | 26 ++++----- Quake/gl_texmgr.c | 1 - Quake/gl_warp.c | 2 - Quake/glquake.h | 6 +- Quake/host_cmd.c | 4 -- 7 files changed, 95 insertions(+), 88 deletions(-) diff --git a/Quake/gl_model.c b/Quake/gl_model.c index 02c388e2..d193051c 100644 --- a/Quake/gl_model.c +++ b/Quake/gl_model.c @@ -26,16 +26,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -qmodel_t *loadmodel; -char loadname[32]; // for hunk tags +static qmodel_t* loadmodel; +static char loadname[32]; // for hunk tags -void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer); -void Mod_LoadBrushModel (qmodel_t *mod, void *buffer); -void Mod_LoadAliasModel (qmodel_t *mod, void *buffer); -qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash); +static void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer); +static void Mod_LoadBrushModel (qmodel_t *mod, void *buffer); +static void Mod_LoadAliasModel (qmodel_t *mod, void *buffer); +static qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash); -cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE}; -cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE}; +static void Mod_Print (void); + +static cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE}; +static cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE}; static byte *mod_novis; static int mod_novis_capacity; @@ -44,8 +46,8 @@ static byte *mod_decompressed; static int mod_decompressed_capacity; #define MAX_MOD_KNOWN 2048 /*johnfitz -- was 512 */ -qmodel_t mod_known[MAX_MOD_KNOWN]; -int mod_numknown; +static qmodel_t mod_known[MAX_MOD_KNOWN]; +static int mod_numknown; texture_t *r_notexture_mip; //johnfitz -- moved here from r_main.c texture_t *r_notexture_mip2; //johnfitz -- used for non-lightmapped surfs with a missing texture @@ -61,6 +63,8 @@ void Mod_Init (void) Cvar_RegisterVariable (&external_vis); Cvar_RegisterVariable (&external_ents); + Cmd_AddCommand ("mcache", Mod_Print); + //johnfitz -- create notexture miptex r_notexture_mip = (texture_t *) Hunk_AllocName (sizeof(texture_t), "r_notexture_mip"); strcpy (r_notexture_mip->name, "notexture"); @@ -130,7 +134,7 @@ mleaf_t *Mod_PointInLeaf (vec3_t p, qmodel_t *model) Mod_DecompressVis =================== */ -byte *Mod_DecompressVis (byte *in, qmodel_t *model) +static byte *Mod_DecompressVis (byte *in, qmodel_t *model) { int c; byte *out; @@ -221,11 +225,13 @@ void Mod_ClearAll (void) qmodel_t *mod; for (i=0 , mod=mod_known ; itype != mod_alias) { mod->needload = true; TexMgr_FreeTexturesForOwner (mod); //johnfitz } + } } void Mod_ResetAll (void) @@ -235,7 +241,7 @@ void Mod_ResetAll (void) //ericw -- free alias model VBOs GLMesh_DeleteVertexBuffers (); - + for (i=0 , mod=mod_known ; ineedload) //otherwise Mod_ClearAll() did it already @@ -251,7 +257,7 @@ Mod_FindName ================== */ -qmodel_t *Mod_FindName (const char *name) +static qmodel_t *Mod_FindName (const char *name) { int i; qmodel_t *mod; @@ -263,8 +269,10 @@ qmodel_t *Mod_FindName (const char *name) // search the currently loaded models // for (i=0 , mod=mod_known ; iname, name) ) break; + } if (i == mod_numknown) { @@ -304,7 +312,7 @@ Mod_LoadModel Loads a model into the cache ================== */ -qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash) +static qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash) { byte *buf; byte stackbuf[1024]; // avoid dirtying the cache heap @@ -398,19 +406,21 @@ qmodel_t *Mod_ForName (const char *name, qboolean crash) =============================================================================== */ -byte *mod_base; +static byte *mod_base; /* ================= Mod_CheckFullbrights -- johnfitz ================= */ -qboolean Mod_CheckFullbrights (byte *pixels, int count) +static qboolean Mod_CheckFullbrights (byte *pixels, int count) { int i; for (i = 0; i < count; i++) + { if (*pixels++ > 223) return true; + } return false; } @@ -422,7 +432,7 @@ Quake64 bsp Check if we have any missing textures in the array ================= */ -qboolean Mod_CheckAnimTextureArrayQ64(texture_t *anims[], int numTex) +static qboolean Mod_CheckAnimTextureArrayQ64(texture_t *anims[], int numTex) { int i; @@ -439,7 +449,7 @@ qboolean Mod_CheckAnimTextureArrayQ64(texture_t *anims[], int numTex) Mod_LoadTextures ================= */ -void Mod_LoadTextures (lump_t *l) +static void Mod_LoadTextures (lump_t *l) { int i, j, pixels, num, maxanim, altmax; miptex_t *mt; @@ -533,9 +543,9 @@ void Mod_LoadTextures (lump_t *l) if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp { if (loadmodel->bspversion == BSPVERSION_QUAKE64) - Sky_LoadTextureQ64 (tx); + Sky_LoadTextureQ64 (loadmodel, tx); else - Sky_LoadTexture (tx); + Sky_LoadTexture (loadmodel, tx); } else if (tx->name[0] == '*') //warping texture { @@ -744,7 +754,7 @@ void Mod_LoadTextures (lump_t *l) Mod_LoadLighting -- johnfitz -- replaced with lit support code via lordhavoc ================= */ -void Mod_LoadLighting (lump_t *l) +static void Mod_LoadLighting (lump_t *l) { int i, mark; byte *in, *out, *data; @@ -840,7 +850,7 @@ void Mod_LoadLighting (lump_t *l) Mod_LoadVisibility ================= */ -void Mod_LoadVisibility (lump_t *l) +static void Mod_LoadVisibility (lump_t *l) { loadmodel->viswarn = false; if (!l->filelen) @@ -858,7 +868,7 @@ void Mod_LoadVisibility (lump_t *l) Mod_LoadEntities ================= */ -void Mod_LoadEntities (lump_t *l) +static void Mod_LoadEntities (lump_t *l) { char basemapname[MAX_QPATH]; char entfilename[MAX_QPATH]; @@ -922,7 +932,7 @@ _load_embedded: Mod_LoadVertexes ================= */ -void Mod_LoadVertexes (lump_t *l) +static void Mod_LoadVertexes (lump_t *l) { dvertex_t *in; mvertex_t *out; @@ -950,7 +960,7 @@ void Mod_LoadVertexes (lump_t *l) Mod_LoadEdges ================= */ -void Mod_LoadEdges (lump_t *l, int bsp2) +static void Mod_LoadEdges (lump_t *l, int bsp2) { medge_t *out; int i, count; @@ -1000,7 +1010,7 @@ void Mod_LoadEdges (lump_t *l, int bsp2) Mod_LoadTexinfo ================= */ -void Mod_LoadTexinfo (lump_t *l) +static void Mod_LoadTexinfo (lump_t *l) { texinfo_t *in; mtexinfo_t *out; @@ -1057,7 +1067,7 @@ CalcSurfaceExtents Fills in s->texturemins[] and s->extents[] ================ */ -void CalcSurfaceExtents (msurface_t *s) +static void CalcSurfaceExtents (msurface_t *s) { float mins[2], maxs[2], val; int i,j, e; @@ -1127,7 +1137,7 @@ Mod_PolyForUnlitSurface -- johnfitz -- creates polys for unlightmapped surfaces TODO: merge this into BuildSurfaceDisplayList? ================ */ -void Mod_PolyForUnlitSurface (msurface_t *fa) +static void Mod_PolyForUnlitSurface (msurface_t *fa) { vec3_t verts[64]; int numverts, i, lindex; @@ -1172,7 +1182,7 @@ void Mod_PolyForUnlitSurface (msurface_t *fa) Mod_CalcSurfaceBounds -- johnfitz -- calculate bounding box for per-surface frustum culling ================= */ -void Mod_CalcSurfaceBounds (msurface_t *s) +static void Mod_CalcSurfaceBounds (msurface_t *s) { int i, e; mvertex_t *v; @@ -1209,7 +1219,7 @@ void Mod_CalcSurfaceBounds (msurface_t *s) Mod_LoadFaces ================= */ -void Mod_LoadFaces (lump_t *l, qboolean bsp2) +static void Mod_LoadFaces (lump_t *l, qboolean bsp2) { dsface_t *ins; dlface_t *inl; @@ -1340,7 +1350,7 @@ void Mod_LoadFaces (lump_t *l, qboolean bsp2) Mod_SetParent ================= */ -void Mod_SetParent (mnode_t *node, mnode_t *parent) +static void Mod_SetParent (mnode_t *node, mnode_t *parent) { node->parent = parent; if (node->contents < 0) @@ -1354,7 +1364,7 @@ void Mod_SetParent (mnode_t *node, mnode_t *parent) Mod_LoadNodes ================= */ -void Mod_LoadNodes_S (lump_t *l) +static void Mod_LoadNodes_S (lump_t *l) { int i, j, count, p; dsnode_t *in; @@ -1410,7 +1420,7 @@ void Mod_LoadNodes_S (lump_t *l) } } -void Mod_LoadNodes_L1 (lump_t *l) +static void Mod_LoadNodes_L1 (lump_t *l) { int i, j, count, p; dl1node_t *in; @@ -1462,7 +1472,7 @@ void Mod_LoadNodes_L1 (lump_t *l) } } -void Mod_LoadNodes_L2 (lump_t *l) +static void Mod_LoadNodes_L2 (lump_t *l) { int i, j, count, p; dl2node_t *in; @@ -1514,7 +1524,7 @@ void Mod_LoadNodes_L2 (lump_t *l) } } -void Mod_LoadNodes (lump_t *l, int bsp2) +static void Mod_LoadNodes (lump_t *l, int bsp2) { if (bsp2 == 2) Mod_LoadNodes_L2(l); @@ -1526,7 +1536,7 @@ void Mod_LoadNodes (lump_t *l, int bsp2) Mod_SetParent (loadmodel->nodes, NULL); // sets nodes and leafs } -void Mod_ProcessLeafs_S (dsleaf_t *in, int filelen) +static void Mod_ProcessLeafs_S (dsleaf_t *in, int filelen) { mleaf_t *out; int i, j, count, p; @@ -1572,7 +1582,7 @@ void Mod_ProcessLeafs_S (dsleaf_t *in, int filelen) } } -void Mod_ProcessLeafs_L1 (dl1leaf_t *in, int filelen) +static void Mod_ProcessLeafs_L1 (dl1leaf_t *in, int filelen) { mleaf_t *out; int i, j, count, p; @@ -1615,7 +1625,7 @@ void Mod_ProcessLeafs_L1 (dl1leaf_t *in, int filelen) } } -void Mod_ProcessLeafs_L2 (dl2leaf_t *in, int filelen) +static void Mod_ProcessLeafs_L2 (dl2leaf_t *in, int filelen) { mleaf_t *out; int i, j, count, p; @@ -1663,7 +1673,7 @@ void Mod_ProcessLeafs_L2 (dl2leaf_t *in, int filelen) Mod_LoadLeafs ================= */ -void Mod_LoadLeafs (lump_t *l, int bsp2) +static void Mod_LoadLeafs (lump_t *l, int bsp2) { void *in = (void *)(mod_base + l->fileofs); @@ -1680,7 +1690,7 @@ void Mod_LoadLeafs (lump_t *l, int bsp2) Mod_LoadClipnodes ================= */ -void Mod_LoadClipnodes (lump_t *l, qboolean bsp2) +static void Mod_LoadClipnodes (lump_t *l, qboolean bsp2) { dsclipnode_t *ins; dlclipnode_t *inl; @@ -1788,7 +1798,7 @@ Mod_MakeHull0 Duplicate the drawing hull structure as a clipping hull ================= */ -void Mod_MakeHull0 (void) +static void Mod_MakeHull0 (void) { mnode_t *in, *child; mclipnode_t *out; //johnfitz -- was dclipnode_t @@ -1825,7 +1835,7 @@ void Mod_MakeHull0 (void) Mod_LoadMarksurfaces ================= */ -void Mod_LoadMarksurfaces (lump_t *l, int bsp2) +static void Mod_LoadMarksurfaces (lump_t *l, int bsp2) { int i, j, count; msurface_t **out; @@ -1883,7 +1893,7 @@ void Mod_LoadMarksurfaces (lump_t *l, int bsp2) Mod_LoadSurfedges ================= */ -void Mod_LoadSurfedges (lump_t *l) +static void Mod_LoadSurfedges (lump_t *l) { int i, count; int *in, *out; @@ -1907,7 +1917,7 @@ void Mod_LoadSurfedges (lump_t *l) Mod_LoadPlanes ================= */ -void Mod_LoadPlanes (lump_t *l) +static void Mod_LoadPlanes (lump_t *l) { int i, j; mplane_t *out; @@ -1945,7 +1955,7 @@ void Mod_LoadPlanes (lump_t *l) RadiusFromBounds ================= */ -float RadiusFromBounds (vec3_t mins, vec3_t maxs) +static float RadiusFromBounds (vec3_t mins, vec3_t maxs) { int i; vec3_t corner; @@ -1963,7 +1973,7 @@ float RadiusFromBounds (vec3_t mins, vec3_t maxs) Mod_LoadSubmodels ================= */ -void Mod_LoadSubmodels (lump_t *l) +static void Mod_LoadSubmodels (lump_t *l) { dmodel_t *in; dmodel_t *out; @@ -2013,7 +2023,8 @@ Therefore, the bounding box of the hull can be constructed entirely from axial planes found in the clipnodes for that hull. ================= */ -void Mod_BoundsFromClipNode (qmodel_t *mod, int hull, int nodenum) +#if 0 /* disabled for now -- see in Mod_SetupSubmodels() */ +static void Mod_BoundsFromClipNode (qmodel_t *mod, int hull, int nodenum) { mplane_t *plane; mclipnode_t *node; @@ -2052,6 +2063,7 @@ void Mod_BoundsFromClipNode (qmodel_t *mod, int hull, int nodenum) Mod_BoundsFromClipNode (mod, hull, node->children[0]); Mod_BoundsFromClipNode (mod, hull, node->children[1]); } +#endif /* #if 0 */ /* EXTERNAL VIS FILE SUPPORT: */ @@ -2153,7 +2165,7 @@ static void Mod_LoadLeafsExternal(FILE* f) Mod_LoadBrushModel ================= */ -void Mod_LoadBrushModel (qmodel_t *mod, void *buffer) +static void Mod_LoadBrushModel (qmodel_t *mod, void *buffer) { int i, j; int bsp2; @@ -2314,17 +2326,14 @@ mtriangle_t triangles[MAXALIASTRIS]; // a pose is a single set of vertexes. a frame may be // an animating sequence of poses trivertx_t *poseverts[MAXALIASFRAMES]; -int posenum; - -byte **player_8bit_texels_tbl; -byte *player_8bit_texels; +static int posenum; /* ================= Mod_LoadAliasFrame ================= */ -void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame) +static void *Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame) { trivertx_t *pinframe; int i; @@ -2347,7 +2356,6 @@ void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame) frame->bboxmax.v[i] = pdaliasframe->bboxmax.v[i]; } - pinframe = (trivertx_t *)(pdaliasframe + 1); poseverts[posenum] = pinframe; @@ -2364,7 +2372,7 @@ void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame) Mod_LoadAliasGroup ================= */ -void *Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame) +static void *Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame) { daliasgroup_t *pingroup; int i, numframes; @@ -2437,7 +2445,7 @@ do { \ else if (pos[off] != 255) fdc = pos[off]; \ } while (0) -void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight ) +static void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight ) { byte fillcolor = *skin; // assume this is the pixel to fill floodfill_t fifo[FLOODFILL_FIFO_SIZE]; @@ -2450,11 +2458,13 @@ void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight ) filledcolor = 0; // attempt to find opaque black for (i = 0; i < 256; ++i) + { if (d_8to24table[i] == (255 << 0)) // alpha 1.0 { filledcolor = i; break; } + } } // can't fill to filled color or to transparent color (used as visited marker) @@ -2488,7 +2498,7 @@ void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight ) Mod_LoadAllSkins =============== */ -void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) +static void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) { int i, j, k, size, groupskins; char name[MAX_QPATH]; @@ -2600,7 +2610,7 @@ void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype) Mod_CalcAliasBounds -- johnfitz -- calculate bounds of alias model for nonrotated, yawrotated, and fullrotated cases ================= */ -void Mod_CalcAliasBounds (aliashdr_t *a) +static void Mod_CalcAliasBounds (aliashdr_t *a) { int i,j,k; float dist, yawradius, radius; @@ -2705,7 +2715,9 @@ void Mod_SetExtraFlags (qmodel_t *mod) if (!strcmp (mod->name, "progs/flame2.mdl") || !strcmp (mod->name, "progs/flame.mdl") || !strcmp (mod->name, "progs/boss.mdl")) + { mod->flags |= MOD_FBRIGHTHACK; + } } /* @@ -2713,7 +2725,7 @@ void Mod_SetExtraFlags (qmodel_t *mod) Mod_LoadAliasModel ================= */ -void Mod_LoadAliasModel (qmodel_t *mod, void *buffer) +static void Mod_LoadAliasModel (qmodel_t *mod, void *buffer) { int i, j; mdl_t *pinmodel; @@ -2873,7 +2885,7 @@ void Mod_LoadAliasModel (qmodel_t *mod, void *buffer) Mod_LoadSpriteFrame ================= */ -void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum) +static void *Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum) { dspriteframe_t *pinframe; mspriteframe_t *pspriteframe; @@ -2921,7 +2933,7 @@ void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum) Mod_LoadSpriteGroup ================= */ -void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum) +static void *Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum) { dspritegroup_t *pingroup; mspritegroup_t *pspritegroup; @@ -2973,7 +2985,7 @@ void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum) Mod_LoadSpriteModel ================= */ -void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer) +static void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer) { int i; int version; @@ -3050,7 +3062,7 @@ void Mod_LoadSpriteModel (qmodel_t *mod, void *buffer) Mod_Print ================ */ -void Mod_Print (void) +static void Mod_Print (void) { int i; qmodel_t *mod; diff --git a/Quake/gl_model.h b/Quake/gl_model.h index eda4f185..3d8b1f73 100644 --- a/Quake/gl_model.h +++ b/Quake/gl_model.h @@ -20,8 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef __MODEL__ -#define __MODEL__ +#ifndef GL_MODEL_H +#define GL_MODEL_H #include "modelgen.h" #include "spritegn.h" @@ -517,4 +517,4 @@ byte *Mod_NoVisPVS (qmodel_t *model); void Mod_SetExtraFlags (qmodel_t *mod); -#endif // __MODEL__ +#endif /* GL_MODEL_H */ diff --git a/Quake/gl_sky.c b/Quake/gl_sky.c index 0f256de7..de88e7ef 100644 --- a/Quake/gl_sky.c +++ b/Quake/gl_sky.c @@ -29,9 +29,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. float Fog_GetDensity(void); float *Fog_GetColor(void); -extern qmodel_t *loadmodel; -extern int rs_skypolys; //for r_speeds readout -extern int rs_skypasses; //for r_speeds readout +extern int rs_skypolys; // for r_speeds readout +extern int rs_skypasses; // for r_speeds readout + float skyflatcolor[3]; float skymins[2][6], skymaxs[2][6]; @@ -92,7 +92,7 @@ Sky_LoadTexture A sky texture is 256*128, with the left side being a masked overlay ============== */ -void Sky_LoadTexture (texture_t *mt) +void Sky_LoadTexture (qmodel_t *mod, texture_t *mt) { char texturename[64]; unsigned x, y, p, r, g, b, count, halfwidth, *rgba; @@ -114,8 +114,8 @@ void Sky_LoadTexture (texture_t *mt) for (y=0 ; yheight ; y++) memcpy (back_data + y*halfwidth, src + halfwidth + y*mt->width, halfwidth); - q_snprintf(texturename, sizeof(texturename), "%s:%s_back", loadmodel->name, mt->name); - solidskytexture = TexMgr_LoadImage (loadmodel, texturename, halfwidth, mt->height, SRC_INDEXED, back_data, "", (src_offset_t)back_data, TEXPREF_NONE); + q_snprintf(texturename, sizeof(texturename), "%s:%s_back", mod->name, mt->name); + solidskytexture = TexMgr_LoadImage (mod, texturename, halfwidth, mt->height, SRC_INDEXED, back_data, "", (src_offset_t)back_data, TEXPREF_NONE); // extract front layer and upload r = g = b = count = 0; @@ -139,8 +139,8 @@ void Sky_LoadTexture (texture_t *mt) } front_data = back_data + halfwidth*mt->height; - q_snprintf(texturename, sizeof(texturename), "%s:%s_front", loadmodel->name, mt->name); - alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, halfwidth, mt->height, SRC_INDEXED, front_data, "", (src_offset_t)front_data, TEXPREF_ALPHA); + q_snprintf(texturename, sizeof(texturename), "%s:%s_front", mod->name, mt->name); + alphaskytexture = TexMgr_LoadImage (mod, texturename, halfwidth, mt->height, SRC_INDEXED, front_data, "", (src_offset_t)front_data, TEXPREF_ALPHA); // calculate r_fastsky color based on average of all opaque foreground colors skyflatcolor[0] = (float)r/(count*255); @@ -155,7 +155,7 @@ Sky_LoadTextureQ64 Quake64 sky textures are 32*64 ============== */ -void Sky_LoadTextureQ64 (texture_t *mt) +void Sky_LoadTextureQ64 (qmodel_t *mod, texture_t *mt) { char texturename[64]; unsigned i, p, r, g, b, count, halfheight, *rgba; @@ -175,8 +175,8 @@ void Sky_LoadTextureQ64 (texture_t *mt) front_rgba = (byte *) Hunk_AllocName (4*mt->width*halfheight, "q64_skytex"); // Normal indexed texture for the back layer - q_snprintf(texturename, sizeof(texturename), "%s:%s_back", loadmodel->name, mt->name); - solidskytexture = TexMgr_LoadImage (loadmodel, texturename, mt->width, halfheight, SRC_INDEXED, back, "", (src_offset_t)back, TEXPREF_NONE); + q_snprintf(texturename, sizeof(texturename), "%s:%s_back", mod->name, mt->name); + solidskytexture = TexMgr_LoadImage (mod, texturename, mt->width, halfheight, SRC_INDEXED, back, "", (src_offset_t)back, TEXPREF_NONE); // front layer, convert to RGBA and upload p = r = g = b = count = 0; @@ -199,8 +199,8 @@ void Sky_LoadTextureQ64 (texture_t *mt) count++; } - q_snprintf(texturename, sizeof(texturename), "%s:%s_front", loadmodel->name, mt->name); - alphaskytexture = TexMgr_LoadImage (loadmodel, texturename, mt->width, halfheight, SRC_RGBA, front_rgba, "", (src_offset_t)front_rgba, TEXPREF_ALPHA); + q_snprintf(texturename, sizeof(texturename), "%s:%s_front", mod->name, mt->name); + alphaskytexture = TexMgr_LoadImage (mod, texturename, mt->width, halfheight, SRC_RGBA, front_rgba, "", (src_offset_t)front_rgba, TEXPREF_ALPHA); // calculate r_fastsky color based on average of all opaque foreground colors skyflatcolor[0] = (float)r/(count*255); diff --git a/Quake/gl_texmgr.c b/Quake/gl_texmgr.c index cc425338..4e4b3b58 100644 --- a/Quake/gl_texmgr.c +++ b/Quake/gl_texmgr.c @@ -605,7 +605,6 @@ void TexMgr_Init (void) int i; static byte notexture_data[16] = {159,91,83,255,0,0,0,255,0,0,0,255,159,91,83,255}; //black and pink checker static byte nulltexture_data[16] = {127,191,255,255,0,0,0,255,0,0,0,255,127,191,255,255}; //black and blue checker - extern texture_t *r_notexture_mip, *r_notexture_mip2; // init texture list free_gltextures = (gltexture_t *) Hunk_AllocName (MAX_GLTEXTURES * sizeof(gltexture_t), "gltextures"); diff --git a/Quake/gl_warp.c b/Quake/gl_warp.c index c2faa938..93fd6501 100644 --- a/Quake/gl_warp.c +++ b/Quake/gl_warp.c @@ -45,8 +45,6 @@ float turbsin[] = // //============================================================================== -extern qmodel_t *loadmodel; - msurface_t *warpface; cvar_t gl_subdivide_size = {"gl_subdivide_size", "128", CVAR_ARCHIVE}; diff --git a/Quake/glquake.h b/Quake/glquake.h index 2912d08c..f9da58da 100644 --- a/Quake/glquake.h +++ b/Quake/glquake.h @@ -108,6 +108,8 @@ extern int r_visframecount; // ??? what difs? extern int r_framecount; extern mplane_t frustum[4]; +extern texture_t *r_notexture_mip, *r_notexture_mip2; + // // view origin // @@ -397,8 +399,8 @@ void Sky_Init (void); void Sky_ClearAll (void); void Sky_DrawSky (void); void Sky_NewMap (void); -void Sky_LoadTexture (texture_t *mt); -void Sky_LoadTextureQ64 (texture_t *mt); +void Sky_LoadTexture (qmodel_t *m, texture_t *mt); +void Sky_LoadTextureQ64 (qmodel_t *m, texture_t *mt); void Sky_LoadSkyBox (const char *name); void TexMgr_RecalcWarpImageSize (void); diff --git a/Quake/host_cmd.c b/Quake/host_cmd.c index 79917676..34f0c668 100644 --- a/Quake/host_cmd.c +++ b/Quake/host_cmd.c @@ -30,8 +30,6 @@ extern cvar_t pausable; int current_skill; -void Mod_Print (void); - /* ================== Host_Quit_f @@ -2325,7 +2323,5 @@ void Host_InitCommands (void) Cmd_AddCommand ("viewframe", Host_Viewframe_f); Cmd_AddCommand ("viewnext", Host_Viewnext_f); Cmd_AddCommand ("viewprev", Host_Viewprev_f); - - Cmd_AddCommand ("mcache", Mod_Print); } From f10c33ad0643c36f3a1fbe437856aa8f9058cd58 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Tue, 5 Jul 2022 10:10:00 +0300 Subject: [PATCH 05/11] re-diff'ed extra patches so that they apply cleanly --- Misc/fs_search_order.patch | 6 +++--- Misc/quake_retexturing_project.patch | 21 ++++++++++----------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Misc/fs_search_order.patch b/Misc/fs_search_order.patch index 20a16ca8..0fba6a55 100644 --- a/Misc/fs_search_order.patch +++ b/Misc/fs_search_order.patch @@ -1,10 +1,10 @@ allow plain files to override files inside a PAK file -- Sander van Dijk. diff --git a/Quake/common.c b/Quake/common.c -index bd246f1..2326383 100644 +index eff4c30..1478d77 100644 --- a/Quake/common.c +++ b/Quake/common.c -@@ -2039,13 +2039,6 @@ static void COM_AddGameDirectory (const char *base, const char *dir) +@@ -2030,13 +2030,6 @@ static void COM_AddGameDirectory (const char *base, const char *dir) else path_id = 1U; _add_path: @@ -18,7 +18,7 @@ index bd246f1..2326383 100644 // add any pak files in the format pak0.pak pak1.pak, ... for (i = 0; ; i++) { -@@ -2077,6 +2070,13 @@ _add_path: +@@ -2068,6 +2061,13 @@ _add_path: if (!pak) break; } diff --git a/Misc/quake_retexturing_project.patch b/Misc/quake_retexturing_project.patch index ee37d293..907a5ca4 100644 --- a/Misc/quake_retexturing_project.patch +++ b/Misc/quake_retexturing_project.patch @@ -1,17 +1,17 @@ diff --git a/Quake/gl_model.c b/Quake/gl_model.c -index 94f0023..fdb8c4c 100644 +index d193051..783dc4d 100644 --- a/Quake/gl_model.c +++ b/Quake/gl_model.c -@@ -37,6 +37,8 @@ qmodel_t *Mod_LoadModel (qmodel_t *mod, qboolean crash); - cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE}; - cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE}; +@@ -39,6 +39,8 @@ static void Mod_Print (void); + static cvar_t external_ents = {"external_ents", "1", CVAR_ARCHIVE}; + static cvar_t external_vis = {"external_vis", "1", CVAR_ARCHIVE}; +extern cvar_t r_externaltexture_fix; //mk + static byte *mod_novis; static int mod_novis_capacity; -@@ -534,6 +536,13 @@ void Mod_LoadTextures (lump_t *l) +@@ -542,6 +544,13 @@ static void Mod_LoadTextures (lump_t *l) { if (!q_strncasecmp(tx->name,"sky",3)) //sky texture //also note -- was Q_strncmp, changed to match qbsp { @@ -23,9 +23,9 @@ index 94f0023..fdb8c4c 100644 + } + } if (loadmodel->bspversion == BSPVERSION_QUAKE64) - Sky_LoadTextureQ64 (tx); + Sky_LoadTextureQ64 (loadmodel, tx); else -@@ -588,6 +597,50 @@ void Mod_LoadTextures (lump_t *l) +@@ -596,6 +605,50 @@ static void Mod_LoadTextures (lump_t *l) //external textures -- first look in "textures/mapname/" then look in "textures/" mark = Hunk_LowMark (); COM_StripExtension (loadmodel->name + 5, mapname, sizeof(mapname)); @@ -77,10 +77,10 @@ index 94f0023..fdb8c4c 100644 data = Image_LoadImage (filename, &fwidth, &fheight); if (!data) diff --git a/Quake/gl_rmain.c b/Quake/gl_rmain.c -index a41d8b1..b0020c5 100644 +index 332ab1e..783a9d6 100644 --- a/Quake/gl_rmain.c +++ b/Quake/gl_rmain.c -@@ -102,6 +102,8 @@ cvar_t r_noshadow_list = {"r_noshadow_list", "progs/flame2.mdl,progs/flame.mdl,p +@@ -99,6 +99,8 @@ cvar_t r_noshadow_list = {"r_noshadow_list", "progs/flame2.mdl,progs/flame.mdl,p extern cvar_t r_vfog; //johnfitz @@ -90,7 +90,7 @@ index a41d8b1..b0020c5 100644 cvar_t r_lavaalpha = {"r_lavaalpha","0",CVAR_NONE}; diff --git a/Quake/gl_rmisc.c b/Quake/gl_rmisc.c -index dfdb84d..9c441bd 100644 +index dc3dff0..dbfe922 100644 --- a/Quake/gl_rmisc.c +++ b/Quake/gl_rmisc.c @@ -47,6 +47,7 @@ extern cvar_t r_nolerp_list; @@ -109,4 +109,3 @@ index dfdb84d..9c441bd 100644 Cvar_RegisterVariable (&gl_zfix); // QuakeSpasm z-fighting fix Cvar_RegisterVariable (&r_lavaalpha); - From f6a15400bae2c36cddf06913a49a6fe981bb464c Mon Sep 17 00:00:00 2001 From: Andrei Drexler Date: Wed, 13 Jul 2022 00:55:38 +0300 Subject: [PATCH 06/11] Fix console history buffer wrapping --- Quake/keys.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Quake/keys.c b/Quake/keys.c index 84e3d234..e57747a5 100644 --- a/Quake/keys.c +++ b/Quake/keys.c @@ -256,8 +256,8 @@ void Key_Console (int key) // If the last two lines are identical, skip storing this line in history // by not incrementing edit_line - if (strcmp(workline, key_lines[(edit_line-1)&31])) - edit_line = (edit_line + 1) & 31; + if (strcmp(workline, key_lines[(edit_line - 1) & (CMDLINES - 1)])) + edit_line = (edit_line + 1) & (CMDLINES - 1); history_line = edit_line; key_lines[edit_line][0] = ']'; @@ -355,11 +355,11 @@ void Key_Console (int key) len = strlen(workline); if ((int)len == key_linepos) { - len = strlen(key_lines[(edit_line + 31) & 31]); + len = strlen(key_lines[(edit_line + (CMDLINES - 1)) & (CMDLINES - 1)]); if ((int)len <= key_linepos) return; // no character to get workline += key_linepos; - *workline = key_lines[(edit_line + 31) & 31][key_linepos]; + *workline = key_lines[(edit_line + (CMDLINES - 1)) & (CMDLINES - 1)][key_linepos]; workline[1] = 0; key_linepos++; } @@ -377,7 +377,7 @@ void Key_Console (int key) history_line_last = history_line; do { - history_line = (history_line - 1) & 31; + history_line = (history_line - 1) & (CMDLINES - 1); } while (history_line != edit_line && !key_lines[history_line][1]); if (history_line == edit_line) @@ -400,7 +400,7 @@ void Key_Console (int key) do { - history_line = (history_line + 1) & 31; + history_line = (history_line + 1) & (CMDLINES - 1); } while (history_line != edit_line && !key_lines[history_line][1]); if (history_line == edit_line) From f8132afd0f3efdf771352e03ec76b12f35adba85 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Mon, 18 Jul 2022 10:15:00 +0300 Subject: [PATCH 07/11] updated lodepng from mainstream git. --- Quake/lodepng.c | 258 +++++++++++++++++++++++++++++++++++++++--------- Quake/lodepng.h | 103 +++++++++++++++---- 2 files changed, 298 insertions(+), 63 deletions(-) diff --git a/Quake/lodepng.c b/Quake/lodepng.c index 62344d84..6f8ef04a 100644 --- a/Quake/lodepng.c +++ b/Quake/lodepng.c @@ -1,5 +1,5 @@ /* -LodePNG version 20220109 +LodePNG version 20220717 Copyright (c) 2005-2022 Lode Vandevenne @@ -44,10 +44,10 @@ Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for #pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ #endif /*_MSC_VER */ -const char* LODEPNG_VERSION_STRING = "20220109"; +const char* LODEPNG_VERSION_STRING = "20220717"; /* -This source file is built up in the following large parts. The code sections +This source file is divided into the following large parts. The code sections with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. -Tools for C and common code for PNG and Zlib -C Code for Zlib (huffman, deflate, ...) @@ -713,10 +713,11 @@ static unsigned HuffmanTree_makeTable(HuffmanTree* tree) { numpresent = 0; for(i = 0; i < tree->numcodes; ++i) { unsigned l = tree->lengths[i]; - unsigned symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ - /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ - unsigned reverse = reverseBits(symbol, l); + unsigned symbol, reverse; if(l == 0) continue; + symbol = tree->codes[i]; /*the huffman bit pattern. i itself is the value.*/ + /*reverse bits, because the huffman bits are given in MSB first order but the bit reader reads LSB first*/ + reverse = reverseBits(symbol, l); numpresent++; if(l <= FIRSTBITS) { @@ -1369,8 +1370,11 @@ static unsigned inflateNoCompression(ucvector* out, LodePNGBitReader* reader, /*read the literal data: LEN bytes are now stored in the out buffer*/ if(bytepos + LEN > size) return 23; /*error: reading outside of in buffer*/ - lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); - bytepos += LEN; + /*out->data can be NULL (when LEN is zero), and arithmetics on NULL ptr is undefined*/ + if (LEN) { + lodepng_memcpy(out->data + out->size - LEN, reader->data + bytepos, LEN); + bytepos += LEN; + } reader->bp = bytepos << 3u; @@ -2371,7 +2375,7 @@ const LodePNGDecompressSettings lodepng_default_decompress_settings = {0, 0, 0, /* ////////////////////////////////////////////////////////////////////////// */ -#ifndef LODEPNG_NO_COMPILE_CRC +#ifdef LODEPNG_COMPILE_CRC /* CRC polynomial: 0xedb88320 */ static unsigned lodepng_crc32_table[256] = { 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u, @@ -2417,9 +2421,11 @@ unsigned lodepng_crc32(const unsigned char* data, size_t length) { } return r ^ 0xffffffffu; } -#else /* !LODEPNG_NO_COMPILE_CRC */ +#else /* LODEPNG_COMPILE_CRC */ +/*in this case, the function is only declared here, and must be defined externally +so that it will be linked in*/ unsigned lodepng_crc32(const unsigned char* data, size_t length); -#endif /* !LODEPNG_NO_COMPILE_CRC */ +#endif /* LODEPNG_COMPILE_CRC */ /* ////////////////////////////////////////////////////////////////////////// */ /* / Reading and writing PNG color channel bits / */ @@ -2457,7 +2463,7 @@ static void setBitOfReversedStream(size_t* bitpointer, unsigned char* bitstream, /* ////////////////////////////////////////////////////////////////////////// */ unsigned lodepng_chunk_length(const unsigned char* chunk) { - return lodepng_read32bitInt(&chunk[0]); + return lodepng_read32bitInt(chunk); } void lodepng_chunk_type(char type[5], const unsigned char* chunk) { @@ -2507,34 +2513,32 @@ void lodepng_chunk_generate_crc(unsigned char* chunk) { } unsigned char* lodepng_chunk_next(unsigned char* chunk, unsigned char* end) { - if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ + size_t available_size = (size_t)(end - chunk); + if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ return chunk + 8; } else { size_t total_chunk_length; - unsigned char* result; if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - result = chunk + total_chunk_length; - if(result < chunk) return end; /*pointer overflow*/ - return result; + if(total_chunk_length > available_size) return end; /*outside of range*/ + return chunk + total_chunk_length; } } const unsigned char* lodepng_chunk_next_const(const unsigned char* chunk, const unsigned char* end) { - if(chunk >= end || end - chunk < 12) return end; /*too small to contain a chunk*/ + size_t available_size = (size_t)(end - chunk); + if(chunk >= end || available_size < 12) return end; /*too small to contain a chunk*/ if(chunk[0] == 0x89 && chunk[1] == 0x50 && chunk[2] == 0x4e && chunk[3] == 0x47 && chunk[4] == 0x0d && chunk[5] == 0x0a && chunk[6] == 0x1a && chunk[7] == 0x0a) { /* Is PNG magic header at start of PNG file. Jump to first actual chunk. */ return chunk + 8; } else { size_t total_chunk_length; - const unsigned char* result; if(lodepng_addofl(lodepng_chunk_length(chunk), 12, &total_chunk_length)) return end; - result = chunk + total_chunk_length; - if(result < chunk) return end; /*pointer overflow*/ - return result; + if(total_chunk_length > available_size) return end; /*outside of range*/ + return chunk + total_chunk_length; } } @@ -3044,6 +3048,9 @@ void lodepng_info_init(LodePNGInfo* info) { info->iccp_name = NULL; info->iccp_profile = NULL; + info->sbit_defined = 0; + info->sbit_r = info->sbit_g = info->sbit_b = info->sbit_a = 0; + LodePNGUnknownChunks_init(info); #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } @@ -3938,7 +3945,7 @@ static unsigned auto_choose_color(LodePNGColorMode* mode_out, if(mode_in->colortype == LCT_PALETTE && mode_in->palettesize >= mode_out->palettesize && mode_in->bitdepth == mode_out->bitdepth) { /*If input should have same palette colors, keep original to preserve its order and prevent conversion*/ - lodepng_color_mode_cleanup(mode_out); + lodepng_color_mode_cleanup(mode_out); /*clears palette, keeps the above set colortype and bitdepth fields as-is*/ lodepng_color_mode_copy(mode_out, mode_in); } } else /*8-bit or 16-bit per channel*/ { @@ -4725,6 +4732,47 @@ static unsigned readChunk_iCCP(LodePNGInfo* info, const LodePNGDecoderSettings* if(!error && !info->iccp_profile_size) error = 100; /*invalid ICC profile size*/ return error; } + +/*significant bits chunk (sBIT)*/ +static unsigned readChunk_sBIT(LodePNGInfo* info, const unsigned char* data, size_t chunkLength) { + unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; + if(info->color.colortype == LCT_GREY) { + /*error: this chunk must be 1 bytes for grayscale image*/ + if(chunkLength != 1) return 114; + if(data[0] == 0 || data[0] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ + } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { + /*error: this chunk must be 3 bytes for RGB and palette image*/ + if(chunkLength != 3) return 114; + if(data[0] == 0 || data[1] == 0 || data[2] == 0) return 115; + if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = data[0]; + info->sbit_g = data[1]; + info->sbit_b = data[2]; + } else if(info->color.colortype == LCT_GREY_ALPHA) { + /*error: this chunk must be 2 byte for grayscale with alpha image*/ + if(chunkLength != 2) return 114; + if(data[0] == 0 || data[1] == 0) return 115; + if(data[0] > bitdepth || data[1] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = info->sbit_g = info->sbit_b = data[0]; /*setting g and b is not required, but sensible*/ + info->sbit_a = data[1]; + } else if(info->color.colortype == LCT_RGBA) { + /*error: this chunk must be 4 bytes for grayscale image*/ + if(chunkLength != 4) return 114; + if(data[0] == 0 || data[1] == 0 || data[2] == 0 || data[3] == 0) return 115; + if(data[0] > bitdepth || data[1] > bitdepth || data[2] > bitdepth || data[3] > bitdepth) return 115; + info->sbit_defined = 1; + info->sbit_r = data[0]; + info->sbit_g = data[1]; + info->sbit_b = data[2]; + info->sbit_a = data[3]; + } + + return 0; /* OK */ +} #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, @@ -4739,7 +4787,7 @@ unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, chunkLength = lodepng_chunk_length(chunk); if(chunkLength > 2147483647) return 63; data = lodepng_chunk_data_const(chunk); - if(data + chunkLength + 4 > in + insize) return 30; + if(chunkLength + 12 > insize - pos) return 30; if(lodepng_chunk_type_equals(chunk, "PLTE")) { error = readChunk_PLTE(&state->info_png.color, data, chunkLength); @@ -4766,6 +4814,8 @@ unsigned lodepng_inspect_chunk(LodePNGState* state, size_t pos, error = readChunk_sRGB(&state->info_png, data, chunkLength); } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); + } else if(lodepng_chunk_type_equals(chunk, "sBIT")) { + error = readChunk_sBIT(&state->info_png, data, chunkLength); #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } else { /* unhandled chunk is ok (is not an error) */ @@ -4784,7 +4834,7 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, LodePNGState* state, const unsigned char* in, size_t insize) { unsigned char IEND = 0; - const unsigned char* chunk; + const unsigned char* chunk; /*points to beginning of next chunk*/ unsigned char* idat; /*the data from idat chunks, zlib compressed*/ size_t idatsize = 0; unsigned char* scanlines = 0; @@ -4820,14 +4870,15 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, while(!IEND && !state->error) { unsigned chunkLength; const unsigned char* data; /*the data in the chunk*/ + size_t pos = (size_t)(chunk - in); - /*error: size of the in buffer too small to contain next chunk*/ - if((size_t)((chunk - in) + 12) > insize || chunk < in) { + /*error: next chunk out of bounds of the in buffer*/ + if(chunk < in || pos + 12 > insize) { if(state->decoder.ignore_end) break; /*other errors may still happen though*/ CERROR_BREAK(state->error, 30); } - /*length of the data of the chunk, excluding the length bytes, chunk type and CRC bytes*/ + /*length of the data of the chunk, excluding the 12 bytes for length, chunk type and CRC*/ chunkLength = lodepng_chunk_length(chunk); /*error: chunk length larger than the max PNG chunk size*/ if(chunkLength > 2147483647) { @@ -4835,8 +4886,8 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, CERROR_BREAK(state->error, 63); } - if((size_t)((chunk - in) + chunkLength + 12) > insize || (chunk + chunkLength + 12) < in) { - CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk*/ + if(pos + (size_t)chunkLength + 12 > insize || pos + (size_t)chunkLength + 12 < pos) { + CERROR_BREAK(state->error, 64); /*error: size of the in buffer too small to contain next chunk (or int overflow)*/ } data = lodepng_chunk_data_const(chunk); @@ -4910,6 +4961,9 @@ static void decodeGeneric(unsigned char** out, unsigned* w, unsigned* h, } else if(lodepng_chunk_type_equals(chunk, "iCCP")) { state->error = readChunk_iCCP(&state->info_png, &state->decoder, data, chunkLength); if(state->error) break; + } else if(lodepng_chunk_type_equals(chunk, "sBIT")) { + state->error = readChunk_sBIT(&state->info_png, data, chunkLength); + if(state->error) break; #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ } else /*it's not an implemented chunk type, so ignore it: skip over the data*/ { /*error: unknown critical chunk (5th bit of first byte of chunk type is 0)*/ @@ -5145,6 +5199,10 @@ static unsigned addChunk_PLTE(ucvector* out, const LodePNGColorMode* info) { unsigned char* chunk; size_t i, j = 8; + if(info->palettesize == 0 || info->palettesize > 256) { + return 68; /*invalid palette size, it is only allowed to be 1-256*/ + } + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, info->palettesize * 3, "PLTE")); for(i = 0; i != info->palettesize; ++i) { @@ -5400,6 +5458,42 @@ static unsigned addChunk_iCCP(ucvector* out, const LodePNGInfo* info, LodePNGCom return error; } +static unsigned addChunk_sBIT(ucvector* out, const LodePNGInfo* info) { + unsigned bitdepth = (info->color.colortype == LCT_PALETTE) ? 8 : info->color.bitdepth; + unsigned char* chunk = 0; + if(info->color.colortype == LCT_GREY) { + if(info->sbit_r == 0 || info->sbit_r > bitdepth) return 115; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 1, "sBIT")); + chunk[8] = info->sbit_r; + } else if(info->color.colortype == LCT_RGB || info->color.colortype == LCT_PALETTE) { + if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0) return 115; + if(info->sbit_r > bitdepth || info->sbit_g > bitdepth || info->sbit_b > bitdepth) return 115; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 3, "sBIT")); + chunk[8] = info->sbit_r; + chunk[9] = info->sbit_g; + chunk[10] = info->sbit_b; + } else if(info->color.colortype == LCT_GREY_ALPHA) { + if(info->sbit_r == 0 || info->sbit_a == 0) return 115; + if(info->sbit_r > bitdepth || info->sbit_a > bitdepth) return 115; + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 2, "sBIT")); + chunk[8] = info->sbit_r; + chunk[9] = info->sbit_a; + } else if(info->color.colortype == LCT_RGBA) { + if(info->sbit_r == 0 || info->sbit_g == 0 || info->sbit_b == 0 || info->sbit_a == 0 || + info->sbit_r > bitdepth || info->sbit_g > bitdepth || + info->sbit_b > bitdepth || info->sbit_a > bitdepth) { + return 115; + } + CERROR_TRY_RETURN(lodepng_chunk_init(&chunk, out, 4, "sBIT")); + chunk[8] = info->sbit_r; + chunk[9] = info->sbit_g; + chunk[10] = info->sbit_b; + chunk[11] = info->sbit_a; + } + if(chunk) lodepng_chunk_generate_crc(chunk); + return 0; +} + #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline, @@ -5845,8 +5939,10 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, ucvector outv = ucvector_init(NULL, 0); LodePNGInfo info; const LodePNGInfo* info_png = &state->info_png; + LodePNGColorMode auto_color; lodepng_info_init(&info); + lodepng_color_mode_init(&auto_color); /*provide some proper output values if error will happen*/ *out = 0; @@ -5856,6 +5952,10 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, /*check input values validity*/ if((info_png->color.colortype == LCT_PALETTE || state->encoder.force_palette) && (info_png->color.palettesize == 0 || info_png->color.palettesize > 256)) { + /*this error is returned even if auto_convert is enabled and thus encoder could + generate the palette by itself: while allowing this could be possible in theory, + it may complicate the code or edge cases, and always requiring to give a palette + when setting this color type is a simpler contract*/ state->error = 68; /*invalid palette size, it is only allowed to be 1-256*/ goto cleanup; } @@ -5876,6 +5976,7 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, lodepng_info_copy(&info, &state->info_png); if(state->encoder.auto_convert) { LodePNGColorStats stats; + unsigned allow_convert = 1; lodepng_color_stats_init(&stats); #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS if(info_png->iccp_defined && @@ -5897,23 +5998,85 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, /*the background chunk's color must be taken into account as well*/ unsigned r = 0, g = 0, b = 0; LodePNGColorMode mode16 = lodepng_color_mode_make(LCT_RGB, 16); - lodepng_convert_rgb(&r, &g, &b, info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color); + lodepng_convert_rgb(&r, &g, &b, + info_png->background_r, info_png->background_g, info_png->background_b, &mode16, &info_png->color); state->error = lodepng_color_stats_add(&stats, r, g, b, 65535); if(state->error) goto cleanup; } #endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ - state->error = auto_choose_color(&info.color, &state->info_raw, &stats); + state->error = auto_choose_color(&auto_color, &state->info_raw, &stats); if(state->error) goto cleanup; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS - /*also convert the background chunk*/ - if(info_png->background_defined) { - if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, - info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { - state->error = 104; - goto cleanup; + if(info_png->sbit_defined) { + /*if sbit is defined, due to strict requirements of which sbit values can be present for which color modes, + auto_convert can't be done in many cases. However, do support a few cases here. + TODO: more conversions may be possible, and it may also be possible to get a more appropriate color type out of + auto_choose_color if knowledge about sbit is used beforehand + */ + unsigned sbit_max = LODEPNG_MAX(LODEPNG_MAX(LODEPNG_MAX(info_png->sbit_r, info_png->sbit_g), + info_png->sbit_b), info_png->sbit_a); + unsigned equal = (!info_png->sbit_g || info_png->sbit_g == info_png->sbit_r) + && (!info_png->sbit_b || info_png->sbit_b == info_png->sbit_r) + && (!info_png->sbit_a || info_png->sbit_a == info_png->sbit_r); + allow_convert = 0; + if(info.color.colortype == LCT_PALETTE && + auto_color.colortype == LCT_PALETTE) { + /* input and output are palette, and in this case it may happen that palette data is + expected to be copied from info_raw into the info_png */ + allow_convert = 1; + } + /*going from 8-bit RGB to palette (or 16-bit as long as sbit_max <= 8) is possible + since both are 8-bit RGB for sBIT's purposes*/ + if(info.color.colortype == LCT_RGB && + auto_color.colortype == LCT_PALETTE && sbit_max <= 8) { + allow_convert = 1; + } + /*going from 8-bit RGBA to palette is also ok but only if sbit_a is exactly 8*/ + if(info.color.colortype == LCT_RGBA && auto_color.colortype == LCT_PALETTE && + info_png->sbit_a == 8 && sbit_max <= 8) { + allow_convert = 1; + } + /*going from 16-bit RGB(A) to 8-bit RGB(A) is ok if all sbit values are <= 8*/ + if((info.color.colortype == LCT_RGB || info.color.colortype == LCT_RGBA) && info.color.bitdepth == 16 && + auto_color.colortype == info.color.colortype && auto_color.bitdepth == 8 && + sbit_max <= 8) { + allow_convert = 1; + } + /*going to less channels is ok if all bit values are equal (all possible values in sbit, + as well as the chosen bitdepth of the result). Due to how auto_convert works, + we already know that auto_color.colortype has less than or equal amount of channels than + info.colortype. Palette is not used here. This conversion is not allowed if + info_png->sbit_r < auto_color.bitdepth, because specifically for alpha, non-presence of + an sbit value heavily implies that alpha's bit depth is equal to the PNG bit depth (rather + than the bit depths set in the r, g and b sbit values, by how the PNG specification describes + handling tRNS chunk case with sBIT), so be conservative here about ignoring user input.*/ + if(info.color.colortype != LCT_PALETTE && auto_color.colortype != LCT_PALETTE && + equal && info_png->sbit_r == auto_color.bitdepth) { + allow_convert = 1; } } +#endif + if(state->encoder.force_palette) { + if(info.color.colortype != LCT_GREY && info.color.colortype != LCT_GREY_ALPHA && + (auto_color.colortype == LCT_GREY || auto_color.colortype == LCT_GREY_ALPHA)) { + /*user speficially forced a PLTE palette, so cannot convert to grayscale types because + the PNG specification only allows writing a suggested palette in PLTE for truecolor types*/ + allow_convert = 0; + } + } + if(allow_convert) { + lodepng_color_mode_copy(&info.color, &auto_color); +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS + /*also convert the background chunk*/ + if(info_png->background_defined) { + if(lodepng_convert_rgb(&info.background_r, &info.background_g, &info.background_b, + info_png->background_r, info_png->background_g, info_png->background_b, &info.color, &info_png->color)) { + state->error = 104; + goto cleanup; + } + } #endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ + } } #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS if(info_png->iccp_defined) { @@ -5984,6 +6147,10 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, state->error = addChunk_cHRM(&outv, &info); if(state->error) goto cleanup; } + if(info_png->sbit_defined) { + state->error = addChunk_sBIT(&outv, &info); + if(state->error) goto cleanup; + } #endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ /*PLTE*/ if(info.color.colortype == LCT_PALETTE) { @@ -6090,6 +6257,7 @@ unsigned lodepng_encode(unsigned char** out, size_t* outsize, cleanup: lodepng_info_cleanup(&info); lodepng_free(data); + lodepng_color_mode_cleanup(&auto_color); /*instead of cleaning the vector up, give it to the output*/ *out = outv.data; @@ -6284,6 +6452,8 @@ const char* lodepng_error_text(unsigned code) { /*max ICC size limit can be configured in LodePNGDecoderSettings. This error prevents unreasonable memory consumption when decoding due to impossibly large ICC profile*/ case 113: return "ICC profile unreasonably large"; + case 114: return "sBIT chunk has wrong size for the color type of the image"; + case 115: return "sBIT value out of range"; } return "unknown error code"; } @@ -6322,7 +6492,7 @@ unsigned decompress(std::vector& out, const unsigned char* in, si size_t buffersize = 0; unsigned error = zlib_decompress(&buffer, &buffersize, 0, in, insize, &settings); if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); + out.insert(out.end(), buffer, &buffer[buffersize]); lodepng_free(buffer); } return error; @@ -6341,7 +6511,7 @@ unsigned compress(std::vector& out, const unsigned char* in, size size_t buffersize = 0; unsigned error = zlib_compress(&buffer, &buffersize, in, insize, &settings); if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); + out.insert(out.end(), buffer, &buffer[buffersize]); lodepng_free(buffer); } return error; @@ -6386,7 +6556,7 @@ unsigned decode(std::vector& out, unsigned& w, unsigned& h, const state.info_raw.colortype = colortype; state.info_raw.bitdepth = bitdepth; size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); + out.insert(out.end(), buffer, &buffer[buffersize]); } lodepng_free(buffer); return error; @@ -6404,7 +6574,7 @@ unsigned decode(std::vector& out, unsigned& w, unsigned& h, unsigned error = lodepng_decode(&buffer, &w, &h, &state, in, insize); if(buffer && !error) { size_t buffersize = lodepng_get_raw_size(w, h, &state.info_raw); - out.insert(out.end(), &buffer[0], &buffer[buffersize]); + out.insert(out.end(), buffer, &buffer[buffersize]); } lodepng_free(buffer); return error; @@ -6436,7 +6606,7 @@ unsigned encode(std::vector& out, const unsigned char* in, unsign size_t buffersize; unsigned error = lodepng_encode_memory(&buffer, &buffersize, in, w, h, colortype, bitdepth); if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); + out.insert(out.end(), buffer, &buffer[buffersize]); lodepng_free(buffer); } return error; @@ -6456,7 +6626,7 @@ unsigned encode(std::vector& out, size_t buffersize; unsigned error = lodepng_encode(&buffer, &buffersize, in, w, h, &state); if(buffer) { - out.insert(out.end(), &buffer[0], &buffer[buffersize]); + out.insert(out.end(), buffer, &buffer[buffersize]); lodepng_free(buffer); } return error; diff --git a/Quake/lodepng.h b/Quake/lodepng.h index 685e7850..fdafc770 100644 --- a/Quake/lodepng.h +++ b/Quake/lodepng.h @@ -1,5 +1,5 @@ /* -LodePNG version 20220109 +LodePNG version 20220717 Copyright (c) 2005-2022 Lode Vandevenne @@ -35,43 +35,50 @@ The following #defines are used to create code sections. They can be disabled to disable code sections, which can give faster compile time and smaller binary. The "NO_COMPILE" defines are designed to be used to pass as defines to the compiler command to disable them without modifying this header, e.g. --DLODEPNG_NO_COMPILE_ZLIB for gcc. -In addition to those below, you can also define LODEPNG_NO_COMPILE_CRC to -allow implementing a custom lodepng_crc32. +-DLODEPNG_NO_COMPILE_ZLIB for gcc or clang. */ /*deflate & zlib. If disabled, you must specify alternative zlib functions in the custom_zlib field of the compress and decompress settings*/ #ifndef LODEPNG_NO_COMPILE_ZLIB +/*pass -DLODEPNG_NO_COMPILE_ZLIB to the compiler to disable this, or comment out LODEPNG_COMPILE_ZLIB below*/ #define LODEPNG_COMPILE_ZLIB #endif /*png encoder and png decoder*/ #ifndef LODEPNG_NO_COMPILE_PNG +/*pass -DLODEPNG_NO_COMPILE_PNG to the compiler to disable this, or comment out LODEPNG_COMPILE_PNG below*/ #define LODEPNG_COMPILE_PNG #endif /*deflate&zlib decoder and png decoder*/ #ifndef LODEPNG_NO_COMPILE_DECODER +/*pass -DLODEPNG_NO_COMPILE_DECODER to the compiler to disable this, or comment out LODEPNG_COMPILE_DECODER below*/ #define LODEPNG_COMPILE_DECODER #endif /*deflate&zlib encoder and png encoder*/ #ifndef LODEPNG_NO_COMPILE_ENCODER +/*pass -DLODEPNG_NO_COMPILE_ENCODER to the compiler to disable this, or comment out LODEPNG_COMPILE_ENCODER below*/ #define LODEPNG_COMPILE_ENCODER #endif /*the optional built in harddisk file loading and saving functions*/ #ifndef LODEPNG_NO_COMPILE_DISK +/*pass -DLODEPNG_NO_COMPILE_DISK to the compiler to disable this, or comment out LODEPNG_COMPILE_DISK below*/ #define LODEPNG_COMPILE_DISK #endif /*support for chunks other than IHDR, IDAT, PLTE, tRNS, IEND: ancillary and unknown chunks*/ #ifndef LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS +/*pass -DLODEPNG_NO_COMPILE_ANCILLARY_CHUNKS to the compiler to disable this, +or comment out LODEPNG_COMPILE_ANCILLARY_CHUNKS below*/ #define LODEPNG_COMPILE_ANCILLARY_CHUNKS #endif /*ability to convert error numerical codes to English text string*/ #ifndef LODEPNG_NO_COMPILE_ERROR_TEXT +/*pass -DLODEPNG_NO_COMPILE_ERROR_TEXT to the compiler to disable this, +or comment out LODEPNG_COMPILE_ERROR_TEXT below*/ #define LODEPNG_COMPILE_ERROR_TEXT #endif @@ -79,12 +86,24 @@ the custom_zlib field of the compress and decompress settings*/ you can define the functions lodepng_free, lodepng_malloc and lodepng_realloc in your source files with custom allocators.*/ #ifndef LODEPNG_NO_COMPILE_ALLOCATORS +/*pass -DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler to disable the built-in ones, +or comment out LODEPNG_COMPILE_ALLOCATORS below*/ #define LODEPNG_COMPILE_ALLOCATORS #endif +/*Disable built-in CRC function, in that case a custom implementation of +lodepng_crc32 must be defined externally so that it can be linked in.*/ +#ifndef LODEPNG_NO_COMPILE_CRC +/*pass -DLODEPNG_NO_COMPILE_CRC to the compiler to disable the built-in one, +or comment out LODEPNG_COMPILE_CRC below*/ +#define LODEPNG_COMPILE_CRC +#endif + /*compile the C++ version (you can disable the C++ wrapper here even when compiling for C++)*/ #ifdef __cplusplus #ifndef LODEPNG_NO_COMPILE_CPP +/*pass -DLODEPNG_NO_COMPILE_CPP to the compiler to disable C++ (not needed if a C-only compiler), +or comment out LODEPNG_COMPILE_CPP below*/ #define LODEPNG_COMPILE_CPP #endif #endif @@ -374,8 +393,10 @@ typedef struct LodePNGColorMode { The alpha channels must be set as well, set them to 255 for opaque images. - When decoding, by default you can ignore this palette, since LodePNG already - fills the palette colors in the pixels of the raw RGBA output. + When decoding, with the default settings you can ignore this palette, since + LodePNG already fills the palette colors in the pixels of the raw RGBA output, + but when decoding to the original PNG color mode it is needed to reconstruct + the colors. The palette is only supported for color type 3. */ @@ -465,10 +486,12 @@ typedef struct LodePNGInfo { with values truncated to the bit depth in the unsigned integer. For grayscale and palette PNGs, the value is stored in background_r. The values - in background_g and background_b are then unused. + in background_g and background_b are then unused. The decoder will set them + equal to background_r, the encoder ignores them in this case. - So when decoding, you may get these in a different color mode than the one you requested - for the raw pixels. + When decoding, you may get these in a different color mode than the one you requested + for the raw pixels: the colortype and bitdepth defined by info_png.color, that is the + ones defined in the header of the PNG image, are used. When encoding with auto_convert, you must use the color model defined in info_png.color for these values. The encoder normally ignores info_png.color when auto_convert is on, but will @@ -535,7 +558,7 @@ typedef struct LodePNGInfo { unsigned phys_unit; /*may be 0 (unknown unit) or 1 (metre)*/ /* - Color profile related chunks: gAMA, cHRM, sRGB, iCPP + Color profile related chunks: gAMA, cHRM, sRGB, iCPP, sBIT LodePNG does not apply any color conversions on pixels in the encoder or decoder and does not interpret these color profile values. It merely passes on the information. If you wish to use color profiles and convert colors, please @@ -598,6 +621,45 @@ typedef struct LodePNGInfo { unsigned char* iccp_profile; unsigned iccp_profile_size; /* The size of iccp_profile in bytes */ + /* + sBIT chunk: significant bits. Optional metadata, only set this if needed. + + If defined, these values give the bit depth of the original data. Since PNG only stores 1, 2, 4, 8 or 16-bit + per channel data, the significant bits value can be used to indicate the original encoded data has another + sample depth, such as 10 or 12. + + Encoders using this value, when storing the pixel data, should use the most significant bits + of the data to store the original bits, and use a good sample depth scaling method such as + "left bit replication" to fill in the least significant bits, rather than fill zeroes. + + Decoders using this value, if able to work with data that's e.g. 10-bit or 12-bit, should right + shift the data to go back to the original bit depth, but decoders are also allowed to ignore + sbit and work e.g. with the 8-bit or 16-bit data from the PNG directly, since thanks + to the encoder contract, the values encoded in PNG are in valid range for the PNG bit depth. + + For grayscale images, sbit_g and sbit_b are not used, and for images that don't use color + type RGBA or grayscale+alpha, sbit_a is not used (it's not used even for palette images with + translucent palette values, or images with color key). The values that are used must be + greater than zero and smaller than or equal to the PNG bit depth. + + The color type from the header in the PNG image defines these used and unused fields: if + decoding with a color mode conversion, such as always decoding to RGBA, this metadata still + only uses the color type of the original PNG, and may e.g. lack the alpha channel info + if the PNG was RGB. When encoding with auto_convert (as well as without), also always the + color model defined in info_png.color determines this. + + NOTE: enabling sbit can hurt compression, because the encoder can then not always use + auto_convert to choose a more optimal color mode for the data, because the PNG format has + strict requirements for the allowed sbit values in combination with color modes. + For example, setting these fields to 10-bit will force the encoder to keep using a 16-bit per channel + color mode, even if the pixel data would in fact fit in a more efficient 8-bit mode. + */ + unsigned sbit_defined; /*is significant bits given? if not, the values below are unused*/ + unsigned sbit_r; /*red or gray component of significant bits*/ + unsigned sbit_g; /*green component of significant bits*/ + unsigned sbit_b; /*blue component of significant bits*/ + unsigned sbit_a; /*alpha component of significant bits*/ + /* End of color profile related chunks */ @@ -770,7 +832,11 @@ typedef struct LodePNGEncoderSettings { const unsigned char* predefined_filters; /*force creating a PLTE chunk if colortype is 2 or 6 (= a suggested palette). - If colortype is 3, PLTE is _always_ created.*/ + If colortype is 3, PLTE is always created. If color type is explicitely set + to a grayscale type (1 or 4), this is not done and is ignored. If enabling this, + a palette must be present in the info_png. + NOTE: enabling this may worsen compression if auto_convert is used to choose + optimal color mode, because it cannot use grayscale color modes in this case*/ unsigned force_palette; #ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /*add LodePNG identifier and version as a text chunk, for debugging*/ @@ -824,8 +890,8 @@ unsigned lodepng_inspect(unsigned* w, unsigned* h, #endif /*LODEPNG_COMPILE_DECODER*/ /* -Reads one metadata chunk (other than IHDR) of the PNG file and outputs what it -read in the state. Returns error code on failure. +Reads one metadata chunk (other than IHDR, which is handled by lodepng_inspect) +of the PNG file and outputs what it read in the state. Returns error code on failure. Use lodepng_inspect first with a new state, then e.g. lodepng_chunk_find_const to find the desired chunk type, and if non null use lodepng_inspect_chunk (with chunk_pointer - start_of_file as pos). @@ -1103,7 +1169,7 @@ TODO: [.] check compatibility with various compilers - done but needs to be redone for every newer version [X] converting color to 16-bit per channel types [X] support color profile chunk types (but never let them touch RGB values by default) -[ ] support all public PNG chunk types (almost done except sBIT, sPLT and hIST) +[ ] support all public PNG chunk types (almost done except sPLT and hIST) [ ] make sure encoder generates no chunks with size > (2^31)-1 [ ] partial decoding (stream processing) [X] let the "isFullyOpaque" function check color keys and transparent palettes too @@ -1230,18 +1296,16 @@ The following features are supported by the decoder: gAMA: RGB gamma correction iCCP: ICC color profile sRGB: rendering intent + sBIT: significant bits 1.2. features not supported --------------------------- -The following features are _not_ supported: +The following features are not (yet) supported: *) some features needed to make a conformant PNG-Editor might be still missing. *) partial loading/stream processing. All data must be available and is processed in one call. -*) The following public chunks are not (yet) supported but treated as unknown chunks by LodePNG: - sBIT - hIST - sPLT +*) The hIST and sPLT public chunks are not (yet) supported but treated as unknown chunks 2. C and C++ version @@ -1845,6 +1909,7 @@ symbol. Not all changes are listed here, the commit history in github lists more: https://github.com/lvandeve/lodepng +*) 13 jun 2022: added support for the sBIT chunk. *) 09 jan 2022: minor decoder speed improvements. *) 27 jun 2021: added warnings that file reading/writing functions don't support wide-character filenames (support for this is not planned, opening files is From ec57aa9731c2f3e8271aeb45228290a6820ddfc0 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Mon, 18 Jul 2022 14:24:24 +0300 Subject: [PATCH 08/11] Fix wrong ext texture use after vid_restart windowed to/from fullscreen Patch from Andrei Drexler. Reference issue: https://github.com/sezero/quakespasm/issues/28. --- Quake/gl_model.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Quake/gl_model.c b/Quake/gl_model.c index d193051c..e5e6f39f 100644 --- a/Quake/gl_model.c +++ b/Quake/gl_model.c @@ -462,7 +462,7 @@ static void Mod_LoadTextures (lump_t *l) int nummiptex; src_offset_t offset; int mark, fwidth, fheight; - char filename[MAX_OSPATH], filename2[MAX_OSPATH], mapname[MAX_OSPATH]; + char filename[MAX_OSPATH], mapname[MAX_OSPATH]; byte *data; extern byte *hunk_base; //johnfitz @@ -607,6 +607,7 @@ static void Mod_LoadTextures (lump_t *l) //now load whatever we found if (data) //load external image { + char filename2[MAX_OSPATH]; tx->gltexture = TexMgr_LoadImage (loadmodel, filename, fwidth, fheight, SRC_RGBA, data, filename, 0, TEXPREF_MIPMAP | extraflags ); @@ -622,7 +623,7 @@ static void Mod_LoadTextures (lump_t *l) if (data) tx->fullbright = TexMgr_LoadImage (loadmodel, filename2, fwidth, fheight, - SRC_RGBA, data, filename, 0, TEXPREF_MIPMAP | extraflags ); + SRC_RGBA, data, filename2, 0, TEXPREF_MIPMAP | extraflags ); } else //use the texture from the bsp file { From 22b9b3474c4102bbcfee033935758cc497445970 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Wed, 20 Jul 2022 23:24:24 +0300 Subject: [PATCH 09/11] lodepng.c: applied patch from mainstream PR/170 marks lodepng_convert_rgb() static and only available if LODEPNG_COMPILE_ANCILLARY_CHUNKS is set. --- Quake/lodepng.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Quake/lodepng.c b/Quake/lodepng.c index 6f8ef04a..0f991b74 100644 --- a/Quake/lodepng.c +++ b/Quake/lodepng.c @@ -3595,6 +3595,9 @@ unsigned lodepng_convert(unsigned char* out, const unsigned char* in, return error; } +#ifdef LODEPNG_COMPILE_ENCODER + +#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS /* Converts a single rgb color without alpha from one type to another, color bits truncated to their bitdepth. In case of single channel (gray or palette), only the r channel is used. Slow @@ -3602,7 +3605,7 @@ function, do not use to process all pixels of an image. Alpha channel not suppor this is for bKGD, supporting alpha may prevent it from finding a color in the palette, from the specification it looks like bKGD should ignore the alpha values of the palette since it can use any palette index but doesn't have an alpha channel. Idem with ignoring color key. */ -unsigned lodepng_convert_rgb( +static unsigned lodepng_convert_rgb( unsigned* r_out, unsigned* g_out, unsigned* b_out, unsigned r_in, unsigned g_in, unsigned b_in, const LodePNGColorMode* mode_out, const LodePNGColorMode* mode_in) { @@ -3652,7 +3655,7 @@ unsigned lodepng_convert_rgb( return 0; } -#ifdef LODEPNG_COMPILE_ENCODER +#endif /* LODEPNG_COMPILE_ANCILLARY_CHUNKS */ void lodepng_color_stats_init(LodePNGColorStats* stats) { /*stats*/ From 47de22c84b1e6c38701d2b2e9897ae7f0dab388b Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Sun, 24 Jul 2022 08:25:10 +0300 Subject: [PATCH 10/11] bump version to 0.94.7, update documents. --- Linux/sgml/Quakespasm.sgml | 13 +- MacOSX/English.lproj/InfoPlist.strings | Bin 536 -> 536 bytes MacOSX/Info.plist | 2 +- Quake/quakedef.h | 2 +- Quakespasm.html | 128 +++++++++--------- Quakespasm.txt | 172 +++++++++---------------- 6 files changed, 145 insertions(+), 172 deletions(-) diff --git a/Linux/sgml/Quakespasm.sgml b/Linux/sgml/Quakespasm.sgml index a489ce6a..9f65f38a 100644 --- a/Linux/sgml/Quakespasm.sgml +++ b/Linux/sgml/Quakespasm.sgml @@ -3,7 +3,7 @@ QuakeSpasm <toc> -<em>Page last edited: June 2022.</em> +<em>Page last edited: July 2022.</em> <sect> About <p> @@ -131,11 +131,20 @@ Alternatively, have a look at <bf>Makefile.darwin</bf> for more instructions on </p> <sect1> Quake '2021 re-release' <p> -QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run quakespasm as you normally do.</p> +QuakeSpasm 0.94 has support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run as you normally do.</p> <sect> Changes<p> +<sect1> Changes in 0.94.7<p> +<itemize> +<item> Fix console history buffer wrapping. +<item> Fix wrong external texture use after vid_restart. +<item> Update lodepng from mainstream git. +<item> Miscellaneous source code cleanups. +</itemize> +</p> + <sect1> Changes in 0.94.6<p> <itemize> <item> Server protocol size check fixes for sounds and particles. diff --git a/MacOSX/English.lproj/InfoPlist.strings b/MacOSX/English.lproj/InfoPlist.strings index 61832cdb79681224be4a58e1d5e06473706a012d..c4e05d3b456c9bcc6d26f9ec34e1a0a4ddb6bae8 100644 GIT binary patch delta 20 ccmbQiGJ|Ep9Y*ts{o)h9I5C<}HfMYY08u;#zW@LL delta 20 ccmbQiGJ|Ep9Y(W>{o)h9I5C<{HfMYY08uIjy#N3J diff --git a/MacOSX/Info.plist b/MacOSX/Info.plist index 54f7043c..1167495d 100644 --- a/MacOSX/Info.plist +++ b/MacOSX/Info.plist @@ -17,7 +17,7 @@ <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> - <string>0.94.6</string> + <string>0.94.7</string> <key>CFBundleSignature</key> <string>????</string> <key>LSApplicationCategoryType</key> diff --git a/Quake/quakedef.h b/Quake/quakedef.h index 7f106f7a..8bbc924a 100644 --- a/Quake/quakedef.h +++ b/Quake/quakedef.h @@ -37,7 +37,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define FITZQUAKE_VERSION 0.85 //johnfitz #define QUAKESPASM_VERSION 0.94 -#define QUAKESPASM_VER_PATCH 6 // helper to print a string like 0.94.6 +#define QUAKESPASM_VER_PATCH 7 // helper to print a string like 0.94.7 #ifndef QUAKESPASM_VER_SUFFIX #define QUAKESPASM_VER_SUFFIX // optional version suffix string literal like "-beta1" #endif diff --git a/Quakespasm.html b/Quakespasm.html index f961b94c..91819c3b 100644 --- a/Quakespasm.html +++ b/Quakespasm.html @@ -8,7 +8,7 @@ <H1>QuakeSpasm</H1> <H2></H2> -<P><EM>Page last edited: June 2022.</EM></P> +<P><EM>Page last edited: July 2022.</EM></P> <P> <H2><A NAME="toc1">1.</A> <A HREF="Quakespasm.html#s1">About </A></H2> @@ -35,30 +35,31 @@ <H2><A NAME="toc5">5.</A> <A HREF="Quakespasm.html#s5">Changes</A></H2> <UL> -<LI><A NAME="toc5.1">5.1</A> <A HREF="Quakespasm.html#ss5.1">Changes in 0.94.6</A> -<LI><A NAME="toc5.2">5.2</A> <A HREF="Quakespasm.html#ss5.2">Changes in 0.94.5</A> -<LI><A NAME="toc5.3">5.3</A> <A HREF="Quakespasm.html#ss5.3">Changes in 0.94.4</A> -<LI><A NAME="toc5.4">5.4</A> <A HREF="Quakespasm.html#ss5.4">Changes in 0.94.3</A> -<LI><A NAME="toc5.5">5.5</A> <A HREF="Quakespasm.html#ss5.5">Changes in 0.94.2</A> -<LI><A NAME="toc5.6">5.6</A> <A HREF="Quakespasm.html#ss5.6">Changes in 0.94.1</A> -<LI><A NAME="toc5.7">5.7</A> <A HREF="Quakespasm.html#ss5.7">Changes in 0.94.0</A> -<LI><A NAME="toc5.8">5.8</A> <A HREF="Quakespasm.html#ss5.8">Changes in 0.93.2</A> -<LI><A NAME="toc5.9">5.9</A> <A HREF="Quakespasm.html#ss5.9">Changes in 0.93.1</A> -<LI><A NAME="toc5.10">5.10</A> <A HREF="Quakespasm.html#ss5.10">Changes in 0.93.0</A> -<LI><A NAME="toc5.11">5.11</A> <A HREF="Quakespasm.html#ss5.11">Changes in 0.92.1</A> -<LI><A NAME="toc5.12">5.12</A> <A HREF="Quakespasm.html#ss5.12">Changes in 0.92.0</A> -<LI><A NAME="toc5.13">5.13</A> <A HREF="Quakespasm.html#ss5.13">Changes in 0.91.0</A> -<LI><A NAME="toc5.14">5.14</A> <A HREF="Quakespasm.html#ss5.14">Changes in 0.90.1</A> -<LI><A NAME="toc5.15">5.15</A> <A HREF="Quakespasm.html#ss5.15">Changes in 0.90.0</A> -<LI><A NAME="toc5.16">5.16</A> <A HREF="Quakespasm.html#ss5.16">Changes in 0.85.9</A> -<LI><A NAME="toc5.17">5.17</A> <A HREF="Quakespasm.html#ss5.17">Changes in 0.85.8</A> -<LI><A NAME="toc5.18">5.18</A> <A HREF="Quakespasm.html#ss5.18">Changes in 0.85.7</A> -<LI><A NAME="toc5.19">5.19</A> <A HREF="Quakespasm.html#ss5.19">Changes in 0.85.6</A> -<LI><A NAME="toc5.20">5.20</A> <A HREF="Quakespasm.html#ss5.20">Changes in 0.85.5</A> -<LI><A NAME="toc5.21">5.21</A> <A HREF="Quakespasm.html#ss5.21">Changes in 0.85.4</A> -<LI><A NAME="toc5.22">5.22</A> <A HREF="Quakespasm.html#ss5.22">Changes in 0.85.3</A> -<LI><A NAME="toc5.23">5.23</A> <A HREF="Quakespasm.html#ss5.23">Changes in 0.85.2</A> -<LI><A NAME="toc5.24">5.24</A> <A HREF="Quakespasm.html#ss5.24">Changes in 0.85.1</A> +<LI><A NAME="toc5.1">5.1</A> <A HREF="Quakespasm.html#ss5.1">Changes in 0.94.7</A> +<LI><A NAME="toc5.2">5.2</A> <A HREF="Quakespasm.html#ss5.2">Changes in 0.94.6</A> +<LI><A NAME="toc5.3">5.3</A> <A HREF="Quakespasm.html#ss5.3">Changes in 0.94.5</A> +<LI><A NAME="toc5.4">5.4</A> <A HREF="Quakespasm.html#ss5.4">Changes in 0.94.4</A> +<LI><A NAME="toc5.5">5.5</A> <A HREF="Quakespasm.html#ss5.5">Changes in 0.94.3</A> +<LI><A NAME="toc5.6">5.6</A> <A HREF="Quakespasm.html#ss5.6">Changes in 0.94.2</A> +<LI><A NAME="toc5.7">5.7</A> <A HREF="Quakespasm.html#ss5.7">Changes in 0.94.1</A> +<LI><A NAME="toc5.8">5.8</A> <A HREF="Quakespasm.html#ss5.8">Changes in 0.94.0</A> +<LI><A NAME="toc5.9">5.9</A> <A HREF="Quakespasm.html#ss5.9">Changes in 0.93.2</A> +<LI><A NAME="toc5.10">5.10</A> <A HREF="Quakespasm.html#ss5.10">Changes in 0.93.1</A> +<LI><A NAME="toc5.11">5.11</A> <A HREF="Quakespasm.html#ss5.11">Changes in 0.93.0</A> +<LI><A NAME="toc5.12">5.12</A> <A HREF="Quakespasm.html#ss5.12">Changes in 0.92.1</A> +<LI><A NAME="toc5.13">5.13</A> <A HREF="Quakespasm.html#ss5.13">Changes in 0.92.0</A> +<LI><A NAME="toc5.14">5.14</A> <A HREF="Quakespasm.html#ss5.14">Changes in 0.91.0</A> +<LI><A NAME="toc5.15">5.15</A> <A HREF="Quakespasm.html#ss5.15">Changes in 0.90.1</A> +<LI><A NAME="toc5.16">5.16</A> <A HREF="Quakespasm.html#ss5.16">Changes in 0.90.0</A> +<LI><A NAME="toc5.17">5.17</A> <A HREF="Quakespasm.html#ss5.17">Changes in 0.85.9</A> +<LI><A NAME="toc5.18">5.18</A> <A HREF="Quakespasm.html#ss5.18">Changes in 0.85.8</A> +<LI><A NAME="toc5.19">5.19</A> <A HREF="Quakespasm.html#ss5.19">Changes in 0.85.7</A> +<LI><A NAME="toc5.20">5.20</A> <A HREF="Quakespasm.html#ss5.20">Changes in 0.85.6</A> +<LI><A NAME="toc5.21">5.21</A> <A HREF="Quakespasm.html#ss5.21">Changes in 0.85.5</A> +<LI><A NAME="toc5.22">5.22</A> <A HREF="Quakespasm.html#ss5.22">Changes in 0.85.4</A> +<LI><A NAME="toc5.23">5.23</A> <A HREF="Quakespasm.html#ss5.23">Changes in 0.85.3</A> +<LI><A NAME="toc5.24">5.24</A> <A HREF="Quakespasm.html#ss5.24">Changes in 0.85.2</A> +<LI><A NAME="toc5.25">5.25</A> <A HREF="Quakespasm.html#ss5.25">Changes in 0.85.1</A> </UL> <P> <H2><A NAME="toc6">6.</A> <A HREF="Quakespasm.html#s6">Copyright </A></H2> @@ -178,7 +179,7 @@ where DRIVER may be alsa, dsp, pulse, esd ...</LI> Quakespasm can also be built with the cross-platform Codeblocks.<BR> Quakespasm's (optional) custom data is now stored in the file <B>quakespasm.pak</B>. This file should be placed alongside your quakespasm binary and <B>id1</B> directory.</P> -<H2><A NAME="ss4.1">4.1</A> <A HREF="#toc4.1">Linux/Unix </A> +<H2><A NAME="ss4.1">4.1</A> <A HREF="#toc4.1">Linux/Unix</A> </H2> <P>After extracting the source tarball, "cd Quake" and edit the Makefile for music options. </P> <P><EM>Streaming music playback requires "libmad" or "libmpg123" for MP3, and "libogg" and "libvorbis" for OGG files.</EM></P> @@ -192,26 +193,37 @@ Compile time options include </UL> </P> -<H2><A NAME="ss4.2">4.2</A> <A HREF="#toc4.2">Windows </A> +<H2><A NAME="ss4.2">4.2</A> <A HREF="#toc4.2">Windows</A> </H2> <P>QuakeSpasm developers cross-compile windows binaries using <A HREF="http://mingw-w64.sf.net">MinGW-w64</A> and -<A HREF="https://mingw.osdn.io">MinGW</A>.</P> -<P>The project can also be built using Microsoft Visual Studio 2005 and newer versions.</P> +<A HREF="https://mingw.osdn.io">MinGW</A>. +The project can also be built using Microsoft Visual Studio 2005 and newer versions.</P> -<H2><A NAME="ss4.3">4.3</A> <A HREF="#toc4.3">Mac OS X </A> +<H2><A NAME="ss4.3">4.3</A> <A HREF="#toc4.3">Mac OS X</A> </H2> -<P>A Quakespasm App (including program launcher and update framework) can be made using the <B>Xcode</B> template found in the MacOSX directory.</P> -<P>Alternatively, have a look at <B>Makefile.darwin</B> for more instructions on building from a console.</P> +<P>A Quakespasm App (including program launcher and update framework) can be made using the <B>Xcode</B> template found in the MacOSX directory. +Alternatively, have a look at <B>Makefile.darwin</B> for more instructions on building from a console.</P> -<H2><A NAME="ss4.4">4.4</A> <A HREF="#toc4.4">Quake '2021 re-release' </A> +<H2><A NAME="ss4.4">4.4</A> <A HREF="#toc4.4">Quake '2021 re-release'</A> </H2> -<P>QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run quakespasm as you normally do.</P> +<P>QuakeSpasm 0.94 has support for playing the 2021 re-release content: Copy the quakespasm binary to your rerelease installation and run as you normally do.</P> <H2><A NAME="s5">5.</A> <A HREF="#toc5">Changes</A></H2> -<H2><A NAME="ss5.1">5.1</A> <A HREF="#toc5.1">Changes in 0.94.6</A> +<H2><A NAME="ss5.1">5.1</A> <A HREF="#toc5.1">Changes in 0.94.7</A> +</H2> +<P> +<UL> +<LI> Fix console history buffer wrapping.</LI> +<LI> Fix wrong external texture use after vid_restart.</LI> +<LI> Update lodepng from mainstream git.</LI> +<LI> Miscellaneous source code cleanups.</LI> +</UL> +</P> + +<H2><A NAME="ss5.2">5.2</A> <A HREF="#toc5.2">Changes in 0.94.6</A> </H2> <P> <UL> @@ -224,7 +236,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.2">5.2</A> <A HREF="#toc5.2">Changes in 0.94.5</A> +<H2><A NAME="ss5.3">5.3</A> <A HREF="#toc5.3">Changes in 0.94.5</A> </H2> <P> <UL> @@ -237,7 +249,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.3">5.3</A> <A HREF="#toc5.3">Changes in 0.94.4</A> +<H2><A NAME="ss5.4">5.4</A> <A HREF="#toc5.4">Changes in 0.94.4</A> </H2> <P> <UL> @@ -259,7 +271,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.4">5.4</A> <A HREF="#toc5.4">Changes in 0.94.3</A> +<H2><A NAME="ss5.5">5.5</A> <A HREF="#toc5.5">Changes in 0.94.3</A> </H2> <P> <UL> @@ -269,7 +281,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.5">5.5</A> <A HREF="#toc5.5">Changes in 0.94.2</A> +<H2><A NAME="ss5.6">5.6</A> <A HREF="#toc5.6">Changes in 0.94.2</A> </H2> <P> <UL> @@ -280,7 +292,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.6">5.6</A> <A HREF="#toc5.6">Changes in 0.94.1</A> +<H2><A NAME="ss5.7">5.7</A> <A HREF="#toc5.7">Changes in 0.94.1</A> </H2> <P> <UL> @@ -288,7 +300,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.7">5.7</A> <A HREF="#toc5.7">Changes in 0.94.0</A> +<H2><A NAME="ss5.8">5.8</A> <A HREF="#toc5.8">Changes in 0.94.0</A> </H2> <P> <UL> @@ -313,7 +325,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.8">5.8</A> <A HREF="#toc5.8">Changes in 0.93.2</A> +<H2><A NAME="ss5.9">5.9</A> <A HREF="#toc5.9">Changes in 0.93.2</A> </H2> <P> <UL> @@ -326,7 +338,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.9">5.9</A> <A HREF="#toc5.9">Changes in 0.93.1</A> +<H2><A NAME="ss5.10">5.10</A> <A HREF="#toc5.10">Changes in 0.93.1</A> </H2> <P> <UL> @@ -340,7 +352,7 @@ Compile time options include </UL> </P> -<H2><A NAME="ss5.10">5.10</A> <A HREF="#toc5.10">Changes in 0.93.0</A> +<H2><A NAME="ss5.11">5.11</A> <A HREF="#toc5.11">Changes in 0.93.0</A> </H2> <P> <UL> @@ -383,7 +395,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.11">5.11</A> <A HREF="#toc5.11">Changes in 0.92.1</A> +<H2><A NAME="ss5.12">5.12</A> <A HREF="#toc5.12">Changes in 0.92.1</A> </H2> <P> <UL> @@ -393,7 +405,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.12">5.12</A> <A HREF="#toc5.12">Changes in 0.92.0</A> +<H2><A NAME="ss5.13">5.13</A> <A HREF="#toc5.13">Changes in 0.92.0</A> </H2> <P> <UL> @@ -412,7 +424,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) <LI> Updated some of the third-party libraries. Other fixes/clean-ups.</LI> </UL> </P> -<H2><A NAME="ss5.13">5.13</A> <A HREF="#toc5.13">Changes in 0.91.0</A> +<H2><A NAME="ss5.14">5.14</A> <A HREF="#toc5.14">Changes in 0.91.0</A> </H2> <H3>Bugfixes</H3> <P> @@ -462,7 +474,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.14">5.14</A> <A HREF="#toc5.14">Changes in 0.90.1</A> +<H2><A NAME="ss5.15">5.15</A> <A HREF="#toc5.15">Changes in 0.90.1</A> </H2> <H3>Bugfixes</H3> <P> @@ -512,7 +524,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.15">5.15</A> <A HREF="#toc5.15">Changes in 0.90.0</A> +<H2><A NAME="ss5.16">5.16</A> <A HREF="#toc5.16">Changes in 0.90.0</A> </H2> <P> <UL> @@ -558,7 +570,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.16">5.16</A> <A HREF="#toc5.16">Changes in 0.85.9</A> +<H2><A NAME="ss5.17">5.17</A> <A HREF="#toc5.17">Changes in 0.85.9</A> </H2> <P> <UL> @@ -582,7 +594,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.17">5.17</A> <A HREF="#toc5.17">Changes in 0.85.8</A> +<H2><A NAME="ss5.18">5.18</A> <A HREF="#toc5.18">Changes in 0.85.8</A> </H2> <P> <UL> @@ -607,7 +619,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.18">5.18</A> <A HREF="#toc5.18">Changes in 0.85.7</A> +<H2><A NAME="ss5.19">5.19</A> <A HREF="#toc5.19">Changes in 0.85.7</A> </H2> <P> <UL> @@ -625,7 +637,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.19">5.19</A> <A HREF="#toc5.19">Changes in 0.85.6</A> +<H2><A NAME="ss5.20">5.20</A> <A HREF="#toc5.20">Changes in 0.85.6</A> </H2> <P> <UL> @@ -636,7 +648,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.20">5.20</A> <A HREF="#toc5.20">Changes in 0.85.5</A> +<H2><A NAME="ss5.21">5.21</A> <A HREF="#toc5.21">Changes in 0.85.5</A> </H2> <P> <UL> @@ -655,7 +667,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.21">5.21</A> <A HREF="#toc5.21">Changes in 0.85.4</A> +<H2><A NAME="ss5.22">5.22</A> <A HREF="#toc5.22">Changes in 0.85.4</A> </H2> <P> <UL> @@ -673,7 +685,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.22">5.22</A> <A HREF="#toc5.22">Changes in 0.85.3</A> +<H2><A NAME="ss5.23">5.23</A> <A HREF="#toc5.23">Changes in 0.85.3</A> </H2> <P> <UL> @@ -695,7 +707,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.23">5.23</A> <A HREF="#toc5.23">Changes in 0.85.2</A> +<H2><A NAME="ss5.24">5.24</A> <A HREF="#toc5.24">Changes in 0.85.2</A> </H2> <P> <UL> @@ -713,7 +725,7 @@ quakespasm (cl_alwaysrun 1, cl_forwardspeed 200, cl_backspeed 200) </UL> </P> -<H2><A NAME="ss5.24">5.24</A> <A HREF="#toc5.24">Changes in 0.85.1</A> +<H2><A NAME="ss5.25">5.25</A> <A HREF="#toc5.25">Changes in 0.85.1</A> </H2> <P> <UL> diff --git a/Quakespasm.txt b/Quakespasm.txt index 37e5c7a8..a7c651a8 100644 --- a/Quakespasm.txt +++ b/Quakespasm.txt @@ -1,68 +1,9 @@ QuakeSpasm - ____________________________________________________________ - - Table of Contents - - 1. About - 2. Downloads - 3. Hints - 3.1 Music Playback - 3.2 Controller Support - 3.2.1 Cvars - 3.2.2 Buttons - - 4. Compiling and Installation - 4.1 Linux/Unix - 4.2 Windows - 4.3 Mac OS X - 4.4 Quake '2021 re-release' - - 5. Changes - 5.1 Changes in 0.94.6 - 5.2 Changes in 0.94.5 - 5.3 Changes in 0.94.4 - 5.4 Changes in 0.94.3 - 5.5 Changes in 0.94.2 - 5.6 Changes in 0.94.1 - 5.7 Changes in 0.94.0 - 5.8 Changes in 0.93.2 - 5.9 Changes in 0.93.1 - 5.10 Changes in 0.93.0 - 5.11 Changes in 0.92.1 - 5.12 Changes in 0.92.0 - 5.13 Changes in 0.91.0 - 5.13.1 Bugfixes - 5.13.2 Visual improvements - 5.13.3 Interface improvements - 5.13.4 Code cleanup / Other - 5.13.5 Raised limits - 5.14 Changes in 0.90.1 - 5.14.1 Bugfixes - 5.14.2 Performance - 5.14.3 Visual improvements - 5.14.4 Interface improvements - 5.14.5 Code cleanup - 5.15 Changes in 0.90.0 - 5.16 Changes in 0.85.9 - 5.17 Changes in 0.85.8 - 5.18 Changes in 0.85.7 - 5.19 Changes in 0.85.6 - 5.20 Changes in 0.85.5 - 5.21 Changes in 0.85.4 - 5.22 Changes in 0.85.3 - 5.23 Changes in 0.85.2 - 5.24 Changes in 0.85.1 - - 6. Copyright - 7. Contact - 8. Links - - ______________________________________________________________________ - Page last edited: June 2022. + Page last edited: July 2022. 1. About @@ -119,7 +60,8 @@ o Use "quakespasm -condebug" to save console log to "qconsole.log". SDL2 builds no longer generate stdout.txt/stderr.txt. - 3.1. Music Playback + + Music Playback: Quakespasm can play various external music formats, including MP3, OGG and FLAC. @@ -137,7 +79,8 @@ o See Quakespasm-Music.txt for more details. - 3.2. Controller Support + + Controller Support: The SDL2 variant of Quakespasm supports Xbox 360 style game controllers. @@ -150,7 +93,7 @@ in your Quake directory, it is a community-maintained database that adds support for more controllers to SDL2. - 3.2.1. Cvars + Controller Support - Cvars: o joy_deadzone - Fraction of the stick travel to be deadzone, between 0 and 1. Default 0.175. @@ -177,7 +120,7 @@ o joy_enable - Set to 0 to disable controller support. Default 1. - 3.2.2. Buttons + Controller Support - Buttons: Some of the controller buttons are hardcoded to allow navigating the menu: @@ -219,7 +162,7 @@ quakespasm.pak. This file should be placed alongside your quakespasm binary and id1 directory. - 4.1. Linux/Unix + Compiling for Linux/Unix: After extracting the source tarball, "cd Quake" and edit the Makefile for music options. @@ -239,15 +182,14 @@ o make USE_SDL2=1 to compile against SDL2 instead of SDL-1.2 - 4.2. Windows + Compiling for Windows: QuakeSpasm developers cross-compile windows binaries using MinGW-w64 - <http://mingw-w64.sf.net> and MinGW <https://mingw.osdn.io>. + <http://mingw-w64.sf.net> and MinGW <https://mingw.osdn.io>. The + project can also be built using Microsoft Visual Studio 2005 and newer + versions. - The project can also be built using Microsoft Visual Studio 2005 and - newer versions. - - 4.3. Mac OS X + Compiling for Mac OS X: A Quakespasm App (including program launcher and update framework) can be made using the Xcode template found in the MacOSX directory. @@ -255,17 +197,28 @@ Alternatively, have a look at Makefile.darwin for more instructions on building from a console. - 4.4. Quake '2021 re-release' - QuakeSpasm 0.94.0 has initial support for playing the 2021 re-release - content: Copy the quakespasm binary to your rerelease installation and - run quakespasm as you normally do. + Quake '2021 re-release': + + QuakeSpasm 0.94 has support for playing the 2021 re-release content: + Copy the quakespasm binary to your rerelease installation and run as + you normally do. 5. Changes + Changes in 0.94.7: - 5.1. Changes in 0.94.6 + o Fix console history buffer wrapping. + + o Fix wrong external texture use after vid_restart. + + o Update lodepng from mainstream git. + + o Miscellaneous source code cleanups. + + + Changes in 0.94.6: o Server protocol size check fixes for sounds and particles. @@ -280,7 +233,7 @@ o Other small improvements elsewhere in the code. - 5.2. Changes in 0.94.5 + Changes in 0.94.5: o Compatibility with new SDL2 versioning scheme. @@ -297,7 +250,7 @@ o Backported a few fixes to the bundled SDL2-2.0.22 version. - 5.3. Changes in 0.94.4 + Changes in 0.94.4: o Fixed getting stuck with loading plaque upon attempting to load a bad save from the menu @@ -333,7 +286,7 @@ patches. - 5.4. Changes in 0.94.3 + Changes in 0.94.3: o Handle sky textures with non-standard sizes and warn about them (e.g. ad_tears) @@ -345,7 +298,7 @@ o Updated included SDL2 to latest version 2.0.18. - 5.5. Changes in 0.94.2 + Changes in 0.94.2: o 2021 rerelease: Support for playing the latest update. @@ -356,13 +309,13 @@ o 2021 rerelease: Look for QuakeEX.kpf under userdir, too. - 5.6. Changes in 0.94.1 + Changes in 0.94.1: o Fix lightmap issues after vkQuake surface mark/cull optimizations merge (sf.net bug/50) - 5.7. Changes in 0.94.0 + Changes in 0.94.0: o Initial support for playing the 'Quake 2021 re-release' content (thanks to Andrei Drexler for bulk of the work, Guillaume Plourde @@ -411,7 +364,7 @@ o Source repository moved to git. - 5.8. Changes in 0.93.2 + Changes in 0.93.2: o Lightmaps are now dynamically allocated (from QSS), and BLOCK_WIDTH/HEIGHT raised from 128 to 256. @@ -431,7 +384,7 @@ o Update the third-party libraries. Other fixes/cleanups. - 5.9. Changes in 0.93.1 + Changes in 0.93.1: o Fixed a fog regression which was introduced in 0.93.0. @@ -449,7 +402,7 @@ o Update the third-party libraries. Other fixes/cleanups. - 5.10. Changes in 0.93.0 + Changes in 0.93.0: o Raise default "joy_deadzone_trigger" cvar to 0.2. @@ -534,7 +487,7 @@ o Update the third-party libraries. - 5.11. Changes in 0.92.1 + Changes in 0.92.1: o Fixed large menu scale factors (was broken in 0.92.0). @@ -543,7 +496,7 @@ o Updated some of the third-party libraries. - 5.12. Changes in 0.92.0 + Changes in 0.92.0: o SDL2 Game Controller support. @@ -580,9 +533,9 @@ o Updated some of the third-party libraries. Other fixes/clean-ups. - 5.13. Changes in 0.91.0 + Changes in 0.91.0: - 5.13.1. Bugfixes + Bugfixes: o Fix unwanted fog mode change upon video restart. @@ -618,7 +571,7 @@ o Prevent a possible vulnerability in MSG_ReadString (old Q1/Q2 bug). - 5.13.2. Visual improvements + Visual improvements: o New cvars r_lavaalpha, r_slimealpha, r_telealpha for fine-tuning specific liquid opacities (from DirectQ/RMQEngine, non-archived, @@ -629,18 +582,18 @@ o GLSL gamma is now supported on older hardware without NPOT extension. - 5.13.3. Interface improvements + Interface improvements: o New r_pos command to show player position. o NaN detection in traceline with "developer 1" set now warns instead of errors. - 5.13.4. Code cleanup / Other + Code cleanup / Other: o Update third-party libraries. - 5.13.5. Raised limits + Raised limits: o Default max_edicts 8192 (was 2048) and no longer saved to config.cfg. @@ -652,9 +605,9 @@ o Raised MAX_SFX to 1024 (was 512). - 5.14. Changes in 0.90.1 + Changes in 0.90.1: - 5.14.1. Bugfixes + Bugfixes: o Fix dynamic light artifact where changing lightmap are rendered one frame late (bug introduced in 0.90.0). @@ -677,13 +630,13 @@ o Fix crash on out-of-bounds skin number. - 5.14.2. Performance + Performance: o Use multithreaded OpenGL on OS X for better performance. o New, faster mdl renderer using GLSL. Disable with "-noglslalias". - 5.14.3. Visual improvements + Visual improvements: o New gamma correction implementation using GLSL. Fixes all known gamma issues (affecting the full display, persisting after @@ -697,7 +650,7 @@ o r_noshadow_list cvar added (from MarkV.) - 5.14.4. Interface improvements + Interface improvements: o Support pausing demo playback with the "pause" command. @@ -714,14 +667,14 @@ "trying to load ent", "bad chunk length", "meshing", "PR_AlocStringSlots: realloc'ing" - 5.14.5. Code cleanup + Code cleanup: o Clean up IDE project files to build on fresh systems. o Update 3rd-party libraries. - 5.15. Changes in 0.90.0 + Changes in 0.90.0: o Fix issues on Windows systems with DPI scaling. @@ -829,7 +782,7 @@ o Other fixes and clean-ups. - 5.16. Changes in 0.85.9 + Changes in 0.85.9: o Fixes for several undefined behaviors in C code (gcc-4.8 support.) @@ -876,7 +829,7 @@ o Several other minor fixes/cleanups. - 5.17. Changes in 0.85.8 + Changes in 0.85.8: o Made Quake shareware 1.00 and 1.01 versions to be recognized properly. @@ -923,7 +876,7 @@ o Miscellaneous source code cleanups. - 5.18. Changes in 0.85.7 + Changes in 0.85.7: o Added support for cross-level demo playback @@ -949,7 +902,7 @@ o Several other small changes mostly invisible to the end-user - 5.19. Changes in 0.85.6 + Changes in 0.85.6: o More work for string buffer safety @@ -962,7 +915,7 @@ o Minor SDL video fixes. - 5.20. Changes in 0.85.5 + Changes in 0.85.5: o SDL input driver updated adding native keymap and dead key support to the console @@ -993,7 +946,7 @@ o Several code updates from uHexen2 project, several code cleanups. - 5.21. Changes in 0.85.4 + Changes in 0.85.4: o Implement music (OGG, MP3, WAV) playback @@ -1021,7 +974,7 @@ o Other minor sound and cdaudio updates - 5.22. Changes in 0.85.3 + Changes in 0.85.3: o Fix the "-dedicated" option (thanks Oz) and add platform specific networking code (default) rather than SDL_net @@ -1058,7 +1011,7 @@ some other CD tweaks. - 5.23. Changes in 0.85.2 + Changes in 0.85.2: o Replace the old "Screen size" slider with a "Scale" slider @@ -1086,7 +1039,7 @@ o Add OSX Makefile (tested?) - 5.24. Changes in 0.85.1 + Changes in 0.85.1: o 64 bit CPU support @@ -1159,4 +1112,3 @@ http://www.celephais.net/board/view_thread.php?id=60452 o Inside3D forums: http://forums.insideqc.com - From 1f6888e7bc64051c4fff3ead7f3650f04f7cecf4 Mon Sep 17 00:00:00 2001 From: Andrei Drexler <makro@rq3.com> Date: Sun, 31 Jul 2022 14:02:24 +0300 Subject: [PATCH 11/11] Clear startdemo list on game change This fixes inconsistent behavior when starting a game with -ad vs starting with id1 and using 'game ad' in the console (since id1 has startdemos in its quake.rc file, while ad doesn't). --- Quake/common.c | 1 + Quake/host_cmd.c | 13 +++++++++++++ Quake/quakedef.h | 1 + 3 files changed, 15 insertions(+) diff --git a/Quake/common.c b/Quake/common.c index eff4c306..7bf9e241 100644 --- a/Quake/common.c +++ b/Quake/common.c @@ -2202,6 +2202,7 @@ static void COM_Game_f (void) R_NewGame (); } ExtraMaps_NewGame (); + Host_Resetdemos (); DemoList_Rebuild (); Con_Printf("\"game\" changed to \"%s\"\n", COM_SkipPath(com_gamedir)); diff --git a/Quake/host_cmd.c b/Quake/host_cmd.c index 34f0c668..ae4c17bc 100644 --- a/Quake/host_cmd.c +++ b/Quake/host_cmd.c @@ -2271,6 +2271,19 @@ static void Host_Stopdemo_f (void) CL_Disconnect (); } +/* +================== +Host_Resetdemos + +Clear looping demo list (called on game change) +================== +*/ +void Host_Resetdemos (void) +{ + memset (cls.demos, 0, sizeof (cls.demos)); + cls.demonum = 0; +} + //============================================================================= /* diff --git a/Quake/quakedef.h b/Quake/quakedef.h index 8bbc924a..c827f015 100644 --- a/Quake/quakedef.h +++ b/Quake/quakedef.h @@ -315,6 +315,7 @@ void Host_Quit_f (void); void Host_ClientCommands (const char *fmt, ...) FUNC_PRINTF(1,2); void Host_ShutdownServer (qboolean crash); void Host_WriteConfiguration (void); +void Host_Resetdemos (void); void ExtraMaps_Init (void); void Modlist_Init (void);