Make sure that the transparent color is first in the colormap so that
Java's png encoder doesn't get confused and merge black pixels into the transparency. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2636 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: Quantize.java,v 1.2 2003/05/29 03:08:37 ray Exp $
|
// $Id: Quantize.java,v 1.3 2003/06/04 05:56:58 ray Exp $
|
||||||
package com.threerings.media.image;
|
package com.threerings.media.image;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -483,9 +483,7 @@ public class Quantize {
|
|||||||
* the index of this node's mean color in the color map.
|
* the index of this node's mean color in the color map.
|
||||||
*/
|
*/
|
||||||
void assignment() {
|
void assignment() {
|
||||||
colormap = new int[colors + (hasTrans ? 1 : 0)];
|
colormap = new int[colors];
|
||||||
int transColor = colors;
|
|
||||||
|
|
||||||
colors = 0;
|
colors = 0;
|
||||||
root.colormap();
|
root.colormap();
|
||||||
|
|
||||||
@@ -495,6 +493,8 @@ public class Quantize {
|
|||||||
int height = pixels[0].length;
|
int height = pixels[0].length;
|
||||||
|
|
||||||
Search search = new Search();
|
Search search = new Search();
|
||||||
|
|
||||||
|
int transPad = hasTrans ? 1 : 0;
|
||||||
|
|
||||||
// convert to indexed color
|
// convert to indexed color
|
||||||
for (int x = width; x-- > 0; ) {
|
for (int x = width; x-- > 0; ) {
|
||||||
@@ -502,7 +502,7 @@ public class Quantize {
|
|||||||
int pixel = pixels[x][y];
|
int pixel = pixels[x][y];
|
||||||
int alpha = (pixel >> 24) & 0xFF;
|
int alpha = (pixel >> 24) & 0xFF;
|
||||||
if (alpha != 255) {
|
if (alpha != 255) {
|
||||||
pixels[x][y] = transColor; // transparent
|
pixels[x][y] = 0; // transparent
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
int red = (pixel >> 16) & 0xFF;
|
int red = (pixel >> 16) & 0xFF;
|
||||||
@@ -525,15 +525,22 @@ public class Quantize {
|
|||||||
// if QUICK is set, just use that
|
// if QUICK is set, just use that
|
||||||
// node. Strictly speaking, this isn't
|
// node. Strictly speaking, this isn't
|
||||||
// necessarily best match.
|
// necessarily best match.
|
||||||
pixels[x][y] = node.color_number;
|
pixels[x][y] = node.color_number + transPad;
|
||||||
} else {
|
} else {
|
||||||
// Find the closest color.
|
// Find the closest color.
|
||||||
search.distance = Integer.MAX_VALUE;
|
search.distance = Integer.MAX_VALUE;
|
||||||
node.parent.closestColor(red, green, blue, search);
|
node.parent.closestColor(red, green, blue, search);
|
||||||
pixels[x][y] = search.color_number;
|
pixels[x][y] = search.color_number + transPad;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// expand the colormap by one to account for the transparent
|
||||||
|
if (hasTrans) {
|
||||||
|
int[] newcmap = new int[colormap.length + 1];
|
||||||
|
System.arraycopy(colormap, 0, newcmap, 1, colormap.length);
|
||||||
|
colormap = newcmap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user