Просмотр исходного кода

Premultiplied alpha support in labels

Ivan Safrin 13 лет назад
Родитель
Сommit
f6edf81027

+ 3 - 1
Core/Contents/Include/PolyLabel.h

@@ -34,7 +34,7 @@ namespace Polycode {
 	class _PolyExport Label : public Image {
 		public:
 			
-			Label(Font *font, const String& text, int size, int antiAliasMode);
+			Label(Font *font, const String& text, int size, int antiAliasMode, bool premultiplyAlpha = false);
 			virtual ~Label();
 			void setText(const String& text);
 			const String& getText() const;
@@ -52,6 +52,8 @@ namespace Polycode {
 			
 		protected:
 
+			bool premultiplyAlpha;
+
 			Number currentTextWidth;
 			Number currentTextHeight;
 			int antiAliasMode;

+ 1 - 1
Core/Contents/Include/PolySceneLabel.h

@@ -46,7 +46,7 @@ namespace Polycode {
 			* @param scale Scale to multiply pixel size by for the actual world size of the label.
 			* @param Anti-aliasing mode. Can be Label::ANTIALIAS_FULL or Label::ANTIALIAS_NONE.
 			*/			
-			SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode);
+			SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode, bool premultiplyAlpha = false);
 			virtual ~SceneLabel();			
 		
 			/**

+ 1 - 1
Core/Contents/Include/PolyScreenLabel.h

@@ -42,7 +42,7 @@ namespace Polycode {
 			* @param size Size in pixels.
 			* @param Anti-aliasing mode.
 			*/
-			ScreenLabel(const String& text, int size, const String& fontName = "sans", int amode = 0);
+			ScreenLabel(const String& text, int size, const String& fontName = "sans", int amode = 0, bool premultiplyAlpha = false);
 			virtual ~ScreenLabel();		
 		
 			/**

+ 17 - 7
Core/Contents/Source/PolyLabel.cpp

@@ -28,10 +28,11 @@ using namespace Polycode;
 #define NORMAL_FT_FLAGS FT_LOAD_TARGET_LIGHT
 
 
-Label::Label(Font *font, const String& text, int size, int antiAliasMode) : Image() {
+Label::Label(Font *font, const String& text, int size, int antiAliasMode, bool premultiplyAlpha) : Image() {
 		setPixelType(Image::IMAGE_RGBA);
 		this->font = font;
 		this->size = size;
+		this->premultiplyAlpha = premultiplyAlpha;
 		imageData = NULL;
 		this->antiAliasMode = antiAliasMode;
 		currentTextWidth = 0;
@@ -186,12 +187,21 @@ void Label::setText(const String& text) {
 					if(!(j%slot->bitmap.width) && j !=0)
 						lineoffset += (textWidth*4)-(slot->bitmap.width * 4);
 
-						imageData[xoff+lineoffset] = 255;
-						imageData[xoff+lineoffset+1] =  255;
-						imageData[xoff+lineoffset+2] =  255;
-						
-						if(imageData[xoff+lineoffset+3] == 0)
-							imageData[xoff+lineoffset+3] =  slot->bitmap.buffer[j];
+						int newVal = imageData[xoff+lineoffset+3] + slot->bitmap.buffer[j];
+						if(newVal > 255)
+							newVal = 255;
+						imageData[xoff+lineoffset+3] = newVal;
+													
+						if(premultiplyAlpha) {
+							imageData[xoff+lineoffset] = (int)(255.0 * ((Number)imageData[xoff+lineoffset+3])/255.0);
+							imageData[xoff+lineoffset+1] =  (int)(255.0 * ((Number)imageData[xoff+lineoffset+3])/255.0);
+							imageData[xoff+lineoffset+2] =  (int)(255.0 * ((Number)imageData[xoff+lineoffset+3])/255.0);
+						} else {
+							imageData[xoff+lineoffset] = 255;
+							imageData[xoff+lineoffset+1] =  255;
+							imageData[xoff+lineoffset+2] =  255;						
+						} 	
+							
 						xoff += 4;
 				}
 			break;

+ 2 - 2
Core/Contents/Source/PolySceneLabel.cpp

@@ -31,8 +31,8 @@
 
 using namespace Polycode;
 
-SceneLabel::SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode) : ScenePrimitive(ScenePrimitive::TYPE_PLANE, 1, 1) {
-	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode);
+SceneLabel::SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode, bool premultiplyAlpha) : ScenePrimitive(ScenePrimitive::TYPE_PLANE, 1, 1) {
+	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
 	this->scale = scale;
 	setText(text);
 	mesh->arrayDirtyMap[RenderDataArray::TEXCOORD_DATA_ARRAY] = true;

+ 2 - 2
Core/Contents/Source/PolyScreenLabel.cpp

@@ -32,8 +32,8 @@
 
 using namespace Polycode;
 
-ScreenLabel::ScreenLabel(const String& text, int size, const String& fontName, int amode) : ScreenShape(ScreenShape::SHAPE_RECT,1,1) {
-	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode);
+ScreenLabel::ScreenLabel(const String& text, int size, const String& fontName, int amode, bool premultiplyAlpha) : ScreenShape(ScreenShape::SHAPE_RECT,1,1) {
+	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
 	dropShadowImage = NULL;
 	texture = NULL;
 	setText(text);