X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fobjectrenderer.h;h=4dd7fe1ec9e8a3ae5cbb8f13545a85da09b510da;hp=6dd97ae1f1d21e34e71124b6f27c5c4120df1477;hb=f59f24dff392428d7219ba2d6be5e1e81c344ee0;hpb=d3e941df79b54b698a5b8a1d4763346c4d6eb3d7 diff --git a/src/objectrenderer.h b/src/objectrenderer.h index 6dd97ae..4dd7fe1 100644 --- a/src/objectrenderer.h +++ b/src/objectrenderer.h @@ -19,8 +19,8 @@ namespace IPDF * Includes GPU rendering and CPU rendering * For GPU rendering, pass GLSL shader source files to constructor in the constructor of a base class * To leave unimplemented, just pass NULL filename strings - * For CPU rendering, implement RenderUsingCPU in the base class - * To leave unimplemented, just call ObjectRenderer::RenderUsingCPU in the base class + * For CPU rendering, implement RenderUsingCPU in the derived class + * To leave unimplemented, just call ObjectRenderer::RenderUsingCPU in the derived class * The View class uses ObjectRenderer's; see view.h */ class ObjectRenderer @@ -34,7 +34,7 @@ namespace IPDF * Use the GPU to render the objects - GLSL shader approach * This way is definitely faster, but subject to the GPU's limitations on precision */ - void RenderUsingGPU(); + virtual void RenderUsingGPU(); /** * Use the CPU to render the objects - "make a bitmap and convert it to a texture" approach @@ -47,12 +47,15 @@ namespace IPDF int64_t w; int64_t h; }; - struct CPURenderBounds + struct PixelBounds { int64_t x; int64_t y; int64_t w; int64_t h; - CPURenderBounds(const Rect & bounds, const View & view, const CPURenderTarget & target); + PixelBounds(const Rect & bounds) : x(bounds.x), y(bounds.y), w(bounds.w), h(bounds.h) {} }; + static Rect CPURenderBounds(const Rect & bounds, const View & view, const CPURenderTarget & target); + + static void SaveBMP(const CPURenderTarget & target, const char * filename); @@ -66,7 +69,9 @@ namespace IPDF void PrepareBuffers(unsigned max_size); void FinaliseBuffers(); void AddObjectToBuffers(unsigned index); - + + /** Helper for CPU rendering that will render a line using Bresenham's algorithm. Do not use the transpose argument. **/ + static void RenderLineOnCPU(int64_t x0, int64_t y0, int64_t x1, int64_t y1, const CPURenderTarget & target, const Colour & colour = Colour(0,0,0,1), bool transpose = false); ShaderProgram m_shader_program; /** GLSL shaders for GPU **/ GraphicsBuffer m_ibo; /** Index Buffer Object for GPU rendering **/ @@ -98,6 +103,20 @@ namespace IPDF virtual ~CircleFilledRenderer() {} virtual void RenderUsingCPU(const Objects & objects, const View & view, const CPURenderTarget & target); }; + + /** Renderer for bezier curves **/ + class BezierRenderer : public ObjectRenderer + { + public: + BezierRenderer() : ObjectRenderer(BEZIER, "shaders/rect_vert.glsl", "shaders/rect_frag.glsl", "shaders/rect_outline_geom.glsl") {} + virtual ~BezierRenderer() {} + virtual void RenderUsingGPU() + { + Error("Cannot render beziers on the GPU; they will appear as outlined rectangles."); + ObjectRenderer::RenderUsingGPU(); + } + virtual void RenderUsingCPU(const Objects & objects, const View & view, const CPURenderTarget & target); + }; } #endif //_OBJECT_RENDERER_H