Skip to content

Commit

Permalink
Add bound rect for get/set float32 from bitmap data
Browse files Browse the repository at this point in the history
  • Loading branch information
hughsando committed Oct 12, 2018
1 parent 3ea7008 commit 2a03ce4
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 52 deletions.
8 changes: 4 additions & 4 deletions project/include/Surface.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ class Surface : public ImageBuffer

virtual void noise(unsigned int randomSeed, unsigned int low, unsigned int high, int channelOptions, bool grayScale) { }

virtual void getFloats32(float *outData, int inStride, PixelFormat pixelFormat, int inTransform, int inSubsample) { }
virtual void setFloats32(const float *inData, int inStride, PixelFormat pixelFormat, int inTransform, int inExpand) { }
virtual void getFloats32(float *outData, int inStride, PixelFormat pixelFormat, int inTransform, int inSubsample, const Rect &bounds) { }
virtual void setFloats32(const float *inData, int inStride, PixelFormat pixelFormat, int inTransform, int inExpand, const Rect &bounds) { }
virtual void getUInts8(uint8 *outData, int inStride, PixelFormat pixelFormat, int inSubsample) { }
virtual void setUInts8(const uint8 *inData, int inStride, PixelFormat pixelFormat, int inExpand) { }

Expand Down Expand Up @@ -168,8 +168,8 @@ class SimpleSurface : public Surface
void scroll(int inDX,int inDY);
void applyFilter(Surface *inSrc, const Rect &inRect, ImagePoint inOffset, Filter *inFilter);
void noise(unsigned int randomSeed, unsigned int low, unsigned int high, int channelOptions, bool grayScale);
void getFloats32(float *outData, int inStride, PixelFormat pixelFormat, int inTransform, int inSubsample);
void setFloats32(const float *inData, int inStride, PixelFormat pixelFormat, int inTransform, int inExpand);
void getFloats32(float *outData, int inStride, PixelFormat pixelFormat, int inTransform, int inSubsample,const Rect &bounds);
void setFloats32(const float *inData, int inStride, PixelFormat pixelFormat, int inTransform, int inExpand,const Rect &bounds);
void getUInts8(uint8 *outData, int inStride, PixelFormat pixelFormat, int inSubsample);
void setUInts8(const uint8 *inData, int inStride, PixelFormat pixelFormat, int inExpand);

Expand Down
18 changes: 12 additions & 6 deletions project/src/common/ExternalInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4484,7 +4484,7 @@ DEFINE_PRIM_MULT(nme_bitmap_data_noise);


void nme_bitmap_data_get_floats32(value inSurface, value inData, int inOffset, int inStride,
int inPixelFormat, int inTransform, int inSubsample)
int inPixelFormat, int inTransform, int inSubsample, value subrect)
{
Surface *surf;
if (AbstractToObject(inSurface,surf))
Expand All @@ -4493,15 +4493,18 @@ void nme_bitmap_data_get_floats32(value inSurface, value inData, int inOffset, i
unsigned char *data = (unsigned char *)val_to_kind(inData, gDataPointer);
if (data)
{
surf->getFloats32((float *)(data + inOffset), inStride, (PixelFormat)inPixelFormat, inTransform, inSubsample);
Rect rect(0,0,surf->Width(), surf->Height());
if (!val_is_null(subrect))
FromValue(rect,subrect);
surf->getFloats32((float *)(data + inOffset), inStride, (PixelFormat)inPixelFormat, inTransform, inSubsample,rect);
}
#endif
}
}
DEFINE_PRIME7v(nme_bitmap_data_get_floats32);
DEFINE_PRIME8v(nme_bitmap_data_get_floats32);

void nme_bitmap_data_set_floats32(value inSurface, value inData, int inOffset, int inStride,
int inPixelFormat, int inTransform, int inExpand)
int inPixelFormat, int inTransform, int inExpand, value subrect)
{
Surface *surf;
if (AbstractToObject(inSurface,surf))
Expand All @@ -4510,12 +4513,15 @@ void nme_bitmap_data_set_floats32(value inSurface, value inData, int inOffset, i
unsigned char *data = (unsigned char *)val_to_kind(inData, gDataPointer);
if (data)
{
surf->setFloats32((float *)(data + inOffset), inStride, (PixelFormat)inPixelFormat, inTransform, inExpand);
Rect rect(0,0,surf->Width(), surf->Height());
if (!val_is_null(subrect))
FromValue(rect,subrect);
surf->setFloats32((float *)(data + inOffset), inStride, (PixelFormat)inPixelFormat, inTransform, inExpand,rect);
}
#endif
}
}
DEFINE_PRIME7v(nme_bitmap_data_set_floats32);
DEFINE_PRIME8v(nme_bitmap_data_set_floats32);



