Opencv 3.1 project on GR-PEACH board
Fork of gr-peach-opencv-project by
Diff: graphicFramework/mGraphic.cpp
- Revision:
- 166:3a9487d57a5c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicFramework/mGraphic.cpp Thu Jun 29 11:00:41 2017 +0000 @@ -0,0 +1,453 @@ +#include "mGraphic.hpp" +int counter =0; +static void togle_led(DigitalOut led) +{ + led = 1; + wait(0.1); + led = 0; + wait(0.1); +} + +graphicFrameworkCanvas::graphicFrameworkCanvas(uint8_t * bufDraw, uint16_t w,uint16_t h, + int8_t bpp, int8_t drawPoint, int8_t sizeHeader) +{ + mBufLcd = bufDraw; + mWidth = w; + mHeight = h; + mBpp = bpp; + mDrawPoint = drawPoint; + mSizeHeaderImg = sizeHeader; +} + +graphicFrameworkCanvas::~graphicFrameworkCanvas() +{ +} + +void graphicFrameworkCanvas::draw_pixel(uint8_t * p_buf, int id, + int x, int y,uint8_t *color) +{ + int idx_base; + int wk_idx; + int i; + int j; + + /* A coordinate in the upper left is calculated from a central coordinate. */ + if ((x - (mDrawPoint / 2)) >= 0) { + x -= (mDrawPoint / 2); + } + if (x > (mWidth - mDrawPoint)) { + x = (mWidth - mDrawPoint); + } + if ((y - (mDrawPoint / 2)) >= 0) { + y -= (mDrawPoint / 2); + } + if (y > (mHeight - mDrawPoint)) { + y = (mHeight - mDrawPoint); + } + idx_base = (x + (mWidth * y)) * mBpp; + + /* Drawing */ + for (i = 0; i < mDrawPoint; i++) { + wk_idx = idx_base + (mWidth * mBpp * i); + for (j = 0; j < mDrawPoint; j++) { + for(int k = 0; k < mBpp;k++) + { + p_buf[wk_idx++] = color[k]; + } + } + } +} + +void graphicFrameworkCanvas::drawImage(uint8_t * _img, int _x, int _y) +{ + uint8_t *p_buf = _img; + uint8_t coller_pix[mBpp]; + uint16_t w = (_img[1] << 8) | _img[0]; + uint16_t h = (_img[3] << 8) | _img[2]; + uint8_t bpp = _img[4]; + + p_buf+=mSizeHeaderImg; + + for(int i = 0;i < (int)h*w*bpp; i+=bpp) + { + int pos_x = (i/bpp)%w; + int pos_y = (i/bpp)/w; + for(int k = 0; k < mBpp;k++) + { + coller_pix[k] = p_buf[i+k]; + } + draw_pixel(mBufLcd, 0, pos_x + _x, pos_y + _y,coller_pix); + } +} + +void graphicFrameworkCanvas::drawRect(int x, int y, int width, int height, + uint8_t *color) +{ + for(int k = 0; k < width;k++) + { + draw_pixel(mBufLcd, 0, x + k, y, color); + draw_pixel(mBufLcd, 0, x + k, y + height,color); + } + + for(int k = 0; k < height;k++) + { + draw_pixel(mBufLcd, 0, x, y + k, color); + draw_pixel(mBufLcd, 0, x + width, y + k,color); + } +} + +void graphicFrameworkCanvas::draw_pixel(int x, int y,uint8_t *color) +{ + int idx_base; + int wk_idx; + int i; + int j; + + /* A coordinate in the upper left is calculated from a central coordinate. */ + if ((x - (mDrawPoint / 2)) >= 0) { + x -= (mDrawPoint / 2); + } + if (x > (mWidth - mDrawPoint)) { + x = (mWidth - mDrawPoint); + } + if ((y - (mDrawPoint / 2)) >= 0) { + y -= (mDrawPoint / 2); + } + if (y > (mHeight - mDrawPoint)) { + y = (mHeight - mDrawPoint); + } + idx_base = (x + (mWidth * y)) * mBpp; + + /* Drawing */ + for (i = 0; i < mDrawPoint; i++) { + wk_idx = idx_base + (mWidth * mBpp * i); + for (j = 0; j < mDrawPoint; j++) { + for(int k = 0; k < mBpp;k++) + { + mBufLcd[wk_idx++] = color[k]; + } + } + } + return; +} +void graphicFrameworkCanvas::drawLineNormal(int x1, int y1, int x2, int y2, uint8_t* color) +{ + int tmp_x = 0; + int tmp_y = 0; + int i = 0; + + if (x1 == x2) // Case equation x = m. + { + if (y1 > y2) // Swap 2 points + { + //ptTemp = pt1; + tmp_x = x1; + tmp_y = y1; + + //pt1 = pt2; + x1 = x2; + y1 = y2; + + //pt2 = ptTemp; + x2 = tmp_x; + y2 = tmp_y; + } + + for (i = y1; i <= y2; i++) // Draw points + { + draw_pixel(x1,i,color); + } + return; + } + + if (y1 == y2) // Case equation y = m. + { + if (x1 > x2) // Swap 2 points + { + //ptTemp = pt1; + tmp_x = x1; + tmp_y = y1; + + //pt1 = pt2; + x1 = x2; + y1 = y2; + + //pt2 = ptTemp; + x2 = tmp_x; + y2 = tmp_y; + } + + for (i = x1; i <= x2; i++) // Draw points + { + draw_pixel(i,y1,color); + } + return; + } + + // Case equation y = ax + b + float fA = (((float)(y2 - y1))) / (x2 - x1); // Calculate a. + float fB = y1 - fA * x1; // Calculate b. + + if (x1 > x2) // Swap 2 points + { + //ptTemp = pt1; + tmp_x = x1; + tmp_y = y1; + + //pt1 = pt2; + x1 = x2; + y1 = y2; + + //pt2 = ptTemp; + x2 = tmp_x; + y2 = tmp_y; + } + + // Calculate every points based on the equation + for (i = x1; i <= x2; i++) + { + draw_pixel(i,(int)floor(fA * i + fB),color); + } +} + +void graphicFrameworkCanvas::drawBresenham1(int x1, int y1, int x2, int y2, + uint8_t* color) +{ + int iDx = abs(x2 - x1); + int iDy = abs(y2 - y1); + int iTwoDy = 2 * iDy; + int iTwoDyMinusDx = 2 * (iDy - iDx); + int iP = iTwoDy - iDx; + int iX, iY, iXEnd; + + // Get smaller x to base + if (x1 > x2) + { + iX = x2; + iY = y2; + iXEnd = x1; + } + else + { + iX = x1; + iY = y1; + iXEnd = x2; + } + + // Draw first point + draw_pixel(iX,iY,color); + + while (iX < iXEnd) + { + iX++; + if (iP < 0) + iP += iTwoDy; + else + { + iY++; + iP += iTwoDyMinusDx; + } + + // Draw points + draw_pixel(iX,iY,color); + } +} + +void graphicFrameworkCanvas::drawBresenham2(int x1, int y1, int x2, int y2, uint8_t* color) +{ + int iDx = abs(x2 - x1); + int iDy = abs(y2 - y1); + int iTwoDy = 2 * iDy; + int iTwoDyMinusDx = 2 * (iDy - iDx); + int iP = -iTwoDy - iDx; + int iX, iY, iXEnd; + + // Get smaller x to base + if (x1 > x2) + { + iX = x2; + iY = y2; + iXEnd = x1; + } + else + { + iX = x1; + iY = y1; + iXEnd = x2; + } + + // Draw first point + draw_pixel(iX,iY,color); + + while (iX < iXEnd) + { + iX++; + if (iP < 0) + iP += iTwoDy; + else + { + iY--; + iP += iTwoDyMinusDx; + } + + // Draw points + draw_pixel(iX,iY,color); + } +} + +void graphicFrameworkCanvas::drawBresenham3(int x1, int y1, int x2, int y2, + uint8_t* color) +{ + int iDx = abs(x2 - x1); + int iDy = abs(y2 - y1); + int iTwoDx = 2 * iDx; + int iTwoDxMinusDy = 2 * (iDx - iDy); + int iP = iTwoDx - iDy; + int iX, iY, iYEnd; + + // Get smaller x to base + if (y1 > y2) + { + iX = x2; + iY = y2; + iYEnd = y1; + } + else + { + iX = x1; + iY = y1; + iYEnd = y2; + } + + // Draw first point + draw_pixel(iX,iY,color); + + while (iY < iYEnd) + { + iY++; + if (iP < 0) + iP += iTwoDx; + else + { + iX++; + iP += iTwoDxMinusDy; + } + // Draw points + draw_pixel(iX,iY,color); + } +} + +void graphicFrameworkCanvas::drawBresenham4(int x1, int y1, int x2, int y2, + uint8_t* color) +{ + int iDx = abs(x2 - x1); + int iDy = abs(y2 - y1); + int iTwoDx = 2 * iDx; + int iTwoDxMinusDy = 2 * (iDx - iDy); + int iP = -iTwoDx - iDy; + int iX, iY, iYEnd; + + // Get smaller x to base + if (y1 > y2) + { + iX = x1; + iY = y1; + iYEnd = y2; + } + else + { + iX = x2; + iY = y2; + iYEnd = y1; + } + + // Draw first point + draw_pixel(iX,iY,color); + + while (iY > iYEnd) + { + iY--; + if (iP < 0) + iP += iTwoDx; + else + { + iX++; + iP += iTwoDxMinusDy; + } + + // Draw points + draw_pixel(iX,iY,color); + } +} + +void graphicFrameworkCanvas::drawLine(int x1, int y1, int x2, int y2, + uint8_t* color) +{ + if (x1 == x2 || y1 == y2) // Case equation x = m or y = m. + { + drawLineNormal(x1,y1,x2,y2,color); + return; + } + + // Case equation y = ax + b + float fA = ((float)(y2 - y1)) / (x2 - x1); // Calculate a. + + // Case (0 < m < 1). + if (fA > 0 && fA < 1) + { + drawBresenham1(x1,y1,x2,y2,color); + return; + } + + // Case (-1 < m < 0). + if (fA > -1 && fA < 0) + { + drawBresenham2(x1,y1,x2,y2,color); + return; + } + + // Case (m >= 1). + if (fA >= 1) + { + drawBresenham3(x1,y1,x2,y2,color); + return; + } + + // Case (m =< -1). + if (fA <= -1) + { + drawBresenham4(x1,y1,x2,y2,color); + return; + } +} + +void graphicFrameworkCanvas::drawCircle(int x0,int y0, int radius, uint8_t* color) +{ + int x = radius; + int y = 0; + int err = 0; + + while (x >= y) + { + // Draw points + draw_pixel(x0 + x,y0 + y,color); + + draw_pixel(x0 + y, y0 + x,color); + draw_pixel(x0 - y, y0 + x,color); + draw_pixel(x0 - x, y0 + y,color); + draw_pixel(x0 - x, y0 - y,color); + draw_pixel(x0 - y, y0 - x,color); + draw_pixel(x0 + y, y0 - x,color); + draw_pixel(x0 + x, y0 - y,color); + + y += 1; + if (err <= 0) + { + err += 2*y + 1; + } else + { + x -= 1; + err += 2 * (y - x) + 1; + } + } +} \ No newline at end of file