Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

cardsurface_blitter.cpp

Go to the documentation of this file.
00001 /*
00002         $Id: cardsurface_blitter.cpp,v 1.1 2001/03/06 15:09:17 mbn Exp $
00003 
00004         ------------------------------------------------------------------------
00005         ClanLib, the platform independent game SDK.
00006 
00007         This library is distributed under the GNU LIBRARY GENERAL PUBLIC LICENSE
00008         version 2. See COPYING for details.
00009 
00010         For a total list of contributers see CREDITS.
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                 // If blit-transparent returns false we're dealing with a fully opaque surface
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 }

Generated at Wed Apr 4 19:53:59 2001 for ClanLib by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001