本文来自http://blog.csdn.net/runaying ,引用必须注明出处!
cocos2d-X 节点(CCTexture2D.h)API
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
贴图类 CCTexture2D是关于 OpenGL 的概念。在 OpenGL中称图片为贴图,在Cocos2D-x中 CCTexture2D 就是图片对象的意思,可以通过它创建精灵等对象 .CCTexture2D类是精灵类和其相关类的基础。以下会看到很多类都可以用CCTexture2D类定义。
//cocos2d-x-3.0alpha0-pre/cocos2dx/textures
#ifndef __CCTEXTURE2D_H__
#define __CCTEXTURE2D_H__
#include <string>
#include <map>
#include "cocoa/CCObject.h"
#include "cocoa/CCGeometry.h"
#include "ccTypes.h"
#ifdef EMSCRIPTEN
#include "base_nodes/CCGLBufferedNode.h"
#endif // EMSCRIPTEN
NS_CC_BEGIN
class Image;
typedef struct _MipmapInfo MipmapInfo;
/**
* @addtogroup textures
* @{
*/
//CONSTANTS:
class GLProgram;
//CLASS INTERFACES:
简要
/** @brief Texture2D class.
* 这个类可以方便的从一个 images, text or raw data. 创建OpenGL的2D textures // 图像,文本或原始数据
*创建Texture2D对象将永远有 power-of-two dimensions //两个维度。
*实际的图像的 texture 可能小于 texture 的尺寸;这取决于你是如何创建 tEXURE2D对象的 i.e. "contentSize" != (pixelsWide, pixelsHigh) and (maxS, maxT) != (1.0, 1.0).
* 请注意,所生成的纹理的内容将上下颠倒!
*/
class CC_DLL Texture2D : public Object
#ifdef EMSCRIPTEN
, public GLBufferedNode
#endif // EMSCRIPTEN
{
public:
/** @typedef Texture2D::PixelFormat
texture 可能会被像素格式化
*/
enum class PixelFormat
{
//! 自动检测类型
AUTO,
//! 32-bit texture: BGRA8888 //32位纹理:BGRA8888
BGRA8888,
//! 32-bit texture: RGBA8888
RGBA8888,
//! 24-bit texture: RGBA888
RGB888,
//! 不带Alpha通道的16位纹理
RGB565,
//! 8-bit textures 作为 masks //模形
A8,
//! 8-bit 强度的 texture
I8,
//! 16-bit textures 作为 masks //模形
AI88,
//! 16-bit textures: RGBA4444
RGBA4444,
//! 16-bit textures: RGB5A1
RGB5A1,
//! 4-bit PVRTC-compressed texture: PVRTC4A // 压缩
PVRTC4,
//! 4-bit PVRTC-compressed texture: PVRTC4 (有 alpha 通道)
PVRTC4A,
//! 2-bit PVRTC-compressed texture: PVRTC2
PVRTC2,
//! 2-bit PVRTC-compressed texture: PVRTC2 (有 alpha 通道)
PVRTC2A,
//! ETC-compressed texture: ETC // 压缩
ETC,
//! S3TC-compressed texture: S3TC_Dxt1
S3TC_DXT1,
//! S3TC-compressed texture: S3TC_Dxt3
S3TC_DXT3,
//! S3TC-compressed texture: S3TC_Dxt5
S3TC_DXT5,
//! ATITC-compressed texture: ATC_RGB
ATC_RGB,
//! ATITC-compressed texture: ATC_EXPLICIT_ALPHA
ATC_EXPLICIT_ALPHA,
//! ATITC-compresed texture: ATC_INTERPOLATED_ALPHA
ATC_INTERPOLATED_ALPHA,
//! 默认的 texture 格式: AUTO
DEFAULT = AUTO,
NONE = -1
};
struct PixelFormatInfo {
PixelFormatInfo(GLenum internalFormat, GLenum format, GLenum type, int bpp, bool compressed, bool alpha)
: internalFormat(internalFormat)
, format(format)
, type(type)
, bpp(bpp)
, compressed(compressed)
, alpha(alpha)
{}
GLenum internalFormat;
GLenum format;
GLenum type;
int bpp;
bool compressed;
bool alpha;
};
typedef std::map<Texture2D::PixelFormat, const PixelFormatInfo> PixelFormatInfoMap;
/**
set Min / Mag 扩展的过滤器
*/
typedef struct _TexParams {
GLuint minFilter;
GLuint magFilter;
GLuint wrapS;
GLuint wrapT;
}TexParams;
public:
/** 为 UIImagescontains alpha 通道设置默认的像素的格式.
该UIImage如果包含Alpha通道,然后有三种选择:
- generate 32-bit textures: Texture2D::PixelFormat::RGBA8888 (default one) //默认的一种
- generate 24-bit textures: Texture2D::PixelFormat::RGB888 //生成
- generate 16-bit textures: Texture2D::PixelFormat::RGBA4444
- generate 16-bit textures: Texture2D::PixelFormat::RGB5A1
- generate 16-bit textures: Texture2D::PixelFormat::RGB565
- generate 8-bit textures: Texture2D::PixelFormat::A8 (使用它的时候你只能使用一种颜色)
他是如何工作的 ?
-如果图片是 RGBA(使用了 alpha通道)则默认的像素格式将被使用 (它可以是 a 8-bit, 16-bit or 32-bit texture)
-如果图片是 RGB(没有使用 alpha通道) 如果默认的像素格式是 RGBA8888 那么将使用 RGBA8888 (32-bit) ,其他情况将使用一个 RGB565 (16-bit texture)
这个参数对 PVR / PVR.CCZ 图片是无效的.
@since v0.8
*/
static void setDefaultAlphaPixelFormat(Texture2D::PixelFormat format);
/** returns alpha 通道像素格式
@since v0.8
*/
static Texture2D::PixelFormat getDefaultAlphaPixelFormat();
CC_DEPRECATED_ATTRIBUTE static Texture2D::PixelFormat defaultAlphaPixelFormat() { return Texture2D::getDefaultAlphaPixelFormat(); };
/**对待(或没有) RVR 文件,把他们当作有 alpha premultiplied。 //预乘
你不可能再运行前知道他们有没有 alpha premultiplied。 //预乘
不论他们有没有 alpha premultiplied。 他们都是可以被加载的 //预乘
默认情况下,它被禁用。
@since v0.99.5
*/
static void PVRImagesHavePremultipliedAlpha(bool haveAlphaPremultiplied);
public:
/**
* @js ctor
*/
Texture2D();
/**
* @js NA
* @lua NA
*/
virtual ~Texture2D();
/**
* @js NA
* @lua NA
*/
const char* description(void) const;
/** 这些功能都需要创建可变的 textures
* @js NA
* @lua NA
*/
void releaseData(void *data);
/**
* @js NA
* @lua NA
*/
void* keepData(void *data, unsigned int length);
/** 使用数据,初始化一个Texture2D
* @js NA
* @lua NA
*/
bool initWithData(const void *data, int dataLen, Texture2D::PixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pixelsHigh, const Size& contentSize);
/** 使用 mipmaps 初始化 */
bool initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, Texture2D::PixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pixelsHigh);
/**
扩展 Texture2D 对象使它很容易的绘制一个基本矩形
这个功能需要客户端支持 GL_TEXTURE_2D 、 GL_VERTEX_ARRAY 、 GL_TEXTURE_COORD_ARRAY */
/** 在一个给定的点绘制一个 texture */
void drawAtPoint(const Point& point);
/** 在一个矩形内绘制一个 texture */
void drawInRect(const Rect& rect);
/**
扩展 Texture2D 对象使它很容易使用一个图片初始化
*/
/**
使用一个 UIImage 对象初始化一个 texure.
调用 setDefaultAlphaPixelFormat 使用你制定的格式,转换图片然后在 texture 里面使用转换后的图片
NOTE: 他不会转换 pvr 图片文件. //关于 pvr(图片的一种格式,像png、jpg一样) 是什么请参考 http://blog.sina.com.cn/s/blog_6fbe210701015j7z.html
*/
bool initWithImage(Image * image);
/** 使用一个 UIImage 对象初始化一个 texure.
图片使用我们传递过来的格式化参数格式化,然后被 texture 使用
如果你传递的是 PixelFormat::Automatic, 那么图片将自动检测图片的渲染类型,使用该类型来渲染 texture
**/
bool initWithImage(Image * image, PixelFormat format);
/**使用字符串和字符串的 长度、对齐方式、字体、字体尺寸 初始化一个 texture */
bool initWithString(const char *text, const char *fontName, float fontSize, const Size& dimensions = Size(0, 0), TextHAlignment hAlignment = TextHAlignment::CENTER, TextVAlignment vAlignment = TextVAlignment::TOP);
/** 使用 text 初始化一个 texture */
bool initWithString(const char *text, const FontDefinition& textDefinition);
/** 为 texture 设置过滤器的最小值和磁力
如果 texture 是 NPOT (密度不是 2),那么它只能在 GL_TEXTURE_WRAP_{S,T} 里面使用 GL_CLAMP_TO_EDGE
@warning 调用此方法,可以为 texture 分配额外的内存。
@since v0.8
* @code
* 这个功能函数在 js 或者 lua 里面使用时,输入参数会改变
* In js: var setBlendFunc(var arg1, var arg2, var arg3, var arg4)
* In lua: local setBlendFunc(local arg1, local arg2, local arg3, local arg4)
* @endcode
*/
void setTexParameters(const TexParams& texParams);
/**
* @js NA
* @lua NA
*/
CC_DEPRECATED_ATTRIBUTE void setTexParameters(const TexParams* texParams) { return setTexParameters(*texParams); };
/** sets texture 的反锯齿参数:
- GL_TEXTURE_MIN_FILTER = GL_LINEAR
- GL_TEXTURE_MAG_FILTER = GL_LINEAR
@warning 调用此方法,可以为 texture 分配额外的内存。
@since v0.8
*/
void setAntiAliasTexParameters();
/** 设置 texture 参数别名:
- GL_TEXTURE_MIN_FILTER = GL_NEAREST
- GL_TEXTURE_MAG_FILTER = GL_NEAREST
@warning 调用此方法,可以分配额外的 texture 内存。
@since v0.8
*/
void setAliasTexParameters();
/** 为 texture 产生 mipmap 图片.
It only works if the texture size is POT (power of 2). //她只在 texture 密度是2 时工作
@since v0.99.0
*/
void generateMipmap();
/** returns 像素格式.
@since v2.0
*/
const char* getStringForFormat() const;
CC_DEPRECATED_ATTRIBUTE const char* stringForFormat() const { return getStringForFormat(); };
/** return OpenGL texture每像素在内存中所占的 bit
@since v1.0
*/
unsigned int getBitsPerPixelForFormat() const;
CC_DEPRECATED_ATTRIBUTE unsigned int bitsPerPixelForFormat() const { return getBitsPerPixelForFormat(); };
/**辅助功能,对于一个给定的格式返回每像素所占bit。
@since v2.0
*/
unsigned int getBitsPerPixelForFormat(Texture2D::PixelFormat format) const;
CC_DEPRECATED_ATTRIBUTE unsigned int bitsPerPixelForFormat(Texture2D::PixelFormat format) const { return getBitsPerPixelForFormat(format); };
/** 内容尺寸 */
const Size& getContentSizeInPixels();
bool hasPremultipliedAlpha() const;
bool hasMipmaps() const;
/** Gets texture 的像素格式 */
Texture2D::PixelFormat getPixelFormat() const;
/**获取 texture 的宽度(以像素为单位)*/
unsigned int getPixelsWide() const;
/** *获取 texture 的高度(以像素为单位) */
unsigned int getPixelsHigh() const;
/** Gets texture 名字 */
GLuint getName() const;
/** Gets max S */
GLfloat getMaxS() const;
/** Sets max S */
void setMaxS(GLfloat maxS);
/** Gets max T */
GLfloat getMaxT() const;
/** Sets max T */
void setMaxT(GLfloat maxT);
Size getContentSize() const;
void setShaderProgram(GLProgram* program);
GLProgram* getShaderProgram() const;
public:
static const PixelFormatInfoMap& getPixelFormatInfoMap();
private:
转换函数
/**convert functions*/ //转换函数
/**
准换格式到你指定的格式参数,如果这个参数是, PixelFormat::Automatic,他会自动检测转换成最接近,你指定的格式参数。他会返回转换后的格式给你 如果 outData != data(输出数据不等于传入的数据),你必须手动删除
*/
static PixelFormat convertDataToFormat(const unsigned char* data, int dataLen, PixelFormat originFormat, PixelFormat format, unsigned char** outData, int* outDataLen);
static PixelFormat convertI8ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);
static PixelFormat convertAI88ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);
static PixelFormat convertRGB888ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);
static PixelFormat convertRGBA8888ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);
//I8 to XXX
static void convertI8ToRGB888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGBA8888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToAI88(const unsigned char* data, int dataLen, unsigned char* outData);
//AI88 to XXX
static void convertAI88ToRGB888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGBA8888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToA8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToI8(const unsigned char* data, int dataLen, unsigned char* outData);
//RGB888 to XXX
static void convertRGB888ToRGBA8888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToI8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToAI88(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);
//RGBA8888 to XXX
static void convertRGBA8888ToRGB888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToI8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToA8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToAI88(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);
protected:
/** texture 的像素格式 */
Texture2D::PixelFormat _pixelFormat;
/**宽度(像素)s */
unsigned int _pixelsWide;
/**高度(像素) */
unsigned int _pixelsHigh;
/** texture 名 */
GLuint _name;
/** texture max S */
GLfloat _maxS;
/** texture max T */
GLfloat _maxT;
/** content 尺寸 */
Size _contentSize;
/** texture 是否有他们的 Alpha premultiplied */
bool _hasPremultipliedAlpha;
bool _hasMipmaps;
/** 着色器程序在 drawAtPoint and drawInRect 里面使用*/
GLProgram* _shaderProgram;
static const PixelFormatInfoMap _pixelFormatInfoTables;
};
// end of textures group
/// @}
NS_CC_END
#endif //__CCTEXTURE2D_H__