David's final changes: more profiler features, fixes.
[ipdf/code.git] / src / objectrenderer.cpp
index 6a216bc..c0c44b6 100644 (file)
@@ -243,14 +243,14 @@ void BezierRenderer::RenderBezierOnCPU(const Bezier & relative, const Rect & bou
                ObjectRenderer::RenderLineOnCPU(pix_bounds.x+pix_bounds.w, pix_bounds.y, pix_bounds.x+pix_bounds.w, pix_bounds.y+pix_bounds.h, target, Colour(0,255,0,0));
        }
        
-       unsigned blen = pix_bounds.w;//min(max(2U, (unsigned)Int64(Real(target.w)/view.GetBounds().w)), 
+       int64_t blen =  min((int64_t)50,pix_bounds.w);//min(max(2U, (unsigned)Int64(Real(target.w)/view.GetBounds().w)), 
                        //min((unsigned)(pix_bounds.w+pix_bounds.h)/4 + 1, 100U));
                
                // DeCasteljau Divide the Bezier
        #ifdef BEZIER_CPU_DECASTELJAU
        queue<Bezier> divisions;
        divisions.push(control);
-       while(divisions.size() < blen)
+       while(divisions.size() < (uint64_t)(blen))
        {
                Bezier & current = divisions.front();
                //if (current.GetType() == Bezier::LINE)
@@ -328,7 +328,7 @@ void BezierRenderer::RenderUsingCPU(Objects & objects, const View & view, const
                                        break;
                        }
                }
-               Rect & bounds = objects.bounds[m_indexes[i]];
+               Rect bounds = view.TransformToViewCoords(objects.bounds[m_indexes[i]]);
                Bezier & bez = objects.beziers[objects.data_indices[m_indexes[i]]];
                RenderBezierOnCPU(bez, bounds, view, target, c);
        }
@@ -382,7 +382,14 @@ void BezierRenderer::RenderUsingGPU(unsigned first_obj_id, unsigned last_obj_id)
        if (m_indexes.empty()) return;
 
        unsigned first_index = 0;
-       while (m_indexes.size() > first_index && m_indexes[first_index] < first_obj_id) first_index ++;
+       while (m_indexes.size() > first_index && m_indexes[first_index] < first_obj_id)
+       {
+               unsigned new_index = (first_index + first_obj_id) / 2;
+               if (new_index != first_index && new_index < m_indexes.size() && m_indexes[new_index] < first_obj_id)
+                       first_index = new_index;
+               else
+                       first_index ++;
+       }
        unsigned last_index = first_index;
        while (m_indexes.size() > last_index && m_indexes[last_index] < last_obj_id) last_index ++;
 
@@ -390,6 +397,12 @@ void BezierRenderer::RenderUsingGPU(unsigned first_obj_id, unsigned last_obj_id)
        glUniform1i(m_shader_program.GetUniformLocation("bezier_buffer_texture"), 0);
        glUniform1i(m_shader_program.GetUniformLocation("bezier_id_buffer_texture"), 1);
        m_ibo.Bind();
+       
+       // To antialias the line... causes SIGFPE because why would anything make sense
+       //glEnable(GL_BLEND);
+       //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+       //glEnable(GL_LINE_SMOOTH);
+       //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
        glDrawElements(GL_LINES, (last_index-first_index)*2, GL_UNSIGNED_INT, (GLvoid*)(2*first_index*sizeof(uint32_t)));
 }
 
@@ -408,9 +421,10 @@ void PathRenderer::RenderUsingCPU(Objects & objects, const View & view, const CP
                if (m_indexes[i] >= last_obj_id) continue;
                
                
-               Rect bounds(CPURenderBounds(objects.bounds[m_indexes[i]], view, target));
-               PixelBounds pix_bounds(bounds);
+       
                Path & path = objects.paths[objects.data_indices[m_indexes[i]]];
+               Rect bounds(CPURenderBounds(path.GetBounds(objects), view, target));
+               PixelBounds pix_bounds(bounds);
                
                if (view.ShowingFillPoints())
                {
@@ -428,7 +442,7 @@ void PathRenderer::RenderUsingCPU(Objects & objects, const View & view, const CP
                        continue;
                for (unsigned b = path.m_start; b <= path.m_end; ++b)
                {
-                       Rect & bbounds = objects.bounds[b];
+                       Rect bbounds = view.TransformToViewCoords(objects.bounds[b]);
                        Bezier & bez = objects.beziers[objects.data_indices[b]];
                        BezierRenderer::RenderBezierOnCPU(bez,bbounds,view,target,path.m_stroke);
                }
@@ -640,4 +654,12 @@ void ObjectRenderer::FloodFillOnCPU(int64_t x, int64_t y, const PixelBounds & bo
        }
 }
 
+ObjectRenderer::PixelBounds::PixelBounds(const Rect & bounds)
+{
+       x = Int64(Double(bounds.x));
+       y = Int64(Double(bounds.y));
+       w = Int64(Double(bounds.w));
+       h = Int64(Double(bounds.h));
+}
+
 }

UCC git Repository :: git.ucc.asn.au