From 3d43200af00372dd54abe2b86b00ca15a4fc6d82 Mon Sep 17 00:00:00 2001 From: louis Date: Tue, 31 Mar 2015 06:57:02 +0200 Subject: added possibility to draw vertical text bottomum and topdown --- HISTORY | 2 ++ dtd/functions.dtd | 1 + libcore/cairoimage.c | 15 ++++++++++++--- libcore/cairoimage.h | 2 +- libcore/imagecache.c | 6 +++--- libcore/imagecache.h | 2 +- libtemplate/templatefunction.c | 28 +++++++++++++++++++++++++++- libtemplate/templatefunction.h | 8 ++++++++ libtemplate/templateview.c | 1 + views/view.c | 8 ++++---- 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::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(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 > 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(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; -- cgit v1.2.3