m_visible_region.rects.clear();
}
-void eSubtitleWidget::setPixmap(ePtr<gPixmap> &pixmap, gRegion changed)
+void eSubtitleWidget::setPixmap(ePtr<gPixmap> &pixmap, gRegion changed, eRect pixmap_dest)
{
m_pixmap = pixmap;
+ m_pixmap_dest = pixmap_dest;
changed.scale(size().width(), pixmap->size().width(), size().height(), pixmap->size().height());
eWidget::event(event, data, data2);
if (m_pixmap)
- painter.blitScale(m_pixmap, eRect(ePoint(0, 0), size()));
- else if (m_page_ok)
+ {
+ eRect r = m_pixmap_dest;
+ r.scale(size().width(), 720, size().height(), 576);
+ painter.blitScale(m_pixmap, r);
+ } else if (m_page_ok)
{
int elements = m_page.m_elements.size();
painter.setFont(subtitleStyles[Subtitle_TTX].font);
void setPage(const eDVBSubtitlePage &p);
void setPage(const ePangoSubtitlePage &p);
void clearPage();
- void setPixmap(ePtr<gPixmap> &pixmap, gRegion changed);
+ void setPixmap(ePtr<gPixmap> &pixmap, gRegion changed, eRect dest = eRect(0, 0, 720, 576));
typedef enum { Subtitle_TTX, Subtitle_Regular, Subtitle_Bold, Subtitle_Italic, Subtitle_MAX } subfont_t;
struct eSubtitleStyle
static eSubtitleStyle subtitleStyles[Subtitle_MAX];
ePtr<gPixmap> m_pixmap; // pixmap to paint on next evtPaint
+ eRect m_pixmap_dest;
};
#endif
if (m_subtitle_widget) {
int x1,x2,y1,y2;
ddvd_get_last_blit_area(m_ddvdconfig, &x1, &x2, &y1, &y2);
- m_subtitle_widget->setPixmap(m_pixmap, eRect(x1, y1, (x2-x1)+1, (y2-y1)+1));
+
+ int x_offset = 0, y_offset = 0, width = 720, height = 576;
+
+#ifdef DDVD_SUPPORTS_GET_BLIT_DESTINATION
+ ddvd_get_blit_destination(m_ddvdconfig, &x_offset, &y_offset, &width, &height);
+ eDebug("values got from ddvd: %d %d %d %d", x_offset, y_offset, width, height);
+ width -= x_offset * 2;
+ height -= y_offset * 2;
+#endif
+ eRect dest(x_offset, y_offset, width, height);
+
+ if (dest.width() && dest.height())
+ m_subtitle_widget->setPixmap(m_pixmap, eRect(x1, y1, (x2-x1)+1, (y2-y1)+1), dest);
}
break;
case DDVD_SHOWOSD_STATE_PLAY:
if (!m_pixmap)
{
m_pixmap = new gPixmap(size, 32, 1); /* allocate accel surface (if possible) */
+#ifdef DDVD_SUPPORTS_GET_BLIT_DESTINATION
+ ddvd_set_lfb_ex(m_ddvdconfig, (unsigned char *)m_pixmap->surface->data, size.width(), size.height(), 4, size.width()*4, 1);
+#else
ddvd_set_lfb(m_ddvdconfig, (unsigned char *)m_pixmap->surface->data, size.width(), size.height(), 4, size.width()*4);
+#warning please update libdreamdvd for fast scaling
+#endif
run(); // start the thread
}