Tuesday, March 23, 2010

Transparency in Export Plugin

I'm writing an export plugin and I need to access transparency information. The example code uses the following to access the three RGB channels:



// in RGB mode, gStuff-%26gt;planes is set to 3

gStuff-%26gt;loPlane = 0;

gStuff-%26gt;hiPlane = gStuff-%26gt;planes - 1;

(*(gStuff-%26gt;advanceState))();



After this, gStuff-%26gt;data contains the RGB channels, but no transparency info. I tried setting the following in the PiPL file, but it seemed to have no effect:



ExportFlags

{

expSupportsTransparency

}



How do I access the transparency information from the export plugin?
Transparency in Export Plugin
Nevermind, I figured it out. The Channel Ports suite does the trick nicely. The code I used to get the transparency is posted below, if anyone else is interested (this assumes you're starting with the samplecode\export\outbound example):



void DoStart (GPtr globals)

{

// verify globals, etc.



ReadChannelDesc * alphaDesc = gStuff-%26gt;documentInfo-%26gt;targetTransparency;



unsigned char * alphaChannel = ReadChannel(globals, alphaDesc);



// do something with alphaChannel here...

}



unsigned char * ReadChannel(GPtr globals, ReadChannelDesc * readDesc)

{

if (!readDesc)

return 0;



uint width = gStuff-%26gt;imageSize.h;

uint height = gStuff-%26gt;imageSize.v;

uint bitDepth = readDesc-%26gt;depth;

uint dataByteSize = width * height * (bitDepth / 8);



PixelMemoryDesc pixelMemDesc;

pixelMemDesc.data = new unsigned char[dataByteSize];

pixelMemDesc.rowBits = width * bitDepth;

pixelMemDesc.colBits = bitDepth;

pixelMemDesc.bitOffset = 0;

pixelMemDesc.depth = bitDepth;

memset(pixelMemDesc.data, 0, dataByteSize);



PSScaling scaling;

scaling.sourceRect = scaling.destinationRect = readDesc-%26gt;bounds;



VRect wroteRect;



int16 result =

(*gStuff-%26gt;channelPortProcs-%26gt;readPixelsProc)(

readDesc-%26gt;port,

%26amp;scaling,

%26amp;readDesc-%26gt;bounds,

%26amp;pixelMemDesc,

%26amp;wroteRect

);



if (result != noErr)

{

delete [] pixelMemDesc.data;

return 0;

}



return (unsigned char *) pixelMemDesc.data;

}

No comments:

Post a Comment