aboutsummaryrefslogtreecommitdiff
path: root/lib/gdi
diff options
context:
space:
mode:
authorAndreas Oberritter <obi@opendreambox.org>2010-04-26 22:39:15 +0200
committerAndreas Oberritter <obi@opendreambox.org>2011-01-11 16:04:05 +0100
commit63e32165a14ac9fc3539bfc9631330b5ca73b756 (patch)
tree9a028a4ecee8fe5b81ee602233adcb1dfa6fa08d /lib/gdi
parent6a25698b1ff48bafd6d1656be7f447638cc4b136 (diff)
downloadenigma2-63e32165a14ac9fc3539bfc9631330b5ca73b756.tar.gz
enigma2-63e32165a14ac9fc3539bfc9631330b5ca73b756.zip
Added support for accelerated fill (requires updated drivers)
Diffstat (limited to 'lib/gdi')
-rw-r--r--lib/gdi/accel.cpp14
-rw-r--r--lib/gdi/bcm.cpp47
2 files changed, 54 insertions, 7 deletions
diff --git a/lib/gdi/accel.cpp b/lib/gdi/accel.cpp
index 9450ecca..5049f0b8 100644
--- a/lib/gdi/accel.cpp
+++ b/lib/gdi/accel.cpp
@@ -138,12 +138,14 @@ int gAccel::fill(gSurface *dst, const eRect &area, unsigned long col)
col);
return 0;
#endif
-#if 0 // def BCM_ACCEL
- bcm_accel_fill(
- dst->data_phys, dst->x, dst->y, dst->stride,
- area.left(), area.top(), area.width(), area.height(),
- col);
- return 0;
+#ifdef BCM_ACCEL
+ if (!m_bcm_accel_state) {
+ bcm_accel_fill(
+ dst->data_phys, dst->x, dst->y, dst->stride,
+ area.left(), area.top(), area.width(), area.height(),
+ col);
+ return 0;
+ }
#endif
return -1;
}
diff --git a/lib/gdi/bcm.cpp b/lib/gdi/bcm.cpp
index 12b5f22a..10219947 100644
--- a/lib/gdi/bcm.cpp
+++ b/lib/gdi/bcm.cpp
@@ -123,6 +123,51 @@ void bcm_accel_fill(
int x, int y, int width, int height,
unsigned long color)
{
-// printf("unimplemented bcm_accel_fill\n");
+ C(0x43); // reset source
+ C(0x53); // reset dest
+ C(0x5b); // reset pattern
+ C(0x67); // reset blend
+ C(0x75); // reset output
+
+ // clear dest surface
+ P(0x0, 0);
+ P(0x1, 0);
+ P(0x2, 0);
+ P(0x3, 0);
+ P(0x4, 0);
+ C(0x45);
+
+ // clear src surface
+ P(0x0, 0);
+ P(0x1, 0);
+ P(0x2, 0);
+ P(0x3, 0);
+ P(0x4, 0);
+ C(0x5);
+
+ P(0x2d, color);
+
+ P(0x2e, x); // prepare output rect
+ P(0x2f, y);
+ P(0x30, width);
+ P(0x31, height);
+ C(0x6e); // set this rect as output rect
+
+ P(0x0, dst_addr); // prepare output surface
+ P(0x1, dst_stride);
+ P(0x2, dst_width);
+ P(0x3, dst_height);
+ P(0x4, 0x7e48888);
+ C(0x69); // set output surface
+
+ P(0x6f, 0);
+ P(0x70, 0);
+ P(0x71, 2);
+ P(0x72, 2);
+ C(0x73); // select color keying
+
+ C(0x77); // do it
+
+ exec_list();
}