00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "Core/precomp.h"
00016
00017 #ifdef BORLAND
00018 #pragma hdrstop
00019 #endif
00020
00021 #include <Display/Display/Generic/cardsurface_blitter.h>
00022 #include <Display/Display/Generic/pixeldata.h>
00023 #include <Display/Display/Generic/blit_transparent.h>
00024 #include <API/Display/Display/surfaceprovider.h>
00025 #include <Display/Display/Generic/displaycard_generic.h>
00026 #include <Display/Display/Generic/blit_opaque.h>
00027
00028 CL_CardSurface_Blitter::CL_CardSurface_Blitter(
00029 CL_DisplayCard_Generic *target,
00030 CL_SurfaceProvider *provider,
00031 bool dynamic)
00032 : CL_CardSurface(provider)
00033 {
00034 m_target = target;
00035 m_dynamic = dynamic;
00036
00037 if (m_dynamic) m_provider->lock();
00038
00039 reload();
00040 }
00041
00042 CL_CardSurface_Blitter::~CL_CardSurface_Blitter()
00043 {
00044 m_blitters.delete_all();
00045
00046 if (m_dynamic) m_provider->unlock();
00047 }
00048
00049 bool CL_CardSurface_Blitter::reload()
00050 {
00051 m_blitters.delete_all();
00052
00053 m_provider->lock();
00054
00055 m_width = m_provider->get_width();
00056 m_height = m_provider->get_height();
00057 m_no_sprs = m_provider->get_num_frames();
00058
00059 if (m_dynamic)
00060 {
00061 m_blitters = m_target->create_hw_dynamic_blitters(m_provider);
00062 create_sw_blitters();
00063 }
00064 else
00065 {
00066 m_blitters = m_target->create_hw_blitters(m_provider);
00067 create_sw_blitters();
00068 }
00069
00070 m_provider->unlock();
00071
00072 return true;
00073 }
00074
00075 bool CL_CardSurface_Blitter::can_convert_video()
00076 {
00077 return false;
00078 }
00079
00080 bool CL_CardSurface_Blitter::can_convert_system()
00081 {
00082 return false;
00083 }
00084
00085 bool CL_CardSurface_Blitter::convert_video()
00086 {
00087 return false;
00088 }
00089
00090 bool CL_CardSurface_Blitter::convert_system()
00091 {
00092 return false;
00093 }
00094
00095 CL_Target *CL_CardSurface_Blitter::get_target()
00096 {
00097 return m_target->get_target();
00098 }
00099
00100 CL_ClipRect CL_CardSurface_Blitter::get_clip_rect()
00101 {
00102 return m_target->get_clip_rect();
00103 }
00104
00105 void CL_CardSurface_Blitter::put_screen(
00106 int x,
00107 int y,
00108 int spr_no,
00109 CL_Target *target)
00110 {
00111 if (target == NULL) target = get_target();
00112
00113 if (target != NULL)
00114 {
00115 x += target->get_translate_offset_x();
00116 y += target->get_translate_offset_y();
00117 }
00118
00119 CL_ClipRect c = get_clip_rect();
00120 CL_ClipRect d(x, y, x+get_width(), y+get_height());
00121 if (c.test_clipped(d))
00122 {
00123 m_blitters.get_clip()->blt_clip(
00124 target,
00125 x,
00126 y,
00127 spr_no,
00128 c);
00129 }
00130 else
00131 {
00132 m_blitters.get_noclip()->blt_noclip(
00133 target,
00134 x,
00135 y,
00136 spr_no);
00137 }
00138 }
00139
00140 void CL_CardSurface_Blitter::put_screen(
00141 int x,
00142 int y,
00143 float scale_x,
00144 float scale_y,
00145 int spr_no,
00146 CL_Target *target)
00147 {
00148 put_screen(
00149 x,
00150 y,
00151 (int) (scale_x * get_width()),
00152 (int) (scale_y * get_height()),
00153 spr_no,
00154 target);
00155 }
00156
00157 void CL_CardSurface_Blitter::put_screen(
00158 int x,
00159 int y,
00160 int size_x,
00161 int size_y,
00162 int spr_no,
00163 CL_Target *target)
00164 {
00165 if (target == NULL) target = get_target();
00166
00167 if (target != NULL)
00168 {
00169 x += target->get_translate_offset_x();
00170 y += target->get_translate_offset_y();
00171 }
00172
00173 CL_ClipRect c = get_clip_rect();
00174 CL_ClipRect d(x, y, x+size_x, y+size_y);
00175 if (c.test_clipped(d))
00176 {
00177 m_blitters.get_scale_clip()->blt_scale_clip(
00178 target,
00179 x,
00180 y,
00181 size_x,
00182 size_y,
00183 spr_no,
00184 c);
00185 }
00186 else
00187 {
00188 m_blitters.get_scale_noclip()->blt_scale_noclip(
00189 target,
00190 x,
00191 y,
00192 size_x,
00193 size_y,
00194 spr_no);
00195 }
00196
00197 }
00198
00199 bool CL_CardSurface_Blitter::is_video()
00200 {
00201 return true;
00202 }
00203
00204 void CL_CardSurface_Blitter::create_sw_blitters()
00205 {
00206 if (m_blitters.test_complete()) return;
00207
00208 int bytes_per_pixel = (get_target()->get_depth()+7)/8;
00209
00210 CL_Blit_Transparent *blt_trans = new CL_Blit_Transparent(m_target, m_provider);
00211 bool res = blt_trans->init_surface(&m_blitters);
00212
00213 if (!res)
00214 {
00215 delete blt_trans;
00216
00217
00218 CL_Blit_Opaque *blt_dyn = new CL_Blit_Opaque(
00219 m_provider,
00220 bytes_per_pixel,
00221 get_target());
00222
00223 if (!m_blitters.test_noclip()) m_blitters.set_noclip(blt_dyn);
00224 if (!m_blitters.test_clip()) m_blitters.set_clip(blt_dyn);
00225 if (!m_blitters.test_scale_noclip()) m_blitters.set_scale_noclip(blt_dyn);
00226 if (!m_blitters.test_scale_clip()) m_blitters.set_scale_clip(blt_dyn);
00227
00228
00229 }
00230 }