2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/public-api/images/buffer-image.h>
22 #include <dali-toolkit/public-api/controls/default-controls/solid-color-actor.h>
33 const unsigned int MAX_BORDER_SIZE( 9 );
36 ImageActor CreateSolidColorActor( const Vector4& color, bool border, const Vector4& borderColor, const unsigned int borderSize )
39 if( borderSize > MAX_BORDER_SIZE )
44 const unsigned int bitmapWidth = borderSize * 2 + 2;
45 bool needAlphaChannel = (color.a < 1.0f) || ( border && borderColor.a < 1.0f );
46 BufferImage imageData;
47 if( needAlphaChannel )
49 imageData = BufferImage::New( bitmapWidth, bitmapWidth, Pixel::RGBA8888 );
53 imageData = BufferImage::New( bitmapWidth, bitmapWidth, Pixel::RGB888 );
57 PixelBuffer* pixbuf = imageData.GetBuffer();
63 Vector4 outerColor = color;
66 outerColor = borderColor;
69 // Using a (2 + border) x (2 + border) image gives a better blend with the GL implementation
70 // than a (1 + border) x (1 + border) image
71 const unsigned int bitmapSize = bitmapWidth * bitmapWidth;
72 const unsigned int topLeft = bitmapWidth * borderSize + borderSize;
73 const unsigned int topRight = topLeft + 1;
74 const unsigned int bottomLeft = bitmapWidth * (borderSize + 1) + borderSize;
75 const unsigned int bottomRight = bottomLeft + 1;
77 if( needAlphaChannel )
79 for( size_t i = 0; i < bitmapSize; ++i )
86 pixbuf[i*4+0] = 0xFF * color.r;
87 pixbuf[i*4+1] = 0xFF * color.g;
88 pixbuf[i*4+2] = 0xFF * color.b;
89 pixbuf[i*4+3] = 0xFF * color.a;
93 pixbuf[i*4+0] = 0xFF * outerColor.r;
94 pixbuf[i*4+1] = 0xFF * outerColor.g;
95 pixbuf[i*4+2] = 0xFF * outerColor.b;
96 pixbuf[i*4+3] = 0xFF * outerColor.a;
102 for( size_t i = 0; i < bitmapSize; ++i )
109 pixbuf[i*3+0] = 0xFF * color.r;
110 pixbuf[i*3+1] = 0xFF * color.g;
111 pixbuf[i*3+2] = 0xFF * color.b;
115 pixbuf[i*3+0] = 0xFF * outerColor.r;
116 pixbuf[i*3+1] = 0xFF * outerColor.g;
117 pixbuf[i*3+2] = 0xFF * outerColor.b;
123 image = ImageActor::New( imageData );
124 image.SetParentOrigin( ParentOrigin::CENTER );
128 image.SetStyle( ImageActor::STYLE_NINE_PATCH );
129 image.SetNinePatchBorder( Vector4::ONE * (float)borderSize * 2.0f );
135 } // namespace Toolkit