BufferImage CreateBufferImage( const Vector4& color, const unsigned int width, const unsigned int height ) { BufferImage imageData = BufferImage::New( width, height, Pixel::RGBA8888 ); // Create the image PixelBuffer* pixbuf = imageData.GetBuffer(); const unsigned int bitmapSize = width * height; for( size_t i = 0; i < bitmapSize; ++i ) { pixbuf[i*4+0] = 0xFF * color.r; pixbuf[i*4+1] = 0xFF * color.g; pixbuf[i*4+2] = 0xFF * color.b; pixbuf[i*4+3] = 0xFF * color.a; } imageData.Update(); return imageData; }
ImageActor CreateSolidColorActor( const Vector4& color, bool border, const Vector4& borderColor, const unsigned int borderSize ) { ImageActor image; if( borderSize > MAX_BORDER_SIZE ) { return image; } const unsigned int bitmapWidth = borderSize * 2 + 2; bool needAlphaChannel = (color.a < 1.0f) || ( border && borderColor.a < 1.0f ); BufferImage imageData; if( needAlphaChannel ) { imageData = BufferImage::New( bitmapWidth, bitmapWidth, Pixel::RGBA8888 ); } else { imageData = BufferImage::New( bitmapWidth, bitmapWidth, Pixel::RGB888 ); } // Create the image PixelBuffer* pixbuf = imageData.GetBuffer(); if( !pixbuf ) { return image; } Vector4 outerColor = color; if ( border ) { outerColor = borderColor; } // Using a (2 + border) x (2 + border) image gives a better blend with the GL implementation // than a (1 + border) x (1 + border) image const unsigned int bitmapSize = bitmapWidth * bitmapWidth; const unsigned int topLeft = bitmapWidth * borderSize + borderSize; const unsigned int topRight = topLeft + 1; const unsigned int bottomLeft = bitmapWidth * (borderSize + 1) + borderSize; const unsigned int bottomRight = bottomLeft + 1; if( needAlphaChannel ) { for( size_t i = 0; i < bitmapSize; ++i ) { if( i == topLeft || i == topRight || i == bottomLeft || i == bottomRight ) { pixbuf[i*4+0] = 0xFF * color.r; pixbuf[i*4+1] = 0xFF * color.g; pixbuf[i*4+2] = 0xFF * color.b; pixbuf[i*4+3] = 0xFF * color.a; } else { pixbuf[i*4+0] = 0xFF * outerColor.r; pixbuf[i*4+1] = 0xFF * outerColor.g; pixbuf[i*4+2] = 0xFF * outerColor.b; pixbuf[i*4+3] = 0xFF * outerColor.a; } } } else { for( size_t i = 0; i < bitmapSize; ++i ) { if( i == topLeft || i == topRight || i == bottomLeft || i == bottomRight ) { pixbuf[i*3+0] = 0xFF * color.r; pixbuf[i*3+1] = 0xFF * color.g; pixbuf[i*3+2] = 0xFF * color.b; } else { pixbuf[i*3+0] = 0xFF * outerColor.r; pixbuf[i*3+1] = 0xFF * outerColor.g; pixbuf[i*3+2] = 0xFF * outerColor.b; } } } imageData.Update(); image = ImageActor::New( imageData ); image.SetParentOrigin( ParentOrigin::CENTER ); if( border ) { image.SetStyle( ImageActor::STYLE_NINE_PATCH ); image.SetNinePatchBorder( Vector4::ONE * (float)borderSize * 2.0f ); } return image; }