Skip to content

Texture created in RenderTexture object has improperly set property that... #9393

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cocos/2d/CCRenderTexture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ bool RenderTexture::initWithWidthAndHeight(int w, int h, Texture2D::PixelFormat
_texture = new (std::nothrow) Texture2D();
if (_texture)
{
_texture->initWithData(data, dataLen, (Texture2D::PixelFormat)_pixelFormat, powW, powH, Size((float)w, (float)h));
_texture->initWithData(data, dataLen, (Texture2D::PixelFormat)_pixelFormat, powW, powH, Size((float)w, (float)h), true);
}
else
{
Expand All @@ -238,7 +238,7 @@ bool RenderTexture::initWithWidthAndHeight(int w, int h, Texture2D::PixelFormat
_textureCopy = new (std::nothrow) Texture2D();
if (_textureCopy)
{
_textureCopy->initWithData(data, dataLen, (Texture2D::PixelFormat)_pixelFormat, powW, powH, Size((float)w, (float)h));
_textureCopy->initWithData(data, dataLen, (Texture2D::PixelFormat)_pixelFormat, powW, powH, Size((float)w, (float)h), true);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why should we treat Texture2D created from RenderTexture to be premultiplied one?

}
else
{
Expand Down
20 changes: 8 additions & 12 deletions cocos/renderer/CCTexture2D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -534,18 +534,18 @@ bool Texture2D::hasPremultipliedAlpha() const
return _hasPremultipliedAlpha;
}

bool Texture2D::initWithData(const void *data, ssize_t dataLen, Texture2D::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, const Size& contentSize)
bool Texture2D::initWithData(const void *data, ssize_t dataLen, Texture2D::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, const Size& contentSize, bool hasPremultipliedAlpha/* =false */)
{
CCASSERT(dataLen>0 && pixelsWide>0 && pixelsHigh>0, "Invalid size");

//if data has no mipmaps, we will consider it has only one mipmap
MipmapInfo mipmap;
mipmap.address = (unsigned char*)data;
mipmap.len = static_cast<int>(dataLen);
return initWithMipmaps(&mipmap, 1, pixelFormat, pixelsWide, pixelsHigh);
return initWithMipmaps(&mipmap, 1, pixelFormat, pixelsWide, pixelsHigh, hasPremultipliedAlpha);
}

bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, PixelFormat pixelFormat, int pixelsWide, int pixelsHigh)
bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, bool hasPremultipliedAlpha/* =false */)
{


Expand Down Expand Up @@ -680,7 +680,7 @@ bool Texture2D::initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, PixelFormat
_maxS = 1;
_maxT = 1;

_hasPremultipliedAlpha = false;
_hasPremultipliedAlpha = hasPremultipliedAlpha;
_hasMipmaps = mipmapsNum > 1;

// shader
Expand Down Expand Up @@ -746,7 +746,7 @@ bool Texture2D::initWithImage(Image *image, PixelFormat format)
CCLOG("cocos2d: WARNING: This image has more than 1 mipmaps and we will not convert the data format");
}

initWithMipmaps(image->getMipmaps(), image->getNumberOfMipmaps(), image->getRenderFormat(), imageWidth, imageHeight);
initWithMipmaps(image->getMipmaps(), image->getNumberOfMipmaps(), image->getRenderFormat(), imageWidth, imageHeight, image->hasPremultipliedAlpha());

return true;
}
Expand All @@ -757,7 +757,7 @@ bool Texture2D::initWithImage(Image *image, PixelFormat format)
CCLOG("cocos2d: WARNING: This image is compressed and we cann't convert it for now");
}

initWithData(tempData, tempDataLen, image->getRenderFormat(), imageWidth, imageHeight, imageSize);
initWithData(tempData, tempDataLen, image->getRenderFormat(), imageWidth, imageHeight, imageSize, image->hasPremultipliedAlpha());
return true;
}
else
Expand All @@ -767,17 +767,14 @@ bool Texture2D::initWithImage(Image *image, PixelFormat format)

pixelFormat = convertDataToFormat(tempData, tempDataLen, renderFormat, pixelFormat, &outTempData, &outTempDataLen);

initWithData(outTempData, outTempDataLen, pixelFormat, imageWidth, imageHeight, imageSize);
initWithData(outTempData, outTempDataLen, pixelFormat, imageWidth, imageHeight, imageSize, image->hasPremultipliedAlpha());


if (outTempData != nullptr && outTempData != tempData)
{

free(outTempData);
}

// set the premultiplied tag
_hasPremultipliedAlpha = image->hasPremultipliedAlpha();

return true;
}
Expand Down Expand Up @@ -1118,13 +1115,12 @@ bool Texture2D::initWithString(const char *text, const FontDefinition& textDefin
Size imageSize = Size((float)imageWidth, (float)imageHeight);
pixelFormat = convertDataToFormat(outData.getBytes(), imageWidth*imageHeight*4, PixelFormat::RGBA8888, pixelFormat, &outTempData, &outTempDataLen);

ret = initWithData(outTempData, outTempDataLen, pixelFormat, imageWidth, imageHeight, imageSize);
ret = initWithData(outTempData, outTempDataLen, pixelFormat, imageWidth, imageHeight, imageSize, hasPremultipliedAlpha);

if (outTempData != nullptr && outTempData != outData.getBytes())
{
free(outTempData);
}
_hasPremultipliedAlpha = hasPremultipliedAlpha;

return ret;
}
Expand Down
4 changes: 2 additions & 2 deletions cocos/renderer/CCTexture2D.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,10 +214,10 @@ class CC_DLL Texture2D : public Ref
* @js NA
* @lua NA
*/
bool initWithData(const void *data, ssize_t dataLen, Texture2D::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, const Size& contentSize);
bool initWithData(const void *data, ssize_t dataLen, Texture2D::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, const Size& contentSize, bool hasPremultipliedAlpha = false);

/** Initializes with mipmaps */
bool initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, Texture2D::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh);
bool initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, Texture2D::PixelFormat pixelFormat, int pixelsWide, int pixelsHigh, bool hasPremultipliedAlpha = false);

/** Update with texture data*/
bool updateWithData(const void *data,int offsetX,int offsetY,int width,int height);
Expand Down