Ticket #4885: bidiosd.patch

File bidiosd.patch, 8.9 KB (added by ido <ido_roseman@…>, 12 years ago)
  • configure

     
    24382438disable fribidi
    24392439FRIBIDI_CONFIG="pkg-config fribidi"
    24402440if test x`which pkg-config 2>/dev/null` != x"" ; then
    2441    if `pkg-config --atleast-version 0.19 fribidi` ; then
     2441   if `pkg-config --atleast-version 0.10 fribidi` ; then
    24422442       check_cc `${FRIBIDI_CONFIG} --cflags` `${FRIBIDI_CONFIG} --libs` << EOF && enable fribidi
    24432443#include <stdio.h>
    24442444#include <fribidi/fribidi.h>
  • libs/libmythtv/osdtypes.cpp

     
    707707    m_linespacing(1.5f),
    708708
    709709    m_draw_info_str(""),
    710     m_draw_info_len(0),
     710    m_draw_info_len(0)
    711711
    712     codeci(NULL)
    713712{
    714713}
    715714
     
    745744    m_linespacing(1.5f),
    746745
    747746    m_draw_info_str(""),
    748     m_draw_info_len(0),
     747    m_draw_info_len(0)
    749748
    750     codeci(NULL)
    751749{
    752750    QMutexLocker locker(&other.m_lock);
    753751
     
    791789    m_altfont = font;
    792790}
    793791
    794 QString OSDTypeText::BasicConvertFromRtoL(const QString &text)
    795 {
    796     QStringList rtl_string_composer;
    797     bool handle_rtl = false;
    798     QChar prev_char;
    799 
    800     // Handling Right-to-Left languages.
    801     // Left-to-Right languages are not affected.
    802     for (int i = (int)text.length() - 1; i >= 0; i--)
    803     {
    804         QChar::Direction text_dir = text[i].direction();
    805         if (text_dir != QChar::DirR &&
    806             text_dir != QChar::DirRLE &&
    807             text_dir != QChar::DirRLO)
    808         {
    809             if (handle_rtl || rtl_string_composer.empty())
    810                 rtl_string_composer.append(QString());
    811 
    812             if (text[i].isSpace() && !prev_char.isNull()
    813                     && prev_char.isDigit() && handle_rtl)
    814                 rtl_string_composer.back().append(text[i]);
    815             else
    816                 rtl_string_composer.back().prepend(text[i]);
    817 
    818             prev_char = text[i];
    819 
    820             handle_rtl = false;
    821         }
    822         else
    823         {
    824             if (!handle_rtl)
    825             {
    826                 rtl_string_composer.append(QString());
    827                 handle_rtl = true;
    828                 prev_char = QChar();
    829             }
    830             rtl_string_composer.back().append(text[i]);
    831         }
    832     }
    833 
    834     QString output = rtl_string_composer.join("");
    835 
    836     return QDeepCopy<QString>(output);
    837 }
    838 
    839 QString OSDTypeText::ConvertFromRtoL(const QString &text) const
    840 {
    841     QString output = BasicConvertFromRtoL(text);
    842 
    843 #ifdef USING_FRIBIDI
    844     QMutexLocker locker(&fribidi_lock);
    845     if (!codeci)
    846         codeci = QTextCodec::codecForName("utf8");
    847 
    848     if (!codeci)
    849         return output;
    850 
    851     QCString temp = codeci->fromUnicode(output);
    852 
    853     FriBidiCharType base;
    854     size_t len;
    855 
    856     bool fribidi_flip_commas = true;
    857     base = (fribidi_flip_commas) ? FRIBIDI_TYPE_ON : FRIBIDI_TYPE_L;
    858 
    859     const char *ip = temp;
    860     FriBidiChar logical[strlen(ip) + 1], visual[strlen(ip) + 1];
    861 
    862     int char_set_num = fribidi_parse_charset("UTF-8");
    863 
    864     len = fribidi_charset_to_unicode(
    865         (FriBidiCharSet) char_set_num, ip, strlen(ip), logical);
    866 
    867     bool log2vis = fribidi_log2vis(
    868         logical, len, &base, visual, NULL, NULL, NULL); // output
    869 
    870     if (log2vis)
    871         len = fribidi_remove_bidi_marks(visual, len, NULL, NULL, NULL);
    872  
    873     output = "";
    874     for (size_t i = 0; i < len ; i++)
    875         output += QChar(visual[i]);
    876 #endif // USING_FRIBIDI
    877 
    878     return output;
    879 }
    880 
    881792void OSDTypeText::SetText(const QString &text)
    882793{
    883794    QMutexLocker locker(&m_lock);
    884     m_message    = ConvertFromRtoL(text);
     795    m_message    = text; //ConvertFromRtoL(text);
    885796    m_cursorpos  = m_message.length();
    886797    m_scrollinit = false;
    887798}
     
    895806void OSDTypeText::SetDefaultText(const QString &text)
    896807{
    897808    QMutexLocker locker(&m_lock);
    898     m_message     = ConvertFromRtoL(text);
     809    m_message     = text; //ConvertFromRtoL(text);
    899810    m_default_msg = QDeepCopy<QString>(m_message);
    900811    m_scrollinit  = false;
    901812}
  • libs/libmythtv/osdtypes.h

     
    238238    void SetButton(bool is_button)      { m_button = is_button;     }
    239239    void SetEntryNum(int entrynum)      { m_entrynum = entrynum;    }
    240240
    241     QString ConvertFromRtoL(const QString &text) const;
    242 
    243     static QString BasicConvertFromRtoL(const QString &text);
    244 
    245241  protected:
    246242    ~OSDTypeText();
    247243
     
    292288    mutable uint    m_draw_info_len;
    293289    mutable vector<DrawInfo> m_draw_info;
    294290
    295     mutable QMutex      fribidi_lock;
    296     mutable QTextCodec *codeci;
    297291};
    298292   
    299293class OSDTypeImage : public OSDType
  • libs/libmythtv/ttfont.h

     
    88#include <qstring.h>
    99#include <qmap.h>
    1010#include <qcolor.h>
     11#include <qmutex.h>
    1112
    1213#include "config.h"
    1314
     
    6869                     int height, int alphamod, kTTF_Color k = kTTF_Normal);
    6970     bool cache_glyph(unsigned short c);
    7071
     72    QString ConvertFromRtoL(const QString &text) const;
     73
     74    static QString BasicConvertFromRtoL(const QString &text);
     75
    7176     bool         valid;
    7277     FT_Library   library;
    7378     FT_Face      face;
     
    104109     int loadedfontsize;
    105110     float m_wscale;
    106111     float m_hmult;
     112
     113    mutable QMutex      fribidi_lock;
     114    mutable QTextCodec *codeci;
     115
    107116};
    108117
    109118#endif
  • libs/libmythtv/ttfont.cpp

     
    2121
    2222#include <iostream>
    2323
     24#ifdef USING_FRIBIDI
     25    #include "fribidi/fribidi.h"
     26    #include <qtextcodec.h>
     27#endif // USING_FRIBIDI
     28
    2429using namespace std;
    2530
    2631#include <cstdio>
     
    430435                               surface->pow_lut);
    431436}
    432437
     438QString TTFFont::BasicConvertFromRtoL(const QString &text)
     439{
     440    QStringList rtl_string_composer;
     441    bool handle_rtl = false;
     442    QChar prev_char;
     443
     444    // Handling Right-to-Left languages.
     445    // Left-to-Right languages are not affected.
     446    for (int i = (int)text.length() - 1; i >= 0; i--)
     447    {
     448        QChar::Direction text_dir = text[i].direction();
     449        if (text_dir != QChar::DirR &&
     450            text_dir != QChar::DirRLE &&
     451            text_dir != QChar::DirRLO)
     452        {
     453            if (handle_rtl || rtl_string_composer.empty())
     454                rtl_string_composer.append(QString());
     455
     456            if (text[i].isSpace() && !prev_char.isNull()
     457                    && prev_char.isDigit() && handle_rtl)
     458                rtl_string_composer.back().append(text[i]);
     459            else
     460                rtl_string_composer.back().prepend(text[i]);
     461
     462            prev_char = text[i];
     463
     464            handle_rtl = false;
     465        }
     466        else
     467        {
     468            if (!handle_rtl)
     469            {
     470                rtl_string_composer.append(QString());
     471                handle_rtl = true;
     472                prev_char = QChar();
     473            }
     474            rtl_string_composer.back().append(text[i]);
     475        }
     476    }
     477
     478    QString output = rtl_string_composer.join("");
     479
     480//    return QDeepCopy<QString>(output);
     481    return output;
     482}
     483
     484QString TTFFont::ConvertFromRtoL(const QString &text) const
     485{
     486    QString output = BasicConvertFromRtoL(text);
     487
     488#ifdef USING_FRIBIDI
     489    QMutexLocker locker(&fribidi_lock);
     490    if (!codeci)
     491        codeci = QTextCodec::codecForName("utf8");
     492
     493    if (!codeci)
     494        return output;
     495
     496    QCString temp = codeci->fromUnicode(text);
     497
     498    FriBidiCharType base;
     499    size_t len;
     500
     501    bool fribidi_flip_commas = true;
     502    base = (fribidi_flip_commas) ? FRIBIDI_TYPE_ON : FRIBIDI_TYPE_L;
     503
     504    const char *ip = temp;
     505    FriBidiChar logical[strlen(ip) + 1], visual[strlen(ip) + 1];
     506
     507    int char_set_num = fribidi_parse_charset("UTF-8");
     508
     509    len = fribidi_charset_to_unicode(
     510        (FriBidiCharSet) char_set_num, (char *)ip, strlen(ip), logical);
     511
     512    bool log2vis = fribidi_log2vis(
     513        logical, len, &base, visual, NULL, NULL, NULL); // output
     514
     515    if (log2vis)
     516        len = fribidi_remove_bidi_marks(visual, len, NULL, NULL, NULL);
     517
     518    output = "";
     519    for (size_t i = 0; i < len ; i++)
     520        output += QChar(visual[i]);
     521#endif // USING_FRIBIDI
     522
     523    return output;
     524}
     525
    433526void TTFFont::DrawString(OSDSurface *surface, int x, int y,
    434527                         const QString &text, int maxx, int maxy,
    435528                         int alphamod, bool double_size)
     
    452545   }
    453546   rmap = create_font_raster(w, h);
    454547
    455    render_text(rmap, rtmp, text, &inx, &iny, double_size);
     548   render_text(rmap, rtmp, ConvertFromRtoL(text), &inx, &iny, double_size);
    456549
    457550   is_pixmap = 1;
    458551