Root/
Source at commit 2606 created 9 years 4 months ago. By ifabio, DEBUG option for last booted partition | |
---|---|
1 | ␊ |
2 | /* Graphic utility functions and data types␊ |
3 | * Prashant Vaibhav (C) 12/12/2008␊ |
4 | * Chameleon␊ |
5 | */␊ |
6 | #include "boot.h"␊ |
7 | #include "graphic_utils.h"␊ |
8 | #include "gui.h"␊ |
9 | ␊ |
10 | void blend( const pixmap_t *blendThis, // Source image␊ |
11 | pixmap_t *blendInto, // Dest image␊ |
12 | const position_t position) // Where to place the source image␊ |
13 | {␊ |
14 | uint16_t sx, sy, dx, dy;␊ |
15 | uint32_t dstrb, dstag, srcrb, srcag, drb, dag, rb, ag, alpha;␊ |
16 | ␉␊ |
17 | ␉uint16_t width = (blendThis->width + position.x < blendInto->width) ? blendThis->width: blendInto->width-position.x;␊ |
18 | ␉uint16_t height = (blendThis->height + position.y < blendInto->height) ? blendThis->height: blendInto->height-position.y;␊ |
19 | ␉␊ |
20 | for (dy = position.y, sy = 0; sy < height; dy++, sy++) {␊ |
21 | for (dx = position.x, sx = 0; sx < width; dx++, sx++) {␊ |
22 | alpha = (pixel(blendThis, sx, sy).ch.a);␊ |
23 | ␊ |
24 | ␉ /* Skip blending for fully transparent pixel */␊ |
25 | ␉ if (alpha == 0) continue;␊ |
26 | ␊ |
27 | ␉ /* For fully opaque pixel, there is no need to interpolate */␊ |
28 | ␉ if (alpha == 255) {␊ |
29 | ␉␉ pixel(blendInto, dx, dy).value = pixel(blendThis, sx, sy).value;␊ |
30 | ␉␉ continue;␊ |
31 | ␉ }␊ |
32 | ␊ |
33 | ␉ /* For semi-transparent pixels, do a full blend */␊ |
34 | ␉ //alpha++␊ |
35 | ␉␉ /* This is needed to spread the alpha over [0..256] instead of [0..255]␊ |
36 | ␉␉␉Boundary conditions were handled above */␊ |
37 | dstrb = pixel(blendInto, dx, dy).value & 0xFF00FF;␊ |
38 | dstag = (pixel(blendInto, dx, dy).value >> 8) & 0xFF00FF;␊ |
39 | srcrb = pixel(blendThis, sx, sy).value & 0xFF00FF;␊ |
40 | srcag = (pixel(blendThis, sx, sy).value >> 8) & 0xFF00FF;␊ |
41 | drb = srcrb - dstrb;␊ |
42 | dag = srcag - dstag;␊ |
43 | drb *= alpha; dag *= alpha;␊ |
44 | drb >>= 8; dag >>= 8;␊ |
45 | rb = (drb + dstrb) & 0x00FF00FF;␊ |
46 | ag = ((dag + dstag) << 8) & 0xFF00FF00;␊ |
47 | pixel(blendInto, dx, dy).value = (rb | ag);␊ |
48 | }␊ |
49 | }␊ |
50 | }␊ |
51 | ␊ |
52 | position_t centeredIn( const pixmap_t *background, const pixmap_t *toCenter )␊ |
53 | {␊ |
54 | position_t centered;␊ |
55 | centered.x = ( background->width - toCenter->width ) / 2;␊ |
56 | centered.y = ( background->height - toCenter->height ) / 2;␊ |
57 | return centered;␊ |
58 | }␊ |
59 | ␊ |
60 | position_t centeredAt( const pixmap_t *pixmap, const position_t center )␊ |
61 | {␊ |
62 | position_t topleft;␊ |
63 | topleft.x = center.x - (pixmap->width / 2);␊ |
64 | topleft.y = center.y - (pixmap->height / 2);␊ |
65 | return topleft;␊ |
66 | }␊ |
67 | ␊ |
68 | position_t pos(const uint16_t x, const uint16_t y) { position_t p; p.x = x; p.y = y; return p; }␊ |
69 | ␊ |
70 | void flipRB(pixmap_t *p)␊ |
71 | {␊ |
72 | ␉//if(testForQemu()) return;␊ |
73 | ␉␊ |
74 | ␉uint32_t x;␊ |
75 | register uint8_t tempB;␊ |
76 | ␉for (x = 0; x < (p->height) * (p->width) ; x++) {␊ |
77 | ␉␉tempB = (p->pixels[x]).ch.b;␊ |
78 | (p->pixels[x]).ch.b = (p->pixels[x]).ch.r;␊ |
79 | (p->pixels[x]).ch.r = tempB;␊ |
80 | ␉}␊ |
81 | }␊ |
82 |