void deadcode(void) { int i; Sym *s, *last; Auto *z; if(debug['v']) Bprint(&bso, "%5.2f deadcode\n", cputime()); mark(lookup(INITENTRY, 0)); for(i=0; i<nelem(morename); i++) mark(lookup(morename[i], 0)); for(i=0; i<ndynexp; i++) mark(dynexp[i]); // remove dead text but keep file information (z symbols). last = nil; z = nil; for(s = textp; s != nil; s = s->next) { if(!s->reachable) { if(isz(s->autom)) z = s->autom; continue; } if(last == nil) textp = s; else last->next = s; last = s; if(z != nil) { if(!isz(s->autom)) addz(s, z); z = nil; } } if(last == nil) textp = nil; else last->next = nil; for(s = allsym; s != S; s = s->allsym) if(strncmp(s->name, "weak.", 5) == 0) { s->special = 1; // do not lay out in data segment s->reachable = 1; s->hide = 1; } }
Size StdDisplayClass::GetStdSize(const Value& q) const { Font font = StdFont(); WString txt; Size isz(0, 0); if(IsType<AttrText>(q)) { const AttrText& t = ValueTo<AttrText>(q); txt = t.text; font = t.font; if(!IsNull(t.img)) { isz = t.img.GetSize(); isz.cx += t.imgspc; } } else txt = IsString(q) ? q : StdConvert().Format(q); Size sz = GetTLTextSize(txt, font); return Size(sz.cx + isz.cx, max(sz.cy, isz.cy)); }
Size DrawLabel::GetSize(int txtcx, Size sz1, int lspc, Size sz2, int rspc) const { Size isz(0, 0); Size txtsz = *text ? GetSmartTextSize(text, font, txtcx) : paintrect.GetStdSize(); if(!IsNull(lspc)) { isz.cx = lspc; isz.cy = sz1.cy; isz.cx += sz1.cx; } if(!IsNull(rspc)) { isz.cx += rspc; if(sz2.cy > isz.cy) isz.cy = sz2.cy; isz.cx += sz2.cx; } isz.cy = max(txtsz.cy, max(sz1.cy, sz2.cy)); isz.cx += txtsz.cx; return isz; }
void deadcode(void) { int i; Sym *s, *last, *p; Auto *z; Fmt fmt; if(debug['v']) Bprint(&bso, "%5.2f deadcode\n", cputime()); mark(lookup(INITENTRY, 0)); for(i=0; i<nelem(markextra); i++) mark(lookup(markextra[i], 0)); for(i=0; i<ndynexp; i++) mark(dynexp[i]); markflood(); // keep each beginning with 'typelink.' if the symbol it points at is being kept. for(s = allsym; s != S; s = s->allsym) { if(strncmp(s->name, "go.typelink.", 12) == 0) s->reachable = s->nr==1 && s->r[0].sym->reachable; } // remove dead text but keep file information (z symbols). last = nil; z = nil; for(s = textp; s != nil; s = s->next) { if(!s->reachable) { if(isz(s->autom)) z = s->autom; continue; } if(last == nil) textp = s; else last->next = s; last = s; if(z != nil) { if(!isz(s->autom)) addz(s, z); z = nil; } } if(last == nil) textp = nil; else last->next = nil; for(s = allsym; s != S; s = s->allsym) if(strncmp(s->name, "go.weak.", 8) == 0) { s->special = 1; // do not lay out in data segment s->reachable = 1; s->hide = 1; } // record field tracking references fmtstrinit(&fmt); for(s = allsym; s != S; s = s->allsym) { if(strncmp(s->name, "go.track.", 9) == 0) { s->special = 1; // do not lay out in data segment s->hide = 1; if(s->reachable) { fmtprint(&fmt, "%s", s->name+9); for(p=s->reachparent; p; p=p->reachparent) fmtprint(&fmt, "\t%s", p->name); fmtprint(&fmt, "\n"); } s->type = SCONST; s->value = 0; } } if(tracksym == nil) return; s = lookup(tracksym, 0); if(!s->reachable) return; addstrdata(tracksym, fmtstrflush(&fmt)); }
int main(int argc, char** argv) { //stbi_set_flip_vertically_on_load(1); if(SDL_Init(SDL_INIT_EVERYTHING) != 0) { Log_Error("Could not init SDL"); Log_Error(SDL_GetError()); return 1; } SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1); SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); int32 window_display_index = 0; #if 1 window_display_index = 1; #endif SDL_Window* window = SDL_CreateWindow("Rituals", SDL_WINDOWPOS_CENTERED_DISPLAY(window_display_index), SDL_WINDOWPOS_CENTERED_DISPLAY(window_display_index), 1280, 720, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_MOUSE_FOCUS | SDL_WINDOW_INPUT_FOCUS); if(window == NULL) { Log_Error("Could not create window"); Log_Error(SDL_GetError()); return 1; } printf("%s \n", SDL_GetError()); SDL_GLContext glctx = SDL_GL_CreateContext(window); if(ogl_LoadFunctions() == ogl_LOAD_FAILED) { Log_Error("Could not load OpenGL 3.3 functions..."); return 1; } int ret = SDL_GL_SetSwapInterval(-1); { #define _check_gl_attribute(attr, val) int _##attr##_val; \ int _##attr##_success = SDL_GL_GetAttribute(attr, &_##attr##_val); \ gl_checks[gl_check_count++] = _##attr##_val == val; \ gl_names[gl_check_count - 1] = #attr; \ gl_vals[gl_check_count - 1] = _##attr##_val; \ gl_exp_vals[gl_check_count - 1] = val; //check if we got everything bool gl_checks[64]; char* gl_names[64]; int gl_vals[64]; int gl_exp_vals[64]; isize gl_check_count = 0; _check_gl_attribute(SDL_GL_RED_SIZE, 8); _check_gl_attribute(SDL_GL_GREEN_SIZE, 8); _check_gl_attribute(SDL_GL_BLUE_SIZE, 8); _check_gl_attribute(SDL_GL_ALPHA_SIZE, 8); _check_gl_attribute(SDL_GL_DOUBLEBUFFER, 1); _check_gl_attribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); _check_gl_attribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); _check_gl_attribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1); _check_gl_attribute(SDL_GL_ACCELERATED_VISUAL, 1); _check_gl_attribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); for(isize i = 0; i < gl_check_count; ++i) { printf("%s %s: wanted %d, got %d \n", gl_names[i], gl_checks[i] ? "succeeeded" : "failed", gl_exp_vals[i], gl_vals[i]); } } // Game initializiation game = Allocate(Game, 1); { game->window = window; game->state = Game_State_None; game->meta_arena = Allocate(Memory_Arena, 1); init_memory_arena(game->meta_arena, isz(Memory_Arena) * 10); game->game_arena = new_memory_arena(Kilobytes(64), game->meta_arena); game->asset_arena = new_memory_arena(Megabytes(512), game->meta_arena); game->temp_arena = new_memory_arena(Megabytes(64), game->meta_arena); game->play_arena = new_memory_arena(Megabytes(512), game->meta_arena); game->renderer_arena = new_memory_arena(Megabytes(32), game->meta_arena); game->base_path = SDL_GetBasePath(); game->base_path_length = strlen(game->base_path); game->input = Arena_Push_Struct(game->game_arena, Game_Input); game->input->scancodes = Arena_Push_Array(game->game_arena, int8, SDL_NUM_SCANCODES); game->input->keycodes = Arena_Push_Array(game->game_arena, int8, SDL_NUM_SCANCODES); game->input->mouse = Arena_Push_Array(game->game_arena, int8, 16); init_random(&game->r, time(NULL)); //TODO(will) load window settings from file game->window_size = v2i(1280, 720); game->scale = 1.0f; game->renderer = Arena_Push_Struct(game->game_arena, Renderer); renderer_init(game->renderer, game->renderer_arena); renderer = game->renderer; input = game->input; } load_assets(); bool running = true; SDL_Event event; glClearColor(0.1f, 0.1f, 0.1f, 1.0f); //glClearColor(1, 1, 1, 1); play_state->current_time = SDL_GetTicks(); play_state->prev_time = play_state->current_time; while(running) { uint64 start_ticks = SDL_GetTicks(); if(game->input->num_keys_down < 0) game->input->num_keys_down = 0; if(game->input->num_mouse_down < 0) game->input->num_mouse_down = 0; if(game->input->num_keys_down > 0) for(int64 i = 0; i < SDL_NUM_SCANCODES; ++i) { int8* t = game->input->scancodes + i; if(*t == State_Just_Released) { *t = State_Released; } else if(*t == State_Just_Pressed) { *t = State_Pressed; } t = game->input->keycodes + i; if(*t == State_Just_Released) { *t = State_Released; } else if(*t == State_Just_Pressed) { *t = State_Pressed; } } if(game->input->num_mouse_down > 0) for(int64 i = 0; i < 16; ++i) { int8* t = game->input->mouse + i; if(*t == State_Just_Released) { *t = State_Released; } else if(*t == State_Just_Pressed) { *t = State_Pressed; } } while(SDL_PollEvent(&event)) { //TODO(will) handle text input switch(event.type) { case SDL_QUIT: running = false; break; case SDL_WINDOWEVENT: update_screen(); break; case SDL_KEYDOWN: game->input->num_keys_down++; if(!event.key.repeat) { game->input->scancodes[event.key.keysym.scancode] = State_Just_Pressed; if(event.key.keysym.sym < SDL_NUM_SCANCODES) { game->input->keycodes[event.key.keysym.sym] = State_Just_Pressed; } } break; case SDL_KEYUP: game->input->num_keys_down--; if(!event.key.repeat) { game->input->scancodes[event.key.keysym.scancode] = State_Just_Released; if(event.key.keysym.sym < SDL_NUM_SCANCODES) { game->input->keycodes[event.key.keysym.sym] = State_Just_Released; } } break; case SDL_MOUSEBUTTONDOWN: game->input->num_mouse_down++; game->input->mouse[event.button.button] = State_Just_Pressed; break; case SDL_MOUSEBUTTONUP: game->input->num_mouse_down--; game->input->mouse[event.button.button] = State_Just_Released; break; } } int mx, my; SDL_GetMouseState(&mx, &my); input->mouse_x = mx; input->mouse_y = my; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); update(); SDL_GL_SwapWindow(window); uint64 frame_ticks = SDL_GetTicks() - start_ticks; //if(frame_ticks > 18) printf("Slow frame! %d\n", frame_ticks); } SDL_Quit(); return 0; }