aboutsummaryrefslogtreecommitdiff
path: root/src/ImageViewer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ImageViewer.cpp')
-rw-r--r--src/ImageViewer.cpp211
1 files changed, 104 insertions, 107 deletions
diff --git a/src/ImageViewer.cpp b/src/ImageViewer.cpp
index 9c6abf7..731099f 100644
--- a/src/ImageViewer.cpp
+++ b/src/ImageViewer.cpp
@@ -1,34 +1,37 @@
#include "../include/ImageViewer.hpp"
#include "../include/Notification.hpp"
#include "../include/Storage.hpp"
-#include "../include/SfmlFixes.hpp"
#include "../include/ResourceLoader.hpp"
#include "../include/Scale.hpp"
#include "../include/Config.hpp"
+#include <mglpp/system/FloatRect.hpp>
#include <cmath>
#include <malloc.h>
-#include <SFML/Window/Event.hpp>
-#include <SFML/Graphics/RenderWindow.hpp>
-#include <SFML/Graphics/RectangleShape.hpp>
+#include <mglpp/window/Event.hpp>
+#include <mglpp/window/Window.hpp>
+#include <mglpp/graphics/Rectangle.hpp>
+#include <mglpp/graphics/Image.hpp>
namespace QuickMedia {
- static sf::Vector2<double> get_no_image_size_scaled(sf::Vector2<double> window_size, bool fit_image_to_window) {
- sf::Vector2<double> no_image_page_size(720.0, 1280.0);
- sf::Vector2f no_image_page_size_f(no_image_page_size.x, no_image_page_size.y);
- sf::Vector2f content_size(window_size.x, window_size.y);
+ static const int page_text_character_size = 14 * get_config().scale * get_config().font_scale;
- sf::Vector2f image_scale;
+ static mgl::vec2d get_no_image_size_scaled(mgl::vec2d window_size, bool fit_image_to_window) {
+ mgl::vec2d no_image_page_size(720.0, 1280.0);
+ mgl::vec2f no_image_page_size_f(no_image_page_size.x, no_image_page_size.y);
+ mgl::vec2f content_size(window_size.x, window_size.y);
+
+ mgl::vec2f image_scale;
if(fit_image_to_window)
- image_scale = get_ratio(no_image_page_size_f, wrap_to_size_x(no_image_page_size_f, content_size));
+ image_scale = get_ratio(no_image_page_size_f, wrap_to_size_x(no_image_page_size_f, content_size.x));
else
- image_scale = get_ratio(no_image_page_size_f, clamp_to_size_x(no_image_page_size_f, content_size));
+ image_scale = get_ratio(no_image_page_size_f, clamp_to_size_x(no_image_page_size_f, content_size.x));
no_image_page_size.x *= image_scale.x;
no_image_page_size.y *= image_scale.y;
return no_image_page_size;
}
- ImageViewer::ImageViewer(sf::RenderWindow *window, int num_pages, const std::string &content_title, const std::string &chapter_title, int current_page, const Path &chapter_cache_dir, bool *fit_image_to_window) :
+ ImageViewer::ImageViewer(mgl::Window *window, int num_pages, const std::string &content_title, const std::string &chapter_title, int current_page, const Path &chapter_cache_dir, bool *fit_image_to_window) :
window(window),
current_page(current_page),
num_pages(num_pages),
@@ -36,8 +39,7 @@ namespace QuickMedia {
chapter_title(chapter_title),
chapter_cache_dir(chapter_cache_dir),
focused_page(current_page),
- font(FontLoader::get_font(FontLoader::FontType::LATIN)),
- page_text("", *FontLoader::get_font(FontLoader::FontType::LATIN), 14 * get_config().scale * get_config().font_scale),
+ page_text("", *FontLoader::get_font(FontLoader::FontType::LATIN, page_text_character_size)),
fit_image_to_window(fit_image_to_window)
{
current_page = std::min(current_page, num_pages);
@@ -47,29 +49,30 @@ namespace QuickMedia {
image_data[i] = nullptr;
page_size[i].loaded = false;
}
- page_text.setFillColor(sf::Color::White);
+ page_text.set_color(mgl::Color(255, 255, 255, 255));
- has_default_cursor = default_cursor.loadFromSystem(sf::Cursor::Arrow);
- has_size_vertical_cursor = size_vertical_cursor.loadFromSystem(sf::Cursor::SizeVertical);
+ // TODO: Fix
+ //has_default_cursor = default_cursor.loadFromSystem(sf::Cursor::Arrow);
+ //has_size_vertical_cursor = size_vertical_cursor.loadFromSystem(sf::Cursor::SizeVertical);
}
ImageViewer::~ImageViewer() {
- if(has_default_cursor)
- window->setMouseCursor(default_cursor);
+ // TODO: Fix
+ //if(has_default_cursor)
+ // window->setMouseCursor(default_cursor);
if(image_loader_thread.joinable())
image_loader_thread.join();
}
void ImageViewer::load_image_async(const Path &path, std::shared_ptr<ImageData> image_data) {
image_data->image_status = ImageStatus::LOADING;
- //image_data->texture.setSmooth(true);
assert(!loading_image);
loading_image = true;
if(image_loader_thread.joinable())
image_loader_thread.join();
image_loader_thread = std::thread([this, image_data, path]() mutable {
- auto image = std::make_unique<sf::Image>();
- if(load_image_from_file(*image, path.data)) {
+ auto image = std::make_unique<mgl::Image>();
+ if(image->load_from_file(path.data.c_str())) {
image_data->image = std::move(image);
image_data->image_status = ImageStatus::LOADED;
} else {
@@ -79,13 +82,13 @@ namespace QuickMedia {
});
}
- bool ImageViewer::render_page(sf::RenderWindow &window, int page, double offset_y) {
+ bool ImageViewer::render_page(mgl::Window &window, int page, double offset_y) {
if(page < 0 || page >= (int)image_data.size())
return false;
std::shared_ptr<ImageData> &page_image_data = image_data[page];
- const sf::Vector2<double> image_size = get_page_size(page);
- sf::Vector2<double> render_pos(std::floor(window_size.x * 0.5 - image_size.x * 0.5), scroll + offset_y);
+ const mgl::vec2d image_size = get_page_size(page);
+ mgl::vec2d render_pos(std::floor(window_size.x * 0.5 - image_size.x * 0.5), scroll + offset_y);
if(render_pos.y + image_size.y <= 0.0 || render_pos.y >= window_size.y) {
if(page_image_data)
page_image_data->visible_on_screen = false;
@@ -106,18 +109,18 @@ namespace QuickMedia {
page_image_data->visible_on_screen = true;
if(page_image_data->image_status == ImageStatus::APPLIED_TO_TEXTURE) {
- auto texture_size = page_image_data->sprite.getTexture()->getSize();
- sf::Vector2f texture_size_f(texture_size.x, texture_size.y);
- sf::Vector2f content_size(window_size.x, window_size.y);
+ auto texture_size = page_image_data->sprite.get_texture()->get_size();
+ mgl::vec2f texture_size_f(texture_size.x, texture_size.y);
+ mgl::vec2f content_size(window_size.x, window_size.y);
- sf::Vector2f image_scale;
+ mgl::vec2f image_scale;
if(*fit_image_to_window)
- image_scale = get_ratio(texture_size_f, wrap_to_size_x(texture_size_f, content_size));
+ image_scale = get_ratio(texture_size_f, wrap_to_size_x(texture_size_f, content_size.x));
else
- image_scale = get_ratio(texture_size_f, clamp_to_size_x(texture_size_f, content_size));
+ image_scale = get_ratio(texture_size_f, clamp_to_size_x(texture_size_f, content_size.x));
- page_image_data->sprite.setScale(image_scale);
- page_image_data->sprite.setPosition(render_pos.x, render_pos.y);
+ page_image_data->sprite.set_scale(image_scale);
+ page_image_data->sprite.set_position(mgl::vec2f(render_pos.x, render_pos.y));
window.draw(page_image_data->sprite);
} else {
std::string page_str = std::to_string(1 + page);
@@ -135,39 +138,39 @@ namespace QuickMedia {
msg = "Failed to load image for page " + page_str;
}
- sf::Text error_message(std::move(msg), *font, 30 * get_config().scale * get_config().font_scale);
- auto text_bounds = error_message.getLocalBounds();
- error_message.setFillColor(sf::Color::Black);
- sf::Vector2<double> render_pos_text(std::floor(window_size.x * 0.5 - text_bounds.width * 0.5), image_size.y * 0.5 - text_bounds.height * 0.5 + scroll + offset_y);
+ mgl::Text error_message(std::move(msg), *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale));
+ auto text_bounds = error_message.get_bounds();
+ error_message.set_color(mgl::Color(0, 0, 0, 255));
+ mgl::vec2d render_pos_text(std::floor(window_size.x * 0.5 - text_bounds.size.x * 0.5), image_size.y * 0.5 - text_bounds.size.y * 0.5 + scroll + offset_y);
if(!scrolling)
render_pos_text.y = std::floor(render_pos_text.y);
- sf::RectangleShape background(sf::Vector2f(image_size.x, image_size.y));
- background.setFillColor(sf::Color::White);
- background.setPosition(render_pos.x, render_pos.y);
+ mgl::Rectangle background(mgl::vec2f(image_size.x, image_size.y));
+ background.set_color(mgl::Color(255, 255, 255, 255));
+ background.set_position(mgl::vec2f(render_pos.x, render_pos.y));
window.draw(background);
- error_message.setPosition(render_pos_text.x, render_pos_text.y);
+ error_message.set_position(mgl::vec2f(render_pos_text.x, render_pos_text.y));
window.draw(error_message);
}
} else {
std::string page_str = std::to_string(1 + page);
- sf::Text error_message("Downloading page " + page_str, *font, 30 * get_config().scale * get_config().font_scale);
- auto text_bounds = error_message.getLocalBounds();
- error_message.setFillColor(sf::Color::Black);
- sf::Vector2<double> render_pos_text(std::floor(window_size.x * 0.5 - text_bounds.width * 0.5), image_size.y * 0.5 - text_bounds.height * 0.5 + scroll + offset_y);
+ mgl::Text error_message("Downloading page " + page_str, *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale));
+ auto text_bounds = error_message.get_bounds();
+ error_message.set_color(mgl::Color(0, 0, 0, 255));
+ mgl::vec2d render_pos_text(std::floor(window_size.x * 0.5 - text_bounds.size.x * 0.5), image_size.y * 0.5 - text_bounds.size.y * 0.5 + scroll + offset_y);
if(!scrolling)
render_pos_text.y = std::floor(render_pos_text.y);
- sf::RectangleShape background(sf::Vector2f(image_size.x, image_size.y));
- background.setFillColor(sf::Color::White);
- background.setPosition(render_pos.x, render_pos.y);
+ mgl::Rectangle background(mgl::vec2f(image_size.x, image_size.y));
+ background.set_color(mgl::Color(255, 255, 255, 255));
+ background.set_position(mgl::vec2f(render_pos.x, render_pos.y));
window.draw(background);
- error_message.setPosition(render_pos_text.x, render_pos_text.y);
+ error_message.set_position(mgl::vec2f(render_pos_text.x, render_pos_text.y));
window.draw(error_message);
Path image_path = chapter_cache_dir;
@@ -181,7 +184,6 @@ namespace QuickMedia {
page_image_data->visible_on_screen = true;
page_image_data->image_status = ImageStatus::WAITING;
- //page_image_data->texture.setSmooth(true);
}
}
@@ -193,73 +195,69 @@ namespace QuickMedia {
}
ImageViewerAction ImageViewer::draw() {
- const double frame_delta = frame_timer.restart().asSeconds();
+ const double frame_delta = frame_timer.restart();
const double scroll_speed_key_input = 50.0;
const double scroll_speed_mouse_wheel = 600.0;
const double scroll_speed_autoscroll = 10.0;
const double scroll_deaccel = 0.96;
if(!window_size_set) {
- auto window_size_i = window->getSize();
+ auto window_size_i = window->get_size();
window_size.x = window_size_i.x;
window_size.y = window_size_i.y;
window_size_set = true;
for(int i = 0; i < current_page; ++i) {
- const sf::Vector2<double> size = get_page_size(i);
+ const mgl::vec2d size = get_page_size(i);
scroll -= size.y;
page_size[i].prev_size = size;
}
}
// TODO: Only redraw when scrolling and when image has finished downloading
- sf::Event event;
- while(window->pollEvent(event)) {
- if(event.type == sf::Event::KeyPressed) {
- if(event.key.code == sf::Keyboard::Q && event.key.control)
+ mgl::Event event;
+ while(window->poll_event(event)) {
+ if(event.type == mgl::Event::KeyPressed) {
+ if(event.key.code == mgl::Keyboard::Q && event.key.control)
window->close();
}
- if(event.type == sf::Event::Resized) {
+ if(event.type == mgl::Event::Resized) {
window_size.x = event.size.width;
window_size.y = event.size.height;
- sf::FloatRect visible_area(0, 0, window_size.x, window_size.y);
- window->setView(sf::View(visible_area));
- //redraw = true;
- } else if(event.type == sf::Event::GainedFocus) {
- //redraw = true;
- } else if(event.type == sf::Event::KeyPressed) {
- if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K))
+ } else if(event.type == mgl::Event::KeyPressed) {
+ if(event.key.code == mgl::Keyboard::Up || (event.key.control && event.key.code == mgl::Keyboard::K))
up_pressed = true;
- if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J))
+ if(event.key.code == mgl::Keyboard::Down || (event.key.control && event.key.code == mgl::Keyboard::J))
down_pressed = true;
- if(event.key.code == sf::Keyboard::Escape)
+ if(event.key.code == mgl::Keyboard::Escape)
return ImageViewerAction::RETURN;
- if(event.key.code == sf::Keyboard::I)
+ if(event.key.code == mgl::Keyboard::I)
return ImageViewerAction::SWITCH_TO_SINGLE_IMAGE_MODE;
- if(event.key.code == sf::Keyboard::F)
+ if(event.key.code == mgl::Keyboard::F)
*fit_image_to_window = !*fit_image_to_window;
- } else if(event.type == sf::Event::KeyReleased) {
- if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K))
+ } else if(event.type == mgl::Event::KeyReleased) {
+ if(event.key.code == mgl::Keyboard::Up || (event.key.control && event.key.code == mgl::Keyboard::K))
up_pressed = false;
- if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J))
+ if(event.key.code == mgl::Keyboard::Down || (event.key.control && event.key.code == mgl::Keyboard::J))
down_pressed = false;
- } else if(event.type == sf::Event::MouseWheelScrolled && event.mouseWheelScroll.wheel == sf::Mouse::VerticalWheel) {
- scroll_speed += scroll_speed_mouse_wheel * event.mouseWheelScroll.delta * frame_delta;
- } else if(event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Button::Middle) {
+ } else if(event.type == mgl::Event::MouseWheelScrolled/* && event.mouse_wheel_scroll.wheel == mgl::Mouse::VerticalWheel*/) {
+ scroll_speed += scroll_speed_mouse_wheel * event.mouse_wheel_scroll.delta * frame_delta;
+ } else if(event.type == mgl::Event::MouseButtonPressed && event.mouse_button.button == mgl::Mouse::Button::Middle) {
middle_mouse_scrolling = true;
- autoscroll_start_y = sf::Mouse::getPosition(*window).y;
- if(has_size_vertical_cursor)
- window->setMouseCursor(size_vertical_cursor);
-
- } else if(event.type == sf::Event::MouseButtonReleased && event.mouseButton.button == sf::Mouse::Button::Middle) {
+ autoscroll_start_y = window->get_mouse_position().y;
+ // TODO: Fix
+ //if(has_size_vertical_cursor)
+ // window->setMouseCursor(size_vertical_cursor);
+ } else if(event.type == mgl::Event::MouseButtonReleased && event.mouse_button.button == mgl::Mouse::Button::Middle) {
middle_mouse_scrolling = false;
scroll_speed = 0.0;
- if(has_default_cursor)
- window->setMouseCursor(default_cursor);
+ // TODO: Fix
+ //if(has_default_cursor)
+ // window->setMouseCursor(default_cursor);
}
}
@@ -269,7 +267,7 @@ namespace QuickMedia {
scroll_speed -= scroll_speed_key_input * frame_delta;
if(middle_mouse_scrolling) {
- double distance_to_start_y = (double)sf::Mouse::getPosition(*window).y - autoscroll_start_y;
+ double distance_to_start_y = (double)window->get_mouse_position().y - autoscroll_start_y;
double dist_abs = std::abs(distance_to_start_y);
dist_abs -= 20.0;
if(dist_abs < 0.0)
@@ -304,14 +302,13 @@ namespace QuickMedia {
int page_i = 0;
for(auto &page_data : image_data) {
if(page_data) {
- if(page_data->image_status == ImageStatus::LOADED && page_data->image->getSize().x > 0 && page_data->image->getSize().y > 0) {
- if(page_data->texture.loadFromImage(*page_data->image)) {
- page_data->texture.setSmooth(true);
+ if(page_data->image_status == ImageStatus::LOADED && page_data->image->get_size().x > 0 && page_data->image->get_size().y > 0) {
+ if(page_data->texture.load_from_image(*page_data->image)) {
//page_data->texture.generateMipmap();
page_data->image_status = ImageStatus::APPLIED_TO_TEXTURE;
- page_data->sprite.setTexture(page_data->texture, true);
- sf::Vector2u texture_size = image_data[page_i]->texture.getSize();
- page_size[page_i].size = sf::Vector2<double>(texture_size.x, texture_size.y);
+ page_data->sprite.set_texture(&page_data->texture);
+ mgl::vec2i texture_size = image_data[page_i]->texture.get_size();
+ page_size[page_i].size = mgl::vec2d(texture_size.x, texture_size.y);
page_size[page_i].loaded = true;
} else {
page_data->image_status = ImageStatus::FAILED_TO_LOAD;
@@ -326,7 +323,7 @@ namespace QuickMedia {
double page_offset = 0.0;
for(int i = 0; i < num_pages; ++i) {
- const sf::Vector2<double> current_page_size = get_page_size(i);
+ const mgl::vec2d current_page_size = get_page_size(i);
const double scroll_diff = current_page_size.y - page_size[i].prev_size.y;
page_size[i].prev_size = current_page_size;
@@ -349,19 +346,19 @@ namespace QuickMedia {
if(focused_page != prev_focused_page) {
prev_focused_page = focused_page;
- page_text.setString(content_title + " | " + chapter_title + " | Page " + std::to_string(1 + focused_page) + "/" + std::to_string(num_pages));
+ page_text.set_string(content_title + " | " + chapter_title + " | Page " + std::to_string(1 + focused_page) + "/" + std::to_string(num_pages));
}
- const float font_height = page_text.getCharacterSize() + 8.0f;
+ const float font_height = page_text_character_size + 8.0f;
const float background_height = font_height + 6.0f;
- sf::RectangleShape page_text_background(sf::Vector2f(window_size.x, background_height));
- page_text_background.setFillColor(sf::Color(0, 0, 0, 150));
- page_text_background.setPosition(0.0f, window_size.y - background_height);
+ mgl::Rectangle page_text_background(mgl::vec2f(window_size.x, background_height));
+ page_text_background.set_color(mgl::Color(0, 0, 0, 150));
+ page_text_background.set_position(mgl::vec2f(0.0f, window_size.y - background_height));
window->draw(page_text_background);
- auto page_text_bounds = page_text.getLocalBounds();
- page_text.setPosition(std::floor(window_size.x * 0.5f - page_text_bounds.width * 0.5f), std::floor(window_size.y - background_height * 0.5f - font_height * 0.5f));
+ auto page_text_bounds = page_text.get_bounds();
+ page_text.set_position(mgl::vec2f(std::floor(window_size.x * 0.5f - page_text_bounds.size.x * 0.5f), std::floor(window_size.y - background_height * 0.5f - font_height * 0.6f)));
window->draw(page_text);
// Free pages that are not visible on the screen
@@ -385,30 +382,30 @@ namespace QuickMedia {
return 1 + focused_page;
}
- sf::Vector2<double> ImageViewer::get_page_size(int page) {
- sf::Vector2<double> no_image_page_size = get_no_image_size_scaled(window_size, *fit_image_to_window);
+ mgl::vec2d ImageViewer::get_page_size(int page) {
+ mgl::vec2d no_image_page_size = get_no_image_size_scaled(window_size, *fit_image_to_window);
if(page < 0 || page >= (int)image_data.size())
return no_image_page_size;
if(page_size[page].loaded) {
- sf::Vector2f texture_size_f(page_size[page].size.x, page_size[page].size.y);
- sf::Vector2f content_size(window_size.x, window_size.y);
+ mgl::vec2f texture_size_f(page_size[page].size.x, page_size[page].size.y);
+ mgl::vec2f content_size(window_size.x, window_size.y);
- sf::Vector2f image_scale;
+ mgl::vec2f image_scale;
if(*fit_image_to_window)
- image_scale = get_ratio(texture_size_f, wrap_to_size_x(texture_size_f, content_size));
+ image_scale = get_ratio(texture_size_f, wrap_to_size_x(texture_size_f, content_size.x));
else
- image_scale = get_ratio(texture_size_f, clamp_to_size_x(texture_size_f, content_size));
+ image_scale = get_ratio(texture_size_f, clamp_to_size_x(texture_size_f, content_size.x));
- return sf::Vector2<double>(page_size[page].size.x * image_scale.x, page_size[page].size.y * image_scale.y);
+ return mgl::vec2d(page_size[page].size.x * image_scale.x, page_size[page].size.y * image_scale.y);
}
if(!image_data[page] || image_data[page]->image_status != ImageStatus::APPLIED_TO_TEXTURE)
return no_image_page_size;
// Do not scale here, because this will be used to set page_size[page].size
- sf::Vector2u texture_size = image_data[page]->texture.getSize();
- return sf::Vector2<double>(texture_size.x, texture_size.y);
+ mgl::vec2i texture_size = image_data[page]->texture.get_size();
+ return mgl::vec2d(texture_size.x, texture_size.y);
}
} \ No newline at end of file