summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY2
-rw-r--r--dtd/functions.dtd1
-rw-r--r--libcore/cairoimage.c15
-rw-r--r--libcore/cairoimage.h2
-rw-r--r--libcore/imagecache.c6
-rw-r--r--libcore/imagecache.h2
-rw-r--r--libtemplate/templatefunction.c28
-rw-r--r--libtemplate/templatefunction.h8
-rw-r--r--libtemplate/templateview.c1
-rw-r--r--views/view.c8
10 files changed, 60 insertions, 13 deletions
diff --git a/HISTORY b/HISTORY
index 87a712e..e7f8ebf 100644
--- a/HISTORY
+++ b/HISTORY
@@ -244,4 +244,6 @@ Version 0.3.3
- fixed bug that parameters with both dynamic tokens and relative width,
height, posx or posy values are not parsed correctly
- fixed bug also for loops
+- added possibility to draw vertical text bottomum and topdown
+
diff --git a/dtd/functions.dtd b/dtd/functions.dtd
index ce80a54..7ea61b6 100644
--- a/dtd/functions.dtd
+++ b/dtd/functions.dtd
@@ -108,6 +108,7 @@
fontsize CDATA #REQUIRED
name NMTOKEN #IMPLIED
text CDATA #REQUIRED
+ direction (bottomup|topdown) #IMPLIED
condition CDATA #IMPLIED
debug (true|false) #IMPLIED
>
diff --git a/libcore/cairoimage.c b/libcore/cairoimage.c
index 476b5f2..4b2bcab 100644
--- a/libcore/cairoimage.c
+++ b/libcore/cairoimage.c
@@ -1,4 +1,5 @@
#include "cairoimage.h"
+#include "../libtemplate/templatefunction.h"
cCairoImage::cCairoImage(void) {
surface = NULL;
@@ -21,18 +22,26 @@ void cCairoImage::InitCairoImage(int width, int height) {
cairo_set_antialias(cr, CAIRO_ANTIALIAS_SUBPIXEL);
}
-void cCairoImage::DrawTextVertical(string text, tColor color, string font, int size) {
+void cCairoImage::DrawTextVertical(string text, tColor color, string font, int size, int direction) {
int imgHeight = GetTextWidth(text, font, size);
InitCairoImage(size * 1.2, imgHeight);
SetColor(color);
- cairo_move_to (cr, size, imgHeight);
cairo_font_weight_t fontWeight = CAIRO_FONT_WEIGHT_NORMAL;
cairo_font_slant_t fontSlant = CAIRO_FONT_SLANT_NORMAL;
cairo_select_font_face (cr, font.c_str(), fontSlant, fontWeight);
cairo_set_font_size (cr, size);
- cairo_rotate(cr, 3*M_PI/2);
+ int x = size;
+ int y = imgHeight;
+ double rotate = 3*M_PI/2;
+ if (direction == diTopDown) {
+ rotate = M_PI/2;
+ x = size*0.3;
+ y = 0;
+ }
+ cairo_move_to (cr, x, y);
+ cairo_rotate(cr, rotate);
cairo_show_text (cr, text.c_str());
}
diff --git a/libcore/cairoimage.h b/libcore/cairoimage.h
index 02e9c89..27fb6f3 100644
--- a/libcore/cairoimage.h
+++ b/libcore/cairoimage.h
@@ -20,7 +20,7 @@ public:
cCairoImage(void);
virtual ~cCairoImage();
void InitCairoImage(int width, int height);
- void DrawTextVertical(string text, tColor color, string font, int size);
+ void DrawTextVertical(string text, tColor color, string font, int size, int direction);
cImage *GetImage(void);
};
#endif //__CAIROIMAGE_H \ No newline at end of file
diff --git a/libcore/imagecache.c b/libcore/imagecache.c
index e6188d2..ad063f6 100644
--- a/libcore/imagecache.c
+++ b/libcore/imagecache.c
@@ -332,17 +332,17 @@ cImage *cImageCache::GetSkinpart(string name, int width, int height) {
return NULL;
}
-cImage *cImageCache::GetVerticalText(string text, tColor color, string font, int size) {
+cImage *cImageCache::GetVerticalText(string text, tColor color, string font, int size, int direction) {
cMutexLock MutexLock(&mutex);
stringstream buf;
- buf << text << "_" << size;
+ buf << text << "_" << size << "_" << direction;
string imgName = buf.str();
map<string, cImage*>::iterator hit = cairoImageCache.find(imgName);
if (hit != cairoImageCache.end()) {
return (cImage*)hit->second;
} else {
cCairoImage c;
- c.DrawTextVertical(text, color, font, size);
+ c.DrawTextVertical(text, color, font, size, direction);
cImage *image = c.GetImage();
cairoImageCache.insert(pair<string, cImage*>(imgName, image));
hit = cairoImageCache.find(imgName);
diff --git a/libcore/imagecache.h b/libcore/imagecache.h
index f2c04f3..207dbb0 100644
--- a/libcore/imagecache.h
+++ b/libcore/imagecache.h
@@ -31,7 +31,7 @@ public:
void CacheSkinpart(string path, int width, int height);
cImage *GetSkinpart(string name, int width, int height);
//cairo special images
- cImage *GetVerticalText(string text, tColor color, string font, int size);
+ cImage *GetVerticalText(string text, tColor color, string font, int size, int direction);
//helpers
void Clear(void);
void Debug(bool full);
diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c
index 5e72948..afbc5fa 100644
--- a/libtemplate/templatefunction.c
+++ b/libtemplate/templatefunction.c
@@ -135,6 +135,8 @@ void cTemplateFunction::SetParameters(vector<pair<string, string> > params) {
p.first = ptCache;
} else if (!name.compare("determinatefont")) {
p.first = ptDeterminateFont;
+ } else if (!name.compare("direction")) {
+ p.first = ptDirection;
} else {
p.first = ptNone;
}
@@ -276,6 +278,9 @@ bool cTemplateFunction::CalculateParameters(void) {
case ptBackground:
paramValid = SetBackground(value);
break;
+ case ptDirection:
+ paramValid = SetDirection(value);
+ break;
default:
paramValid = true;
break;
@@ -420,6 +425,8 @@ int cTemplateFunction::GetNumericParameter(eParamType type) {
return 0;
else if (type == ptBackground)
return 0;
+ else if (type == ptDirection)
+ return diBottomUp;
return -1;
}
return hit->second;
@@ -475,6 +482,9 @@ int cTemplateFunction::GetWidth(bool cutted) {
else
funcWidth = fontManager->Width(fontName, GetNumericParameter(ptFontSize), parsedText.c_str());
break; }
+ case ftDrawTextVertical:
+ funcWidth = GetNumericParameter(ptFontSize)*1.2;
+ break;
case ftFill:
case ftDrawImage:
case ftDrawRectangle:
@@ -496,6 +506,9 @@ int cTemplateFunction::GetHeight(void) {
case ftDrawText:
funcHeight = fontManager->Height(fontName, GetNumericParameter(ptFontSize));
break;
+ case ftDrawTextVertical:
+ funcHeight = fontManager->Width(fontName, GetNumericParameter(ptFontSize), parsedText.c_str());
+ break;
case ftFill:
case ftDrawImage:
case ftDrawRectangle:
@@ -1092,6 +1105,16 @@ bool cTemplateFunction::SetBackground(string value) {
return true;
}
+bool cTemplateFunction::SetDirection(string value) {
+ int direction = diNone;
+ if (!value.compare("bottomup"))
+ direction = diBottomUp;
+ else if (!value.compare("topdown"))
+ direction = diTopDown;
+ numericParameters.insert(pair<eParamType, int>(ptDirection, direction));
+ return true;
+}
+
void cTemplateFunction::ParseStringParameters(void) {
//first replace stringtokens in Text (drawText)
stringstream text;
@@ -1581,7 +1604,10 @@ string cTemplateFunction::GetParamName(eParamType pt) {
break;
case ptDeterminateFont:
name = "Determinate Font";
- break;
+ break;
+ case ptDirection:
+ name = "Text Direction";
+ break;
default:
name = "Unknown";
break;
diff --git a/libtemplate/templatefunction.h b/libtemplate/templatefunction.h
index a862aa7..3c7e515 100644
--- a/libtemplate/templatefunction.h
+++ b/libtemplate/templatefunction.h
@@ -81,6 +81,7 @@ enum eParamType {
ptHideRoot,
ptCache,
ptDeterminateFont,
+ ptDirection,
ptNone
};
@@ -105,6 +106,12 @@ enum eOverflowType {
otCut
};
+enum eDirection {
+ diNone,
+ diBottomUp,
+ diTopDown
+};
+
class cTemplateFunction {
protected:
eFuncType type;
@@ -156,6 +163,7 @@ protected:
bool SetHideRoot(string value);
bool SetDetached(string value);
bool SetBackground(string value);
+ bool SetDirection(string value);
void ParseStringParameters(void);
void ParseNumericalParameters(void);
void CalculateAlign(int elementWidth, int elementHeight);
diff --git a/libtemplate/templateview.c b/libtemplate/templateview.c
index df523a1..a111d70 100644
--- a/libtemplate/templateview.c
+++ b/libtemplate/templateview.c
@@ -727,6 +727,7 @@ void cTemplateView::SetFunctionDefinitions(void) {
attributes.insert("height");
attributes.insert("align");
attributes.insert("valign");
+ attributes.insert("direction");
attributes.insert("font");
attributes.insert("fontsize");
attributes.insert("color");
diff --git a/views/view.c b/views/view.c
index a76c48a..344a350 100644
--- a/views/view.c
+++ b/views/view.c
@@ -513,10 +513,11 @@ void cView::DoDrawText(int num, cTemplateFunction *func, int x0, int y0) {
void cView::DoDrawTextVertical(int num, cTemplateFunction *func, int x0, int y0) {
string fontName = func->GetFontName();
int fontSize = func->GetNumericParameter(ptFontSize);
+ int direction = func->GetNumericParameter(ptDirection);
tColor clr = func->GetColorParameter(ptColor);
tColor clrBack = clrTransparent;
string text = func->GetText(false);
- cImage *textVertical = imgCache->GetVerticalText(text, clr, fontName, fontSize);
+ cImage *textVertical = imgCache->GetVerticalText(text, clr, fontName, fontSize, direction);
if (!textVertical)
return;
@@ -529,7 +530,7 @@ void cView::DoDrawTextVertical(int num, cTemplateFunction *func, int x0, int y0)
x = (containerWidth - textVertical->Width()) / 2;
} else if (align == alLeft) {
x = 0;
- } else if (align = alRight) {
+ } else if (align == alRight) {
int containerWidth = func->GetContainerWidth();
x = (containerWidth - textVertical->Width());
} else {
@@ -542,13 +543,12 @@ void cView::DoDrawTextVertical(int num, cTemplateFunction *func, int x0, int y0)
y = (containerHeight - textVertical->Height()) / 2;
} else if (align == alTop) {
y = 0;
- } else if (align = alBottom) {
+ } else if (align == alBottom) {
int containerHeight = func->GetContainerHeight();
y = (containerHeight - textVertical->Height());
} else {
y = func->GetNumericParameter(ptY);
}
-
if (x < 0) x = 0;
x += x0;
if (y < 0) y = func->GetContainerHeight() - textVertical->Height() - 5;