All Downloads are FREE. Search and download functionalities are using the official Maven repository.

it.tidalwave.geo.viewer.spi.feature.FeaturesRenderer Maven / Gradle / Ivy

/***********************************************************************************************************************
 *
 * forceTen - open source geography
 * Copyright (C) 2007-2012 by Tidalwave s.a.s. (http://www.tidalwave.it)
 *
 ***********************************************************************************************************************
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations under the License.
 *
 ***********************************************************************************************************************
 *
 * WWW: http://forceten.tidalwave.it
 * SCM: https://bitbucket.org/tidalwave/forceten-src
 *
 **********************************************************************************************************************/
package it.tidalwave.geo.viewer.spi.feature;

import it.tidalwave.geo.viewer.impl.feature.DefaultFeatureRenderer;
import java.util.HashMap;
import java.util.Map;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.annotation.Nonnull;

/***********************************************************************************************************************
 *
 * @author  Fabrizio Giudici
 * @version $Id$
 *
 **********************************************************************************************************************/
public class FeaturesRenderer implements FeatureRenderer
  {
    private static final Dimension DUMMY_SIZE = new Dimension();

    private final Map, FeatureRenderer> rendererMapByFeatureClass = new HashMap, FeatureRenderer>();

    private final DefaultFeatureRenderer fallBackRenderer = new DefaultFeatureRenderer();

    /***************************************************************************
     *
     * Creates an icon out of a waypoint.
     *
     * @param  waypoint  the waypoint
     * @param  size      a holder where the size of the waypoint will be stored
     *
     * *************************************************************************/
    @Nonnull
    public BufferedImage makeIcon (final @Nonnull Object waypoint, final boolean pedestal, final @Nonnull Dimension size)
      {
        paintFeature(null, waypoint, 0, 0, pedestal, size); // asks for size
        final BufferedImage image = new BufferedImage((int)size.getWidth(), (int)size.getHeight(), BufferedImage.TYPE_INT_ARGB);
        final Graphics2D g = image.createGraphics();

        try
          {
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            paintFeature(g, waypoint, 0, 0, pedestal, size);
          }
        finally
          {
            g.dispose();
          }

        return image;
      }

    @Override
    public boolean paintFeature (final Graphics2D g,
                                 final Object feature,
                                 final int x,
                                 final int y,
                                 final boolean pedestal,
                                 final Dimension size)
      {
        return findRenderer(feature).paintFeature(g, feature, x, y, pedestal, (size != null) ? size : DUMMY_SIZE);
      }

    private FeatureRenderer findRenderer (final Object feature)
      {
        FeatureRenderer renderer = (FeatureRenderer)rendererMapByFeatureClass.get(feature.getClass());

        if (renderer == null)
          {
            for (final Class clazz : feature.getClass().getInterfaces())
              {
                renderer = (FeatureRenderer)rendererMapByFeatureClass.get(clazz);

                if (renderer != null)
                  {
                    break;
                  }
              }

            if (renderer == null)
              {
                renderer = fallBackRenderer;
              }

            rendererMapByFeatureClass.put(feature.getClass(), renderer);
          }

        return renderer;
      }
  }