From a085c34bad9f9d7ec123b0f7e77afd8f7e203cfd Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sat, 16 Jan 2010 16:15:43 +0000 Subject: [PATCH] framebuffer: fix !USE_NEVIS_GXA case The GXA accelerator is a win for e.g. big boxes, but it is a net loss for the fontrenderer in the current implementation. So fix the framebuffer class, so that disabling USE_NEVIS_GXA works again for testing both cases. git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@169 e54a6e83-5905-42d5-8d5c-058d10e6a962 Origin commit data ------------------ Branch: ni/coolstream Commit: https://github.com/neutrino-images/ni-neutrino/commit/2c215c8f557a79001d1492866975e0500506517e Author: Stefan Seyfried Date: 2010-01-16 (Sat, 16 Jan 2010) ------------------ This commit was generated by Migit --- src/driver/framebuffer.cpp | 136 +++++++------------------------------ 1 file changed, 24 insertions(+), 112 deletions(-) diff --git a/src/driver/framebuffer.cpp b/src/driver/framebuffer.cpp index 2194a7ada..da526a0f0 100644 --- a/src/driver/framebuffer.cpp +++ b/src/driver/framebuffer.cpp @@ -509,7 +509,12 @@ void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int int corner_tr = (type & CORNER_TOP_RIGHT) ? 1 : 0; int corner_bl = (type & CORNER_BOTTOM_LEFT) ? 1 : 0; int corner_br = (type & CORNER_BOTTOM_RIGHT) ? 1 : 0; -#ifdef USE_NEVIS_GXA + +#ifndef USE_NEVIS_GXA + int swidth = stride / sizeof(fb_pixel_t); + fb_pixel_t *fbp = getFrameBufferPointer() + (swidth * y); +#endif + /* this table contains the x coordinates for a quarter circle (the bottom right quarter) with fixed radius of 540 px which is the half of the max HD graphics size of 1080 px. So with that table we ca draw boxes with round corners and als circles by just setting dx = dy = radius (max 540). */ @@ -544,10 +549,12 @@ void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int 23}; int line = 0; +#ifdef USE_NEVIS_GXA unsigned int cmd = GXA_CMD_NOT_TEXT | GXA_SRC_BMP_SEL(2) | GXA_DST_BMP_SEL(2) | GXA_PARAM_COUNT(2) | GXA_CMD_NOT_ALPHA; _write_gxa(gxa_base, GXA_FG_COLOR_REG, (unsigned int) col); /* setup the drawing color */ _write_gxa(gxa_base, GXA_LINE_CONTROL_REG, 0x00000404); /* X is major axis, skip last pixel */ +#endif if ((type) && (radius)) { @@ -591,9 +598,16 @@ void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int ofl = corner_bl ? ofs : 0; ofr = corner_br ? ofs : 0; } +#ifdef USE_NEVIS_GXA _write_gxa(gxa_base, cmd, GXA_POINT(x + dx - ofr, y + line)); /* endig point */ _write_gxa(gxa_base, cmd, GXA_POINT(x + ofl, y + line)); /* start point */ - +#else + for (int pos = x + ofl; pos < x + dx - ofr; pos++) + { + *(fbp + pos) = col; + } + fbp += swidth; +#endif line++; } } @@ -601,121 +615,19 @@ void CFrameBuffer::paintBoxRel(const int x, const int y, const int dx, const int { while (line < dy) { +#ifdef USE_NEVIS_GXA _write_gxa(gxa_base, cmd, GXA_POINT(x + dx, y + line)); /* endig point */ _write_gxa(gxa_base, cmd, GXA_POINT(x, y + line)); /* start point */ +#else + for (int pos = x; pos < x + dx; pos++) + { + *(fbp + pos) = col; + } + fbp += swidth; +#endif line++; } } - -#else -#error TODO: please fix the rounded corner code for !USE_NEVIS_GXA case - int F,R=radius,sx,sy,dxx=dx,dyy=dy,rx,ry,wx,wy; - - if (!getActive()) - return; - - uint8_t *pos = ((uint8_t *)getFrameBufferPointer()) + x*sizeof(fb_pixel_t) + stride*y; - uint8_t *pos0 = 0, *pos1 = 0, *pos2 = 0, *pos3 = 0; - - fb_pixel_t *dest0, *dest1; - - if(R) { - if(--dyy<=0) { - //if(dyy <= 0) - dyy=1; - } - - if(R==1 || R>(dxx/2) || R>(dyy/2)) { - R=dxx/10; - F=dyy/10; - if(R>F) { - if(R>(dyy/3)) { - R=dyy/3; - } - } else { - R=F; - if(R>(dxx/3)) { - R=dxx/3; - } - } - } - sx=0; - sy=R; - F=1-R; - - rx=R-sx; - ry=R-sy; - - if(type & 1) { - pos1=pos+(ry*stride); // top 1 - pos2=pos+(rx*stride); // top 2 - } - if(type & 2) { - pos0=pos+((dyy-ry)*stride); // bottom 1 - pos3=pos+((dyy-rx)*stride); // bottom 2 - } - while (sx <= sy) { - rx=R-sx; - ry=R-sy; - wx=rx<<1; - wy=ry<<1; - dest0=(fb_pixel_t *)(pos0+rx*sizeof(fb_pixel_t)); - dest1=(fb_pixel_t *)(pos1+rx*sizeof(fb_pixel_t)); - for (int i=0; i<(dxx-wx); i++) { - if(type & 2) - *(dest0++)=col; //bottom 1 - if(type & 1) - *(dest1++)=col; // top 1 - } - dest0=(fb_pixel_t *)(pos2+ry*sizeof(fb_pixel_t)); - dest1=(fb_pixel_t *)(pos3+ry*sizeof(fb_pixel_t)); - for (int i=0; i<(dxx-wy); i++) { - if(type & 1) - *(dest0++)=col; // top 2 - if(type & 2) - *(dest1++)=col; //bottom 2 - } - sx++; - pos2-=stride; - pos3+=stride; - if (F<0) { - F+=(sx<<1)-1; - } else { - F+=((sx-sy)<<1); - sy--; - pos0-=stride; - pos1+=stride; - } - } - if(type & 1) - pos+=R*stride; - } - - int start = R; - int end = dyy - R; - if(!(type & 1)) - start = 0; - if(!(type & 2)) - end = dyy+ (R ? 1 : 0); - -#if 0 - fb_fillrect fillrect; - fillrect.dx = x; - fillrect.dy = y+start; - fillrect.width = dx; - fillrect.height = end; - fillrect.color = col; - fillrect.rop = ROP_COPY; - ioctl(fd, FBIO_FILL_RECT, &fillrect); -#else - for (int count= start; count < end; count++) { - dest0=(fb_pixel_t *)pos; - for (int i=0; i