Changeset 221 in josm for src/org/openstreetmap


Ignore:
Timestamp:
2007-04-27T21:27:20+02:00 (17 years ago)
Author:
framm
Message:

Speed up rendering by determining crucial preference settings once instead of for every segment drawn. Patch by eai@….

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java

    r211 r221  
    44import java.awt.Graphics;
    55import java.awt.Point;
     6import java.awt.Rectangle;
     7import java.awt.geom.Line2D;
    68
    79import org.openstreetmap.josm.Main;
     
    6870         */
    6971        public void visit(Segment ls) {
    70                 drawSegment(ls, getPreferencesColor("segment", darkgreen));
     72                drawSegment(ls, getPreferencesColor("segment", darkgreen), Main.pref.getBoolean("draw.segment.direction"));
    7173        }
    7274
     
    8587                }
    8688
     89                boolean showDirectionArrow = Main.pref.getBoolean("draw.segment.direction");
     90                boolean showOrderNumber = Main.pref.getBoolean("draw.segment.order_number");
    8791                int orderNumber = 0;
    8892                for (Segment ls : w.segments) {
    8993                        orderNumber++;
    9094                        if (!ls.selected) // selected already in good color
    91                                 drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.WHITE) : wayColor);
    92                         if (!ls.incomplete && Main.pref.getBoolean("draw.segment.order_number"))
     95                                drawSegment(ls, w.selected ? getPreferencesColor("selected", Color.WHITE) : wayColor, showDirectionArrow);
     96                        if (!ls.incomplete && showOrderNumber)
    9397                                drawOrderNumber(ls, orderNumber);
    9498                }
     
    104108                int x = (p1.x+p2.x)/2 - 4*strlen;
    105109                int y = (p1.y+p2.y)/2 + 4;
    106                 Color c = g.getColor();
    107                 g.setColor(Color.black);
    108                 g.fillRect(x-1,y-12,8*strlen+1,14);
    109                 g.setColor(c);
    110                 g.drawString(""+orderNumber,x,y);
     110
     111                Rectangle screen = g.getClipBounds();
     112                if (screen.contains(x,y)) {
     113                        Color c = g.getColor();
     114                        g.setColor(getPreferencesColor("background", Color.BLACK));
     115                        g.fillRect(x-1, y-12, 8*strlen+1, 14);
     116                        g.setColor(c);
     117                        g.drawString(""+orderNumber, x, y);
     118                }
    111119    }
    112120
     
    120128                Point p = nc.getPoint(n.eastNorth);
    121129                g.setColor(color);
    122                 g.drawRect(p.x-1, p.y-1, 2, 2);
     130                Rectangle screen = g.getClipBounds();
     131
     132                if ( screen.contains(p.x, p.y) )
     133                        g.drawRect(p.x-1, p.y-1, 2, 2);
    123134        }
    124135
     
    126137         * Draw a line with the given color.
    127138         */
    128         protected void drawSegment(Segment ls, Color col) {
     139        protected void drawSegment(Segment ls, Color col, boolean showDirection) {
    129140                if (ls.incomplete)
    130141                        return;
     
    134145                Point p1 = nc.getPoint(ls.from.eastNorth);
    135146                Point p2 = nc.getPoint(ls.to.eastNorth);
    136                 g.drawLine(p1.x, p1.y, p2.x, p2.y);
    137 
    138                 if (Main.pref.getBoolean("draw.segment.direction")) {
    139                         double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
    140                 g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
    141                 g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
     147               
     148                Rectangle screen = g.getClipBounds();
     149                Line2D line = new Line2D.Double(p1.x, p1.y, p2.x, p2.y);
     150                if (screen.contains(p1.x, p1.y, p2.x, p2.y) || screen.intersectsLine(line))
     151                {
     152                        g.drawLine(p1.x, p1.y, p2.x, p2.y);
     153       
     154                        if (showDirection) {
     155                                double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
     156                        g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI)));
     157                        g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI)));
     158                        }
    142159                }
    143160        }
Note: See TracChangeset for help on using the changeset viewer.