#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;
* @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),
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());
#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
- x *= m_bounds.w;
- y *= m_bounds.h;
- x += m_bounds.x;
- y += m_bounds.y;
+ m_document.ScaleObjectsAboutPoint(x, y, scale_amount, type);
+ #endif
+ 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());
#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<Real>(), inp);
}
/**
#ifndef QUADTREE_DISABLED
if (m_bounds_dirty || !m_lazy_rendering)
{
- if ( (m_bounds.x > 1.0 || m_bounds.x < 0.0 || m_bounds.y > 1.0 || m_bounds.y < 0.0 || m_bounds.w > 1.0 || m_bounds.h > 1.0))
+ if ( m_bounds.w > 1.0 || m_bounds.h > 1.0)
{
//TODO: Generate a new parent node.
if (m_document.GetQuadTree().nodes[m_current_quadtree_node].parent != QUADTREE_EMPTY)
m_current_quadtree_node = m_document.GetQuadTree().nodes[m_current_quadtree_node].parent;
}
}
+
+ // TODO: Support generating new parent nodes.
+ if (false && m_document.GetQuadTree().nodes[m_current_quadtree_node].parent != QUADTREE_EMPTY)
+ {
+ if (m_bounds.x < -0.5)
+ {
+ m_bounds = Rect(m_bounds.x + 1, m_bounds.y, m_bounds.w, m_bounds.h);
+ m_current_quadtree_node = m_document.GetQuadTree().GetNeighbour(m_current_quadtree_node, -1, 0, &m_document);
+ }
+ if (m_bounds.y < -0.5)
+ {
+ m_bounds = Rect(m_bounds.x, m_bounds.y + 1, m_bounds.w, m_bounds.h);
+ m_current_quadtree_node = m_document.GetQuadTree().GetNeighbour(m_current_quadtree_node, 0, -1, &m_document);
+ }
+ if (m_bounds.w + m_bounds.x > 0.5)
+ {
+ m_bounds = Rect(m_bounds.x - 1, m_bounds.y, m_bounds.w, m_bounds.h);
+ m_current_quadtree_node = m_document.GetQuadTree().GetNeighbour(m_current_quadtree_node, 1, 0, &m_document);
+ }
+ if (m_bounds.h + m_bounds.y > 0.5)
+ {
+ m_bounds = Rect(m_bounds.x, m_bounds.y - 1, m_bounds.w, m_bounds.h);
+ m_current_quadtree_node = m_document.GetQuadTree().GetNeighbour(m_current_quadtree_node, 0, 1, &m_document);
+ }
+ }
+
if (ContainedInQuadChild(m_bounds, QTC_TOP_LEFT))
{
if (m_document.GetQuadTree().nodes[m_current_quadtree_node].top_left == QUADTREE_EMPTY)
{
m_bounds = Rect(m_bounds.x - 1, m_bounds.y - 1, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, -1, -1), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, -1, -1, &m_document), remaining_depth - 1);
}
+ m_bounds = old_bounds;
if (m_bounds.Intersects(Rect(-1,0,1,1)))
{
m_bounds = Rect(m_bounds.x - 1, m_bounds.y, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, -1, 0), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, -1, 0, &m_document), remaining_depth - 1);
}
+ m_bounds = old_bounds;
if (m_bounds.Intersects(Rect(-1,1,1,1)))
{
m_bounds = Rect(m_bounds.x - 1, m_bounds.y + 1, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, -1, 1), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, -1, 1, &m_document), remaining_depth - 1);
}
+ m_bounds = old_bounds;
if (m_bounds.Intersects(Rect(0,-1,1,1)))
{
m_bounds = Rect(m_bounds.x, m_bounds.y - 1, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 0, -1), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 0, -1, &m_document), remaining_depth - 1);
}
+ m_bounds = old_bounds;
if (m_bounds.Intersects(Rect(0,1,1,1)))
{
m_bounds = Rect(m_bounds.x, m_bounds.y + 1, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 0, 1), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 0, 1, &m_document), remaining_depth - 1);
}
+ m_bounds = old_bounds;
if (m_bounds.Intersects(Rect(1,-1,1,1)))
{
m_bounds = Rect(m_bounds.x + 1, m_bounds.y - 1, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 1, -1), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 1, -1, &m_document), remaining_depth - 1);
}
+ m_bounds = old_bounds;
if (m_bounds.Intersects(Rect(1,0,1,1)))
{
m_bounds = Rect(m_bounds.x + 1, m_bounds.y, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 1, 0), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 1, 0, &m_document), remaining_depth - 1);
}
+ m_bounds = old_bounds;
if (m_bounds.Intersects(Rect(1,1,1,1)))
{
m_bounds = Rect(m_bounds.x + 1, m_bounds.y + 1, m_bounds.w, m_bounds.h);
m_bounds_dirty = true;
- RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 1, 1), remaining_depth - 1);
+ RenderQuadtreeNode(width, height, m_document.GetQuadTree().GetNeighbour(node, 1, 1, &m_document), remaining_depth - 1);
}
m_bounds = old_bounds;
m_bounds_dirty = true;
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
//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);
}
BufferBuilder<GPUObjBounds> 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;
(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();
}
/**
m_object_renderers[i]->FinaliseBuffers();
}
if (UsingGPURendering())
+ {
dynamic_cast<BezierRenderer*>(m_object_renderers[BEZIER])->PrepareBezierGPUBuffer(m_document.m_objects);
+ }
m_render_dirty = false;
}