mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-08 15:29:48 -10:00
One of the main points of contention when adding the NanoVG based TrueType text rendering was that it required an external Opengl renderer which may interfere with our rendering engine by changing OpenGL state without telling the rest of the engine. Since the rendering interface for NanoVG is abstract and can be easily replaced, I did just that and replaced it with an implementation that uses only generic graphics functions without relying on the specific graphics API. This will improve the interoperability of NanoVG with our engine and should make later changes to the rendering engine easier since there is no external rendering code which may interfere with our own code.
175 lines
3.3 KiB
C++
175 lines
3.3 KiB
C++
#pragma once
|
|
|
|
#include <memory>
|
|
|
|
#include "globalincs/pstypes.h"
|
|
#include "nanovg/nanovg.h"
|
|
|
|
#include "graphics/2d.h"
|
|
|
|
namespace graphics
|
|
{
|
|
namespace paths
|
|
{
|
|
enum Direction
|
|
{
|
|
DIR_CCW,
|
|
DIR_CW
|
|
};
|
|
|
|
enum Solidity
|
|
{
|
|
SOLIDITY_SOLID,
|
|
SOLIDITY_HOLE
|
|
};
|
|
|
|
enum TextAlign
|
|
{
|
|
// Horizontal align
|
|
ALIGN_LEFT = 1 << 0, // Default, align text horizontally to left.
|
|
ALIGN_CENTER = 1 << 1, // Align text horizontally to center.
|
|
ALIGN_RIGHT = 1 << 2, // Align text horizontally to right.
|
|
|
|
// Vertical align
|
|
ALIGN_TOP = 1 << 3, // Align text vertically to top.
|
|
ALIGN_MIDDLE = 1 << 4, // Align text vertically to middle.
|
|
ALIGN_BOTTOM = 1 << 5, // Align text vertically to bottom.
|
|
ALIGN_BASELINE = 1 << 6, // Default, align text vertically to baseline.
|
|
};
|
|
|
|
/**
|
|
* @brief A paint used for drawing
|
|
* @attention The contents of this struct are private, do not rely on any form of structure in it
|
|
*/
|
|
struct DrawPaint
|
|
{
|
|
// Use a union when more backends are implemented
|
|
NVGpaint nvg;
|
|
};
|
|
|
|
class PathRenderer
|
|
{
|
|
private:
|
|
static std::unique_ptr<PathRenderer> s_instance;
|
|
|
|
NVGcontext* m_context;
|
|
bool m_inFrame;
|
|
public:
|
|
PathRenderer();
|
|
~PathRenderer();
|
|
|
|
static bool init();
|
|
|
|
static inline PathRenderer* instance()
|
|
{
|
|
return s_instance.get();
|
|
}
|
|
|
|
static void shutdown();
|
|
|
|
void beginFrame();
|
|
|
|
void cancelFrame();
|
|
|
|
void endFrame();
|
|
|
|
void scissor(float x, float y, float w, float h);
|
|
|
|
void resetScissor();
|
|
|
|
/* begin transforms */
|
|
|
|
void resetTransform();
|
|
|
|
void translate(float x, float y);
|
|
|
|
void rotate(float rad);
|
|
|
|
void skewX(float rad);
|
|
|
|
void skewY(float rad);
|
|
|
|
void scale(float x, float y);
|
|
|
|
/* end transforms */
|
|
|
|
/* begin paint creation */
|
|
|
|
DrawPaint createLinearGradient(float sx, float sy, float ex,
|
|
float ey, color* icol, color* ocol);
|
|
|
|
/* end paint creation */
|
|
|
|
/* begin color handling */
|
|
void setAlpha(float alpha);
|
|
|
|
void setFillColor(color* color);
|
|
|
|
void setFillPaint(const DrawPaint& paint);
|
|
|
|
void setStrokeColor(color* color);
|
|
|
|
void setStrokePaint(const DrawPaint& paint);
|
|
|
|
void setStrokeWidth(float witdh);
|
|
/* end color handling */
|
|
|
|
void beginPath();
|
|
|
|
void moveTo(float x, float y);
|
|
|
|
void setSolidity(Solidity solid);
|
|
|
|
/* begin shapes
|
|
TODO: Replace this with doxygen */
|
|
|
|
void lineTo(float x, float y);
|
|
|
|
void rectangle(float x, float y, float w, float h);
|
|
|
|
void roundedRectangle(float x, float y, float w, float h, float radius);
|
|
|
|
void circle(float x, float y, float r);
|
|
|
|
void ellipse(float x, float y, float rx, float ry);
|
|
|
|
void arc(float cx, float cy, float r, float a0, float a1, Direction dir);
|
|
|
|
/* end shapes */
|
|
|
|
/* begin font and text */
|
|
|
|
int createFontMem(const char* name, unsigned char* data, int ndata, int freeData);
|
|
|
|
void fontSize(float size);
|
|
|
|
void textLetterSpacing(float spacing);
|
|
|
|
void fontFaceId(int font);
|
|
|
|
float text(float x, float y, const char* string, const char* end);
|
|
|
|
float textBounds(float x, float y, const char* string, const char* end, float* bounds);
|
|
|
|
void textMetrics(float* ascender, float* descender, float* lineh);
|
|
|
|
void textAlign(TextAlign align);
|
|
|
|
/* end font and text */
|
|
|
|
void closePath();
|
|
|
|
void fill();
|
|
|
|
void stroke();
|
|
|
|
void saveState();
|
|
|
|
void resetState();
|
|
|
|
void restoreState();
|
|
};
|
|
}
|
|
}
|
|
|