Show
Ignore:
Timestamp:
12/18/09 20:41:38 (2 years ago)
Author:
Thibaut GIRKA <thib@…>
Branch:
default
Message:
Replaced SATURATE -> ADD, implemented objComposite, corrected minor things
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • window/picture.cc

    r53 r60  
    4242using namespace std; 
    4343 
    44 int print_blit = 0; 
    4544/* render.cc */ 
    4645void DSurfaceBlitAlpha(Surface* src_o, const Rect& srcrect_o, Surface* dst_o, const Rect& dstrect_o, const unsigned char* alpha, const Rect& alpharect); 
    47 void DSurfaceBlitSaturate(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect, unsigned char alpha); 
     46void DSurfaceBlitAdd(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect, unsigned char alpha); 
    4847void DSurfaceBlitMultiply(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect); 
    4948void DSurfaceFill(Surface* src, const Rect& rect, int r, int g, int b, int a=0xff); // ¥¯¥ê¥¢ 
     
    181180        Rect abs_r = QueryAbsPos(rpos); 
    182181        Rect ppos = parent_pos(rpos); 
    183 if(print_blit) fprintf(stderr,"back."); 
    184182        if (parent) parent->BlitBack(z_pos, ppos); 
    185 if(print_blit) fprintf(stderr,"self."); 
    186183        if (!is_hidden_now) Blit(rpos); 
    187 if(print_blit) fprintf(stderr,"front."); 
    188184        if (parent) parent->BlitFront(z_pos, ppos); 
    189 if(print_blit) fprintf(stderr,"end."); 
    190185} 
    191186 
     
    325320        surface_alpha = 0; 
    326321        surface_alpha_rect = Rect(0,0); 
    327         attribute &= ~(BLIT_SATURATE | BLIT_MULTIPLY); 
     322        attribute &= ~(BLIT_ADD | BLIT_MULTIPLY); 
    328323        if (surface_own) { 
    329324                int key = SDL_MapRGB( ((SDL_Surface*)surface_own)->format, r, g, b); 
     
    403398                root->DeleteSurface(surface_own); 
    404399        } 
    405         attribute &= ~(SURFACE_FREE | BLIT_SATURATE | BLIT_MULTIPLY | NO_PICTURE | SOLID); 
     400        attribute &= ~(SURFACE_FREE | BLIT_ADD | BLIT_MULTIPLY | NO_PICTURE | SOLID); 
    406401        attribute |= new_attr; 
    407402        surface_own = new_surface; 
     
    470465 
    471466void PicBase::SetSurfaceAttribute(int new_attribute) { 
    472         attribute &= ~(BLIT_SATURATE | BLIT_MULTIPLY); 
    473         attribute |= new_attribute & (BLIT_SATURATE | BLIT_MULTIPLY); 
    474         if (new_attribute & (BLIT_SATURATE | BLIT_MULTIPLY)) { 
     467        attribute &= ~(BLIT_ADD | BLIT_MULTIPLY); 
     468        attribute |= new_attribute & (BLIT_ADD | BLIT_MULTIPLY); 
     469        if (new_attribute & (BLIT_ADD | BLIT_MULTIPLY)) { 
    475470                rel_solid_area = Rect(0,0); 
    476471        } 
     
    540535                Rect apos = (*z)->QueryAbsPos(cpos); 
    541536                Rect draw_rpos = (*z)->parent_pos(cpos); 
    542 if(print_blit) fprintf(stderr,"cahce."); 
    543537                root->BlitSurface(surface_back, draw_rpos, root->surface, apos); 
    544538                goto self_redraw; 
     
    547541        if (parent) { 
    548542                Rect ppos = parent_pos(rpos); 
    549 if(print_blit) fprintf(stderr,"parent-back."); 
    550543                parent->BlitBack(z_pos, ppos); 
    551544        } 
    552545        if (is_hidden_now) return; 
    553546self_redraw: 
    554 if(print_blit) fprintf(stderr,"back-self."); 
    555547        BlitSelf(rpos); // »Ò€ÏÉÁ²è€»€º¡¢Œ«Ê¬€À€±ÉÁ²è 
    556548children_redraw: 
     
    565557 
    566558void PicContainer::BlitChildren(Rect rpos) { 
    567 if (print_blit) fprintf(stderr,"bc."); 
    568559        iterator end = children.end(); 
    569560        for (iterator it = children.begin(); it != end; it++) { 
    570 if ( (*it)->is_hidden_now) if(print_blit) fprintf(stderr,"bch %p;",*it); 
    571561                if ( (*it)->is_hidden_now) continue; 
    572562                if ( (*it)->rel_pos.is_crossed(rpos)) { 
     
    602592        Rect apos = QueryAbsPos(rpos); 
    603593        // ɬÍ׀˱þ€ž€ÆÊÝž¡¢ÉÁ²è 
    604 if(print_blit) fprintf(stderr,"self-back."); 
    605594        if (attribute & CACHE_BACK) root->BlitSurface(root->surface, apos, surface_back, rpos); 
    606595        if (! (attribute & NO_PICTURE)) { 
     
    611600                        rpos.intersect(clip); 
    612601                } 
    613 if(print_blit) fprintf(stderr,"self-blit."); 
    614602                root->BlitSurface(surface_own, rpos, surface_alpha, surface_alpha_rect, root->surface, apos, attribute); 
    615603        } else if (parent == NULL) { // ¿Æ€¬€€€Ê€€€Ê€éÇØ·ÊŸÃµî€ÎÀÕÇ€€ò€â€Ä 
     
    895883        vector<UpdateItem>::iterator end = update_rects.end(); 
    896884 
    897 if(print_blit){ 
    898         fprintf(stderr,"ExecUpdate Start: \n\t"); 
    899         for (it=update_rects.begin(); it != end; it++) { 
    900                 fprintf(stderr,"(%d,%d,%d,%d), ",it->apos.lx,it->apos.ty,it->apos.rx,it->apos.by); 
    901         } 
    902         fprintf(stderr,"\n"); 
    903 } 
    904  
    905885        for (it=update_rects.begin(); it != end; it++) { 
    906886                if (it->rpos.width() == 0) continue; 
     
    926906        } 
    927907 
    928 if(print_blit){ 
    929         fprintf(stderr,"->\t"); 
    930         for (it=update_rects.begin(); it != end; it++) { 
    931                 fprintf(stderr,"(%d,%d,%d,%d), ",it->apos.lx,it->apos.ty,it->apos.rx,it->apos.by); 
    932         } 
    933         fprintf(stderr,"\n"); 
    934 } 
    935  
    936908        int num = update_rects.size(); 
    937909        SDL_Rect* r = new SDL_Rect[num]; 
     
    943915                Rect& ur = item.apos; 
    944916                if (ur.width() == 0) continue; 
    945 if(print_blit)fprintf(stderr,"%p: %d,%d,%d,%d",item.pic, item.apos.lx, item.apos.ty, item.apos.rx, item.apos.by); 
    946917 
    947918                item.pic->ExecReBlit(item.rpos); 
    948 if(print_blit)fprintf(stderr,"\n"); 
     919 
    949920                ur.intersect(confine); 
    950921                r[n].x = ur.lx; 
     
    955926                n++; 
    956927        } 
    957 if(print_blit)fprintf(stderr,"\n"); 
     928 
    958929        SDL_UpdateRects(hw_surface, n, r); 
    959930        delete[] r; 
     
    1017988#define ALPHA_MAX 255 
    1018989#endif 
    1019 void PicRoot::BlitSurface(Surface* src, const Rect& src_r, const unsigned char* alpha, const Rect& alpha_r, Surface* dest, const Rect& dest_r, int attribute) const { 
    1020 if (print_blit) fprintf(stderr," s %p %d:%d:%d:%d;",src, dest_r.lx, dest_r.ty, dest_r.rx, dest_r.by); 
     990void PicRoot::BlitSurface(Surface* src, const Rect& src_r, const unsigned char* alpha, const Rect& alpha_r, 
     991                          Surface* dest, const Rect& dest_r, int attribute) const 
     992{ 
    1021993        SDL_Rect sr = SDLed(src_r); SDL_Rect dr = SDLed(dest_r); 
    1022994 
    1023         if (attribute & PicBase::BLIT_MULTIPLY) { 
    1024 if (print_blit) fprintf(stderr,"M"); 
     995        if (attribute & PicBase::BLIT_MULTIPLY) 
     996        { 
    1025997                DSurfaceBlitMultiply(src, src_r, dest, dest_r); 
    1026998                return; 
    1027         } else if (attribute & PicBase::BLIT_SATURATE && src->format->Amask == 0) { 
    1028 if (print_blit) fprintf(stderr,"S"); 
     999        } 
     1000        else if (attribute & PicBase::BLIT_ADD) 
     1001        { 
    10291002                unsigned char a = 255; 
    1030                 if (alpha && alpha_r.width() >= 1 && alpha_r.height() >= 1) a = *alpha; 
    1031                 DSurfaceBlitSaturate(src, src_r, dest, dest_r, a); 
     1003                if (alpha != NULL && alpha_r.width() >= 1 && alpha_r.height() >= 1) 
     1004                        a = *alpha; 
     1005                DSurfaceBlitAdd(src, src_r, dest, dest_r, a); 
    10321006                return; 
    10331007        } 
    10341008 
    1035 if (print_blit) fprintf(stderr,"N"); 
    1036         if (alpha == NULL || alpha_r.width() == 0) { // simple blit 
    1037 if (print_blit) fprintf(stderr,"X"); 
     1009        if (alpha == NULL || alpha_r.width() == 0) // simple blit 
     1010        { 
    10381011                SDL_BlitSurface(src, &sr, dest, &dr); 
    10391012                return; 
     
    10411014        if (alpha_r.width() == 1 && alpha_r.height() == 1) { 
    10421015                if (*alpha == 255) { 
    1043 if (print_blit) fprintf(stderr,"Y"); 
    10441016                        SDL_BlitSurface(src, &sr, dest, &dr); 
    10451017                        return; 
    10461018                } 
    10471019                if (src->format->Amask == 0) { // use per-surface alpha 
    1048 if (print_blit) fprintf(stderr,"Z"); 
    10491020                        SDL_SetAlpha(src, SDL_SRCALPHA, *alpha); 
    10501021                        SDL_BlitSurface(src, &sr, dest, &dr); 
     
    10541025        } 
    10551026        // generic alpha blit 
    1056 if (print_blit) fprintf(stderr,"W"); 
    10571027        DSurfaceBlitAlpha(src, src_r, dest, dest_r, alpha, alpha_r); 
    1058         return; 
    10591028} 
    10601029