- // Draw some grid lines at fixed pixel positions
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(0.0, 1.0, 1.0, 0.0, -1.f, 1.f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glColor4f(0.9,0.9,0.9,0.1);
- const float num_lines = 50.0;
- for (float i = 0; i < num_lines; ++i)
- {
- glBegin(GL_LINES);
- glVertex2f(i*(1.0/num_lines), 0.0);
- glVertex2f(i*(1.0/num_lines), 1.0);
- glEnd();
- glBegin(GL_LINES);
- glVertex2f(0.0,i*(1.0/num_lines));
- glVertex2f(1.0,i*(1.0/num_lines));
- glEnd();
-
+ 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;
+}
+
+/**
+ * Render the view
+ * Updates FrameBuffer if the document, object bounds, or view bounds have changed, then Blits it
+ * Otherwise just Blits the cached FrameBuffer
+ * @param width - Width of View to render
+ * @param height - Height of View to render
+ */
+void View::Render(int width, int height)
+{
+ // View dimensions have changed (ie: Window was resized)
+ int prev_width = m_cached_display.GetWidth();
+ int prev_height = m_cached_display.GetHeight();
+ if (width != prev_width || height != prev_height)
+ {
+ m_cached_display.Create(width, height);
+ m_bounds_dirty = true;
+ }
+
+ // View bounds have not changed; blit the FrameBuffer as it is
+ if (!m_bounds_dirty)
+ {
+ m_cached_display.UnBind();
+ m_cached_display.Blit();
+ return;
+ }
+ m_cached_display.Bind(); //NOTE: This is redundant; Clear already calls Bind
+ m_cached_display.Clear();
+
+#ifndef QUADTREE_DISABLED
+ if (m_bounds_dirty)
+ {
+ if (ContainedInQuadChild(m_bounds, QTC_TOP_LEFT) && m_document.GetQuadTree().nodes[m_current_quadtree_node].top_left != QUADTREE_EMPTY)
+ {
+ m_bounds = TransformToQuadChild(m_bounds, QTC_TOP_LEFT);
+ m_current_quadtree_node = m_document.GetQuadTree().nodes[m_current_quadtree_node].top_left;
+ }
+ if ((m_bounds.w > 1 || m_bounds.h > 1) && m_document.GetQuadTree().nodes[m_current_quadtree_node].parent != QUADTREE_EMPTY)
+ {
+ m_bounds = TransformFromQuadChild(m_bounds, m_document.GetQuadTree().nodes[m_current_quadtree_node].child_type);
+ m_current_quadtree_node = m_document.GetQuadTree().nodes[m_current_quadtree_node].parent;
+ }
+ }
+ m_screen.DebugFontPrintF("Current View QuadTree Node: %d\n", m_current_quadtree_node);
+#endif
+
+ if (!m_use_gpu_rendering)
+ {
+ // Dynamically resize CPU rendering target pixels if needed
+ if (m_cpu_rendering_pixels == NULL || width*height > prev_width*prev_height)
+ {
+ delete [] m_cpu_rendering_pixels;
+ m_cpu_rendering_pixels = new uint8_t[width*height*4];
+ if (m_cpu_rendering_pixels == NULL)
+ Fatal("Could not allocate %d*%d*4 = %d bytes for cpu rendered pixels", width, height, width*height*4);
+ }
+ // Clear CPU rendering pixels
+ for (int i = 0; i < width*height*4; ++i)
+ m_cpu_rendering_pixels[i] = 255;