1#include "dNinePatchBitmap.h"
2
3dNinePatchBitmap::dNinePatchBitmap
()
4{
5 this->mBitmap
= 0;
6 this->mWidth
= 0;
7 this->mHeight
= 0;
8 this->mStartX1
= 0;
9 this->mStartX2
= 0;
10 this->mStartY1
= 0;
11 this->mStartY2
= 0;
12}
13
14dNinePatchBitmap::~dNinePatchBitmap
()
15{
16 if ( this->mBitmap
)
17 {
18 al_destroy_bitmap( this->mBitmap
);
19 }
20}
21
22dNinePatchBitmap
* dNinePatchBitmap::create
( ALLEGRO_BITMAP *bitmap,
int x1,
int y1,
int x2,
int y2
)
23{
24 dNinePatchBitmap
* ninePatch
= 0;
25
26 if ( bitmap
)
27 {
28 if ( x1
== -1 ) { x1
= 0; };
29 if ( y1
== -1 ) { y1
= 0; };
30 if ( x2
== -1 ) { x2
= al_get_bitmap_width( bitmap
) - 1; };
31 if ( y2
== -1 ) { y2
= al_get_bitmap_height( bitmap
) - 1; };
32
33 ninePatch
= new dNinePatchBitmap
();
34
35 if ( ninePatch
)
36 {
37 ninePatch->mWidth
= ( x2
- x1
);
38 ninePatch->mHeight
= ( y2
- y1
);
39 ninePatch->mBitmap
= al_create_bitmap( ninePatch->mWidth, ninePatch->mHeight
);
40
41 if ( ninePatch->mBitmap
)
42 {
43 unsigned char r
= 0;
44 unsigned char g
= 0;
45 unsigned char b
= 0;
46 ALLEGRO_BITMAP *target
= al_get_target_bitmap();
47
48 al_set_target_bitmap( ninePatch->mBitmap
);
49
50 al_draw_bitmap_region( bitmap, x1
+ 1, y1
+ 1, ninePatch->mWidth, ninePatch->mHeight,
0,
0,
0 );
51
52 al_lock_bitmap( ninePatch->mBitmap, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_READONLY
);
53
54 for ( int i
= 0; i
<= ninePatch->mWidth
; i
++ )
55 {
56 al_unmap_rgb( al_get_pixel( bitmap, x1
+ i,
0 ),
&r,
&g,
&b
);
57
58 if ( r
== 0 && g
== 0 && b
== 0 )
59 {
60 ninePatch->mStartX1
= i
- 1;
61 break;
62 }
63 }
64
65 for ( int i
= ninePatch->mStartX1
+ 1; i
<= ninePatch->mWidth
; i
++ )
66 {
67 al_unmap_rgb( al_get_pixel( bitmap, x1
+ i,
0 ),
&r,
&g,
&b
);
68
69 if ( !( r
== 0 && g
== 0 && b
== 0 ) )
70 {
71 break;
72 }
73
74 ninePatch->mStartX2
= i
;
75 }
76
77 for ( int j
= 0; j
<= ninePatch->mHeight
; j
++ )
78 {
79 al_unmap_rgb( al_get_pixel( bitmap,
0, y1
+ j
),
&r,
&g,
&b
);
80
81 if ( r
== 0 && g
== 0 && b
== 0 )
82 {
83 ninePatch->mStartY1
= j
- 1;
84 break;
85 }
86 }
87
88 for ( int j
= ninePatch->mStartY1
+ 1; j
<= ninePatch->mHeight
; j
++ )
89 {
90 al_unmap_rgb( al_get_pixel( bitmap,
0, y1
+ j
),
&r,
&g,
&b
);
91
92 if ( !( r
== 0 && g
== 0 && b
== 0 ) )
93 {
94 break;
95 }
96
97 ninePatch->mStartY2
= j
;
98 }
99
100 al_unlock_bitmap( ninePatch->mBitmap
);
101
102
103 al_convert_mask_to_alpha( ninePatch->mBitmap,
al_map_rgb( 255,
0,
255 ) );
104
105 al_set_target_bitmap( target
);
106 }
107 else
108 {
109 delete ninePatch
;
110 }
111 }
112 }
113
114 return ninePatch
;
115}
116
117void dNinePatchBitmap::draw
( int x,
int y,
int w,
int h
)
118{
119// s e
120// ........----------.......
121// 0123456789012345678901234
122// 1 2 3
123
124 int x1
= 0;
125 int x2
= this->mStartX1
;
126 int x3
= this->mStartX2
;
127
128 int y1
= 0;
129 int y2
= this->mStartY1
;
130 int y3
= this->mStartY2
;
131
132 int w1
= ( x2
- x1
);
133 int w2
= ( x3
- x2
);
134 int w3
= ( this->mWidth
- x3
);
135
136 int h1
= ( y2
- y1
);
137 int h2
= ( y3
- y2
);
138 int h3
= ( this->mHeight
- y3
);
139
140 int stretchW
= w
- ( w1
+ w3
);
141 int stretchH
= h
- ( h1
+ h3
);
142
143 // upper left
144 al_draw_bitmap_region( this->mBitmap, x1, y1, w1, h1, x, y,
0 );
145
146 // upper right
147 al_draw_bitmap_region( this->mBitmap, x3, y1, w3, h1, x
+ w
- w3, y,
0 );
148
149 // lower left
150 al_draw_bitmap_region( this->mBitmap, x1, y3, w1, h1, x, y
+ h
- h3,
0 );
151
152 // lower right
153 al_draw_bitmap_region( this->mBitmap, x3, y3, w3, h1, x
+ w
- w3, y
+ h
- h3,
0 );
154
155 // upper middle
156 al_draw_scaled_bitmap( this->mBitmap, x2, y1, w2, h1, x
+ x2, y, stretchW, h1,
0 );
157
158 // middle left
159 al_draw_scaled_bitmap( this->mBitmap, x1, y2, w1, h2, x, y
+ y2, w1, stretchH,
0 );
160
161
162 // lower middle
163 al_draw_scaled_bitmap( this->mBitmap, x2, y3, w2, h3, x
+ x2, y
+ h
- h3, stretchW, h3,
0 );
164
165 // middle right
166 al_draw_scaled_bitmap( this->mBitmap, x3, y2, w3, h2, x
+ w
- w3, y
+ y2, w3, stretchH,
0 );
167
168 // middle
169 al_draw_scaled_bitmap( this->mBitmap, x2, y2, w2, h2, x
+ x2, y
+ y2, stretchW, stretchH,
0 );
170}