SinglePixelSet class

Пакет: com.hypixel.hytale.server.worldgen.zoom

Файл: com/hypixel/hytale/server/worldgen/zoom/PixelDistanceProvider.java

implements: PixelDistanceProvider.IPixelSet

Поля (1)

МодификаторыТипИмя
private final int pixel

Методы (3)

МодификаторыВозвратСигнатура
public boolean containspublic boolean contains(int var1)
public int sizepublic int size()
public String toStringpublic String toString()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.zoom;

class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import javax.annotation.Nonnull;

class="kw">public class PixelDistanceProvider {
   class="kw">private class="kw">static class="kw">final int TABLE_SIZE = 8;
   @Nonnull
   class="kw">protected class="kw">final PixelProvider image;
   class="kw">protected class="kw">final int width;
   class="kw">protected class="kw">final int height;
   class="kw">protected class="kw">final int cellsX;
   class="kw">protected class="kw">final int cellsY;
   @Nonnull
   class="kw">protected class="kw">final PixelDistanceProvider.IPixelSet[] table;
   @Nonnull
   class="kw">protected class="kw">final IntSet pixels;

   class="kw">public PixelDistanceProvider(@Nonnull PixelProvider var1) {
      this.image = var1;
      this.width = var1.getWidth();
      this.height = var1.getHeight();
      this.cellsX = var1.getWidth() / 8;
      this.cellsY = var1.getHeight() / 8;
      this.table = new PixelDistanceProvider.IPixelSet[this.cellsX * this.cellsY];
      this.pixels = new IntOpenHashSet();
      this.prepareSegmentTable();
   }

   @Nonnull
   class="kw">public IntSet getColors() {
      class="kw">return this.pixels;
   }

   class="kw">public double distanceSqToDifferentPixel(double var1, double var3, int var5, int var6) {
      var5 = this.clampX(var5);
      var6 = this.clampY(var6);
      int var7 = this.image.getPixel(var5, var6);
      int var8 = var5 / 8;
      int var9 = var6 / 8;
      double var10 = Double.POSITIVE_INFINITY;
      int var12 = Math.max(var8 - 1, 0);
      int var13 = Math.min(var8 + 2, this.cellsX);
      int var14 = Math.max(var9 - 1, 0);
      int var15 = Math.min(var9 + 2, this.cellsY);

      for (int var16 = var12; var16 < var13; var16++) {
         for (int var17 = var14; var17 < var15; var17++) {
            double var18 = this.distanceSqToDiffInSeq(var1, var3, var7, var16, var17);
            if (var18 < var10) {
               var10 = var18;
            }
         }
      }

      class="kw">return var10;
   }

   class="kw">protected double distanceSqToDiffInSeq(double var1, double var3, int var5, int var6, int var7) {
      double var8 = Double.POSITIVE_INFINITY;
      if (this.hasDifferentPixel(var6, var7, var5)) {
         int var10 = var6 * 8;
         int var11 = var7 * 8;

         for (int var12 = 0; var12 < 8; var12++) {
            int var13 = var12 + var10;

            for (int var14 = 0; var14 < 8; var14++) {
               int var15 = var14 + var11;
               if (var5 != this.image.getPixel(var13, var15)) {
                  double var16 = distanceSqToPixel(var1, var3, var13, var15);
                  if (var16 < var8) {
                     var8 = var16;
                  }
               }
            }
         }
      }

      class="kw">return var8;
   }

   class="kw">protected boolean hasDifferentPixel(int var1, int var2, int var3) {
      PixelDistanceProvider.IPixelSet var4 = this.table[this.cellIndex(var1, var2)];
      class="kw">return !var4.contains(var3) || var4.size() > 1;
   }

   class="kw">private void prepareSegmentTable() {
      for (int var1 = 0; var1 < this.cellsX; var1++) {
         for (int var2 = 0; var2 < this.cellsY; var2++) {
            IntSet var3 = new IntOpenHashSet();
            int var4 = var1 * 8;
            int var5 = var2 * 8;

            for (int var6 = 0; var6 < 8; var6++) {
               for (int var7 = 0; var7 < 8; var7++) {
                  int var8 = var6 + var4;
                  int var9 = var7 + var5;
                  if (var8 < this.width && var9 < this.height) {
                     var3.add(this.image.getPixel(var8, var9));
                  }
               }
            }

            this.pixels.addAll(var3);
            if (var3.size() == 1) {
               this.table[this.cellIndex(var1, var2)] = new PixelDistanceProvider.SinglePixelSet(var3.iterator().nextInt());
            } else {
               this.table[this.cellIndex(var1, var2)] = new PixelDistanceProvider.MultiplePixelSet(var3);
            }
         }
      }
   }

   class="kw">protected int clampX(int var1) {
      if (var1 < 0) {
         class="kw">return 0;
      } else {
         class="kw">return var1 >= this.width ? this.width - 1 : var1;
      }
   }

   class="kw">protected int clampY(int var1) {
      if (var1 < 0) {
         class="kw">return 0;
      } else {
         class="kw">return var1 >= this.height ? this.height - 1 : var1;
      }
   }

   class="kw">protected int cellIndex(int var1, int var2) {
      class="kw">return var1 * this.cellsY + var2;
   }

   class="kw">private class="kw">static double distanceSqToPixel(double var0, double var2, int var4, int var5) {
      double var6 = Math.max(Math.max(var4 - var0, var0 - var4 - 1.0), 0.0);
      double var8 = Math.max(Math.max(var5 - var2, var2 - var5 - 1.0), 0.0);
      class="kw">return var6 * var6 + var8 * var8;
   }

   class="kw">private class="kw">interface IPixelSet {
      boolean contains(int var1);

      int size();
   }

   class="kw">private class="kw">static class MultiplePixelSet class="kw">implements PixelDistanceProvider.IPixelSet {
      class="kw">private class="kw">final IntSet pixels;

      MultiplePixelSet(IntSet var1) {
         this.pixels = var1;
      }

      @Override
      class="kw">public boolean contains(int var1) {
         class="kw">return this.pixels.contains(var1);
      }

      @Override
      class="kw">public int size() {
         class="kw">return this.pixels.size();
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return "MultiplePixelSet{pixels=" + this.pixels + "}";
      }
   }

   class="kw">private class="kw">static class SinglePixelSet class="kw">implements PixelDistanceProvider.IPixelSet {
      class="kw">private class="kw">final int pixel;

      SinglePixelSet(int var1) {
         this.pixel = var1;
      }

      @Override
      class="kw">public boolean contains(int var1) {
         class="kw">return this.pixel == var1;
      }

      @Override
      class="kw">public int size() {
         class="kw">return 1;
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return "SinglePixelSet{pixel=" + this.pixel + "}";
      }
   }
}