00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.faces;
00023
00024 import java.util.HashMap;
00025 import java.util.Map;
00026 import org.jetbrains.annotations.NotNull;
00027
00032 public class RawScale8d {
00033
00037 @NotNull
00038 private final int[] srcImage;
00039
00043 @NotNull
00044 private final int[] dstImage;
00045
00049 private final int width;
00050
00054 private final int height;
00055
00059 @NotNull
00060 private final Map<Integer, Integer> pixels = new HashMap<Integer, Integer>();
00061
00068 public RawScale8d(@NotNull final int[] imageData, final int dataWidth, final int dataHeight) {
00069 width = dataWidth;
00070 height = dataHeight;
00071 srcImage = imageData;
00072 dstImage = new int[imageData.length*4];
00073 }
00074
00081 private void setDestPixel(final int x, final int y, final int p) {
00082 dstImage[x+y*width/8] = p;
00083 }
00084
00091 private int getSourcePixel(final int x, final int y) {
00092 return srcImage[x+y*width];
00093 }
00094
00100 private void process(final int x, final int y) {
00101 pixels.clear();
00102 for (int dx = 0; dx < 8; dx++) {
00103 for (int dy = 0; dy < 8; dy++) {
00104 final int value = getSourcePixel(8*x+dx, 8*y+dy);
00105 if (value != 0) {
00106 final Integer count = pixels.get(value);
00107 pixels.put(value, count == null ? 1 : count+1);
00108 }
00109 }
00110 }
00111 int maxCount = 0;
00112 int maxPixel = 0;
00113 for (final Map.Entry<Integer, Integer> e : pixels.entrySet()) {
00114 final int thisCount = e.getValue();
00115 if (thisCount > maxCount) {
00116 maxCount = thisCount;
00117 maxPixel = e.getKey();
00118 }
00119 }
00120 pixels.clear();
00121
00122 setDestPixel(x, y, maxPixel);
00123 }
00124
00131 @NotNull
00132 public int[] getScaledData() {
00133 for (int x = 0; x < width/8; x++) {
00134 for (int y = 0; y < height/8; y++) {
00135 process(x, y);
00136 }
00137 }
00138
00139 return dstImage;
00140 }
00141
00142 }