void ttrack::impl_draw_background(surface& frame_buffer, int x_offset, int y_offset) { tcontrol::impl_draw_background(frame_buffer, x_offset, y_offset); SDL_Rect rc = get_rect(); if (!background_surf_ || background_surf_->w != w_ || background_surf_->h != h_) { background_surf_.assign(get_surface_portion(frame_buffer, rc)); } else { sdl_blit(frame_buffer, &rc, background_surf_, NULL); } frame_buffer_ = frame_buffer; frame_offset_ = tpoint(x_offset + draw_offset_.x, y_offset + draw_offset_.y); if (callback_timer_) { callback_timer_(*this, frame_buffer, frame_offset_, state2_, false); } }
bool effect::render() { if(disp == NULL) { return false; } if(loc_.x != -1 && loc_.y != -1) { if(disp->shrouded(loc_)) { return false; } else { // The location of a halo is an x,y value and not a map location. // This means when a map is zoomed, the halo's won't move, // This glitch is most visible on [item] haloes. // This workaround always recalculates the location of the halo // (item haloes have a location parameter to hide them under the shroud) // and reapplies that location. // It might be optimized by storing and comparing the zoom value. set_location( disp->get_location_x(loc_) + disp->hex_size() / 2, disp->get_location_y(loc_) + disp->hex_size() / 2); } } images_.update_last_draw_time(); surf_.assign(image::get_image(current_image(),image::SCALED_TO_ZOOM)); if(surf_ == NULL) { return false; } if(orientation_ == HREVERSE || orientation_ == HVREVERSE) { surf_.assign(image::reverse_image(surf_)); } if(orientation_ == VREVERSE || orientation_ == HVREVERSE) { surf_.assign(flop_surface(surf_)); } const map_location zero_loc(0,0); const int screenx = disp->get_location_x(zero_loc); const int screeny = disp->get_location_y(zero_loc); const int xpos = x_ + screenx - surf_->w/2; const int ypos = y_ + screeny - surf_->h/2; SDL_Rect rect = create_rect(xpos, ypos, surf_->w, surf_->h); rect_ = rect; SDL_Rect clip_rect = disp->map_outside_area(); // If rendered the first time, need to determine the area affected. // If a halo changes size, it is not updated. if(overlayed_hexes_.empty()) { rect_of_hexes hexes = disp->hexes_under_rect(rect); rect_of_hexes::iterator i = hexes.begin(), end = hexes.end(); for (;i != end; ++i) { overlayed_hexes_.push_back(*i); } } if(rects_overlap(rect,clip_rect) == false) { buffer_.assign(NULL); return false; } surface screen = disp->get_screen_surface(); const clip_rect_setter clip_setter(screen, &clip_rect); if(buffer_ == NULL || buffer_->w != rect.w || buffer_->h != rect.h) { SDL_Rect rect = rect_; buffer_.assign(get_surface_portion(screen,rect)); } else { SDL_Rect rect = rect_; sdl_blit(screen,&rect,buffer_,NULL); } sdl_blit(surf_,NULL,screen,&rect); return true; }