void loadpage (uint16 pagenumber, uint16 *pagepointer) { int32 size; byte * buffer; CheckAnimStarted ( "loadpage" ); buffer = anim->buffer; if (anim->curlpnum != pagenumber) { anim->curlpnum = pagenumber; buffer += 0xb00 + (pagenumber*0x10000); size = sizeof(lp_descriptor); /* Bmemcpy(&anim->curlp,buffer,size); // JBF: why didn't this get read from the LpArray[] table? anim->curlp.baseRecord = B_LITTLE16(anim->curlp.baseRecord); anim->curlp.nRecords = B_LITTLE16(anim->curlp.nRecords); anim->curlp.nBytes = B_LITTLE16(anim->curlp.nBytes); */ Bmemcpy(&anim->curlp, &anim->LpArray[pagenumber], size); buffer += size + sizeof(uint16); Bmemcpy(pagepointer,buffer,anim->curlp.nBytes+(anim->curlp.nRecords*2)); } }
static void decodeframe(uint8_t * srcP, uint8_t * dstP) { do { int32_t count=*srcP++; if (!count) /* Short RLE */ { int32_t color = *(srcP+1); count = *(uint8_t *)((srcP += sizeof(int16_t)) - sizeof(int16_t)); Bmemset((dstP += count) - count, color, count); continue; } else if ((count & 0x80) == 0) /* Short copy */ { Bmemcpy((dstP += count) - count, (srcP += count) - count, count); continue; } else if ((count &= ~0x80) > 0) /* short skip */ { dstP += count; continue; } /* long op */ count = B_LITTLE16(B_UNBUF16(srcP)); srcP += sizeof(int16_t); if (!count) /* stop sign */ return; else if ((count & 0x8000) == 0) /* long skip */ { dstP += count; continue; } else if ((count &= ~0x8000) & 0x4000) /* long RLE */ { int32_t color = *srcP++; count &= ~0x4000; Bmemset((dstP += count) - count, color, count); continue; } /* long copy */ Bmemcpy((dstP += count) - count, (srcP += count) - count, count); } while (1); }
void ANIM_LoadAnim (char * buffer) { uint16 i; int32 size; if (!Anim_Started) { anim = SafeMalloc(sizeof(anim_t)); Anim_Started = true; } anim->buffer = buffer; anim->curlpnum = 0xffff; anim->currentframe = -1; size = sizeof(lpfileheader); Bmemcpy(&anim->lpheader, buffer, size ); anim->lpheader.id = B_LITTLE32(anim->lpheader.id); anim->lpheader.maxLps = B_LITTLE16(anim->lpheader.maxLps); anim->lpheader.nLps = B_LITTLE16(anim->lpheader.nLps); anim->lpheader.nRecords = B_LITTLE32(anim->lpheader.nRecords); anim->lpheader.maxRecsPerLp = B_LITTLE16(anim->lpheader.maxRecsPerLp); anim->lpheader.lpfTableOffset = B_LITTLE16(anim->lpheader.lpfTableOffset); anim->lpheader.contentType = B_LITTLE32(anim->lpheader.contentType); anim->lpheader.width = B_LITTLE16(anim->lpheader.width); anim->lpheader.height = B_LITTLE16(anim->lpheader.height); anim->lpheader.nFrames = B_LITTLE32(anim->lpheader.nFrames); anim->lpheader.framesPerSecond = B_LITTLE16(anim->lpheader.framesPerSecond); buffer += size+128; // load the color palette for (i = 0; i < 768; i += 3) { anim->pal[i+2] = *buffer++; anim->pal[i+1] = *buffer++; anim->pal[i] = *buffer++; buffer++; } // read in large page descriptors size = sizeof(anim->LpArray); Bmemcpy(&anim->LpArray,buffer,size); for (i = 0; i < size/sizeof(lp_descriptor); i++) { anim->LpArray[i].baseRecord = B_LITTLE16(anim->LpArray[i].baseRecord); anim->LpArray[i].nRecords = B_LITTLE16(anim->LpArray[i].nRecords); anim->LpArray[i].nBytes = B_LITTLE16(anim->LpArray[i].nBytes); } }
pthtyp *texcache_fetchmulti(pthtyp *pth, hicreplctyp *si, int32_t dapicnum, int32_t dameth) { const int32_t j = dapicnum&(GLTEXCACHEADSIZ-1); int32_t i; for (i = 0; i <= (GLTEXCACHEADSIZ - 1); i++) { const pthtyp *pth2; for (pth2=texcache.list[i]; pth2; pth2=pth2->next) { if (pth2->hicr && pth2->hicr->filename && filnamcmp(pth2->hicr->filename, si->filename) == 0) { Bmemcpy(pth, pth2, sizeof(pthtyp)); pth->picnum = dapicnum; pth->flags = TO_PTH_CLAMPED(dameth) + PTH_HIGHTILE + (drawingskybox>0)*PTH_SKYBOX; if (pth2->flags & PTH_HASALPHA) pth->flags |= PTH_HASALPHA; pth->hicr = si; pth->next = texcache.list[j]; texcache.list[j] = pth; return pth; } } } return NULL; }
// Read from on-disk texcache or its in-memory cache. int32_t texcache_readdata(void *dest, int32_t len) { const int32_t ocachepos = texcache.filepos; texcache.filepos += len; if (texcache.memcache.ptr && texcache.memcache.size >= ocachepos+len) { // initprintf("using memcache!\n"); Bmemcpy(dest, texcache.memcache.ptr+ocachepos, len); return 0; } if (Blseek(texcache.filehandle, ocachepos, BSEEK_SET) != ocachepos) return 1; if (Bread(texcache.filehandle, dest, len) < len) return 1; return 0; }
int32_t startwin_puts(const char *buf) { const char *p = NULL, *q = NULL; static char workbuf[1024]; static int32_t newline = 0; int32_t curlen, linesbefore, linesafter; HWND edctl; int32_t vis; static HWND dactrl = NULL; if (!startupdlg) return 1; edctl = pages[TAB_MESSAGES]; if (!edctl) return -1; if (!dactrl) dactrl = GetDlgItem(startupdlg, WIN_STARTWIN_TABCTL); vis = ((int32_t)SendMessage(dactrl, TCM_GETCURSEL,0,0) == TAB_MESSAGES); if (vis) SendMessage(edctl, WM_SETREDRAW, FALSE,0); curlen = SendMessage(edctl, WM_GETTEXTLENGTH, 0,0); SendMessage(edctl, EM_SETSEL, (WPARAM)curlen, (LPARAM)curlen); linesbefore = SendMessage(edctl, EM_GETLINECOUNT, 0,0); p = buf; while (*p) { if (newline) { SendMessage(edctl, EM_REPLACESEL, 0, (LPARAM)"\r\n"); newline = 0; } q = p; while (*q && *q != '\n') q++; Bmemcpy(workbuf, p, q-p); if (*q == '\n') { if (!q[1]) { newline = 1; workbuf[q-p] = 0; } else { workbuf[q-p] = '\r'; workbuf[q-p+1] = '\n'; workbuf[q-p+2] = 0; } p = q+1; } else { workbuf[q-p] = 0; p = q; } SendMessage(edctl, EM_REPLACESEL, 0, (LPARAM)workbuf); } linesafter = SendMessage(edctl, EM_GETLINECOUNT, 0,0); SendMessage(edctl, EM_LINESCROLL, 0, linesafter-linesbefore); if (vis) SendMessage(edctl, WM_SETREDRAW, TRUE,0); return 0; }
int32_t MUSIC_Init(int32_t SoundCard, int32_t Address) { #ifdef __ANDROID__ music_initialized = 1; return(MUSIC_Ok); #endif // Use an external MIDI player if the user has specified to do so char *command = getenv("EDUKE32_MUSIC_CMD"); const SDL_version *linked = Mix_Linked_Version(); UNREFERENCED_PARAMETER(SoundCard); UNREFERENCED_PARAMETER(Address); if (music_initialized) { setErrorMessage("Music system is already initialized."); return(MUSIC_Error); } // if if (SDL_VERSIONNUM(linked->major,linked->minor,linked->patch) < MIX_REQUIREDVERSION) { // reject running with SDL_Mixer versions older than what is stated in sdl_inc.h initprintf("You need at least v%d.%d.%d of SDL_mixer for music\n",SDL_MIXER_MIN_X,SDL_MIXER_MIN_Y,SDL_MIXER_MIN_Z); return(MUSIC_Error); } external_midi = (command != NULL && command[0] != 0); if (external_midi) { #if defined FORK_EXEC_MIDI int32_t ws=1, numargs=0, pagesize=sysconf(_SC_PAGE_SIZE); char *c, *cmd; size_t sz; #endif initprintf("Setting music command to \"%s\".\n", command); #if !defined FORK_EXEC_MIDI if (Mix_SetMusicCMD(command)==-1) { perror("Mix_SetMusicCMD"); goto fallback; } #else if (pagesize==-1) goto fallback; for (c=command; *c; c++) { if (isspace(*c)) ws = 1; else if (ws) { ws = 0; numargs++; } } if (numargs==0) goto fallback; sz = (numargs+2)*sizeof(char *) + (c-command+1); sz = ((sz+pagesize-1)/pagesize)*pagesize; #if defined(__APPLE__) || defined(__ANDROID__) external_midi_argv = Xcalloc(1,sz+pagesize); external_midi_argv = (char **)((intptr_t)external_midi_argv + (pagesize-(((intptr_t)external_midi_argv)&(pagesize-1)))); #else if (posix_memalign((void **)&external_midi_argv, pagesize, sz)) goto fallback; #endif cmd = (char *)external_midi_argv + (numargs+2)*sizeof(char *); Bmemcpy(cmd, command, c-command+1); ws = 1; numargs = 0; for (c=cmd; *c; c++) { if (isspace(*c)) { ws = 1; *c = 0; } else if (ws) { ws = 0; external_midi_argv[numargs++] = c; } } external_midi_argv[numargs] = external_midi_tempfn; external_midi_argv[numargs+1] = NULL; if (mprotect(external_midi_argv, sz, PROT_READ)==-1) // make argv and command string read-only { perror("MUSIC_Init: mprotect"); goto fallback; } # if 0 { int i; initprintf("----Music argv:\n"); for (i=0; i<numargs+1; i++) initprintf(" %s\n", external_midi_argv[i]); initprintf("----\n"); } # endif #endif music_initialized = 1; return(MUSIC_Ok); fallback: initprintf("Error setting music command, falling back to timidity.\n"); } { static const char *s[] = { "/etc/timidity.cfg", "/etc/timidity/timidity.cfg", "/etc/timidity/freepats.cfg" }; FILE *fp; int32_t i; for (i = ARRAY_SIZE(s)-1; i>=0; i--) { fp = Bfopen(s[i], "r"); if (fp == NULL) { if (i == 0) { initprintf("Error: couldn't open any of the following files:\n"); for (i = ARRAY_SIZE(s)-1; i>=0; i--) initprintf("%s\n",s[i]); return(MUSIC_Error); } continue; } else break; } Bfclose(fp); } music_initialized = 1; return(MUSIC_Ok); } // MUSIC_Init
void texcache_writetex(const char *fn, int32_t len, int32_t dameth, char effect, texcacheheader *head) { static GLint glGetTexLevelParameterivOK = GL_TRUE; char cachefn[BMAX_PATH]; char *pic = NULL, *packbuf = NULL; void *midbuf = NULL; uint32_t alloclen=0, level; uint32_t padx=0, pady=0; GLint gi; int32_t offset = 0; if (!texcache_enabled()) return; gi = GL_FALSE; bglGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, &gi); if (gi != GL_TRUE) { if (glGetTexLevelParameterivOK == GL_TRUE) { OSD_Printf("Error: glGetTexLevelParameteriv returned GL_FALSE!\n"); glGetTexLevelParameterivOK = GL_FALSE; } return; } Blseek(texcache.filehandle, 0, BSEEK_END); offset = Blseek(texcache.filehandle, 0, BSEEK_CUR); // OSD_Printf("Caching %s, offset 0x%x\n", cachefn, offset); Bmemcpy(head->magic, TEXCACHEMAGIC, 4); // sizes are set by caller if (glusetexcache == 2) head->flags |= CACHEAD_COMPRESSED; // native -> external (little-endian) head->xdim = B_LITTLE32(head->xdim); head->ydim = B_LITTLE32(head->ydim); head->flags = B_LITTLE32(head->flags); head->quality = B_LITTLE32(head->quality); if (Bwrite(texcache.filehandle, head, sizeof(texcacheheader)) != sizeof(texcacheheader)) goto failure; CLEAR_GL_ERRORS(); for (level = 0; level==0 || (padx > 1 || pady > 1); level++) { uint32_t miplen; texcachepicture pict; bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_ARB, &gi); WRITEX_FAIL_ON_ERROR(); if (gi != GL_TRUE) goto failure; // an uncompressed mipmap bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_INTERNAL_FORMAT, &gi); WRITEX_FAIL_ON_ERROR(); #ifdef __APPLE__ if (pr_ati_textureformat_one && gi == 1) gi = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; #endif // native -> external (little endian) pict.format = B_LITTLE32(gi); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_WIDTH, &gi); WRITEX_FAIL_ON_ERROR(); padx = gi; pict.xdim = B_LITTLE32(gi); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_HEIGHT, &gi); WRITEX_FAIL_ON_ERROR(); pady = gi; pict.ydim = B_LITTLE32(gi); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_BORDER, &gi); WRITEX_FAIL_ON_ERROR(); pict.border = B_LITTLE32(gi); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_DEPTH, &gi); WRITEX_FAIL_ON_ERROR(); pict.depth = B_LITTLE32(gi); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, &gi); WRITEX_FAIL_ON_ERROR(); miplen = gi; pict.size = B_LITTLE32(gi); if (alloclen < miplen) { pic = (char *)Xrealloc(pic, miplen); alloclen = miplen; packbuf = (char *)Xrealloc(packbuf, alloclen); midbuf = (void *)Xrealloc(midbuf, miplen); } bglGetCompressedTexImageARB(GL_TEXTURE_2D, level, pic); WRITEX_FAIL_ON_ERROR(); if (Bwrite(texcache.filehandle, &pict, sizeof(texcachepicture)) != sizeof(texcachepicture)) goto failure; if (dxtfilter(texcache.filehandle, &pict, pic, midbuf, packbuf, miplen)) goto failure; } { texcacheindex *t; int32_t i = hash_find(&texcache.hashes, texcache_calcid(cachefn, fn, len, dameth, effect)); if (i > -1) { // update an existing entry t = texcache.iptrs[i]; t->offset = offset; t->len = Blseek(texcache.filehandle, 0, BSEEK_CUR) - t->offset; /*initprintf("%s %d got a match for %s offset %d\n",__FILE__, __LINE__, cachefn,offset);*/ } else { t = texcache.currentindex; Bstrcpy(t->name, cachefn); t->offset = offset; t->len = Blseek(texcache.filehandle, 0, BSEEK_CUR) - t->offset; t->next = (texcacheindex *)Xcalloc(1, sizeof(texcacheindex)); hash_add(&texcache.hashes, cachefn, texcache.numentries, 0); if (++texcache.numentries > texcache.iptrcnt) { texcache.iptrcnt += 512; texcache.iptrs = (texcacheindex **) Xrealloc(texcache.iptrs, sizeof(intptr_t) * texcache.iptrcnt); } texcache.iptrs[texcache.numentries-1] = t; texcache.currentindex = t->next; } if (texcache.index) { fseek(texcache.index, 0, BSEEK_END); Bfprintf(texcache.index, "%s %d %d\n", t->name, t->offset, t->len); } else OSD_Printf("wtf?\n"); } goto success; failure: initprintf("ERROR: cache failure!\n"); texcache.currentindex->offset = 0; Bmemset(texcache.currentindex->name,0,sizeof(texcache.currentindex->name)); success: TEXCACHE_FREEBUFS(); }
FORCE_INLINE void* XXH_memcpy(void* dest, const void* src, size_t size) { return Bmemcpy(dest,src,size); }
int32_t CONFIG_ReadSetup(void) { int32_t dummy, i = 0; char commmacro[] = "CommbatMacro# "; char tempbuf[1024]; CONTROL_ClearAssignments(); CONFIG_SetDefaults(); ud.config.setupread = 1; pathsearchmode = 1; #ifndef EDUKE32_TOUCH_DEVICES if (SafeFileExists(setupfilename) && ud.config.scripthandle < 0) // JBF 20031211 ud.config.scripthandle = SCRIPT_Load(setupfilename); else if (SafeFileExists(SETUPFILENAME) && ud.config.scripthandle < 0) { i=wm_ynbox("Import Configuration Settings", "The configuration file \"%s\" was not found. " "Import configuration data from \"%s\"?",setupfilename,SETUPFILENAME); if (i) ud.config.scripthandle = SCRIPT_Load(SETUPFILENAME); } else if (SafeFileExists("duke3d.cfg") && ud.config.scripthandle < 0) { i=wm_ynbox("Import Configuration Settings", "The configuration file \"%s\" was not found. " "Import configuration data from \"duke3d.cfg\"?",setupfilename); if (i) ud.config.scripthandle = SCRIPT_Load("duke3d.cfg"); } #endif pathsearchmode = 0; if (ud.config.scripthandle < 0) return -1; if (ud.config.scripthandle >= 0) { char dummybuf[64]; for (dummy = 0; dummy < MAXRIDECULE; dummy++) { commmacro[13] = dummy+'0'; SCRIPT_GetString(ud.config.scripthandle, "Comm Setup",commmacro,&ud.ridecule[dummy][0]); } Bmemset(tempbuf, 0, sizeof(tempbuf)); // Bmemset(dummybuf, 0, sizeof(dummybuf)); SCRIPT_GetString(ud.config.scripthandle, "Comm Setup","PlayerName",&tempbuf[0]); while (Bstrlen(OSD_StripColors(dummybuf,tempbuf)) > 10) tempbuf[Bstrlen(tempbuf)-1] = '\0'; Bstrncpyz(szPlayerName, tempbuf, sizeof(szPlayerName)); if (g_rtsNamePtr == NULL) SCRIPT_GetString(ud.config.scripthandle, "Comm Setup","RTSName",&ud.rtsname[0]); SCRIPT_GetNumber(ud.config.scripthandle, "Setup","ConfigVersion",&ud.configversion); SCRIPT_GetNumber(ud.config.scripthandle, "Setup","ForceSetup",&ud.config.ForceSetup); SCRIPT_GetNumber(ud.config.scripthandle, "Setup","NoAutoLoad",&ud.config.NoAutoLoad); // #ifdef _WIN32 if (g_noSetup == 0 && g_modDir[0] == '/') { struct Bstat st; SCRIPT_GetString(ud.config.scripthandle, "Setup","ModDir",&g_modDir[0]); if (Bstat(g_modDir, &st)) { if ((st.st_mode & S_IFDIR) != S_IFDIR) { initprintf("Invalid mod dir in cfg!\n"); Bsprintf(g_modDir,"/"); } } } // #endif if (g_grpNamePtr == NULL && g_usingAddon == 0) { SCRIPT_GetStringPtr(ud.config.scripthandle, "Setup","SelectedGRP",&g_grpNamePtr); if (g_grpNamePtr && !Bstrlen(g_grpNamePtr)) g_grpNamePtr = dup_filename(G_DefaultGrpFile()); } if (!NAM) { SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "Out",&ud.lockout); SCRIPT_GetString(ud.config.scripthandle, "Screen Setup","Password",&ud.pwlockout[0]); } SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "ScreenHeight",&ud.config.ScreenHeight); SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "ScreenMode",&ud.config.ScreenMode); SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "ScreenWidth",&ud.config.ScreenWidth); SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "WindowPositioning", (int32_t *)&windowpos); windowx = -1; SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "WindowPosX", (int32_t *)&windowx); windowy = -1; SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "WindowPosY", (int32_t *)&windowy); #ifdef RENDERTYPEWIN SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "MaxRefreshFreq", (int32_t *)&maxrefreshfreq); #endif SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "ScreenBPP", &ud.config.ScreenBPP); if (ud.config.ScreenBPP < 8) ud.config.ScreenBPP = 32; #ifdef POLYMER SCRIPT_GetNumber(ud.config.scripthandle, "Screen Setup", "Polymer", &dummy); if (dummy > 0 && ud.config.ScreenBPP >= 16) glrendmode = REND_POLYMER; else glrendmode = REND_POLYMOST; #endif /* SCRIPT_GetNumber(ud.config.scripthandle, "Misc", "Color",&ud.color); G_CheckPlayerColor((int32_t *)&ud.color,-1); g_player[0].ps->palookup = g_player[0].pcolor = ud.color; tempbuf[0] = 0; */ SCRIPT_GetString(ud.config.scripthandle, "Misc", "CrosshairColor",&tempbuf[0]); if (tempbuf[0]) { char *ptr = strtok(tempbuf,","); palette_t temppal; char *palptr = (char *)&temppal; i = 0; while (ptr != NULL && i < 3) { palptr[i++] = Batoi(ptr); ptr = strtok(NULL,","); } if (i == 3) { Bmemcpy(&CrosshairColors,&temppal,sizeof(palette_t)); DefaultCrosshairColors.f = 1; } } SCRIPT_GetNumber(ud.config.scripthandle, "Misc", "Executions",&ud.executions); #ifdef _WIN32 SCRIPT_GetNumber(ud.config.scripthandle, "Updates", "CheckForUpdates", &ud.config.CheckForUpdates); SCRIPT_GetNumber(ud.config.scripthandle, "Updates", "LastUpdateCheck", &ud.config.LastUpdateCheck); #endif } //CONFIG_SetupMouse(ud.config.scripthandle); //CONFIG_SetupJoystick(ud.config.scripthandle); ud.config.setupread = 1; return 0; }