Added support for transparency in rotation code
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5950 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -2608,8 +2608,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxImageModule, wxModule)
|
|||||||
unsigned long wxImage::CountColours( unsigned long stopafter )
|
unsigned long wxImage::CountColours( unsigned long stopafter )
|
||||||
{
|
{
|
||||||
wxHashTable h;
|
wxHashTable h;
|
||||||
wxNode *node;
|
wxObject dummy;
|
||||||
wxHNode *hnode;
|
|
||||||
unsigned char r, g, b, *p;
|
unsigned char r, g, b, *p;
|
||||||
unsigned long size, nentries, key;
|
unsigned long size, nentries, key;
|
||||||
|
|
||||||
@@ -2624,20 +2623,13 @@ unsigned long wxImage::CountColours( unsigned long stopafter )
|
|||||||
b = *(p++);
|
b = *(p++);
|
||||||
key = (r << 16) | (g << 8) | b;
|
key = (r << 16) | (g << 8) | b;
|
||||||
|
|
||||||
hnode = (wxHNode *) h.Get(key);
|
if (h.Get(key) == NULL)
|
||||||
|
|
||||||
if (!hnode)
|
|
||||||
{
|
{
|
||||||
h.Put(key, (wxObject *)(new wxHNode));
|
h.Put(key, &dummy);
|
||||||
nentries++;
|
nentries++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete all HNodes
|
|
||||||
h.BeginFind();
|
|
||||||
while ((node = h.Next()) != NULL)
|
|
||||||
delete (wxHNode *)node->GetData();
|
|
||||||
|
|
||||||
return nentries;
|
return nentries;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2699,7 +2691,6 @@ struct wxRotationPoint
|
|||||||
double x, y;
|
double x, y;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const wxRotationPixel gs_BlankPixel = {0,0,0};
|
|
||||||
static const double gs_Epsilon = 1e-10;
|
static const double gs_Epsilon = 1e-10;
|
||||||
|
|
||||||
static inline int wxCint (double x)
|
static inline int wxCint (double x)
|
||||||
@@ -2741,7 +2732,8 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i
|
|||||||
data[i] = data[i - 1] + img.GetWidth();
|
data[i] = data[i - 1] + img.GetWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
// pre-compute coefficients for rotation formula (sine and cosine of the angle)
|
// pre-compute coefficients for rotation formula
|
||||||
|
// (sine and cosine of the angle)
|
||||||
const double cos_angle = cos(angle);
|
const double cos_angle = cos(angle);
|
||||||
const double sin_angle = sin(angle);
|
const double sin_angle = sin(angle);
|
||||||
|
|
||||||
@@ -2769,7 +2761,6 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i
|
|||||||
*offset_after_rotation = wxPoint (x1, y1);
|
*offset_after_rotation = wxPoint (x1, y1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wxRotationPixel ** result_data = new wxRotationPixel * [rotated.GetHeight()];
|
wxRotationPixel ** result_data = new wxRotationPixel * [rotated.GetHeight()];
|
||||||
|
|
||||||
result_data[0] = (wxRotationPixel *) rotated.GetData();
|
result_data[0] = (wxRotationPixel *) rotated.GetData();
|
||||||
@@ -2779,10 +2770,28 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i
|
|||||||
result_data[i] = result_data[i - 1] + rotated.GetWidth();
|
result_data[i] = result_data[i - 1] + rotated.GetWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GRG: if the original image has a mask, use its RGB values
|
||||||
|
// as the blank pixel, else, fall back to default (black).
|
||||||
|
//
|
||||||
|
wxRotationPixel blankPixel = {{ 0, 0, 0 }};
|
||||||
|
|
||||||
|
if (HasMask())
|
||||||
|
{
|
||||||
|
unsigned char r = GetMaskRed();
|
||||||
|
unsigned char g = GetMaskGreen();
|
||||||
|
unsigned char b = GetMaskBlue();
|
||||||
|
rotated.SetMaskColour( r, g, b );
|
||||||
|
blankPixel.rgb[0] = r;
|
||||||
|
blankPixel.rgb[1] = g;
|
||||||
|
blankPixel.rgb[2] = b;
|
||||||
|
}
|
||||||
|
|
||||||
// Now, for each point of the rotated image, find where it came from, by
|
// Now, for each point of the rotated image, find where it came from, by
|
||||||
// performing an inverse rotation (a rotation of -angle) and getting the
|
// performing an inverse rotation (a rotation of -angle) and getting the
|
||||||
// pixel at those coordinates
|
// pixel at those coordinates
|
||||||
|
|
||||||
|
// GRG: I'd suggest to take the (interpolating) test out of the loops
|
||||||
|
|
||||||
int x;
|
int x;
|
||||||
for (x = 0; x < rotated.GetWidth(); x++)
|
for (x = 0; x < rotated.GetWidth(); x++)
|
||||||
{
|
{
|
||||||
@@ -2854,7 +2863,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result_data[y][x] = gs_BlankPixel;
|
result_data[y][x] = blankPixel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2869,7 +2878,7 @@ wxImage wxImage::Rotate(double angle, const wxPoint & centre_of_rotation, bool i
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result_data[y][x] = gs_BlankPixel;
|
result_data[y][x] = blankPixel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user