Expand Down
71 changes: 35 additions & 36 deletions project/src/common/Surface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1905,45 +1905,41 @@ enum
};


void SimpleSurface::getFloats32(float *outData, int inStride, PixelFormat inFormat, int inTransform, int inSubsample)
void SimpleSurface::getFloats32(float *outData, int inStride, PixelFormat inFormat, int inTransform, int inSubsample,const Rect &bounds)
{
int pixelSize = BytesPerPixel(inFormat);

std::vector<unsigned char> buffer;
const unsigned char *ptr = mBase;
const unsigned char *ptr = mBase + mStride*bounds.y + bounds.x*BytesPerPixel(mPixelFormat);
int w = bounds.w;
int h = bounds.h;
// TODO - inSubsample
int stride = mStride;
int pixelSize = BytesPerPixel(inFormat);
if (inFormat!=mPixelFormat)
{
stride = mWidth * pixelSize;
buffer.resize( stride * mHeight );
PixelConvert(mWidth, mHeight,
mPixelFormat, mBase, mStride, GetPlaneOffset(),
stride = w * pixelSize;
buffer.resize( stride * h );
PixelConvert(w, h,
mPixelFormat, ptr, mStride, GetPlaneOffset(),
inFormat, &buffer[0], stride, 0 );
ptr = &buffer[0];
}
bool swizzleRgb = (inTransform & FloatSwizzeRgb );

int histo[256];
int ppr = mWidth * pixelSize;
int count = ppr*mHeight;
memset(histo, 0, sizeof(histo));
for(int y=0;y<mHeight;y++)
{
const Uint8 *p = ptr + y*stride;
for(int x=0;x<ppr;x++)
histo[p[x]]++;
}
int n = 0;
int sumX = 0;
double sumX2 = 0;
for(int i=0;i<256;i++)
int ppr = w * pixelSize;
int count = ppr*h;

if ( inTransform & (FloatZeroMean | FloatStdScale) )
{
n += histo[i];
sumX += i*histo[i];
sumX2 += i*i*histo[i];
memset(histo, 0, sizeof(histo));
for(int y=0;y<h;y++)
{
const Uint8 *p = ptr + y*stride;
for(int x=0;x<ppr;x++)
histo[p[x]]++;
}
}
if (!n)
return;
float lut[256];

if (!inTransform)
Expand Down Expand Up @@ -1999,15 +1995,15 @@ void SimpleSurface::getFloats32(float *outData, int inStride, PixelFormat inForm
}

float *dest = outData;
for(int y=0;y<mHeight;y++)
for(int y=0;y<h;y++)
{
const Uint8 *src = ptr + y*stride;
if (inStride)
dest = (float *)( (char *)outData + inStride*mHeight );
dest = (float *)( (char *)outData + inStride*y );

if (swizzleRgb && inFormat==pfRGB)
{
for(int x=0;x<mWidth;x++)
for(int x=0;x<w;x++)
{
*dest++ = lut[src[2]];
*dest++ = lut[src[1]];
Expand Down Expand Up @@ -2072,26 +2068,29 @@ void SimpleSurface::setUInts8(const uint8 *inData, int inStride, PixelFormat inF



void SimpleSurface::setFloats32(const float *inData, int inStride, PixelFormat inFormat, int inTransform, int inExpand)
void SimpleSurface::setFloats32(const float *inData, int inStride, PixelFormat inFormat, int inTransform, int inExpand,const Rect &bounds)
{
Uint8 *ptr = mBase + mStride*bounds.y + bounds.x*BytesPerPixel(mPixelFormat);
int w = bounds.w;
int h = bounds.h;

std::vector<unsigned char> buffer;
Uint8 *ptr = mBase;
// TODO - inExpand

int stride = mStride;
int pixelSize = BytesPerPixel(inFormat);

if (inFormat!=mPixelFormat)
{
stride = mWidth * pixelSize;
buffer.resize( stride * mHeight );
stride = w * pixelSize;
buffer.resize( stride * h );
ptr = &buffer[0];
}
int ppr = mWidth * pixelSize;
int ppr = w * pixelSize;

const float *src = inData;
#define GET_FLOAT( EXPR ) { \
for(int y=0;y<mHeight;y++) \
for(int y=0;y<h;y++) \
{ \
Uint8 *dest = ptr + y*stride; \
if (inStride) \
Expand Down Expand Up @@ -2125,9 +2124,9 @@ void SimpleSurface::setFloats32(const float *inData, int inStride, PixelFormat i

if (inFormat!=mPixelFormat)
{
PixelConvert(mWidth, mHeight,
PixelConvert(w, h,
inFormat, &buffer[0], stride, 0,
mPixelFormat, mBase, mStride, 0 );
mPixelFormat, ptr, mStride, 0 );
}
}

Expand Down
12 changes: 6 additions & 6 deletions src/nme/bare/Surface.hx
Original file line number Diff line number Diff line change
Expand Up @@ -290,16 +290,16 @@ class Surface
}

public function getFloats32(dataHandle:Dynamic, dataOffset:Int, dataStride:Int,
pixelFormat:Int, transform:Int, subSample:Int = 1)
pixelFormat:Int, transform:Int, subSample:Int = 1, ?subrect:Rectangle)
{
nme_bitmap_data_get_floats32(nmeHandle,dataHandle, dataOffset, dataStride, pixelFormat, transform, subSample);
nme_bitmap_data_get_floats32(nmeHandle,dataHandle, dataOffset, dataStride, pixelFormat, transform, subSample, subrect);
}


public function setFloats32(dataHandle:Dynamic, dataOffset:Int, dataStride:Int,
pixelFormat:Int, transform:Int, expand:Int = 1)
pixelFormat:Int, transform:Int, expand:Int = 1, ?subrect:Rectangle)
{
nme_bitmap_data_set_floats32(nmeHandle,dataHandle, dataOffset, dataStride, pixelFormat, transform, expand);
nme_bitmap_data_set_floats32(nmeHandle,dataHandle, dataOffset, dataStride, pixelFormat, transform, expand,subrect);
}


Expand Down Expand Up @@ -384,8 +384,8 @@ class Surface
private static var nme_bitmap_data_flood_fill = Loader.load("nme_bitmap_data_flood_fill", 4);
private static var nme_bitmap_data_get_prem_alpha = Loader.load("nme_bitmap_data_get_prem_alpha", 1);
private static var nme_bitmap_data_set_prem_alpha = Loader.load("nme_bitmap_data_set_prem_alpha", 2);
private static var nme_bitmap_data_get_floats32 = nme.PrimeLoader.load("nme_bitmap_data_get_floats32", "ooiiiiiv");
private static var nme_bitmap_data_set_floats32 = nme.PrimeLoader.load("nme_bitmap_data_set_floats32", "ooiiiiiv");
private static var nme_bitmap_data_get_floats32 = nme.PrimeLoader.load("nme_bitmap_data_get_floats32", "ooiiiiiov");
private static var nme_bitmap_data_set_floats32 = nme.PrimeLoader.load("nme_bitmap_data_set_floats32", "ooiiiiiov");
private static var nme_bitmap_data_get_uints8 = nme.PrimeLoader.load("nme_bitmap_data_get_uints8", "ooiiiiv");
private static var nme_bitmap_data_set_uints8 = nme.PrimeLoader.load("nme_bitmap_data_set_uints8", "ooiiiiv");
}
Expand Down
5 changes: 5 additions & 0 deletions src/nme/display/BitmapData.hx
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,11 @@ class BitmapData extends Surface implements IBitmapDrawable
// Handled internally...
}

public function toString():String
{
return 'BitmapData($width,$height)';
}

// Native Methods
private static var nme_bitmap_data_apply_filter = Loader.load("nme_bitmap_data_apply_filter", 5);
private static var nme_bitmap_data_generate_filter_rect = Loader.load("nme_bitmap_data_generate_filter_rect", 3);
Expand Down

0 comments on commit 2a03ce4

Please sign in to comment.