solvespace/src/platform/headless.cpp
whitequark 6bb73a162c GTK: remove GlWidget, use standard Gtk::GLArea.
This removes a large number of hacks from the codebase, speeds up
the rendering, and removes tearing when dragging entities.
2017-01-02 16:21:05 +00:00

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");
}
}