Changeset 1636 for branches/3.0-Beta2/components/rendering/src/omeis/providers/re/GreyScaleStrategy.java
- Timestamp:
- 06/13/07 10:20:37 (18 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
branches/3.0-Beta2/components/rendering/src/omeis/providers/re/GreyScaleStrategy.java
r1608 r1636 16 16 17 17 // Application-internal dependencies 18 import ome.conditions.ResourceError;19 18 import ome.io.nio.PixelBuffer; 20 19 import ome.model.core.Pixels; 21 20 import ome.model.display.ChannelBinding; 22 import ome.model.display.Color;23 21 import omeis.providers.re.codomain.CodomainChain; 24 22 import omeis.providers.re.data.PlaneFactory; … … 44 42 /** The logger for this particular class */ 45 43 private static Log log = LogFactory.getLog(Renderer.class); 46 44 45 /** The channel we're operating on */ 46 private int channel; 47 48 /** The channel binding we're using */ 49 private ChannelBinding channelBinding; 50 47 51 /** 48 52 * Initializes the <code>sizeX1</code> and <code>sizeX2</code> fields … … 76 80 77 81 /** 78 * Renders the specified wavelength (channel).79 *80 * @param dataBuf81 * The buffer to hold the output image's data.82 * @param plane83 * Defines the plane to render.84 * @param qs85 * Knows how to quantize a pixel intensity value.86 * @param color87 * The color components used when mapping a quantized value onto88 * the color space.89 * @throws QuantizationException90 * If an error occurs while quantizing a pixels intensity value.91 */92 private void renderWave(RGBBuffer dataBuf, Plane2D plane, Color color,93 QuantumStrategy qs) throws QuantizationException {94 CodomainChain cc = renderer.getCodomainChain();95 int x1, x2, discreteValue, pixelIndex;96 97 // Perform optimised pixel settings for integer arrays98 if (dataBuf instanceof RGBIntBuffer) {99 int alpha = color.getAlpha();100 int[] buf = ((RGBIntBuffer) dataBuf).getDataBuffer();101 for (x2 = 0; x2 < sizeX2; ++x2) {102 int index = sizeX1 * x2;103 for (x1 = 0; x1 < sizeX1; ++x1) {104 discreteValue = qs.quantize(plane.getPixelValue(x1, x2));105 discreteValue = cc.transform(discreteValue);106 buf[index + x1] = alpha << 24 | discreteValue << 16107 | discreteValue << 8 | discreteValue;108 }109 }110 } else // We have just a plain RGBBuffer111 {112 byte value;113 float alpha = color.getAlpha().floatValue() / 255;114 byte[] r = dataBuf.getRedBand();115 byte[] g = dataBuf.getBlueBand();116 byte[] b = dataBuf.getGreenBand();117 for (x2 = 0; x2 < sizeX2; ++x2) {118 for (x1 = 0; x1 < sizeX1; ++x1) {119 pixelIndex = sizeX1 * x2 + x1;120 discreteValue = qs.quantize(plane.getPixelValue(x1, x2));121 discreteValue = cc.transform(discreteValue);122 value = (byte) (discreteValue * alpha);123 r[pixelIndex] = value;124 g[pixelIndex] = value;125 b[pixelIndex] = value;126 }127 }128 }129 }130 131 /**132 82 * Implemented as specified by the superclass. 133 83 * … … 139 89 // Set the context and retrieve objects we're gonna use. 140 90 renderer = ctx; 91 findFirstActiveChannelBinding(); 92 PixelBuffer pixels = renderer.getPixels(); 141 93 Pixels metadata = renderer.getMetadata(); 94 RenderingStats performanceStats = renderer.getStats(); 95 QuantumStrategy qs = 96 renderer.getQuantumManager().getStrategyFor(channel); 97 CodomainChain cc = renderer.getCodomainChain(); 98 99 // Retrieve the planar data to render 100 performanceStats.startIO(channel); 101 Plane2D plane = 102 PlaneFactory.createPlane(planeDef, channel, metadata, pixels); 103 performanceStats.endIO(channel); 142 104 143 105 // Initialize sizeX1 and sizeX2 according to the plane definition and … … 145 107 initAxesSize(planeDef, metadata); 146 108 RGBBuffer buf = getRgbBuffer(); 147 148 render(buf, planeDef); 109 110 byte value; 111 float alpha = channelBinding.getColor().getAlpha().floatValue() / 255; 112 113 int x1, x2, discreteValue, pixelIndex; 114 byte[] r = buf.getRedBand(); 115 byte[] g = buf.getBlueBand(); 116 byte[] b = buf.getGreenBand(); 117 if (plane.isXYPlanar()) 118 { 119 int planeSize = sizeX1 * sizeX2; 120 for (int i = 0; i < planeSize; i++) 121 { 122 for (x1 = 0; x1 < sizeX1; ++x1) 123 { 124 discreteValue = qs.quantize(plane.getPixelValue(i)); 125 discreteValue = cc.transform(discreteValue); 126 value = (byte) (discreteValue * alpha); 127 r[i] = value; 128 g[i] = value; 129 b[i] = value; 130 } 131 } 132 } 133 else 134 { 135 for (x2 = 0; x2 < sizeX2; ++x2) { 136 for (x1 = 0; x1 < sizeX1; ++x1) { 137 pixelIndex = sizeX1 * x2 + x1; 138 discreteValue = qs.quantize(plane.getPixelValue(x1, x2)); 139 discreteValue = cc.transform(discreteValue); 140 value = (byte) (discreteValue * alpha); 141 r[pixelIndex] = value; 142 g[pixelIndex] = value; 143 b[pixelIndex] = value; 144 } 145 } 146 } 149 147 return buf; 150 148 } 151 152 /** 153 * Implemented as specified by the superclass.154 *155 * @see RenderingStrategy#render(Renderer ctx, PlaneDef planeDef)156 */157 @Override158 RGBIntBuffer renderAsPackedInt(Renderer ctx, PlaneDef planeDef)159 throws IOException, QuantizationException {149 150 /** 151 * Implemented as specified by the superclass. 152 * 153 * @see RenderingStrategy#render(Renderer ctx, PlaneDef planeDef) 154 */ 155 @Override 156 RGBIntBuffer renderAsPackedInt(Renderer ctx, PlaneDef planeDef) 157 throws IOException, QuantizationException { 160 158 // Set the context and retrieve objects we're gonna use. 161 159 renderer = ctx; 162 Pixels metadata = renderer.getMetadata(); 163 164 // Initialize sizeX1 and sizeX2 according to the plane definition and 165 // create the RGB buffer. 166 initAxesSize(planeDef, metadata); 167 RGBIntBuffer buf = getIntBuffer(); 168 169 render(buf, planeDef); 170 return buf; 171 } 172 173 /** 174 * Implemented as specified by the superclass. 175 * 176 * @see RenderingStrategy#render(Renderer ctx, PlaneDef planeDef) 177 */ 178 private void render(RGBBuffer buf, PlaneDef planeDef) throws IOException, 179 QuantizationException { 180 QuantumManager qManager = renderer.getQuantumManager(); 160 findFirstActiveChannelBinding(); 181 161 PixelBuffer pixels = renderer.getPixels(); 182 162 Pixels metadata = renderer.getMetadata(); 183 ChannelBinding[] cBindings = renderer.getChannelBindings();184 163 RenderingStats performanceStats = renderer.getStats(); 185 186 // Process the first active wavelength. 187 Plane2D wData; 188 for (int i = 0; i < cBindings.length; i++) { 189 if (cBindings[i].getActive().booleanValue()) { 190 // Get the raw data. 191 performanceStats.startIO(i); 192 wData = PlaneFactory.createPlane(planeDef, i, metadata, pixels); 193 performanceStats.endIO(i); 194 195 try { // Transform it into an RGB image. 196 performanceStats.startRendering(); 197 renderWave(buf, wData, cBindings[i].getColor(), qManager 198 .getStrategyFor(i)); 199 performanceStats.endRendering(); 200 } catch (QuantizationException e) { 201 e.setWavelength(i); 202 throw e; 203 } 204 break; 205 } 206 } 207 // Make sure that the pixel buffer is cleansed properly. 208 try { 209 pixels.close(); 210 } catch (IOException e) { 211 log.error("IOException caught, throwing ResourceError", e.getCause()); 212 throw new ResourceError( 213 e.getMessage() + " Please check server log."); 214 } 215 } 164 QuantumStrategy qs = 165 renderer.getQuantumManager().getStrategyFor(channel); 166 CodomainChain cc = renderer.getCodomainChain(); 167 168 // Retrieve the planar data to render 169 performanceStats.startIO(channel); 170 Plane2D plane = 171 PlaneFactory.createPlane(planeDef, channel, metadata, pixels); 172 performanceStats.endIO(channel); 173 174 // Initialize sizeX1 and sizeX2 according to the plane definition and 175 // create the RGB buffer. 176 initAxesSize(planeDef, metadata); 177 RGBIntBuffer dataBuf = getIntBuffer(); 178 179 int alpha = channelBinding.getColor().getAlpha(); 180 int[] buf = ((RGBIntBuffer) dataBuf).getDataBuffer(); 181 int x1, x2, discreteValue, pixelIndex; 182 if (plane.isXYPlanar()) 183 { 184 int planeSize = sizeX1 * sizeX2; 185 for (int i = 0; i < planeSize; i++) 186 { 187 discreteValue = qs.quantize(plane.getPixelValue(i)); 188 discreteValue = cc.transform(discreteValue); 189 buf[i] = alpha << 24 | discreteValue << 16 190 | discreteValue << 8 | discreteValue; 191 } 192 } 193 else 194 { 195 for (x2 = 0; x2 < sizeX2; ++x2) { 196 pixelIndex = sizeX1 * x2; 197 for (x1 = 0; x1 < sizeX1; ++x1) { 198 discreteValue = qs.quantize(plane.getPixelValue(x1, x2)); 199 discreteValue = cc.transform(discreteValue); 200 buf[pixelIndex + x1] = alpha << 24 | discreteValue << 16 201 | discreteValue << 8 | discreteValue; 202 } 203 } 204 } 205 return dataBuf; 206 } 207 208 /** 209 * Initializes the first active channel binding for the current rendering 210 * context. 211 */ 212 private void findFirstActiveChannelBinding() 213 { 214 ChannelBinding[] channelBindings = renderer.getChannelBindings(); 215 for (int i = 0; i < channelBindings.length; i++) 216 { 217 if (channelBindings[i].getActive()) 218 { 219 channel = i; 220 channelBinding = channelBindings[i]; 221 return; 222 } 223 } 224 throw new IllegalArgumentException("No active channel bindings found."); 225 } 216 226 217 227 /**
