Root/
Source at commit 307 created 12 years 11 months ago. By ifabio, merge changes from trunk (929). Also merge the module changes from Azimutz branche (fix compile error) Also edited the info.plist into AHCIPortInjector.kext: http://forum.voodooprojects.org/index.php/topic,1170.0.html | |
---|---|
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 |