# HG changeset patch # User unC0Rr # Date 1544189435 -3600 # Node ID 4409344db447aa8d74a12c77b5875f16291a72f3 # Parent b6824a53d4b1ee81d332a25df695be2e7c4fc937 Rework EngineInstance::generatePreview, add preview cleanup function in enginelib diff -r b6824a53d4b1 -r 4409344db447 qmlfrontend/engine_instance.cpp --- a/qmlfrontend/engine_instance.cpp Fri Dec 07 13:56:45 2018 +0100 +++ b/qmlfrontend/engine_instance.cpp Fri Dec 07 14:30:35 2018 +0100 @@ -27,6 +27,8 @@ reinterpret_cast(hwlib.resolve("start_engine")); generate_preview = reinterpret_cast( hwlib.resolve("generate_preview")); + dispose_preview = reinterpret_cast( + hwlib.resolve("dispose_preview")); cleanup = reinterpret_cast(hwlib.resolve("cleanup")); send_ipc = reinterpret_cast(hwlib.resolve("send_ipc")); @@ -41,8 +43,9 @@ hwlib.resolve("advance_simulation")); m_isValid = hedgewars_engine_protocol_version && start_engine && - generate_preview && cleanup && send_ipc && read_ipc && - setup_current_gl_context && render_frame && advance_simulation; + generate_preview && dispose_preview && cleanup && send_ipc && + read_ipc && setup_current_gl_context && render_frame && + advance_simulation; emit isValidChanged(m_isValid); if (isValid()) { @@ -79,12 +82,23 @@ &getProcAddress); } -Engine::PreviewInfo EngineInstance::generatePreview() { +QImage EngineInstance::generatePreview() { Engine::PreviewInfo pinfo; generate_preview(m_instance, &pinfo); - return pinfo; + QVector colorTable; + colorTable.resize(256); + for (int i = 0; i < 256; ++i) colorTable[i] = qRgba(255, 255, 0, i); + + QImage previewImage(pinfo.land, static_cast(pinfo.width), + static_cast(pinfo.height), QImage::Format_Indexed8); + previewImage.setColorTable(colorTable); + + // Cannot use it here, since QImage refers to original bytes + // dispose_preview(m_instance); + + return previewImage; } bool EngineInstance::isValid() const { return m_isValid; } diff -r b6824a53d4b1 -r 4409344db447 qmlfrontend/engine_instance.h --- a/qmlfrontend/engine_instance.h Fri Dec 07 13:56:45 2018 +0100 +++ b/qmlfrontend/engine_instance.h Fri Dec 07 14:30:35 2018 +0100 @@ -1,6 +1,7 @@ #ifndef ENGINEINSTANCE_H #define ENGINEINSTANCE_H +#include #include #include @@ -20,7 +21,7 @@ void advance(quint32 ticks); void renderFrame(); void setOpenGLContext(QOpenGLContext* context); - Engine::PreviewInfo generatePreview(); + QImage generatePreview(); bool isValid() const; @@ -36,6 +37,7 @@ hedgewars_engine_protocol_version; Engine::start_engine_t* start_engine; Engine::generate_preview_t* generate_preview; + Engine::dispose_preview_t* dispose_preview; Engine::cleanup_t* cleanup; Engine::send_ipc_t* send_ipc; Engine::read_ipc_t* read_ipc; diff -r b6824a53d4b1 -r 4409344db447 qmlfrontend/engine_interface.h --- a/qmlfrontend/engine_interface.h Fri Dec 07 13:56:45 2018 +0100 +++ b/qmlfrontend/engine_interface.h Fri Dec 07 14:30:35 2018 +0100 @@ -22,6 +22,7 @@ typedef EngineInstance* start_engine_t(); typedef void generate_preview_t(EngineInstance* engine_state, PreviewInfo* preview); +typedef void dispose_preview_t(EngineInstance* engine_state); typedef void cleanup_t(EngineInstance* engine_state); typedef void send_ipc_t(EngineInstance* engine_state, uint8_t* buf, diff -r b6824a53d4b1 -r 4409344db447 qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Fri Dec 07 13:56:45 2018 +0100 +++ b/qmlfrontend/hwengine.cpp Fri Dec 07 14:30:35 2018 +0100 @@ -2,8 +2,6 @@ #include #include -#include -#include #include #include "engine_instance.h" @@ -27,17 +25,7 @@ engine.sendConfig(m_gameConfig); - Engine::PreviewInfo preview = engine.generatePreview(); - - QVector colorTable; - colorTable.resize(256); - for (int i = 0; i < 256; ++i) colorTable[i] = qRgba(255, 255, 0, i); - - QImage previewImage(preview.land, static_cast(preview.width), - static_cast(preview.height), - QImage::Format_Indexed8); - previewImage.setColorTable(colorTable); - previewImage.detach(); + QImage previewImage = engine.generatePreview(); if (m_previewAcceptor) m_previewAcceptor->setImage(previewImage); diff -r b6824a53d4b1 -r 4409344db447 rust/lib-hedgewars-engine/src/lib.rs --- a/rust/lib-hedgewars-engine/src/lib.rs Fri Dec 07 13:56:45 2018 +0100 +++ b/rust/lib-hedgewars-engine/src/lib.rs Fri Dec 07 14:30:35 2018 +0100 @@ -42,14 +42,19 @@ (*engine_state).world.generate_preview(); - let land_preview = (*engine_state).world.preview(); + if let Some(land_preview) = (*engine_state).world.preview() { + *preview = PreviewInfo { + width: land_preview.width() as u32, + height: land_preview.height() as u32, + hedgehogs_number: 0, + land: land_preview.raw_pixels().as_ptr(), + }; + } +} - *preview = PreviewInfo { - width: land_preview.width() as u32, - height: land_preview.height() as u32, - hedgehogs_number: 0, - land: land_preview.raw_pixels().as_ptr(), - }; +#[no_mangle] +pub extern "C" fn dispose_preview(engine_state: &mut EngineInstance, preview: &mut PreviewInfo) { + (*engine_state).world.dispose_preview(); } #[no_mangle] diff -r b6824a53d4b1 -r 4409344db447 rust/lib-hedgewars-engine/src/world.rs --- a/rust/lib-hedgewars-engine/src/world.rs Fri Dec 07 13:56:45 2018 +0100 +++ b/rust/lib-hedgewars-engine/src/world.rs Fri Dec 07 14:30:35 2018 +0100 @@ -26,7 +26,7 @@ pub struct World { random_numbers_gen: LaggedFibonacciPRNG, - preview: Land2D, + preview: Option>, game_state: Option, } @@ -34,7 +34,7 @@ pub fn new() -> Self { Self { random_numbers_gen: LaggedFibonacciPRNG::new(&[]), - preview: Land2D::new(Size::new(0, 0), 0), + preview: None, game_state: None, } } @@ -43,7 +43,7 @@ self.random_numbers_gen = LaggedFibonacciPRNG::new(seed); } - pub fn preview(&self) -> &Land2D { + pub fn preview(&self) -> &Option> { &self.preview } @@ -63,7 +63,11 @@ let params = LandGenerationParameters::new(0u8, u8::max_value(), 5, false, false); let landgen = TemplatedLandGenerator::new(template()); - self.preview = landgen.generate_land(¶ms, &mut self.random_numbers_gen); + self.preview = Some(landgen.generate_land(¶ms, &mut self.random_numbers_gen)); + } + + pub fn dispose_preview(&mut self) { + self.preview = None } pub fn init(&mut self, template: OutlineTemplate) {