void make_text(SDL_Win *win, SDL_Rect *location, TTF_Font *font, char* text, int r, int g, int b) { SDL_Color textcolour = {r,g,b,255}; SDL_Surface* textsurface = TTF_RenderText_Blended(font, text, textcolour); SDL_Texture* texttexture = surface_to_texture(textsurface, win); SDL_RenderCopy(win->renderer, texttexture, NULL, location); SDL_DestroyTexture(texttexture); }
void ft_query_corewar_texture(t_sdl *sdl, SDL_Surface *solid) { solid = TTF_RenderText_Blended(sdl->font, "COREWAR GAME", BACKGROUNDCOLOR); sdl->solid_texture = surface_to_texture(solid, sdl->renderer); SDL_QueryTexture(sdl->solid_texture, NULL, NULL, &sdl->solid_rect.w, &sdl->solid_rect.h); sdl->solid_rect.x = 1420; sdl->solid_rect.y = 20; }
SDL_Texture* tcache_get(surface *sur, screen_palette *pal, char *remap_table, uint8_t pal_offset) { if(sur == NULL || sur->w == 0 || sur->h == 0 || sur->data == NULL) { if(sur != NULL) { DEBUG("Invalid surface requested from tcache: w,h = %d,%d data = %p", sur->w, sur->h, sur->data); } else { DEBUG("Invalid surface requested from tcache: w,h = %d,%d surface = %p", sur->w, sur->h, sur); } return NULL; } // Form a key tcache_entry_key key; memset(&key, 0, sizeof(tcache_entry_key)); key.c_pal_offset = (sur->type == SURFACE_TYPE_RGBA) ? 0 : pal_offset; key.c_remap_table = (sur->type == SURFACE_TYPE_RGBA) ? 0 : remap_table; key.c_surface = sur; key.w = sur->w; key.h = sur->h; // Attempt to find appropriate surface // If surface is cacheable and hasn't changed, just return here. tcache_entry_value *val = tcache_get_entry(&key); if(val != NULL && (val->pal_version == pal->version || sur->type == SURFACE_TYPE_RGBA) && !sur->force_refresh) { val->age = 0; cache->hits++; return val->tex; } // Reset refresh flag here sur->force_refresh = 0; // If there was no fitting surface tex in the cache at all, // then we need to create one if(val == NULL) { tcache_entry_value new_entry; new_entry.age = 0; new_entry.pal_version = pal->version; new_entry.tex = SDL_CreateTexture(cache->renderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, sur->w * cache->scale_factor, sur->h * cache->scale_factor); SDL_SetTextureBlendMode(new_entry.tex, SDL_BLENDMODE_BLEND); val = tcache_add_entry(&key, &new_entry); } // We have a texture either from the cache, or we just created one. // Either one, it needs to be updated. Let's do it now. // Also, scale surface if necessary if(cache->scale_factor > 1) { char *raw = malloc(sur->w * sur->h * 4); surface scaled; surface_create(&scaled, SURFACE_TYPE_RGBA, sur->w * cache->scale_factor, sur->h * cache->scale_factor); surface_to_rgba(sur, raw, pal, remap_table, pal_offset); scaler_scale(cache->scaler, raw, scaled.data, sur->w, sur->h, cache->scale_factor); surface_to_texture(&scaled, val->tex, pal, remap_table, pal_offset); surface_free(&scaled); free(raw); } else { surface_to_texture(sur, val->tex, pal, remap_table, pal_offset); } // Set correct age and palette version val->age = 0; val->pal_version = pal->version; // Do some statistics stuff cache->misses++; return val->tex; }