• Views
  • Iteration Report
  • My Iteration Report
  •  
OMERO.server
  • Login
  • Help/Guide
  • About Trac
  • Preferences
  • Wiki
  • Timeline
  • Roadmap
  • Browse Source
  • View Tickets
  • Search

Context Navigation

  • ← Previous Change
  • Next Change →

Changeset 1636 for branches/3.0-Beta2/components/rendering/src/omeis/providers/re/GreyScaleStrategy.java

Show
Ignore:
Timestamp:
06/13/07 10:20:37 (18 months ago)
Author:
callan
Message:

Merging trunk I/O fixes into the milestone:3.0-Beta2 branch:

  • r1586:1587
  • r1591:1592
  • r1593:1594
  • Manual merge of GreyScaleStrategy
Files:
1 modified

  • branches/3.0-Beta2/components/rendering/src/omeis/providers/re/GreyScaleStrategy.java (modified) (5 diffs)

Legend:

Unmodified
Added
Removed
  • branches/3.0-Beta2/components/rendering/src/omeis/providers/re/GreyScaleStrategy.java

    r1608 r1636  
    1616 
    1717// Application-internal dependencies 
    18 import ome.conditions.ResourceError; 
    1918import ome.io.nio.PixelBuffer; 
    2019import ome.model.core.Pixels; 
    2120import ome.model.display.ChannelBinding; 
    22 import ome.model.display.Color; 
    2321import omeis.providers.re.codomain.CodomainChain; 
    2422import omeis.providers.re.data.PlaneFactory; 
    … …  
    4442    /** The logger for this particular class */ 
    4543    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     
    4751    /** 
    4852     * Initializes the <code>sizeX1</code> and <code>sizeX2</code> fields 
    … …  
    7680 
    7781    /** 
    78      * Renders the specified wavelength (channel). 
    79      *  
    80      * @param dataBuf 
    81      *            The buffer to hold the output image's data. 
    82      * @param plane 
    83      *            Defines the plane to render. 
    84      * @param qs 
    85      *            Knows how to quantize a pixel intensity value. 
    86      * @param color 
    87      *            The color components used when mapping a quantized value onto 
    88      *            the color space. 
    89      * @throws QuantizationException 
    90      *             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 arrays 
    98         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 << 16 
    107                             | discreteValue << 8 | discreteValue; 
    108                 } 
    109             } 
    110         } else // We have just a plain RGBBuffer 
    111         { 
    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     /** 
    13282     * Implemented as specified by the superclass. 
    13383     *  
    … …  
    13989        // Set the context and retrieve objects we're gonna use. 
    14090        renderer = ctx; 
     91        findFirstActiveChannelBinding(); 
     92        PixelBuffer pixels = renderer.getPixels(); 
    14193        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); 
    142104 
    143105        // Initialize sizeX1 and sizeX2 according to the plane definition and 
    … …  
    145107        initAxesSize(planeDef, metadata); 
    146108        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        } 
    149147        return buf; 
    150148    } 
    151  
    152     /** 
    153     * Implemented as specified by the superclass. 
    154     *  
    155     * @see RenderingStrategy#render(Renderer ctx, PlaneDef planeDef) 
    156     */ 
    157     @Override 
    158     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 { 
    160158        // Set the context and retrieve objects we're gonna use. 
    161159        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(); 
    181161        PixelBuffer pixels = renderer.getPixels(); 
    182162        Pixels metadata = renderer.getMetadata(); 
    183         ChannelBinding[] cBindings = renderer.getChannelBindings(); 
    184163        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        } 
    216226 
    217227    /** 

Download in other formats:

  • Unified Diff
  • Zip Archive

Trac Powered

Powered by Trac 0.11
By Edgewall Software.

Visit the Trac open source project at
http://trac.edgewall.org/