| for(... ; i < h; ...){
d = &a[offset];
w = width - (offset << 1);
if(w && ...)
... | 
| *d++ = color; *wd++ = wcolor; *(uint16_t *)d = color; /* write the last 16-bit word */ | 
| 
for (int i = 0; i < 10; i++){
   for (int j = 0; j < 10; j++){
        drawPixel(i, j, bitmap++):
   }
}
__inline void drawPixel(uint16_t Xpos, uint16_t Ypos, uint16_t color) {
volatile uint16_t *pLCDbuf = (uint16_t *) LCD_VRAM_BASE_ADDR; /* LCD buffer start address */
pLCDbuf[Ypos * GLCD_X_SIZE + Xpos] = color;
} | 
| 
uint16_t *screen;
uint16_t linesize; /* width in pixels of a line */
uint16_t x, y; /* x and y position of box */
uint16_t w, h; /* box width and height */
uint16_t color; /* color of box */
uint16_t *a; /* precalculated address of starting top/left corner */
uint16_t *d; /* destination */
screen = (uint16_t *)LCD_VRAM_BASE_ADDR;  /* this is what I usually call the screen base address */
linesize = GLCD_X_SIZE;
x = 17;
y = 33;
w = 50;  /* width of our box */
h = 10; /* height of our box */
a = &screen[y * linesize + x];  /* get address of the top/right corner on of our 'box' on screen */
for (int i = 0; i < h; i++){
    d = a;  /* point d to left side of box */
    for(int j = 0; j < w; j++)
    {
        *d++ = color;
    }
    a += linesize;  /* advance to next line */
} | 
| loop: subsr2,r2,#1; decrement width counter, update condition codes (takes 1 clock cycle) strhr0,[r1],#2; store color (takes one clock cycle) bneloop; go round loop (2 clock cycles) | 
| 
uint32_t wcolor;
uint32_t *wd;
wcolor = (color << 16) | color;
uint16_t ww;
ww = w >> 1;  /* width / 2 */
w &= 1; /* keep only odd-bit of w */
for (int i = 0; i < h; i++){
    d = a;  /* point d to left side of box */
    if(w && (2 & (uint32_t) a)) /* if w is 1 and a is not on a 32-bit boundary */
    {
        *d++ = color;
        w = 0;
    }
    wd = (uint32_t *)d;
    for(int j = 0; j < ww; j++)
    {
        *wd++ = wcolor;
    }
    if(w) /* if we forgot to write the 16-bit word... */
    {
        *(uint16_t *)d = color; /* write the last 16-bit word */
    }
    a += linesize;  /* advance to next line */
} | 
| loop: subsr2,r2,#1; decrement width counter, update condition codes (1 clk) strr0,[r1],#4; store two colors (1 clk) bneloop; go round loop (2 clk) | 
| loop: subsr2,r2,#1; decrement width counter and set condition code (1 clk) strr0,[r1,#4]; store two colors at address d + 4 (1 clk) strr0,[r1,#8]; store two colors at address d + 8 (1 clk) strr0,[r1,#12]; store two colors at address d + 12 (1 clk) strr0,[r1],#16; store two colors at address d, then d = d + 16 (1 clk) bneloop; go round loop (2 clk) | 
| 
for (int i = 0; i < 10; i++){
   for (int j = 0; j < 10; j++){
        drawPixel(i, j, bitmap++):
   }
}
__inline void drawPixel(uint16_t Xpos, uint16_t Ypos, uint16_t color) {
volatile uint16_t *pLCDbuf = (uint16_t *) LCD_VRAM_BASE_ADDR; /* LCD buffer start address */
pLCDbuf[Ypos * GLCD_X_SIZE + Xpos] = color;
}
 | 
| 
for (int i = 0; i < 10; i++){
   for (int j = 0; j < 10; j++){
        line[j] = bitmap++;
   }
//and then somehow write the whole line to pLCDbuf[]???
}
actually no, Im confused | 
| void rbox(void *picture, int32_t dstx, int32_t dsty, int32_t width, int32_t height, int32_t radius)
{
  int32_t dx, sx, ex;
  int32_t save_x;
  int32_t srcx, srcy;
  ...
  for(srcy = 0; srcy < height; srcy++)
  {
    dx = calcx(radius, srcy, height);
    sx = dx;
    ex = width - dx;
    save_x = dstx;
    dstx += sx;
    for(srcx = sx; srcx < ex; srcx++)
    {
      copypixel(picture,srcx,srcy,dstx++,dsty);
    }
    dstx = save_x;
    dsty++;
  }
} | 
| 
const uint32_t *ws;
uint32_t *wd;
const uint16_t *hs;
uint16_t *hd;
if(s < e && length & 1)
{
  *hd++ = *hs++;
}
length = length >> 1;
wd = (uint32_t *)hd;
ws = (uint32_t *)hs;
while(s < e)
{
  *wd++ = *ws++;
}
 | 
| 
Bool GLCD_checkBresenhamCorner(uint16_t h, uint16_t k, uint16_t r,
uint16_t which, uint16_t xC, uint16_t yC) {
int x = 0;
int y = r;
int p = (3 - (2 * r));
do {
switch (which) {
case 1: {//Testing if its outside the top left corner
if (xC <= h - x && yC <= k - y) {
return 0;
} else if (xC <= h - y && yC <= k - x) {
return 0;
}
break;
}
case 2: {//Testing if its outside the top right corner
if (xC >= h + y && yC <= k - x) {
return 0;
} else if (xC >= h + x && yC <= k - y) {
return 0;
}
break;
}
case 3: {//Testing if its outside the bottom right corner
if (xC >= h + x && yC >= k + y) {
return 0;
} else if (xC >= h + y && yC >= k + x) {
return 0;
}
break;
}
case 4: {//Testing if its outside the bottom left corner
if (xC <= h - y && yC >= k + x) {
return 0;
} else if (xC <= h - x && yC >= k + y) {
return 0;
}
break;
}
}
x++;
if (p < 0)
p += ((4 * x) + 6);
else {
y--;
p += ((4 * (x - y)) + 10);
}
} while (x <= y);
return 1;
}
void GLCD_displayBitmapInCirle(uint16_t x, uint16_t y, uint16_t w, uint16_t h,
uint16_t r, uint16_t * bitmap) {
uint16_t atx = 0, aty = 0;
uint16_t j = 0;
uint16_t k = 0;
uint16_t index = 0;
for (k = 0; k < h; k++) {
for (j = 0; j < w; j++) {
atx = x + j;
aty = y + k;
if (atx <= x + r && aty <= y + r) { //is it in the top left corner
if (GLCD_checkBresenhamCorner(x + r, y + r, r, 1, atx, aty)
== 1) {
GLCD_SetPixel_16bpp(atx, aty, bitmap[index]);
}
} else if (atx >= x + w - r && aty <= y + r) { //is it in the top right corner
if (GLCD_checkBresenhamCorner(x + w - r, y + r, r, 2, atx, aty)
== 1) {
GLCD_SetPixel_16bpp(atx, aty, bitmap[index]);
}
} else if (atx >= x + w - r && aty >= y + h - r) { //is it in the bottom right corner
if (GLCD_checkBresenhamCorner(x + w - r, y + h - r, r, 3, atx,
aty) == 1) {
GLCD_SetPixel_16bpp(atx, aty, bitmap[index]);
}
} else if (atx <= x + r && aty >= y + h - r) { //is it in the bottom left corner
if (GLCD_checkBresenhamCorner(x + r, y + h - r, r, 4, atx, aty)
== 1) {
GLCD_SetPixel_16bpp(atx, aty, bitmap[index]);
}
} else { //its not in a corner so draw it
GLCD_SetPixel_16bpp(atx, aty, bitmap[index]);
}
index++;
}
}
x++;
}
 | 
