diff --git a/engines/ags/engine/ac/draw.cpp b/engines/ags/engine/ac/draw.cpp
index cf52ebf3c5b..4f628f2a2a8 100644
a
|
b
|
static void dispose_debug_room_drawdata() {
|
423 | 423 | } |
424 | 424 | |
425 | 425 | void dispose_room_drawdata() { |
| 426 | debug(1, "%s", __FUNCTION__); |
426 | 427 | _GP(CameraDrawData).clear(); |
427 | 428 | dispose_invalid_regions(true); |
428 | 429 | } |
… |
… |
void on_mainviewport_changed() {
|
470 | 471 | |
471 | 472 | // Allocates a bitmap for rendering camera/viewport pair (software render mode) |
472 | 473 | void prepare_roomview_frame(Viewport *view) { |
| 474 | debug(1, "%s(view_index: %d)", __FUNCTION__, view->GetID()); |
473 | 475 | if (!view->GetCamera()) return; // no camera link |
474 | 476 | const int view_index = view->GetID(); |
475 | 477 | const Size view_sz = view->GetRect().GetSize(); |
… |
… |
void prepare_roomview_frame(Viewport *view) {
|
482 | 484 | // regions outside of master bitmap, and we must not clamp surface size to virtual screen because |
483 | 485 | // plugins may want to also use viewport bitmap, therefore it should retain full size. |
484 | 486 | if (cam_sz == view_sz && !draw_dat.IsOffscreen) { |
| 487 | debug(1, "#1"); |
485 | 488 | // note we keep the buffer allocated in case it will become useful later |
486 | 489 | draw_dat.Frame.reset(); |
487 | 490 | } else { |
| 491 | debug(1, "#2"); |
| 492 | debug(1, " _GP(CameraDrawData)[view_index].Frame.get(): %p", (void *)(_GP(CameraDrawData)[view_index].Frame.get())); |
488 | 493 | PBitmap &camera_frame = draw_dat.Frame; |
489 | 494 | PBitmap &camera_buffer = draw_dat.Buffer; |
490 | 495 | if (!camera_buffer || camera_buffer->GetWidth() < cam_sz.Width || camera_buffer->GetHeight() < cam_sz.Height) { |
| 496 | debug(1, "#3"); |
491 | 497 | // Allocate new buffer bitmap with an extra size in case they will want to zoom out |
492 | 498 | int room_width = data_to_game_coord(_GP(thisroom).Width); |
493 | 499 | int room_height = data_to_game_coord(_GP(thisroom).Height); |
| 500 | debug(1, "room_width: %d room_height: %d", room_width, room_height); |
494 | 501 | Size alloc_sz = Size::Clamp(cam_sz * 2, Size(1, 1), Size(room_width, room_height)); |
| 502 | debug(1, "alloc_sz.Width: %d alloc_sz.Height: %d", alloc_sz.Width, alloc_sz.Height); |
495 | 503 | camera_buffer.reset(new Bitmap(alloc_sz.Width, alloc_sz.Height, _G(gfxDriver)->GetMemoryBackBuffer()->GetColorDepth())); |
496 | 504 | } |
497 | 505 | |
498 | 506 | if (!camera_frame || camera_frame->GetSize() != cam_sz) { |
| 507 | debug(1, "#4"); |
499 | 508 | camera_frame.reset(BitmapHelper::CreateSubBitmap(camera_buffer.get(), RectWH(cam_sz))); |
500 | 509 | } |
| 510 | assert(draw_dat.Frame->GetAllegroBitmap()->_owner != nullptr); |
| 511 | assert(draw_dat.Buffer->GetAllegroBitmap()->_owner != nullptr); |
| 512 | debug(1, " _GP(CameraDrawData)[view_index].Frame.get(): %p", (void *)(_GP(CameraDrawData)[view_index].Frame.get())); |
501 | 513 | } |
| 514 | |
| 515 | /*{ |
| 516 | RoomCameraDrawData &d = _GP(CameraDrawData)[view_index]; |
| 517 | assert(d.Frame->GetAllegroBitmap()->_owner != nullptr); |
| 518 | assert(d.Buffer->GetAllegroBitmap()->_owner != nullptr); |
| 519 | }*/ |
502 | 520 | } |
503 | 521 | |
504 | 522 | // Syncs room viewport and camera in case either size has changed |
… |
… |
void sync_roomview(Viewport *view) {
|
513 | 531 | } |
514 | 532 | |
515 | 533 | void init_room_drawdata() { |
| 534 | debug(1, "%s", __FUNCTION__); |
516 | 535 | // Update debug overlays, if any were on |
517 | 536 | debug_draw_room_mask(_G(debugRoomMask)); |
518 | 537 | debug_draw_movelist(_G(debugMoveListChar)); |
… |
… |
void init_room_drawdata() {
|
522 | 541 | return; |
523 | 542 | // Make sure all frame buffers are created for software drawing |
524 | 543 | int view_count = _GP(play).GetRoomViewportCount(); |
| 544 | debug(1, "view_count: %d", view_count); |
525 | 545 | _GP(CameraDrawData).resize(view_count); |
526 | 546 | for (int i = 0; i < _GP(play).GetRoomViewportCount(); ++i) |
527 | 547 | sync_roomview(_GP(play).GetRoomViewport(i).get()); |
528 | 548 | } |
529 | 549 | |
530 | 550 | void on_roomviewport_created(int index) { |
| 551 | debug(1, "%s(%d)", __FUNCTION__, index); |
531 | 552 | if (!_G(gfxDriver) || _G(gfxDriver)->RequiresFullRedrawEachFrame()) |
532 | 553 | return; |
533 | 554 | if ((size_t)index < _GP(CameraDrawData).size()) |
… |
… |
void on_roomviewport_created(int index) {
|
536 | 557 | } |
537 | 558 | |
538 | 559 | void on_roomviewport_deleted(int index) { |
| 560 | debug(1, "%s(%d)", __FUNCTION__, index); |
539 | 561 | if (_G(gfxDriver)->RequiresFullRedrawEachFrame()) |
540 | 562 | return; |
541 | 563 | _GP(CameraDrawData).erase(_GP(CameraDrawData).begin() + index); |
… |
… |
void on_roomviewport_deleted(int index) {
|
543 | 565 | } |
544 | 566 | |
545 | 567 | void on_roomviewport_changed(Viewport *view) { |
| 568 | debug(1, "%s", __FUNCTION__); |
546 | 569 | if (_G(gfxDriver)->RequiresFullRedrawEachFrame()) |
547 | 570 | return; |
548 | 571 | if (!view->IsVisible() || view->GetCamera() == nullptr) |
… |
… |
PBitmap draw_room_background(Viewport *view) {
|
1789 | 1812 | // If separate bitmap was prepared for this view/camera pair then use it, draw untransformed |
1790 | 1813 | // and blit transformed whole surface later. |
1791 | 1814 | const bool draw_to_camsurf = _GP(CameraDrawData)[view_index].Frame != nullptr; |
| 1815 | debug(1, "draw_to_camsurf: %d view_index:%d _GP(CameraDrawData)[view_index].Frame.get():%p", draw_to_camsurf, view_index, (void *)(_GP(CameraDrawData)[view_index].Frame.get())); |
1792 | 1816 | Bitmap *roomcam_surface = draw_to_camsurf ? _GP(CameraDrawData)[view_index].Frame.get() : ds; |
| 1817 | assert(roomcam_surface->GetAllegroBitmap()->_owner != nullptr); |
1793 | 1818 | { |
1794 | 1819 | // For software renderer: copy dirty rects onto the virtual screen. |
1795 | 1820 | // TODO: that would be SUPER NICE to reorganize the code and move this operation into SoftwareGraphicDriver somehow. |
diff --git a/engines/ags/lib/allegro/surface.cpp b/engines/ags/lib/allegro/surface.cpp
index d4de07dd46c..a4676910779 100644
a
|
b
|
void BITMAP::draw(const BITMAP *srcBitmap, const Common::Rect &srcRect,
|
111 | 111 | int dstX, int dstY, bool horizFlip, bool vertFlip, |
112 | 112 | bool skipTrans, int srcAlpha, int tintRed, int tintGreen, |
113 | 113 | int tintBlue) { |
| 114 | assert(_owner != nullptr); |
114 | 115 | assert(format.bytesPerPixel == 2 || format.bytesPerPixel == 4 || |
115 | 116 | (format.bytesPerPixel == 1 && srcBitmap->format.bytesPerPixel == 1)); |
116 | 117 | |
diff --git a/engines/ags/lib/allegro/surface.h b/engines/ags/lib/allegro/surface.h
index 6ac73b40a5c..acd5b5f8ac4 100644
a
|
b
|
|
29 | 29 | namespace AGS3 { |
30 | 30 | |
31 | 31 | class BITMAP { |
32 | | private: |
| 32 | public: |
33 | 33 | Graphics::ManagedSurface *_owner; |
34 | | public: |
35 | 34 | int16 &w, &h, &pitch; |
36 | 35 | Graphics::PixelFormat &format; |
37 | 36 | bool clip; |