</applet>
</screen>
- <screen name="ChoiceBox_summary" position="0,0" size="132,64">
- <widget source="parent.summary_list" render="Label" position="6,0" size="126,64" font="Regular;11" />
- </screen>
+
<!-- Common interface -->
<screen name="MMIDialog" position="center,center" size="450,270">
<widget name="title" position="10,10" size="430,25" font="Regular;23" />
self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y()))
</applet>
</screen>
- <screen name="MessageBox_summary" position="0,0" size="132,64">
- <widget source="parent.Text" render="Label" position="0,0" size="132,52" font="Regular;11" halign="center" valign="center" />
- <widget source="parent.selectedChoice" render="Label" position="6,50" size="120,14" font="Regular;14" halign="center" valign="center" />
- </screen>
<!-- Minute input -->
<screen name="MinuteInput" position="center,center" size="280,60" title="Seek">
<widget name="minutes" position="80,15" size="160,25" halign="right" font="Regular;23" />
<widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
<widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
<widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
- <widget name="list" position="5,50" size="550,280" scrollbarMode="showOnDemand" zPosition="10"/>
+ <widget source="list" render="Listbox" position="5,50" size="550,280" zPosition="10" scrollbarMode="showOnDemand">
+ <convert type="TemplatedMultiContent"> <!-- iface, name, description, interfacepng, defaultpng, activepng, divpng -->
+ {"template": [
+ MultiContentEntryText(pos = (85, 6), size = (440, 28), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1), # index 1 is the interfacename
+ MultiContentEntryText(pos = (85, 43), size = (440, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, text = 2), # index 2 is the description
+ MultiContentEntryPixmapAlphaTest(pos = (2, 8), size = (54, 54), png = 3), # index 3 is the interface pixmap
+ MultiContentEntryPixmapAlphaTest(pos = (63, 46), size = (15, 16), png = 4), # index 4 is the default pixmap
+ ],
+ "fonts": [gFont("Regular", 28),gFont("Regular", 20)],
+ "itemHeight": 70
+ }
+ </convert>
+ </widget>
<ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />
<widget source="introduction" render="Label" position="0,350" size="560,50" zPosition="10" font="Regular;21" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
</screen>
<ePixmap pixmap="skin_default/volume.png" position="0,0" size="214,21" />
<widget name="Volume" pixmap="skin_default/progress_small.png" position="31,7" zPosition="1" size="168,7" transparent="1" />
</screen>
+ <!-- JobView -->
+ <screen name="JobView" position="center,center" size="520,350" title="Job View">
+ <widget source="job_name" render="Label" position="20,12" size="480,60" font="Regular;28" />
+ <widget source="job_task" render="Label" position="20,90" size="480,50" font="Regular;23" />
+ <widget source="job_progress" render="Progress" position="20,162" size="480,36" borderWidth="2" backgroundColor="#254f7497" />
+ <widget source="job_progress" render="Label" position="120,166" size="280,32" font="Regular;28" foregroundColor="#000000" zPosition="2" halign="center" transparent="1" >
+ <convert type="ProgressToText" />
+ </widget>
+ <widget source="job_status" render="Label" position="20,212" size="480,26" font="Regular;23" />
+ <widget name="config" position="20,254" size="480,20" />
+ <widget source="cancelable" render="Pixmap" pixmap="skin_default/buttons/red.png" position="20,300" size="140,40" alphatest="on" >
+ <convert type="ConditionalShowHide" />
+ </widget>
+ <widget source="cancelable" render="FixedLabel" text="Cancel" position="20,300" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" >
+ <convert type="ConditionalShowHide" />
+ </widget>
+ <widget source="finished" render="Pixmap" pixmap="skin_default/buttons/green.png" position="190,300" size="140,40" alphatest="on" >
+ <convert type="ConditionalShowHide" />
+ </widget>
+ <widget source="finished" render="FixedLabel" text="OK" font="Regular;20" halign="center" valign="center" position="190,300" size="140,40" transparent="1" backgroundColor="#1f771f" >
+ <convert type="ConditionalShowHide" />
+ </widget>
+ <widget source="backgroundable" render="Pixmap" pixmap="skin_default/buttons/blue.png" position="360,300" size="140,40" alphatest="on" >
+ <convert type="ConditionalShowHide" />
+ </widget>
+ <widget source="backgroundable" render="FixedLabel" text="Continue in background" font="Regular;20" halign="center" valign="center" position="360,300" size="140,40" transparent="1" backgroundColor="#18188b" >
+ <convert type="ConditionalShowHide" />
+ </widget>
+ </screen>
+ <!-- VirtualKeyBoard -->
+ <screen name="VirtualKeyBoard" position="center,center" size="560,350" zPosition="99" title="Virtual KeyBoard">
+ <ePixmap pixmap="skin_default/vkey_text.png" position="9,35" zPosition="-4" size="542,52" alphatest="on" />
+ <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" />
+ <widget name="text" position="12,35" size="536,46" font="Regular;46" transparent="1" noWrap="1" halign="right" />
+ <widget name="list" position="10,100" size="540,225" selectionDisabled="1" transparent="1" />
+ </screen>
+ <!-- FileBrowser -->
+ <screen name="FileBrowser" position="center,center" size="520,430" title="DVD File Browser" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget name="filelist" position="5,50" size="510,370" scrollbarMode="showOnDemand" />
+ </screen>
<!-- LCD/OLED Screens -->
<!-- LCD screen (channelselection) -->
- <screen name="ChannelSelection_summary" position="0,0" size="132,64">
+ <screen name="ChannelSelection_summary" position="0,0" size="132,64" id="1">
<widget source="parent.ServiceEvent" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
<convert type="ServiceName">Name</convert>
</widget>
<widget source="global.CurrentTime" render="Label" position="100,34" zPosition="1" size="26,30" font="Regular;16" valign="top">
<convert type="ClockToText">Format:%S</convert>
</widget>
+ </screen>
+ <!-- Color OLED screen (ChannelSelection) -->
+ <screen name="ChannelSelection_summary" position="0,0" size="96,64" id="2">
+ <widget source="parent.ServiceEvent" render="Label" position="0,0" size="96,28" font="Regular;16" halign="center" valign="center" >
+ <convert type="ServiceName">Name</convert>
+ </widget>
+ <widget source="session.Event_Now" render="Progress" position="0,30" size="96,8" borderWidth="1" backgroundColor="dark">
+ <convert type="EventTime">Progress</convert>
+ </widget>
+ <widget source="global.CurrentTime" render="Label" position="0,38" size="96,26" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
+ <convert type="ClockToText">Format:%H:%M</convert>
+ </widget>
</screen>
<!-- LCD screen (main) -->
- <screen name="InfoBarSummary" position="0,0" size="132,64">
+ <screen name="InfoBarSummary" position="0,0" size="132,64" id="1">
<widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
<convert type="ServiceName">Name</convert>
</widget>
<convert type="ConditionalShowHide">Blink</convert>
</widget>
</screen>
- <!-- LCD screen (menus) -->
- <screen name="MenuSummary" position="0,0" size="132,64">
- <widget source="parent.title" render="Label" position="6,0" size="120,32" font="Regular;14" halign="center" valign="center"/>
- <widget source="parent.menu" render="Label" position="6,32" size="120,32" font="Regular;16" halign="center" valign="center">
- <convert type="StringListSelection" />
+ <!-- Color OLED screen (main) -->
+ <screen name="InfoBarSummary" position="0,0" size="96,64" id="2">
+ <widget source="session.CurrentService" render="Label" position="0,0" size="96,28" font="Regular;16" halign="center" valign="center" >
+ <convert type="ServiceName">Name</convert>
+ </widget>
+ <widget source="session.Event_Now" render="Progress" position="0,30" size="96,8" borderWidth="1" backgroundColor="dark">
+ <convert type="EventTime">Progress</convert>
+ </widget>
+ <widget source="global.CurrentTime" render="Label" position="0,38" size="96,26" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
+ <convert type="ClockToText">Format:%H:%M</convert>
+ </widget>
+ <widget source="session.RecordState" render="FixedLabel" text=" " position="0,38" zPosition="1" size="96,30">
+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
+ <convert type="ConditionalShowHide">Blink</convert>
</widget>
</screen>
<!-- LCD screen (movieplayer) -->
- <screen name="InfoBarMoviePlayerSummary" position="0,0" size="132,64">
+ <screen name="InfoBarMoviePlayerSummary" position="0,0" size="132,64" id="1">
<widget source="session.CurrentService" render="Label" position="6,0" size="120,25" font="Regular;14" halign="center" valign="center" >
<convert type="ServiceName">Name</convert>
</widget>
<convert type="ConditionalShowHide">Blink</convert>
</widget>
</screen>
+ <!-- Color OLED screen (movieplayer) -->
+ <screen name="InfoBarMoviePlayerSummary" position="0,0" size="96,64" id="2">
+ <widget source="session.CurrentService" render="Label" position="0,0" size="96,28" font="Regular;16" halign="center" valign="center" >
+ <convert type="ServiceName">Name</convert>
+ </widget>
+ <widget source="session.Event_Now" render="Progress" position="0,30" size="96,8" borderWidth="1" backgroundColor="dark">
+ <convert type="EventTime">Progress</convert>
+ </widget>
+ <widget source="global.CurrentTime" render="Label" position="0,38" size="96,26" font="Regular;32" halign="center" valign="center" foregroundColor="#FFFFFF" backgroundColor="#000000" >
+ <convert type="ClockToText">Format:%H:%M</convert>
+ </widget>
+ <widget source="session.RecordState" render="FixedLabel" text=" " position="0,38" zPosition="1" size="96,30">
+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
+ <convert type="ConditionalShowHide">Blink</convert>
+ </widget>
+ </screen>
+ <!-- LCD screen (ChoiceBox) -->
+ <screen name="ChoiceBox_summary" position="0,0" size="132,64" id="1">
+ <widget source="parent.summary_list" render="Label" position="6,0" size="126,64" font="Regular;11" />
+ </screen>
+ <!-- Color OLED screen (ChoiceBox) -->
+ <screen name="ChoiceBox_summary" position="0,0" size="96,64" id="2">
+ <widget source="parent.summary_list" render="Label" position="0,0" size="96,64" font="Regular;10" />
+ </screen>
+ <!-- LCD screen (MessageBox) -->
+ <screen name="MessageBox_summary" position="0,0" size="132,64" id="1">
+ <widget source="parent.Text" render="Label" position="0,0" size="132,52" font="Regular;11" halign="center" valign="center" />
+ <widget source="parent.selectedChoice" render="Label" position="6,50" size="120,14" font="Regular;14" halign="center" valign="center" />
+ </screen>
+ <!-- Color OLED screen (MessageBox) -->
+ <screen name="MessageBox_summary" position="0,0" size="96,64" id="2">
+ <widget source="parent.Text" render="Label" position="0,0" size="96,52" font="Regular;10" halign="center" valign="center" />
+ <widget source="parent.selectedChoice" render="Label" position="0,50" size="96,14" font="Regular;12" halign="center" valign="center" />
+ </screen>
+ <!-- LCD screen (menus) -->
+ <screen name="MenuSummary" position="0,0" size="132,64" id="1">
+ <widget source="parent.title" render="Label" position="6,0" size="120,32" font="Regular;14" halign="center" valign="center"/>
+ <widget source="parent.menu" render="Label" position="6,32" size="120,32" font="Regular;16" halign="center" valign="center">
+ <convert type="StringListSelection" />
+ </widget>
+ </screen>
+ <!-- Color OLED screen (menus) -->
+ <screen name="MenuSummary" position="0,0" size="96,64" id="2">
+ <widget source="parent.title" render="Label" position="0,0" size="96,32" font="Regular;15" halign="center" valign="center"/>
+ <widget source="parent.menu" render="Label" position="0,32" size="96,32" font="Regular;16" halign="center" valign="top">
+ <convert type="StringListSelection" />
+ </widget>
+ </screen>
+ <!-- LCD screen (ServiceScan) -->
+ <screen name="ServiceScanSummary" position="0,0" size="132,64" id="1">
+ <widget name="Title" position="6,4" size="120,42" font="Regular;16" transparent="1" />
+ <widget name="Service" position="6,22" size="120,26" font="Regular;12" transparent="1" />
+ <widget name="scan_progress" position="6,50" zPosition="1" borderWidth="1" size="56,12" backgroundColor="dark" />
+ </screen>
+ <!-- Color OLED screen (ServiceScan) -->
+ <screen name="ServiceScanSummary" position="0,0" size="96,64" id="2">
+ <widget name="Title" position="0,0" size="96,30" font="Regular;14" transparent="1" />
+ <widget name="Service" position="0,30" size="96,20" font="Regular;10" transparent="1" />
+ <widget name="scan_progress" position="0,50" zPosition="1" borderWidth="1" size="96,12" backgroundColor="dark" />
+ </screen>
<!-- LCD screen (setup) -->
- <screen name="SetupSummary" position="0,0" size="132,64">
+ <screen name="SetupSummary" position="0,0" size="132,64" id="1">
<widget source="SetupTitle" render="Label" position="6,0" size="120,16" font="Regular;12" />
<widget source="SetupEntry" render="Label" position="6,16" size="120,32" font="Regular;12" />
<widget source="SetupValue" render="Label" position="6,48" size="120,16" font="Regular;12" />
</screen>
+ <!-- Color OLED screen (setup) -->
+ <screen name="SetupSummary" position="0,0" size="96,64" id="2">
+ <widget source="SetupTitle" render="Label" position="0,0" size="96,16" font="Regular;10" />
+ <widget source="SetupEntry" render="Label" position="0,16" size="96,32" font="Regular;10" />
+ <widget source="SetupValue" render="Label" position="0,48" size="96,16" font="Regular;10" />
+ </screen>
<!-- LCD screen (misc) -->
- <screen name="SimpleSummary" position="0,0" size="132,64">
+ <screen name="SimpleSummary" position="0,0" size="132,64" id="1">
<widget source="parent.Title" render="Label" position="6,0" size="120,64" font="Regular;16" halign="center" valign="center" />
</screen>
+ <!-- Color OLED screen (misc) -->
+ <screen name="SimpleSummary" position="0,0" size="96,64" id="2">
+ <widget source="parent.Title" render="Label" position="0,0" size="96,64" font="Regular;14" halign="center" valign="center" />
+ </screen>
<!-- LCD screen (standby) -->
- <screen name="StandbySummary" position="0,0" size="132,64">
+ <screen name="StandbySummary" position="0,0" size="132,64" id="1">
<widget source="global.CurrentTime" render="Label" position="6,0" size="120,64" font="Regular;40" halign="center" valign="center">
<convert type="ClockToText">Format:%H:%M</convert>
</widget>
<convert type="ConditionalShowHide">Blink</convert>
</widget>
</screen>
- <!-- JobView -->
- <screen name="JobView" position="center,center" size="520,350" title="Job View">
- <widget source="job_name" render="Label" position="20,12" size="480,60" font="Regular;28" />
- <widget source="job_task" render="Label" position="20,90" size="480,50" font="Regular;23" />
- <widget source="job_progress" render="Progress" position="20,162" size="480,36" borderWidth="2" backgroundColor="#254f7497" />
- <widget source="job_progress" render="Label" position="120,166" size="280,32" font="Regular;28" foregroundColor="#000000" zPosition="2" halign="center" transparent="1" >
- <convert type="ProgressToText" />
- </widget>
- <widget source="job_status" render="Label" position="20,212" size="480,26" font="Regular;23" />
- <widget name="config" position="20,254" size="480,20" />
- <widget source="cancelable" render="Pixmap" pixmap="skin_default/buttons/red.png" position="20,300" size="140,40" alphatest="on" >
- <convert type="ConditionalShowHide" />
- </widget>
- <widget source="cancelable" render="FixedLabel" text="Cancel" position="20,300" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" >
- <convert type="ConditionalShowHide" />
- </widget>
- <widget source="finished" render="Pixmap" pixmap="skin_default/buttons/green.png" position="190,300" size="140,40" alphatest="on" >
- <convert type="ConditionalShowHide" />
- </widget>
- <widget source="finished" render="FixedLabel" text="OK" font="Regular;20" halign="center" valign="center" position="190,300" size="140,40" transparent="1" backgroundColor="#1f771f" >
- <convert type="ConditionalShowHide" />
- </widget>
- <widget source="backgroundable" render="Pixmap" pixmap="skin_default/buttons/blue.png" position="360,300" size="140,40" alphatest="on" >
- <convert type="ConditionalShowHide" />
+ <!-- Color OLED screen (standby) -->
+ <screen name="StandbySummary" position="0,0" size="96,64" id="2">
+ <widget source="global.CurrentTime" render="Label" position="0,0" size="96,64" font="Regular;38" halign="center" valign="center">
+ <convert type="ClockToText">Format:%H:%M</convert>
</widget>
- <widget source="backgroundable" render="FixedLabel" text="Continue in background" font="Regular;20" halign="center" valign="center" position="360,300" size="140,40" transparent="1" backgroundColor="#18188b" >
- <convert type="ConditionalShowHide" />
+ <widget source="session.RecordState" render="FixedLabel" position="0,0" zPosition="1" size="96,64" text=" ">
+ <convert type="ConfigEntryTest">config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean</convert>
+ <convert type="ConditionalShowHide">Blink</convert>
</widget>
</screen>
- <!-- JobView Summary -->
- <screen name="JobView_summary" position="0,0" size="132,64">
+ <!-- LCD screen (JobView) -->
+ <screen name="JobView_summary" position="0,0" size="132,64" id="1">
<widget source="parent.summary_job_name" render="Label" position="6,4" size="120,42" font="Regular;16" />
<widget source="parent.summary_job_task" render="Label" position="6,22" size="120,26" font="Regular;12" />
<widget source="parent.summary_job_progress" render="Progress" position="6,50" size="60,12" borderWidth="1" zPosition="1" />
<convert type="ProgressToText" />
</widget>
</screen>
- <!-- VirtualKeyBoard -->
- <screen name="VirtualKeyBoard" position="center,center" size="560,350" zPosition="99" title="Virtual KeyBoard">
- <ePixmap pixmap="skin_default/vkey_text.png" position="9,35" zPosition="-4" size="542,52" alphatest="on" />
- <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" />
- <widget name="text" position="12,35" size="536,46" font="Regular;46" transparent="1" noWrap="1" halign="right" />
- <widget name="list" position="10,100" size="540,225" selectionDisabled="1" transparent="1" />
+ <!-- Color OLED screen (JobView) -->
+ <screen name="JobView_summary" position="0,0" size="96,64" id="2">
+ <widget source="parent.summary_job_name" render="Label" position="0,4" size="96,42" font="Regular;14" />
+ <widget source="parent.summary_job_task" render="Label" position="0,22" size="96,26" font="Regular;10" />
+ <widget source="parent.summary_job_progress" render="Progress" position="0,50" size="60,12" borderWidth="1" zPosition="1" />
+ <widget source="parent.summary_job_progress" render="Label" position="60,50" size="36,12" font="Regular;10" zPosition="2" halign="center" transparent="1" >
+ <convert type="ProgressToText" />
+ </widget>
</screen>
- <!-- FileBrowser -->
- <screen name="FileBrowser" position="center,center" size="520,430" title="DVD File Browser" >
- <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
- <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
- <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
- <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
- <widget name="filelist" position="5,50" size="510,370" scrollbarMode="showOnDemand" />
+ <!-- LCD screen (Wizard) -->
+ <screen name="WizardSummary" position="0,0" size="132,64" id="1">
+ <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" />
+ <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12">
+ <convert type="StringListSelection" />
+ </widget>
</screen>
+ <!-- Color OLED screen (Wizard) -->
+ <screen name="WizardSummary" position="0,0" size="96,64" id="2">
+ <widget source="text" render="Label" position="0,0" size="96,16" font="Regular;14" transparent="1" />
+ <widget source="parent.list" render="Label" position="0,18" size="96,46" font="Regular;12">
+ <convert type="StringListSelection" />
+ </widget>
+ </screen>
+
</skin>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
+ #include <byteswap.h>
+
+ #ifndef BYTE_ORDER
+ #error "no BYTE_ORDER defined!"
+ #endif
// use this for init Freetype...
#include <ft2build.h>
i->x-=offset.x();
i->y-=offset.y();
i->bbox.moveBy(-offset.x(), -offset.y());
+ --lineChars.back();
+ ++charCount;
} while (i-- != glyphs.rbegin()); // rearrange them into the next line
cursor+=ePoint(linelength, 0); // put the cursor after that line
} else
ng.glyph_index = glyphIndex;
ng.flags = flags;
glyphs.push_back(ng);
+ ++charCount;
/* when we have a SHY, don't xadvance. It will either be the last in the line (when used for breaking), or not displayed. */
if (!(flags & GS_SOFTHYPHEN))
cursor.setX(left);
previous=0;
int linegap=current_face->size->metrics.height-(current_face->size->metrics.ascender+current_face->size->metrics.descender);
+
+ lineOffsets.push_back(cursor.y());
+ lineChars.push_back(charCount);
+ charCount=0;
+
cursor+=ePoint(0, (current_face->size->metrics.ascender+current_face->size->metrics.descender+linegap)>>6);
+
if (maximum.height()<cursor.y())
maximum.setHeight(cursor.y());
previous=0;
shape(uc_shape, uc_string);
// now do the usual logical->visual reordering
-#ifdef HAVE_FRIBIDI
+ int size=uc_shape.size();
+#ifdef HAVE_FRIBIDI
FriBidiCharType dir=FRIBIDI_TYPE_ON;
- {
- int size=uc_shape.size();
- uc_visual.resize(size);
- // gaaanz lahm, aber anders geht das leider nicht, sorry.
- FriBidiChar array[size], target[size];
- std::copy(uc_shape.begin(), uc_shape.end(), array);
- fribidi_log2vis(array, size, &dir, target, 0, 0, 0);
- uc_visual.assign(target, target+size);
- }
+ uc_visual.resize(size);
+ // gaaanz lahm, aber anders geht das leider nicht, sorry.
+ FriBidiChar array[size], target[size];
+ std::copy(uc_shape.begin(), uc_shape.end(), array);
+ fribidi_log2vis(array, size, &dir, target, 0, 0, 0);
+ uc_visual.assign(target, target+size);
#else
uc_visual=uc_shape;
#endif
- glyphs.reserve(uc_visual.size());
+ glyphs.reserve(size);
int nextflags = 0;
calc_bbox();
#ifdef HAVE_FRIBIDI
if (dir & FRIBIDI_MASK_RTL)
+ {
realign(dirRight);
+ doTopBottomReordering=true;
+ }
#endif
+
+ if (charCount)
+ {
+ lineOffsets.push_back(cursor.y());
+ lineChars.push_back(charCount);
+ charCount=0;
+ }
+
return 0;
}
gColor *lookup8, lookup8_invert[16];
gColor *lookup8_normal=0;
+ __u16 lookup16_normal[16], lookup16_invert[16], *lookup16;
__u32 lookup32_normal[16], lookup32_invert[16], *lookup32;
-
+
if (surface->bpp == 8)
{
if (surface->clut.data)
opcode=0;
} else
opcode=1;
+ } else if (surface->bpp == 16)
+ {
+ opcode=2;
+ for (int i=0; i<16; ++i)
+ {
+ #define BLEND(y, x, a) (y + (((x-y) * a)>>8))
+ unsigned char da = background.a, dr = background.r, dg = background.g, db = background.b;
+ int sa = i * 16;
+ if (sa < 256)
+ {
+ dr = BLEND(background.r, foreground.r, sa) & 0xFF;
+ dg = BLEND(background.g, foreground.g, sa) & 0xFF;
+ db = BLEND(background.b, foreground.b, sa) & 0xFF;
+ }
+ #undef BLEND
+ #if BYTE_ORDER == LITTLE_ENDIAN
+ lookup16_normal[i] = bswap_16(((db >> 3) << 11) | ((dg >> 2) << 5) | (dr >> 3));
+ #else
+ lookup16_normal[i] = ((db >> 3) << 11) | ((dg >> 2) << 5) | (dr >> 3);
+ #endif
+ da ^= 0xFF;
+ }
+ for (int i=0; i<16; ++i)
+ lookup16_invert[i]=lookup16_normal[i^0xF];
} else if (surface->bpp == 32)
{
opcode=3;
-
for (int i=0; i<16; ++i)
{
#define BLEND(y, x, a) (y + (((x-y) * a)>>8))
eWarning("can't render to %dbpp", surface->bpp);
return;
}
-
+
gRegion area(eRect(0, 0, surface->x, surface->y));
gRegion clip = dc.getClip() & area;
int buffer_stride=surface->stride;
-
+
for (unsigned int c = 0; c < clip.rects.size(); ++c)
{
- for (glyphString::iterator i(glyphs.begin()); i != glyphs.end(); ++i)
+ std::list<int>::reverse_iterator line_offs_it(lineOffsets.rbegin());
+ std::list<int>::iterator line_chars_it(lineChars.begin());
+ int line_offs=0;
+ int line_chars=0;
+ for (glyphString::iterator i(glyphs.begin()); i != glyphs.end(); ++i, --line_chars)
{
+ while(!line_chars)
+ {
+ line_offs = *(line_offs_it++);
+ line_chars = *(line_chars_it++);
+ }
+
if (i->flags & GS_SOFTHYPHEN)
continue;
if (!(i->flags & GS_INVERT))
{
lookup8 = lookup8_normal;
+ lookup16 = lookup16_normal;
lookup32 = lookup32_normal;
} else
{
lookup8 = lookup8_invert;
+ lookup16 = lookup16_invert;
lookup32 = lookup32_invert;
}
-
+
static FTC_SBit glyph_bitmap;
if (fontRenderClass::instance->getGlyphBitmap(&i->font->font, i->glyph_index, &glyph_bitmap))
continue;
int rx=i->x+glyph_bitmap->left + offset.x();
- int ry=i->y-glyph_bitmap->top + offset.y();
-
+ int ry=(doTopBottomReordering ? line_offs : i->y) - glyph_bitmap->top + offset.y();
+
__u8 *d=(__u8*)(surface->data)+buffer_stride*ry+rx*surface->bypp;
__u8 *s=glyph_bitmap->buffer;
register int sx=glyph_bitmap->width;
d+=diff*buffer_stride;
}
if (sx>0)
- for (int ay=0; ay<sy; ay++)
- {
- if (!opcode) // 4bit lookup to 8bit
+ {
+ switch(opcode) {
+ case 0: // 4bit lookup to 8bit
+ for (int ay=0; ay<sy; ay++)
{
register __u8 *td=d;
register int ax;
-
for (ax=0; ax<sx; ax++)
- {
+ {
register int b=(*s++)>>4;
if(b)
*td++=lookup8[b];
else
td++;
}
- } else if (opcode == 1) // 8bit direct
+ s+=glyph_bitmap->pitch-sx;
+ d+=buffer_stride;
+ }
+ break;
+ case 1: // 8bit direct
+ for (int ay=0; ay<sy; ay++)
{
register __u8 *td=d;
register int ax;
for (ax=0; ax<sx; ax++)
- {
+ {
register int b=*s++;
*td++^=b;
}
- } else
+ s+=glyph_bitmap->pitch-sx;
+ d+=buffer_stride;
+ }
+ break;
+ case 2: // 16bit
+ for (int ay=0; ay<sy; ay++)
+ {
+ register __u16 *td=(__u16*)d;
+ register int ax;
+ for (ax=0; ax<sx; ax++)
+ {
+ register int b=(*s++)>>4;
+ if(b)
+ *td++=lookup16[b];
+ else
+ td++;
+ }
+ s+=glyph_bitmap->pitch-sx;
+ d+=buffer_stride;
+ }
+ break;
+ case 3: // 32bit
+ for (int ay=0; ay<sy; ay++)
{
register __u32 *td=(__u32*)d;
register int ax;
for (ax=0; ax<sx; ax++)
- {
+ {
register int b=(*s++)>>4;
if(b)
*td++=lookup32[b];
else
td++;
}
+ s+=glyph_bitmap->pitch-sx;
+ d+=buffer_stride;
}
- s+=glyph_bitmap->pitch-sx;
- d+=buffer_stride;
+ default:
+ break;
}
+ }
}
}
}