20 package net.sf.gridarta.model.face;
22 import java.awt.Point;
23 import java.awt.Polygon;
24 import java.awt.image.ColorModel;
25 import java.awt.image.ImageFilter;
26 import org.jetbrains.annotations.NotNull;
54 private int @NotNull []
raster =
new int[0];
56 private int @NotNull []
pixels =
new int[0];
59 private static final Point @NotNull []
point = {
new Point(),
new Point(),
new Point(),
new Point() };
62 private static final Point @NotNull []
point2 = {
new Point(),
new Point(),
new Point(),
new Point() };
64 private static final double @NotNull []
slope = { 0.0, 0.0, 0.0, 0.0 };
66 private final int @NotNull []
stdTileHalfLen = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0 };
69 private static final Polygon
polygon =
new Polygon();
86 super.setDimensions(
width, newHeight);
91 super.setHints(COMPLETESCANLINES | TOPDOWNLEFTRIGHT);
95 public void setPixels(
final int x,
final int y,
final int w,
final int h, @NotNull
final ColorModel model,
final byte @NotNull []
pixels,
final int off,
final int scansize) {
97 int dstOff = y *
width + x;
98 for (
int yc = 0; yc < h; yc++) {
99 for (
int xc = 0; xc < w; xc++) {
100 this.pixels[dstOff++] = model.getRGB(
pixels[srcOff++] & 0xff);
102 srcOff += scansize - w;
108 public void setPixels(
final int x,
final int y,
final int w,
final int h, @NotNull
final ColorModel model, @NotNull
final int @NotNull []
pixels,
final int off,
final int scansize) {
110 int dstOff = y *
width + x;
111 for (
int yc = 0; yc < h; yc++) {
112 for (
int xc = 0; xc < w; xc++) {
113 this.pixels[dstOff++] = model.getRGB(
pixels[srcOff++]);
115 srcOff += scansize - w;
120 private static void determineLine(
final int idx,
final int sx,
final int sy,
final int ex,
final int ey) {
125 final double xDiff = Math.abs(sx - ex);
126 final double yDiff = Math.abs(sy - ey);
127 slope[idx] = xDiff == 0 ? 0.0 : yDiff / xDiff;
130 private static void determineLines(
final int n,
final int e,
final int s,
final int w) {
146 final int n = (int) (
stretch >> 24) & 0xff;
147 final int e = (int) (
stretch >> 16) & 0xff;
148 final int w = (int) (
stretch >> 8) & 0xff;
149 final int s = (int)
stretch & 0xff;
165 private void copyPixelToPixel(
final int x,
final int y,
final int x2,
final int y2,
final double brightness,
final int wd,
final int ht,
final int wd2,
final int ht2, @NotNull
final ColorModel model) {
166 if (x < 0 || y < 0 || x2 < 0 || y2 < 0 || x >= wd || x2 >= wd2 || y >= ht || y2 >= ht2) {
170 final int color = model.getRGB(
pixels[y * wd + x]);
172 final int a = (color >> 24) & 0xff;
176 final int r1 = (color >> 16) & 0xff;
177 final int g1 = (color >> 8) & 0xff;
178 final int b1 = color & 0xff;
180 final int r = Math.min(255, (
int) (r1 * brightness));
181 final int g = Math.min(255, (
int) (g1 * brightness));
182 final int b = Math.min(255, (
int) (b1 * brightness));
183 raster[y2 * wd2 + x2] = (a << 24) | (r << 16) | (g << 8) | b;
186 private void copyVerticalLine(
final int srcX,
final int srcSy,
final int srcEy,
final int destX,
final int destSy,
final int destEy,
final double brightness,
final boolean extra,
final int wd,
final int ht,
final int wd2,
final int ht2, @NotNull
final ColorModel model) {
187 final int minSrcY = Math.min(srcSy, srcEy);
188 final int maxSrcY = Math.max(srcSy, srcEy);
189 final int minDestY = Math.min(destSy, destEy);
190 final int maxDestY = Math.max(destSy, destEy);
191 final int srcH = maxSrcY - minSrcY;
192 final int destH = maxDestY - minDestY;
195 copyPixelToPixel(srcX, srcH == 0 ? minSrcY : (maxSrcY - minSrcY) / 2, destX, minDestY, brightness, wd, ht, wd2, ht2, model);
200 final int pixel = model.getRGB(
pixels[minSrcY * wd + srcX]);
201 for (
int y = minDestY; y <= maxDestY; y++) {
202 raster[y * wd2 + destX] = pixel;
208 final double ratio = srcH / (double) destH;
210 for (
int y = 0; y <= destH; y++) {
211 final int goY = minDestY + y;
212 final int getY = (int) (minSrcY + (y * ratio));
213 copyPixelToPixel(srcX, getY, destX, goY, brightness, wd, ht, wd2, ht2, model);
216 if (extra && maxDestY + 1 < ht2) {
217 copyPixelToPixel(srcX, maxSrcY, destX, maxDestY + 1, brightness, wd, ht, wd2, ht2, model);
221 private void stretch(
final int wd,
final int ht, @NotNull
final ColorModel model) {
228 final int ht2 = ht + n;
230 final boolean flat = n != 0 || e != 0 || w != 0 || s != 0;
235 wDark = 1.0 - ((w - e) / 25.0);
236 eDark = n > 0 || s > 0 ? wDark : 1.0;
238 eDark = 1.0 + ((e - w) / 25.0);
239 wDark = s > 0 || n > 0 ? eDark : 1.0;
247 for (
int lnNum = 0; lnNum < 4; lnNum += 2) {
248 final int destSx =
point[lnNum].x;
249 final int destSy =
point[lnNum].y;
250 final int destEx =
point2[lnNum].x;
251 final int destEy =
point2[lnNum].y;
252 final double destSlope =
slope[lnNum];
254 final int destSy2 =
point[lnNum + 1].y;
255 final int destEy2 =
point2[lnNum + 1].y;
256 final double destSlope2 =
slope[lnNum + 1];
258 final int destYInc = destSy > destEy ? -1 : 1;
259 final int destXInc = destSx > destEx ? -1 : 1;
260 final int destYInc2 = destSy2 > destEy2 ? -1 : 1;
266 double kicker2 = 0.0;
267 boolean atLeastOne =
false;
269 while ((destSlope != 0.0 && dx != destEx && dy != destEy) || (!atLeastOne && destSlope == 0.0)) {
277 if (kicker2 >= 1.0) {
284 copyVerticalLine(dx, 11 + srcLen, 11 - srcLen, dx, dy, y2, lnNum < 2 ? wDark : eDark, flat, wd, ht, wd2, ht2, model);
289 kicker2 += destSlope2;
293 for (
int dx = 22; dx < 22 + 2; dx++) {
294 copyVerticalLine(dx, 0, 23, dx, 0, 23 + n - s, wDark, flat, wd, ht, wd2, ht2, model);
297 for (
int dx = 24; dx < 24 + 2; dx++) {
298 copyVerticalLine(dx, 0, 23, dx, 0, 23 + n - s, eDark, flat, wd, ht, wd2, ht2, model);
301 for (
int dx = 0; dx < 2; dx++) {
305 for (
int dx = 46; dx < 48; dx++) {
312 if (status != IMAGEERROR && status != IMAGEABORTED) {
316 super.imageComplete(status);