
This removes a large number of hacks from the codebase, speeds up the rendering, and removes tearing when dragging entities.
261 lines
7.3 KiB
C++
261 lines
7.3 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Our platform support functions for the headless (no OpenGL) test runner.
|
|
//
|
|
// Copyright 2016 whitequark
|
|
//-----------------------------------------------------------------------------
|
|
#include "solvespace.h"
|
|
#include <cairo.h>
|
|
|
|
namespace SolveSpace {
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Settings
|
|
//-----------------------------------------------------------------------------
|
|
|
|
class Setting {
|
|
public:
|
|
enum class Type {
|
|
Undefined,
|
|
Int,
|
|
Float,
|
|
String
|
|
};
|
|
|
|
Type type;
|
|
int valueInt;
|
|
float valueFloat;
|
|
std::string valueString;
|
|
|
|
void CheckType(Type expectedType) {
|
|
ssassert(type == Setting::Type::Undefined ||
|
|
type == expectedType, "Wrong setting type");
|
|
type = expectedType;
|
|
}
|
|
};
|
|
|
|
std::map<std::string, Setting> settings;
|
|
|
|
void CnfFreezeInt(uint32_t val, const std::string &key) {
|
|
Setting &setting = settings[key];
|
|
setting.CheckType(Setting::Type::Int);
|
|
setting.valueInt = val;
|
|
}
|
|
uint32_t CnfThawInt(uint32_t val, const std::string &key) {
|
|
if(settings.find(key) != settings.end()) {
|
|
Setting &setting = settings[key];
|
|
setting.CheckType(Setting::Type::Int);
|
|
val = setting.valueInt;
|
|
}
|
|
return val;
|
|
}
|
|
|
|
void CnfFreezeFloat(float val, const std::string &key) {
|
|
Setting &setting = settings[key];
|
|
setting.CheckType(Setting::Type::Float);
|
|
setting.valueFloat = val;
|
|
}
|
|
float CnfThawFloat(float val, const std::string &key) {
|
|
if(settings.find(key) != settings.end()) {
|
|
Setting &setting = settings[key];
|
|
setting.CheckType(Setting::Type::Float);
|
|
val = setting.valueFloat;
|
|
}
|
|
return val;
|
|
}
|
|
|
|
void CnfFreezeString(const std::string &val, const std::string &key) {
|
|
Setting &setting = settings[key];
|
|
setting.CheckType(Setting::Type::String);
|
|
setting.valueString = val;
|
|
}
|
|
std::string CnfThawString(const std::string &val, const std::string &key) {
|
|
std::string ret = val;
|
|
if(settings.find(key) != settings.end()) {
|
|
Setting &setting = settings[key];
|
|
setting.CheckType(Setting::Type::String);
|
|
ret = setting.valueString;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Timers
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void SetTimerFor(int milliseconds) {
|
|
}
|
|
void SetAutosaveTimerFor(int minutes) {
|
|
}
|
|
void ScheduleLater() {
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Rendering
|
|
//-----------------------------------------------------------------------------
|
|
|
|
std::shared_ptr<ViewportCanvas> CreateRenderer() {
|
|
return NULL;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Graphics window
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void GetGraphicsWindowSize(int *w, int *h) {
|
|
*w = *h = 600;
|
|
}
|
|
double GetScreenDpi() {
|
|
return 72;
|
|
}
|
|
|
|
void InvalidateGraphics() {
|
|
}
|
|
|
|
std::shared_ptr<Pixmap> framebuffer;
|
|
bool antialias = true;
|
|
void PaintGraphics() {
|
|
const Camera &camera = SS.GW.GetCamera();
|
|
|
|
std::shared_ptr<Pixmap> pixmap = std::make_shared<Pixmap>();
|
|
pixmap->format = Pixmap::Format::BGRA;
|
|
pixmap->width = camera.width;
|
|
pixmap->height = camera.height;
|
|
pixmap->stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, camera.width);
|
|
pixmap->data = std::vector<uint8_t>(pixmap->stride * pixmap->height);
|
|
cairo_surface_t *surface =
|
|
cairo_image_surface_create_for_data(&pixmap->data[0], CAIRO_FORMAT_RGB24,
|
|
pixmap->width, pixmap->height, pixmap->stride);
|
|
cairo_t *context = cairo_create(surface);
|
|
|
|
CairoRenderer canvas;
|
|
canvas.camera = camera;
|
|
canvas.lighting = SS.GW.GetLighting();
|
|
canvas.chordTolerance = SS.chordTol;
|
|
canvas.context = context;
|
|
canvas.antialias = antialias;
|
|
|
|
SS.GW.Draw(&canvas);
|
|
canvas.CullOccludedStrokes();
|
|
canvas.OutputInPaintOrder();
|
|
|
|
pixmap->ConvertTo(Pixmap::Format::RGBA);
|
|
framebuffer = pixmap;
|
|
|
|
canvas.Clear();
|
|
|
|
cairo_surface_destroy(surface);
|
|
cairo_destroy(context);
|
|
}
|
|
|
|
void SetCurrentFilename(const std::string &filename) {
|
|
}
|
|
void ToggleFullScreen() {
|
|
}
|
|
bool FullScreenIsActive() {
|
|
return false;
|
|
}
|
|
void ShowGraphicsEditControl(int x, int y, int fontHeight, int minWidthChars,
|
|
const std::string &val) {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
void HideGraphicsEditControl() {
|
|
}
|
|
bool GraphicsEditControlIsVisible() {
|
|
return false;
|
|
}
|
|
void ToggleMenuBar() {
|
|
}
|
|
bool MenuBarIsVisible() {
|
|
return false;
|
|
}
|
|
void AddContextMenuItem(const char *label, ContextCommand cmd) {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
void CreateContextSubmenu() {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
ContextCommand ShowContextMenu() {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
void EnableMenuByCmd(Command cmd, bool enabled) {
|
|
}
|
|
void CheckMenuByCmd(Command cmd, bool checked) {
|
|
}
|
|
void RadioMenuByCmd(Command cmd, bool selected) {
|
|
}
|
|
void RefreshRecentMenus() {
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Text window
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void ShowTextWindow(bool visible) {
|
|
}
|
|
void GetTextWindowSize(int *w, int *h) {
|
|
*w = *h = 100;
|
|
}
|
|
void InvalidateText() {
|
|
}
|
|
void MoveTextScrollbarTo(int pos, int maxPos, int page) {
|
|
}
|
|
void SetMousePointerToHand(bool is_hand) {
|
|
}
|
|
void ShowTextEditControl(int x, int y, const std::string &val) {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
void HideTextEditControl() {
|
|
}
|
|
bool TextEditControlIsVisible() {
|
|
return false;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Dialogs
|
|
//-----------------------------------------------------------------------------
|
|
|
|
bool GetOpenFile(std::string *filename, const std::string &activeOrEmpty,
|
|
const FileFilter filters[]) {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
bool GetSaveFile(std::string *filename, const std::string &activeOrEmpty,
|
|
const FileFilter filters[]) {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
DialogChoice SaveFileYesNoCancel() {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
DialogChoice LoadAutosaveYesNo() {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
DialogChoice LocateImportedFileYesNoCancel(const std::string &filename,
|
|
bool canCancel) {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
void DoMessageBox(const char *message, int rows, int cols, bool error) {
|
|
dbp("%s box: %s", error ? "error" : "message", message);
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
void OpenWebsite(const char *url) {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Resources
|
|
//-----------------------------------------------------------------------------
|
|
|
|
std::vector<std::string> fontFiles;
|
|
std::vector<std::string> GetFontFiles() {
|
|
return fontFiles;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Application lifecycle
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void ExitNow() {
|
|
ssassert(false, "Not implemented");
|
|
}
|
|
|
|
}
|