Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix city label & note locations #1

Merged
merged 2 commits into from
Jul 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/output.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <iosfwd>
#include <iterator>
#include <map>
#include <stack>
#include <string>
#include <type_traits>
#include <utility>
Expand Down
66 changes: 45 additions & 21 deletions src/sdltiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,24 @@ std::string cata_tiles::get_omt_id_rotation_and_subtile(
return ot_type_id.id().str();
}

static point draw_string( Font &font,
const SDL_Renderer_Ptr &renderer,
const GeometryRenderer_Ptr &geometry,
const std::string &str,
point p,
const unsigned char color )
{
const char *cstr = str.c_str();
int len = str.length();
while( len > 0 ) {
const uint32_t ch32 = UTF8_getch( &cstr, &len );
const std::string ch = utf32_to_utf8( ch32 );
font.OutputChar( renderer, geometry, ch, p, color );
p.x += mk_wcwidth( ch32 ) * font.width;
}
return p;
}

void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt &center_abs_omt, bool blink )
{
if( !g ) {
Expand Down Expand Up @@ -833,10 +851,6 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt &center_abs_
geometry->rect( renderer, clipRect, SDL_Color() );
}

// color blocks overlay; drawn on top of tiles and on top of overlay strings (if any).
color_block_overlay_container color_blocks;
// Strings with colors do be drawn with map_font on top of tiles.
std::multimap<point, formatted_text> overlay_strings;
point s;
get_window_tile_counts( width, height, s.x, s.y );

Expand Down Expand Up @@ -1040,22 +1054,23 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt &center_abs_
const auto abs_sm_to_draw_label = [&]( const tripoint_abs_sm & city_pos, const int label_length ) {
const tripoint tile_draw_pos = global_omt_to_draw_position( project_to<coords::omt>
( city_pos ) ) - o;
point draw_point( tile_draw_pos.x * width / max_col, tile_draw_pos.y * height / max_row );
draw_point.x -= label_length * font->width;
draw_point.x += width / max_col;
point draw_point( tile_draw_pos.x * tile_width + dest.x,
tile_draw_pos.y * tile_height + dest.y );
// center text on the tile
draw_point += point( ( tile_width - label_length * fontwidth ) / 2,
( tile_height - fontheight ) / 2 );
return draw_point;
};

// draws a black rectangle behind a label for visibility and legibility
const auto label_bg = [&]( const tripoint_abs_sm & pos, const std::string & name ) {
const int name_length = name.length();
const int name_length = utf8_width( name );
const point draw_pos = abs_sm_to_draw_label( pos, name_length );
SDL_Rect clipRect = { draw_pos.x, draw_pos.y, name_length * fontwidth, fontheight };

geometry->rect( renderer, clipRect, SDL_Color() );

const point label_pos( draw_pos + point( -( name.length() * fontwidth / 2 ), 0 ) );
map_font->OutputChar( renderer, geometry, name, label_pos, 11 );
draw_string( *font, renderer, geometry, name, draw_pos, 11 );
};

// the tiles on the overmap are overmap tiles, so we need to use
Expand Down Expand Up @@ -1112,25 +1127,29 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt &center_abs_

const auto draw_note_text = [&]( const point & draw_pos, const std::string & name,
nc_color & color ) {
const int name_length = name.length();
const point label_pos( draw_pos + point( -( name.length() * fontwidth / 2 ), 0 ) );
char note_fg_color = color == c_yellow ? 11 :
cata_cursesport::colorpairs[color.to_color_pair_index()].FG;
map_font->OutputChar( renderer, geometry, name, label_pos, note_fg_color );
return draw_string( *font, renderer, geometry, name, draw_pos, note_fg_color );
};

// Find screen coordinates to the right of the center tile
auto center_sm = coords::project_to<coords::sm>( tripoint_abs_omt( center_abs_omt.x() + 1,
center_abs_omt.y(), center_abs_omt.z() ) );
const tripoint tile_draw_pos = global_omt_to_draw_position( project_to<coords::omt>
( center_sm ) ) - o;
point draw_point( tile_draw_pos.x * width / max_col, tile_draw_pos.y * height / max_row );
draw_point.x += width / max_col;
point draw_point( tile_draw_pos.x * tile_width + dest.x,
tile_draw_pos.y * tile_height + dest.y );
draw_point += point( padding, padding );

// Draw notes header. Very simple label at the moment
nc_color header_color = c_white;
const std::string header_string = "-- Notes: --";
SDL_Rect header_background_rect = { draw_point.x - padding, draw_point.y - padding, fontwidth *static_cast<int>( header_string.length() ) + padding * 2, fontheight + padding * 2 };
const std::string header_string = _( "-- Notes: --" );
SDL_Rect header_background_rect = {
draw_point.x - padding,
draw_point.y - padding,
fontwidth * utf8_width( header_string ) + padding * 2,
fontheight + padding * 2
};
geometry->rect( renderer, header_background_rect, SDL_Color{ 0, 0, 0, 175 } );
draw_note_text( draw_point, header_string, header_color );
draw_point.y += fontheight + padding * 2;
Expand Down Expand Up @@ -1162,18 +1181,22 @@ void cata_tiles::draw_om( const point &dest, const tripoint_abs_omt &center_abs_

nc_color &color = color_stack.empty() ? default_color : color_stack.top();
colored_lines.emplace_back( color, seg );
line_length += seg.length();
line_length += utf8_width( seg );
}

// Draw background first for the whole line
SDL_Rect background_rect = { draw_point.x - padding, draw_point.y - padding, fontwidth *line_length + padding * 2, fontheight + padding * 2 };
SDL_Rect background_rect = {
draw_point.x - padding,
draw_point.y - padding,
fontwidth *line_length + padding * 2,
fontheight + padding * 2
};
geometry->rect( renderer, background_rect, SDL_Color{ 0, 0, 0, 175 } );

// Draw colored text segments
for( auto &colored_line : colored_lines ) {
std::string &text = std::get<1>( colored_line );
draw_note_text( draw_point, text, std::get<0>( colored_line ) );
draw_point.x += fontwidth * text.length();
draw_point.x = draw_note_text( draw_point, text, std::get<0>( colored_line ) ).x;
}

draw_point.y += fontheight + padding;
Expand Down Expand Up @@ -2409,6 +2432,7 @@ void draw_quick_shortcuts()
text_x = ( ( i + 0.5f ) * width - ( font->width * utf8_width( text ) ) * text_scale * 0.5f ) /
text_scale;
}
// TODO use draw_string instead
text_y = ( WindowHeight - ( height + font->height * text_scale ) * 0.5f ) / text_scale;
font->OutputChar( renderer, geometry, text, point( text_x + 1, text_y + 1 ), 0,
get_option<int>( "ANDROID_SHORTCUT_OPACITY_SHADOW" ) * 0.01f );
Expand Down