From: ghost Date: Wed, 6 Oct 2010 09:55:09 +0000 (+0200) Subject: Merge remote branch 'origin/bug_530_add_dm800se_support' X-Git-Tag: 3.0.0~78 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/37152843c915fd0a9352256d804ced4ff54c23c4?hp=-c Merge remote branch 'origin/bug_530_add_dm800se_support' --- 37152843c915fd0a9352256d804ced4ff54c23c4 diff --combined data/skin_default.xml index 497d33ac,aabefec4..8e0c1562 --- a/data/skin_default.xml +++ b/data/skin_default.xml @@@ -164,9 -164,7 +164,7 @@@ self.instance.move(ePoint((720-wsizex)/ - - - + @@@ -511,10 -509,6 +509,6 @@@ newwidth = wsize[0 self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - - - - @@@ -577,19 -571,7 +571,19 @@@ - + + + {"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 + } + + @@@ -1054,11 -1036,55 +1048,55 @@@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + Name @@@ -1071,9 -1097,21 +1109,21 @@@ Format:%S + + + + + Name + + + Progress + + + Format:%H:%M + - + Name @@@ -1091,15 -1129,24 +1141,24 @@@ Blink - - - - - + + + + Name + + + Progress + + + Format:%H:%M + + + config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean + Blink - + Name @@@ -1114,18 -1161,88 +1173,88 @@@ Blink + + + + Name + + + Progress + + + Format:%H:%M + + + config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean + Blink + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - + + + + + - + Format:%H:%M @@@ -1134,37 -1251,18 +1263,18 @@@ Blink - - - - - - - - - - - - - - - - - - - - - - - - + + + + Format:%H:%M - - + + config.usage.blinking_display_clock_during_recording,True,CheckSourceBoolean + Blink - - + + @@@ -1172,19 -1270,28 +1282,28 @@@ - - - - - - + + + + + + + + - - - - - - - + + + + + + + + + + + + + + diff --combined lib/dvb/dvb.cpp index 836851c5,688f1a13..40d44186 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@@ -96,6 -96,8 +96,8 @@@ eDVBResourceManager::eDVBResourceManage m_boxtype = DM800; else if (!strncmp(tmp, "dm500hd\n", rd)) m_boxtype = DM500HD; + else if (!strncmp(tmp, "dm800se\n", rd)) + m_boxtype = DM800SE; else { eDebug("boxtype detection via /proc/stb/info not possible... use fallback via demux count!\n"); if (m_demux.size() == 3) @@@ -455,7 -457,7 +457,7 @@@ RESULT eDVBResourceManager::allocateDem ePtr unused; - if (m_boxtype == DM800 || m_boxtype == DM500HD) // dm800 / 500hd + if (m_boxtype == DM800 || m_boxtype == DM500HD || m_boxtype == DM800SE) // dm800 / 500hd { cap |= capHoldDecodeReference; // this is checked in eDVBChannel::getDemux for (; i != m_demux.end(); ++i, ++n) @@@ -1657,18 -1659,6 +1659,18 @@@ void eDVBChannel::SDTready(int result m_SDT = 0; } +int eDVBChannel::reserveDemux() +{ + ePtr dmx; + if (!getDemux(dmx, 0)) + { + uint8_t id; + if (!dmx->getCADemuxID(id)) + return id; + } + return -1; +} + RESULT eDVBChannel::requestTsidOnid(ePyObject callback) { if (PyCallable_Check(callback)) diff --combined lib/dvb/dvb.h index 405bd557,9573bd48..fb925807 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@@ -135,7 -135,7 +135,7 @@@ class eDVBResourceManager: public iObje DECLARE_REF(eDVBResourceManager); int avail, busy; - enum { DM7025, DM800, DM500HD, DM8000 }; + enum { DM7025, DM800, DM500HD, DM800SE, DM8000 }; int m_boxtype; @@@ -268,7 -268,6 +268,7 @@@ public int getUseCount() { return m_use_count; } RESULT requestTsidOnid(ePyObject callback); + int reserveDemux(); private: ePtr m_frontend; ePtr m_demux, m_decoder_demux; diff --combined lib/gdi/font.cpp index 967c1df6,6688a3d4..a5db43a9 --- a/lib/gdi/font.cpp +++ b/lib/gdi/font.cpp @@@ -6,6 -6,11 +6,11 @@@ #include #include #include + #include + + #ifndef BYTE_ORDER + #error "no BYTE_ORDER defined!" + #endif // use this for init Freetype... #include @@@ -341,8 -346,6 +346,8 @@@ int eTextPara::appendGlyph(Font *curren 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 @@@ -380,7 -383,6 +385,7 @@@ 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)) @@@ -428,13 -430,7 +433,13 @@@ void eTextPara::newLine(int flags 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()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; @@@ -711,19 -709,8 +716,19 @@@ nprint: isprintable=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; } @@@ -766,8 -753,9 +771,9 @@@ void eTextPara::blit(gDC &dc, const ePo 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) @@@ -781,10 -769,33 +787,33 @@@ 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)) @@@ -809,45 -820,37 +838,47 @@@ 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::reverse_iterator line_offs_it(lineOffsets.rbegin()); + std::list::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; @@@ -873,46 -876,76 +904,76 @@@ d+=diff*buffer_stride; } if (sx>0) - for (int ay=0; ay>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; aypitch-sx; + d+=buffer_stride; + } + break; + case 2: // 16bit + for (int ay=0; ay>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>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; } + } } } } diff --combined lib/gdi/lcd.cpp index 0908d890,ae0477b4..a7dc22db --- a/lib/gdi/lcd.cpp +++ b/lib/gdi/lcd.cpp @@@ -14,13 -14,19 +14,19 @@@ eDBoxLCD *eDBoxLCD::instance; - eLCD::eLCD(eSize size): res(size) + eLCD::eLCD() { lcdfd = -1; locked=0; - _buffer=new unsigned char[res.height()*res.width()]; - memset(_buffer, 0, res.height()*res.width()); - _stride=res.width(); + } + + void eLCD::setSize(int xres, int yres, int bpp) + { + res = eSize(xres, yres); + _buffer=new unsigned char[xres * yres * bpp/8]; + memset(_buffer, 0, res.height()*res.width()*bpp/8); + _stride=res.width()*bpp/8; + eDebug("lcd buffer %p %d bytes, stride %d", _buffer, xres*yres*bpp/8, _stride); } eLCD::~eLCD() @@@ -42,16 -48,15 +48,17 @@@ void eLCD::unlock( locked=0; } - eDBoxLCD::eDBoxLCD(): eLCD(eSize(132, 64)) + eDBoxLCD::eDBoxLCD() { + int xres=132, yres=64, bpp=8; is_oled = 0; #ifndef NO_LCD lcdfd = open("/dev/dbox/oled0", O_RDWR); if (lcdfd < 0) { - FILE *f=fopen("/proc/stb/fp/oled_brightness", "w"); + FILE *f=fopen("/proc/stb/lcd/oled_brightness", "w"); + if (!f) + f = fopen("/proc/stb/fp/oled_brightness", "w"); if (f) { is_oled = 2; @@@ -75,13 -80,37 +82,37 @@@ int i=LCD_MODE_BIN; ioctl(lcdfd, LCD_IOCTL_ASC_MODE, &i); inverted=0; + FILE *f = fopen("/proc/stb/lcd/xres", "r"); + if (f) + { + int tmp; + if (fscanf(f, "%x", &tmp) == 1) + xres = tmp; + fclose(f); + f = fopen("/proc/stb/lcd/yres", "r"); + if (f) + { + if (fscanf(f, "%x", &tmp) == 1) + yres = tmp; + fclose(f); + f = fopen("/proc/stb/lcd/bpp", "r"); + if (f) + { + if (fscanf(f, "%x", &tmp) == 1) + bpp = tmp; + fclose(f); + } + } + is_oled = 3; + } } + setSize(xres, yres, bpp); } void eDBoxLCD::setInverted(unsigned char inv) { inverted=inv; - update(); + update(); } int eDBoxLCD::setLCDContrast(int contrast) @@@ -104,13 -133,11 +135,13 @@@ int eDBoxLCD::setLCDBrightness(int brightness) { eDebug("setLCDBrightness %d", brightness); - FILE *f=fopen("/proc/stb/fp/oled_brightness", "w"); + FILE *f=fopen("/proc/stb/lcd/oled_brightness", "w"); + if (!f) + f = fopen("/proc/stb/fp/oled_brightness", "w"); if (f) { if (fprintf(f, "%d", brightness) == 0) - eDebug("write /proc/stb/fp/oled_brightness failed!! (%m)"); + eDebug("write /proc/stb/lcd/oled_brightness failed!! (%m)"); fclose(f); } else @@@ -145,42 -172,46 +176,46 @@@ eDBoxLCD *eDBoxLCD::getInstance( void eDBoxLCD::update() { - if (!is_oled || is_oled == 2) + if (lcdfd >= 0) { - unsigned char raw[132*8]; - int x, y, yy; - for (y=0; y<8; y++) + if (!is_oled || is_oled == 2) { - for (x=0; x<132; x++) + unsigned char raw[132*8]; + int x, y, yy; + for (y=0; y<8; y++) { - int pix=0; - for (yy=0; yy<8; yy++) + for (x=0; x<132; x++) { - pix|=(_buffer[(y*8+yy)*132+x]>=108)<=108)<= 0) write(lcdfd, raw, 132*8); - } else - { - unsigned char raw[64*64]; - int x, y; - memset(raw, 0, 64*64); - for (y=0; y<64; y++) + } + else if (is_oled == 3) + write(lcdfd, _buffer, _stride * res.height()); + else { - int pix=0; - for (x=0; x<128 / 2; x++) + unsigned char raw[64*64]; + int x, y; + memset(raw, 0, 64*64); + for (y=0; y<64; y++) { - pix = (_buffer[y*132 + x * 2 + 2] & 0xF0) |(_buffer[y*132 + x * 2 + 1 + 2] >> 4); - if (inverted) - pix = 0xFF - pix; - raw[y*64+x] = pix; + int pix=0; + for (x=0; x<128 / 2; x++) + { + pix = (_buffer[y*132 + x * 2 + 2] & 0xF0) |(_buffer[y*132 + x * 2 + 1 + 2] >> 4); + if (inverted) + pix = 0xFF - pix; + raw[y*64+x] = pix; + } } - } - if (lcdfd >= 0) write(lcdfd, raw, 64*64); + } } }