00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #include "guichan/allegro/allegrographics.hpp"
00060 #include "guichan/rectangle.hpp"
00061 #include "guichan/exception.hpp"
00062 #include "guichan/cliprectangle.hpp"
00063 #include "guichan/color.hpp"
00064
00065 namespace gcn
00066 {
00067 AllegroGraphics::AllegroGraphics()
00068 {
00069 mTarget = NULL;
00070 mClipNull = false;
00071 }
00072
00073 AllegroGraphics::AllegroGraphics(BITMAP *target)
00074 {
00075 mTarget = target;
00076 }
00077
00078 AllegroGraphics::~AllegroGraphics()
00079 {
00080 }
00081
00082 void AllegroGraphics::setTarget(BITMAP *target)
00083 {
00084 mTarget = target;
00085 }
00086
00087 BITMAP *AllegroGraphics::getTarget()
00088 {
00089 return mTarget;
00090 }
00091
00092 void AllegroGraphics::_beginDraw()
00093 {
00094 if (mTarget == NULL)
00095 {
00096 throw GCN_EXCEPTION("Target BITMAP is null, set it with setTarget first.");
00097 }
00098
00099
00100 pushClipArea(Rectangle(0, 0, mTarget->w - 1, mTarget->h - 1));
00101 }
00102
00103 void AllegroGraphics::_endDraw()
00104 {
00105
00106 popClipArea();
00107 }
00108
00109 bool AllegroGraphics::pushClipArea(Rectangle area)
00110 {
00111 bool result = Graphics::pushClipArea(area);
00112
00113 ClipRectangle cr = mClipStack.top();
00114
00115
00116
00117
00118 if (cr.width == 0 || cr.height == 0)
00119 {
00120 mClipNull = true;
00121 }
00122 else
00123 {
00124 mClipNull = false;
00125 #if ALLEGRO_VERSION == 4 && ALLEGRO_SUB_VERSION == 0
00126 set_clip(mTarget, cr.x, cr.y, cr.x + cr.width - 1, cr.y + cr.height - 1);
00127 #else
00128 set_clip_rect(mTarget, cr.x, cr.y, cr.x + cr.width - 1, cr.y + cr.height - 1);
00129 #endif
00130 }
00131
00132 return result;
00133 }
00134
00135 void AllegroGraphics::popClipArea()
00136 {
00137 Graphics::popClipArea();
00138
00139 if (mClipStack.empty())
00140 {
00141 return;
00142 }
00143
00144 ClipRectangle cr = mClipStack.top();
00145
00146
00147
00148
00149 if (cr.width == 0 || cr.height == 0)
00150 {
00151 mClipNull = true;
00152 }
00153 else
00154 {
00155 mClipNull = false;
00156 #if ALLEGRO_VERSION == 4 && ALLEGRO_SUB_VERSION == 0
00157 set_clip(mTarget, cr.x, cr.y, cr.x + cr.width - 1, cr.y + cr.height - 1);
00158 #else
00159 set_clip_rect(mTarget, cr.x, cr.y, cr.x + cr.width - 1, cr.y + cr.height - 1);
00160 #endif
00161 }
00162 }
00163
00164 void AllegroGraphics::drawImage(const Image* image,
00165 int srcX, int srcY,
00166 int dstX, int dstY,
00167 int width, int height)
00168 {
00169 if (mClipNull)
00170 {
00171 return;
00172 }
00173
00174 BITMAP *src = (BITMAP *)image->_getData();
00175
00176 dstX += mClipStack.top().xOffset;
00177 dstY += mClipStack.top().yOffset;
00178
00179 masked_blit(src, mTarget, srcX, srcY, dstX, dstY, width, height);
00180 }
00181
00182 void AllegroGraphics::drawPoint(int x, int y)
00183 {
00184 if (mClipNull)
00185 {
00186 return;
00187 }
00188
00189 int xOffset = mClipStack.top().xOffset;
00190 int yOffset = mClipStack.top().yOffset;
00191
00192 putpixel(mTarget,
00193 x + xOffset,
00194 y + yOffset,
00195 mAlColor);
00196 }
00197
00198 void AllegroGraphics::drawLine(int x1, int y1, int x2, int y2)
00199 {
00200 if (mClipNull)
00201 {
00202 return;
00203 }
00204
00205 int xOffset = mClipStack.top().xOffset;
00206 int yOffset = mClipStack.top().yOffset;
00207
00208 line(mTarget,
00209 x1 + xOffset,
00210 y1 + yOffset,
00211 x2 + xOffset,
00212 y2 + yOffset,
00213 mAlColor);
00214 }
00215
00216 void AllegroGraphics::drawRectangle(const Rectangle& rectangle)
00217 {
00218 if (mClipNull)
00219 {
00220 return;
00221 }
00222
00223 int xOffset = mClipStack.top().xOffset;
00224 int yOffset = mClipStack.top().yOffset;
00225
00226 rect(mTarget,
00227 rectangle.x + xOffset,
00228 rectangle.y + yOffset,
00229 rectangle.x + rectangle.width - 1 + xOffset,
00230 rectangle.y + rectangle.height - 1 + yOffset,
00231 mAlColor);
00232 }
00233
00234 void AllegroGraphics::fillRectangle(const Rectangle& rectangle)
00235 {
00236 if (mClipNull)
00237 {
00238 return;
00239 }
00240
00241 int xOffset = mClipStack.top().xOffset;
00242 int yOffset = mClipStack.top().yOffset;
00243
00244 rectfill(mTarget,
00245 rectangle.x + xOffset,
00246 rectangle.y + yOffset,
00247 rectangle.x + rectangle.width - 1 + xOffset,
00248 rectangle.y + rectangle.height - 1 + yOffset,
00249 mAlColor);
00250 }
00251
00252 void AllegroGraphics::setColor(const Color& color)
00253 {
00254 mColor = color;
00255 mAlColor = makecol(color.r, color.g, color.b);
00256
00257 if (color.a != 255)
00258 {
00259 set_trans_blender(255, 255, 255, color.a);
00260 drawing_mode(DRAW_MODE_TRANS, NULL, 0, 0);
00261 }
00262 else
00263 {
00264 solid_mode();
00265 }
00266 }
00267
00268 const Color& AllegroGraphics::getColor()
00269 {
00270 return mColor;
00271 }
00272 }