SetPixel.C

This demonstrates how pixels are addressed in the image buffer memory array.

/*
   Plugin Tutorial
   example 4 - SetPixel.C
   demonstrate individual pixel and channel addressing
*/

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <memory.h>
#include "cpi.h"

#define XYPOS    "XY position"
#define CLEAR_R    "Clear red"
#define CLEAR_G    "Clear green"
#define CLEAR_B    "Clear blue"
#define CLEAR_A    "Clear alpha"

#define SET        1
#define UNSET    0

#define FIRST_ELEM      0
#define SECND_ELEM      1

template <class T>
void clearPixel(T *image, unsigned int offset, unsigned int channels)
{
    int        i;

    image += offset;

    for (i = 0; i < channels; i++)
    {
        *image = (T)0;
         image++;
    }
}

CPIDSOEXPORT void upiCreateParameters( void )
{
    int        idef[] = {100, 100};

    cpiAddTab( "Parameters" );
    cpiAddIntVector( XYPOS, 2, idef, 1, 100, 0);
    cpiAddToggle( CLEAR_R, SET, 0);
    cpiAddToggle( CLEAR_G, SET, 0);
    cpiAddToggle( CLEAR_B, SET, 0);
    cpiAddToggle( CLEAR_A, SET, 0);
    return;
}

CPIDSOEXPORT int upiProcessImage( CPI_Image *result )
{
    int        xpos, ypos, pelsize, channels, offset;

    cpiGetIntVector(XYPOS, result->info.time, FIRST_ELEM, &xpos);
    cpiGetIntVector(XYPOS, result->info.time, SECND_ELEM, &ypos);

    channels = result->info.channels;
    switch( result->info.pelType)
    {
        case P_INT8:    
            pelsize = channels * 1;
            offset = ypos * result->info.sizeY * pelsize + xpos * pelsize;
            clearPixel((unsigned char *)result->data, offset, channels);
            break;
        case P_INT16:
            pelsize = channels * 2;
            offset = ypos * result->info.sizeY * pelsize + xpos * pelsize;
            clearPixel((unsigned short *)result->data, offset, channels);
            break;
        case P_FLOAT32:
            pelsize = channels * 4;
            offset = ypos * result->info.sizeY * pelsize + xpos * pelsize;
            clearPixel((float *)result->data, offset, channels);
            break;
        default: 
            cpiError("Unknown pixel type"); 
            return 1;
    }

    return 0;
}
[ Table of Contents ] [ Index]

Copyright © 1998 Silicon Grail Inc.
710 Seward Street, Hollywood, CA 90038