コード例 #1
0
ファイル: util.cpp プロジェクト: jieyaozu/FightingSolarSystem
CCTexture2D* Util::getGrayTexture(const char* filename){
		typedef enum {  
			RED = 0,  
			GREEN = 1,  
			BLUE = 2,  
			ALPHA = 3  
		} PIXELS;  
		CCImage *image = new CCImage();
		image->initWithImageFile(filename);
		unsigned char* pixels = image->getData();
		int len = image->getDataLen();
		uint32_t *p = (uint32_t *)pixels;
		for(int i=0;i<len;i++){
			uint8_t *rgbaPixel = (uint8_t *) &p[i];
			//uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];
			uint32_t gray = 1.2*rgbaPixel[RED] + 1.0*rgbaPixel[GREEN] + 0.0*rgbaPixel[BLUE];
			// set the pixels to gray  
			rgbaPixel[RED] = gray;  
			rgbaPixel[GREEN] = gray;  
			rgbaPixel[BLUE] = gray;  
		} 

		CCTexture2D* texture = new CCTexture2D();  
		texture->autorelease();
		texture->initWithImage(image);
		image->release();

		return texture;
}
コード例 #2
0
ファイル: util.cpp プロジェクト: jieyaozu/FightingSolarSystem
CCTexture2D* Util::getGrayTexture(CCTexture2D* texture){
		typedef enum {  
			RED = 0,  
			GREEN = 1,  
			BLUE = 2,  
			ALPHA = 3  
		} PIXELS;  
		CCSize textSize = texture->getContentSize();
		CCSprite *temporarySprite = CCSprite::createWithTexture(texture);
		//就这么一小句搞了我半天了,不过能出来也值了
		temporarySprite->setAnchorPoint(ccp(0,0));
		CCRenderTexture *rt = CCRenderTexture::create(textSize.width, textSize.height);
		rt->begin();
		temporarySprite->visit();
		rt->end();
		
		CCImage *image = rt->newCCImage();
		unsigned char* pixels = image->getData();
		int len = image->getDataLen();
		uint32_t *p = (uint32_t *)pixels;
		for(int i=0;i<len;i++){
			uint8_t *rgbaPixel = (uint8_t *) &p[i];
			//uint32_t gray = 0.3 * rgbaPixel[RED] + 0.59 * rgbaPixel[GREEN] + 0.11 * rgbaPixel[BLUE];
			uint32_t gray = 1.2*rgbaPixel[RED] + 1.0*rgbaPixel[GREEN] + 0.0*rgbaPixel[BLUE];
			// set the pixels to gray  
			rgbaPixel[RED] = gray;  
			rgbaPixel[GREEN] = gray;  
			rgbaPixel[BLUE] = gray;  
		}
		CCTexture2D* newtexture = new CCTexture2D();  
		newtexture->autorelease();
		newtexture->initWithImage(image);

		image->release();
		return newtexture;
}
コード例 #3
0
ファイル: BSUtil.cpp プロジェクト: yitianljt/Box
CCSprite * BSAddStrokeToLabel(cocos2d::CCLabelTTF * label, float size, cocos2d::ccColor3B color, GLubyte opacity) {
    CCPoint originalPos = label->getPosition();
    ccColor3B originalColor = label->getColor();
    GLubyte originalOpacity = label->getOpacity();
    bool originalVisibility = label->isVisible();
    ccBlendFunc originalBlend = label->getBlendFunc();
    
    label->setColor(color);
    label->setOpacity(opacity);
    ccBlendFunc bf = {GL_SRC_ALPHA, GL_ONE};
    label->setBlendFunc(bf);
    
    CCPoint bottomLeft = ccp(label->getTexture()->getContentSize().width * label->getAnchorPoint().x + size,
                             label->getTexture()->getContentSize().height * label->getAnchorPoint().y + size);
    CCRenderTexture* rt = CCRenderTexture::create(label->getTexture()->getContentSize().width + size * 2,
                                                  label->getTexture()->getContentSize().height + size * 2);
    /* 在原始位置绘制文字,用于镂空用 */
    label->setPosition(bottomLeft);
    rt->begin();
    label->visit();
    rt->end();
    CCImage * originText = rt->newCCImage();
    glBlendEquation(GL_BLEND_EQUATION_ALPHA);
    /* 在各个方向上移动文字,重叠得到未镂空的描边 */
    rt->begin();
    /* Bresenham's circle algorithm */
    int radis = 3 * size;
    for (int x = 0, y = radis, d = 3 - 2 * radis; x <= y; ++x) {
        float xx = x / 3.0F, yy = y / 3.0F;
        label->setPosition(ccp(bottomLeft.x + xx, bottomLeft.y + yy)); label->visit();
        label->setPosition(ccp(bottomLeft.x - xx, bottomLeft.y + yy)); label->visit();
        label->setPosition(ccp(bottomLeft.x + xx, bottomLeft.y - yy)); label->visit();
        label->setPosition(ccp(bottomLeft.x - xx, bottomLeft.y - yy)); label->visit();
        label->setPosition(ccp(bottomLeft.x + yy, bottomLeft.y + xx)); label->visit();
        label->setPosition(ccp(bottomLeft.x - yy, bottomLeft.y + xx)); label->visit();
        label->setPosition(ccp(bottomLeft.x + yy, bottomLeft.y - xx)); label->visit();
        label->setPosition(ccp(bottomLeft.x - yy, bottomLeft.y - xx)); label->visit();
        if (d < 0) {
            d = d + 4 * x + 6;
        } else {
            d = d + 4 * (x - y) + 10;
            y --;
        }
    }
    rt->end();
    
    /* TODO: ugly workaround. rendertexture多次绘制颜色叠加,需要取色值大的那个,需要通过glBlendEquation(GL_MAX)实现。
     * see http://stackoverflow.com/questions/2143690/is-it-possible-to-achieve-maxas-ad-opengl-blending */
    CCImage * strokedText = rt->newCCImage();
    unsigned char * pStorke = strokedText->getData();
    unsigned char * pErase = originText->getData();
    for (int i = 0; i < strokedText->getDataLen(); ++i) {
        if ((unsigned int) pErase[i * 4] != 0) {
            *(unsigned int *) &pStorke[i * 4] = 0;
        } else if ((unsigned int) pStorke[i * 4] != 0) {
            unsigned char * pixel = &pStorke[i * 4];
            (*pixel++) = color.r;
            (*pixel++) = color.g;
            (*pixel++) = color.b;
             *pixel    = opacity;
        }
    }
    originText->release();
    
    /* 用RenderTexture构造一个Sprite,以实现支持透明度 FadeIn FadeOut */
    CCTexture2D * texture2D = new CCTexture2D();
    texture2D->initWithImage(strokedText);
    strokedText->release();
    CCSprite * sprite = CCSprite::createWithTexture(texture2D);
    texture2D->release();
    
    label->setPosition(originalPos);
    label->setColor(originalColor);
    label->setBlendFunc(originalBlend);
    label->setVisible(originalVisibility);
    label->setOpacity(originalOpacity);
    
    sprite->setPosition(ccp(label->getTexture()->getContentSize().width / 2, label->getTexture()->getContentSize().height / 2));
    label->addChild(sprite, -1);
    
    return sprite;
}