summaryrefslogtreecommitdiff
path: root/apps/plugins/lib/gray_verline.c
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2004-06-23 22:15:50 +0000
committerJens Arnold <amiconn@rockbox.org>2004-06-23 22:15:50 +0000
commit7c6bdd64935452464b21f99198896c34569105e5 (patch)
treebecd4aeb5498966aea5629f1e692ba5131192b5e /apps/plugins/lib/gray_verline.c
parent8877ad943eb077d10a0725b47c55a8b2f55f319a (diff)
downloadrockbox-7c6bdd64935452464b21f99198896c34569105e5.zip
rockbox-7c6bdd64935452464b21f99198896c34569105e5.tar.gz
rockbox-7c6bdd64935452464b21f99198896c34569105e5.tar.bz2
rockbox-7c6bdd64935452464b21f99198896c34569105e5.tar.xz
Split grayscale library into several files to make up a real function library. Significantly decreases binary size for plugins using it.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4802 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/lib/gray_verline.c')
-rw-r--r--apps/plugins/lib/gray_verline.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/apps/plugins/lib/gray_verline.c b/apps/plugins/lib/gray_verline.c
new file mode 100644
index 0000000..15910b4
--- /dev/null
+++ b/apps/plugins/lib/gray_verline.c
@@ -0,0 +1,88 @@
+/***************************************************************************
+* __________ __ ___.
+* Open \______ \ ____ ____ | | _\_ |__ _______ ___
+* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+* \/ \/ \/ \/ \/
+* $Id$
+*
+* Grayscale framework
+* gray_verline() function
+*
+* This is a generic framework to use grayscale display within Rockbox
+* plugins. It obviously does not work for the player.
+*
+* Copyright (C) 2004 Jens Arnold
+*
+* All files in this archive are subject to the GNU General Public License.
+* See the file COPYING in the source tree root for full license agreement.
+*
+* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+* KIND, either express or implied.
+*
+****************************************************************************/
+
+#ifndef SIMULATOR /* not for simulator by now */
+#include "plugin.h"
+
+#ifdef HAVE_LCD_BITMAP /* and also not for the Player */
+#include "gray.h"
+
+/*---------------------------------------------------------------------------
+ Draw a vertical line from (x, y1) to (x, y2) with the current drawinfo
+ ----------------------------------------------------------------------------
+ See gray_drawpixel() for details
+ This one uses the block drawing optimization, so it is rather fast.
+ */
+void gray_verline(int x, int y1, int y2)
+{
+ int shift, y, ny;
+ unsigned bits, mask_top, mask_bottom;
+ unsigned char *dst;
+ void (*blockfunc)(unsigned char *address, unsigned mask, unsigned bits);
+
+ if ((unsigned) x >= (unsigned) _graybuf->width
+ || (unsigned) y1 >= (unsigned) _graybuf->height
+ || (unsigned) y2 >= (unsigned) _graybuf->height)
+ return;
+
+ if (y1 > y2)
+ {
+ y = y1;
+ y1 = y2;
+ y2 = y;
+ }
+ y = y1;
+ ny = y2 - y1 + 1;
+
+ dst = _graybuf->data + x + MULU16(_graybuf->width, y >> 3);
+ shift = y & 7;
+ ny += shift;
+
+ mask_top = 0xFFu << (y & 7);
+ mask_bottom = ~(0xFEu << ((ny - 1) & 7));
+ if (ny <= 8)
+ mask_bottom &= mask_top;
+
+ blockfunc = _gray_blockfuncs[_graybuf->drawmode];
+ bits = (_graybuf->drawmode == GRAY_DRAW_BG) ? 0u : 0xFFu;
+
+ if (ny > 8)
+ {
+ blockfunc(dst, mask_top, bits);
+ dst += _graybuf->width;
+
+ for (y = 8; y < ny - 8; y += 8)
+ {
+ blockfunc(dst, 0xFFu, bits);
+ dst += _graybuf->width;
+ }
+ }
+
+ blockfunc(dst, mask_bottom, bits);
+}
+
+#endif // #ifdef HAVE_LCD_BITMAP
+#endif // #ifndef SIMULATOR
+