X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fview.cpp;h=53511d216c0716818952f60a72425852c48790d7;hb=6b7e92069596a3f19fbe068b14a9c5ef59c22061;hp=e5f81bbb6c2148c7e83fe4d709ca2847c45393cb;hpb=fe80b0a479a44182b6e7e982fb6ff33b6e17303d;p=ipdf%2Fcode.git diff --git a/src/view.cpp b/src/view.cpp index e5f81bb..53511d2 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -7,6 +7,13 @@ #include "controlpanel.h" #endif //CONTROLPANEL_DISABLED + +#ifdef TRANSFORM_BEZIERS_TO_PATH + #ifndef TRANSFORM_OBJECTS_NOT_VIEW + //#error Cannot TRANSFORM_BEZIERS_TO_PATH _without_ TRANSFORM_OBJECTS_NOT_VIEW + #endif +#endif + using namespace IPDF; using namespace std; @@ -17,7 +24,7 @@ using namespace std; * @param bounds - Initial bounds of the View * @param colour - Colour to use for rendering this view. TODO: Make sure this actually works, or just remove it */ -View::View(Document & document, Screen & screen, const Rect & bounds, const Colour & colour) +View::View(Document & document, Screen & screen, const VRect & bounds, const Colour & colour) : m_use_gpu_transform(USE_GPU_TRANSFORM), m_use_gpu_rendering(USE_GPU_RENDERING), m_bounds_dirty(true), m_buffer_dirty(true), m_render_dirty(true), m_document(document), m_screen(screen), m_cached_display(), m_bounds(bounds), m_colour(colour), m_bounds_ubo(), m_objbounds_vbo(), m_object_renderers(NUMBER_OF_OBJECT_TYPES), m_cpu_rendering_pixels(NULL), @@ -83,12 +90,14 @@ void View::Translate(Real x, Real y) m_buffer_dirty = true; m_bounds_dirty = true; #ifdef TRANSFORM_OBJECTS_NOT_VIEW - m_document.TranslateObjects(-x, -y); + ObjectType type = NUMBER_OF_OBJECT_TYPES; + #ifdef TRANSFORM_BEZIERS_TO_PATH + type = PATH; + #endif + m_document.TranslateObjects(-x, -y, type); #endif - x *= m_bounds.w; - y *= m_bounds.h; - m_bounds.x += x; - m_bounds.y += y; + m_bounds.x += m_bounds.w*VReal(x); + m_bounds.y += m_bounds.h*VReal(y); //Debug("View Bounds => %s", m_bounds.Str().c_str()); @@ -126,21 +135,25 @@ void View::ScaleAroundPoint(Real x, Real y, Real scale_amount) #ifdef TRANSFORM_OBJECTS_NOT_VIEW - m_document.ScaleObjectsAboutPoint(x, y, scale_amount); + ObjectType type = NUMBER_OF_OBJECT_TYPES; + #ifdef TRANSFORM_BEZIERS_TO_PATH + type = PATH; + #endif + m_document.ScaleObjectsAboutPoint(x, y, scale_amount, type); #endif - x *= m_bounds.w; - y *= m_bounds.h; - x += m_bounds.x; - y += m_bounds.y; + VReal vx = m_bounds.w * VReal(x); + VReal vy = m_bounds.h * VReal(y); + vx += m_bounds.x; + vy += m_bounds.y; - Real top = y - m_bounds.y; - Real left = x - m_bounds.x; + VReal top = vy - m_bounds.y; + VReal left = vx - m_bounds.x; top *= scale_amount; left *= scale_amount; - m_bounds.x = x - left; - m_bounds.y = y - top; + m_bounds.x = vx - left; + m_bounds.y = vy - top; m_bounds.w *= scale_amount; m_bounds.h *= scale_amount; //Debug("Scale at {%s, %s} by %s View Bounds => %s", x.Str().c_str(), y.Str().c_str(), scale_amount.Str().c_str(), m_bounds.Str().c_str()); @@ -159,12 +172,7 @@ Rect View::TransformToViewCoords(const Rect& inp) const #ifdef TRANSFORM_OBJECTS_NOT_VIEW return inp; #endif - Rect out; - out.x = (inp.x - m_bounds.x) / m_bounds.w; - out.y = (inp.y - m_bounds.y) / m_bounds.h; - out.w = inp.w / m_bounds.w; - out.h = inp.h / m_bounds.h; - return out; + return TransformRectCoordinates(m_bounds.Convert(), inp); } /** @@ -446,6 +454,7 @@ void View::RenderRange(int width, int height, unsigned first_obj, unsigned last_ if (m_use_gpu_transform) { #ifdef TRANSFORM_OBJECTS_NOT_VIEW + //Debug("Transform objects, not view"); GLfloat glbounds[] = {0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, float(width), float(height)}; #else @@ -503,11 +512,14 @@ void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj) //m_objbounds_vbo.Invalidate(); m_objbounds_vbo.SetType(GraphicsBuffer::BufferTypeVertex); m_objbounds_vbo.SetName("Object Bounds VBO"); + + #ifndef TRANSFORM_OBJECTS_NOT_VIEW if (m_use_gpu_transform) { m_objbounds_vbo.SetUsage(GraphicsBuffer::BufferUsageStaticDraw); } else + #endif //TRANSFORM_OBJECTS_NOT_VIEW { m_objbounds_vbo.SetUsage(GraphicsBuffer::BufferUsageDynamicCopy); } @@ -515,6 +527,7 @@ void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj) BufferBuilder obj_bounds_builder(m_objbounds_vbo.MapRange(first_obj*sizeof(GPUObjBounds), (last_obj-first_obj)*sizeof(GPUObjBounds), false, true, true), m_objbounds_vbo.GetSize()); + #ifndef TRANSFORM_BEZIERS_TO_PATH for (unsigned id = first_obj; id < last_obj; ++id) { Rect obj_bounds; @@ -532,9 +545,48 @@ void View::UpdateObjBoundsVBO(unsigned first_obj, unsigned last_obj) (float)Float(obj_bounds.x + obj_bounds.w), (float)Float(obj_bounds.y + obj_bounds.h) }; - obj_bounds_builder.Add(gpu_bounds); + obj_bounds_builder.Add(gpu_bounds); + } + #else + for (unsigned i = 0; i < m_document.m_objects.paths.size(); ++i) + { + Path & path = m_document.m_objects.paths[i]; + Rect & pbounds = path.GetBounds(m_document.m_objects); // Not very efficient... + for (unsigned id = path.m_start; id <= path.m_end; ++id) + { + if (id < first_obj || id >= last_obj) + continue; + + Rect obj_bounds = m_document.m_objects.bounds[id]; + + obj_bounds.x *= pbounds.w; + obj_bounds.x += pbounds.x; + obj_bounds.y *= pbounds.h; + obj_bounds.y += pbounds.y; + obj_bounds.w *= pbounds.w; + obj_bounds.h *= pbounds.h; + + if (!m_use_gpu_transform) + obj_bounds = TransformToViewCoords(obj_bounds); + GPUObjBounds gpu_bounds = { + Float(obj_bounds.x), + Float(obj_bounds.y), + Float(obj_bounds.x + obj_bounds.w), + Float(obj_bounds.y + obj_bounds.h) + }; + obj_bounds_builder.Add(gpu_bounds); + //Debug("Path %d %s -> %s via %s", id, m_document.m_objects.bounds[id].Str().c_str(), obj_bounds.Str().c_str(), pbounds.Str().c_str()); + } + GPUObjBounds p_gpu_bounds = { + Float(pbounds.x), + Float(pbounds.y), + Float(pbounds.x + pbounds.w), + Float(pbounds.y + pbounds.h) + }; + obj_bounds_builder.Add(p_gpu_bounds); } + #endif m_objbounds_vbo.UnMap(); } /** @@ -582,7 +634,9 @@ void View::PrepareRender() m_object_renderers[i]->FinaliseBuffers(); } if (UsingGPURendering()) + { dynamic_cast(m_object_renderers[BEZIER])->PrepareBezierGPUBuffer(m_document.m_objects); + } m_render_dirty = false; }