diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2024-05-19 11:21:24 -0400 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2024-05-19 11:21:24 -0400 |
| commit | 8980bf2a124f647dbdece9f90b86b2f37c4f3fa5 (patch) | |
| tree | 744ab82d66b5272c95694d33d039f84000fe28ba /src | |
| parent | c87281384f716c8ca2f57bb8ea65d6d01bb06fae (diff) | |
| download | lingo-ap-tracker-8980bf2a124f647dbdece9f90b86b2f37c4f3fa5.tar.gz lingo-ap-tracker-8980bf2a124f647dbdece9f90b86b2f37c4f3fa5.tar.bz2 lingo-ap-tracker-8980bf2a124f647dbdece9f90b86b2f37c4f3fa5.zip | |
Faster subway map rendering
Image quality suffered a bit though.
Diffstat (limited to 'src')
| -rw-r--r-- | src/subway_map.cpp | 103 |
1 files changed, 69 insertions, 34 deletions
| diff --git a/src/subway_map.cpp b/src/subway_map.cpp index b02c616..51f17c5 100644 --- a/src/subway_map.cpp +++ b/src/subway_map.cpp | |||
| @@ -117,13 +117,77 @@ void SubwayMap::UpdateSunwarp(SubwaySunwarp from_sunwarp, | |||
| 117 | 117 | ||
| 118 | void SubwayMap::OnPaint(wxPaintEvent &event) { | 118 | void SubwayMap::OnPaint(wxPaintEvent &event) { |
| 119 | if (GetSize() != rendered_.GetSize()) { | 119 | if (GetSize() != rendered_.GetSize()) { |
| 120 | Redraw(); | 120 | wxSize panel_size = GetSize(); |
| 121 | wxSize image_size = map_image_.GetSize(); | ||
| 122 | |||
| 123 | render_x_ = 0; | ||
| 124 | render_y_ = 0; | ||
| 125 | render_width_ = panel_size.GetWidth(); | ||
| 126 | render_height_ = panel_size.GetHeight(); | ||
| 127 | |||
| 128 | if (image_size.GetWidth() * panel_size.GetHeight() > | ||
| 129 | panel_size.GetWidth() * image_size.GetHeight()) { | ||
| 130 | render_height_ = (panel_size.GetWidth() * image_size.GetHeight()) / | ||
| 131 | image_size.GetWidth(); | ||
| 132 | render_y_ = (panel_size.GetHeight() - render_height_) / 2; | ||
| 133 | } else { | ||
| 134 | render_width_ = (image_size.GetWidth() * panel_size.GetHeight()) / | ||
| 135 | image_size.GetHeight(); | ||
| 136 | render_x_ = (panel_size.GetWidth() - render_width_) / 2; | ||
| 137 | } | ||
| 138 | |||
| 139 | SetZoomPos({zoom_x_, zoom_y_}); | ||
| 121 | } | 140 | } |
| 122 | 141 | ||
| 123 | wxBufferedPaintDC dc(this); | 142 | wxBufferedPaintDC dc(this); |
| 124 | dc.SetBackground(*wxWHITE_BRUSH); | 143 | dc.SetBackground(*wxWHITE_BRUSH); |
| 125 | dc.Clear(); | 144 | dc.Clear(); |
| 126 | dc.DrawBitmap(rendered_, zoom_x_, zoom_y_); | 145 | |
| 146 | { | ||
| 147 | wxMemoryDC rendered_dc; | ||
| 148 | rendered_dc.SelectObject(rendered_); | ||
| 149 | |||
| 150 | int dst_x; | ||
| 151 | int dst_y; | ||
| 152 | int dst_w; | ||
| 153 | int dst_h; | ||
| 154 | int src_x; | ||
| 155 | int src_y; | ||
| 156 | int src_w; | ||
| 157 | int src_h; | ||
| 158 | |||
| 159 | int zoomed_width = render_width_ * zoom_; | ||
| 160 | int zoomed_height = render_height_ * zoom_; | ||
| 161 | |||
| 162 | if (zoomed_width <= GetSize().GetWidth()) { | ||
| 163 | dst_x = (GetSize().GetWidth() - zoomed_width) / 2; | ||
| 164 | dst_w = zoomed_width; | ||
| 165 | src_x = 0; | ||
| 166 | src_w = map_image_.GetWidth(); | ||
| 167 | } else { | ||
| 168 | dst_x = 0; | ||
| 169 | dst_w = GetSize().GetWidth(); | ||
| 170 | src_x = -zoom_x_ * map_image_.GetWidth() / render_width_ / zoom_; | ||
| 171 | src_w = | ||
| 172 | GetSize().GetWidth() * map_image_.GetWidth() / render_width_ / zoom_; | ||
| 173 | } | ||
| 174 | |||
| 175 | if (zoomed_height <= GetSize().GetHeight()) { | ||
| 176 | dst_y = (GetSize().GetHeight() - zoomed_height) / 2; | ||
| 177 | dst_h = zoomed_height; | ||
| 178 | src_y = 0; | ||
| 179 | src_h = map_image_.GetHeight(); | ||
| 180 | } else { | ||
| 181 | dst_y = 0; | ||
| 182 | dst_h = GetSize().GetHeight(); | ||
| 183 | src_y = -zoom_y_ * map_image_.GetWidth() / render_width_ / zoom_; | ||
| 184 | src_h = | ||
| 185 | GetSize().GetHeight() * map_image_.GetWidth() / render_width_ / zoom_; | ||
| 186 | } | ||
| 187 | |||
| 188 | dc.StretchBlit(dst_x, dst_y, dst_w, dst_h, &rendered_dc, src_x, src_y, | ||
| 189 | src_w, src_h); | ||
| 190 | } | ||
| 127 | 191 | ||
| 128 | if (hovered_item_) { | 192 | if (hovered_item_) { |
| 129 | const SubwayItem &subway_item = GD_GetSubwayItem(*hovered_item_); | 193 | const SubwayItem &subway_item = GD_GetSubwayItem(*hovered_item_); |
| @@ -320,7 +384,6 @@ void SubwayMap::OnMouseScroll(wxMouseEvent &event) { | |||
| 320 | wxPoint virtual_pos = MapPosToVirtualPos(map_pos); | 384 | wxPoint virtual_pos = MapPosToVirtualPos(map_pos); |
| 321 | SetZoomPos(-(virtual_pos - event.GetPosition())); | 385 | SetZoomPos(-(virtual_pos - event.GetPosition())); |
| 322 | 386 | ||
| 323 | Redraw(); | ||
| 324 | Refresh(); | 387 | Refresh(); |
| 325 | } | 388 | } |
| 326 | 389 | ||
| @@ -335,29 +398,7 @@ void SubwayMap::OnTimer(wxTimerEvent &event) { | |||
| 335 | } | 398 | } |
| 336 | 399 | ||
| 337 | void SubwayMap::Redraw() { | 400 | void SubwayMap::Redraw() { |
| 338 | wxSize panel_size = GetSize(); | 401 | rendered_ = wxBitmap(map_image_); |
| 339 | wxSize image_size = map_image_.GetSize(); | ||
| 340 | |||
| 341 | render_x_ = 0; | ||
| 342 | render_y_ = 0; | ||
| 343 | render_width_ = panel_size.GetWidth(); | ||
| 344 | render_height_ = panel_size.GetHeight(); | ||
| 345 | |||
| 346 | if (image_size.GetWidth() * panel_size.GetHeight() > | ||
| 347 | panel_size.GetWidth() * image_size.GetHeight()) { | ||
| 348 | render_height_ = (panel_size.GetWidth() * image_size.GetHeight()) / | ||
| 349 | image_size.GetWidth(); | ||
| 350 | render_y_ = (panel_size.GetHeight() - render_height_) / 2; | ||
| 351 | } else { | ||
| 352 | render_width_ = (image_size.GetWidth() * panel_size.GetHeight()) / | ||
| 353 | image_size.GetHeight(); | ||
| 354 | render_x_ = (panel_size.GetWidth() - render_width_) / 2; | ||
| 355 | } | ||
| 356 | |||
| 357 | rendered_ = wxBitmap(map_image_.Scale( | ||
| 358 | render_width_ * zoom_, render_height_ * zoom_, wxIMAGE_QUALITY_BILINEAR)); | ||
| 359 | |||
| 360 | SetZoomPos({zoom_x_, zoom_y_}); | ||
| 361 | 402 | ||
| 362 | wxMemoryDC dc; | 403 | wxMemoryDC dc; |
| 363 | dc.SelectObject(rendered_); | 404 | dc.SelectObject(rendered_); |
| @@ -413,15 +454,9 @@ void SubwayMap::Redraw() { | |||
| 413 | } | 454 | } |
| 414 | } | 455 | } |
| 415 | 456 | ||
| 416 | wxPoint real_area_pos = MapPosToVirtualPos({subway_item.x, subway_item.y}); | 457 | wxPoint real_area_pos = {subway_item.x, subway_item.y}; |
| 417 | 458 | ||
| 418 | int real_area_size = | 459 | int real_area_size = (draw_type == ItemDrawType::kOwl ? OWL_ACTUAL_SIZE : AREA_ACTUAL_SIZE); |
| 419 | render_width_ * zoom_ * | ||
| 420 | (draw_type == ItemDrawType::kOwl ? OWL_ACTUAL_SIZE : AREA_ACTUAL_SIZE) / | ||
| 421 | image_size.GetWidth(); | ||
| 422 | if (real_area_size == 0) { | ||
| 423 | real_area_size = 1; | ||
| 424 | } | ||
| 425 | 460 | ||
| 426 | if (draw_type == ItemDrawType::kBox) { | 461 | if (draw_type == ItemDrawType::kBox) { |
| 427 | dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, 1)); | 462 | dc.SetPen(*wxThePenList->FindOrCreatePen(*wxBLACK, 1)); |
