Subversion Repositories Kolibri OS

Rev

Rev 882 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 882 Rev 1002
Line 562... Line 562...
562
     if( ( width <= 0 ) || ( height<=0 ) )
562
    if( ( width <= 0 ) || ( height<=0 ) )
563
        return ERR_PARAM;
563
        return ERR_PARAM;
Line 564... Line 564...
564
 
564
 
565
/*   if "hardware acceleration present" and
565
/*  if "hardware acceleration present" and
566
     "destinastion is primary screen or local videomemory"  and
-
 
567
     "source is primary screen or local videomemory"
566
    "destinastion is primary screen or local videomemory"
568
*/
567
*/
569
     if( (srv_hw2d != 0) &&
568
    if( (srv_hw2d != 0) &&
570
         ( (dst_pixmap == (void*)-1) ||
569
        ( (dst_pixmap == (void*)-1) ||
571
           ( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) )  &&
570
           ( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) /* &&
572
         ( (src_pixmap == (void*)-1) ||
571
         ( (src_pixmap == (void*)-1) ||
573
           ( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
572
           ( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) */ )
574
     {
573
    {
575
        ioctl_t io;
574
        ioctl_t io;
Line 576... Line 575...
576
        pxblit_t *blit = (pxblit_t*)&dst_pixmap;
575
        pxblit_t *blit = (pxblit_t*)&dst_pixmap;
577
 
576
 
Line 578... Line 577...
578
        if((int)dst_pixmap != -1)
577
        if((int)dst_pixmap != -1)
-
 
578
            blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle;
579
        blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle;
579
 
Line 580... Line 580...
580
 
580
        if( (int)src_pixmap != -1 &&
581
        if((int)src_pixmap != -1)
581
            (src_pixmap->flags & PX_MEM_MASK) != PX_MEM_SYSTEM)
582
           blit->src_pixmap = (pixmap_t*)src_pixmap->handle;
582
            blit->src_pixmap = (pixmap_t*)src_pixmap->handle;
Line 703... Line 703...
703
 
703
 
Line 704... Line 704...
704
        return call_service(&io);
704
        return call_service(&io);
705
     };
705
     };
Line -... Line 706...
-
 
706
 
-
 
707
     dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ;
-
 
708
     src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ;
706
 
709
 
707
     src_clip.xmin = 0;
710
     src_clip.xmin = 0;
708
     src_clip.ymin = 0;
711
     src_clip.ymin = 0;
709
     src_clip.xmax = src_pixmap->width-1;
712
     src_clip.xmax = src_pixmap->width-1;
Line 720... Line 723...
720
                    &width, &height) )
723
                    &width, &height) )
721
     {
724
     {
722
        __m64 clr_key;
725
        __m64 clr_key;
723
 
726
 
Line 724... Line -...
724
        dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ;
-
 
725
        src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ;
-
 
Line 726... Line 727...
726
 
727
 
727
        color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x];
728
        color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x];
Line 728... Line 729...
728
        color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x];
729
        color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x];
Line 764... Line 765...
764
     };
765
     };
765
     return ERR_OK;
766
     return ERR_OK;
766
}
767
}
767
768
 
Line -... Line 769...
-
 
769
unsigned long long m_0080 = 0x0080008000800080ULL;
-
 
770
 
-
 
771
int BlitAlpha(pixmap_t *dst_pixmap, int dst_x, int dst_y,
-
 
772
              pixmap_t *src_pixmap, int src_x, int src_y,
-
 
773
              int width, int height, u32_t alpha)
-
 
774
{
-
 
775
     clip_t src_clip, dst_clip;
-
 
776
 
-
 
777
     if( (srv_hw2d != 0) &&
-
 
778
         ( (dst_pixmap == (void*)-1) ||
-
 
779
           ( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) )  &&
-
 
780
         ( (src_pixmap == (void*)-1) ||
-
 
781
           ( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
-
 
782
     {
-
 
783
        ioctl_t io;
-
 
784
        pxblit_t *blit = (pxblit_t*)&dst_pixmap;
-
 
785
 
-
 
786
        if((int)dst_pixmap != -1)
-
 
787
           blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle;
-
 
788
 
-
 
789
        if((int)src_pixmap != -1)
-
 
790
           blit->src_pixmap = (pixmap_t*)src_pixmap->handle;
-
 
791
 
-
 
792
        io.handle   = srv_hw2d;
-
 
793
        io.io_code  = PX_BLIT_ALPHA;
-
 
794
        io.input    = blit;
-
 
795
        io.inp_size = 9;
-
 
796
        io.output   = NULL;
-
 
797
        io.out_size = 0;
-
 
798
 
-
 
799
        return call_service(&io);
-
 
800
     };
-
 
801
 
-
 
802
     dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ;
-
 
803
     src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ;
-
 
804
 
-
 
805
     src_clip.xmin = 0;
-
 
806
     src_clip.ymin = 0;
-
 
807
     src_clip.xmax = src_pixmap->width-1;
-
 
808
     src_clip.ymax = src_pixmap->height-1;
-
 
809
 
-
 
810
     dst_clip.xmin = 0;
-
 
811
     dst_clip.ymin = 0;
-
 
812
     dst_clip.xmax = dst_pixmap->width-1;
-
 
813
     dst_clip.ymax = dst_pixmap->height-1;
-
 
814
 
-
 
815
 
-
 
816
     if( !blit_clip(&dst_clip, &dst_x, &dst_y,
-
 
817
                    &src_clip, &src_x, &src_y,
-
 
818
                    &width, &height) )
-
 
819
     {
-
 
820
        __m64 m_alpha;
-
 
821
        __m64 m_one_alpha;
Line -... Line 822...
-
 
822
 
-
 
823
        color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x];
-
 
824
        color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x];
-
 
825
 
-
 
826
        m_alpha = _mm_cvtsi32_si64((alpha << 16) | alpha);
-
 
827
        m_alpha = _mm_unpacklo_pi32(m_alpha, m_alpha);
-
 
828
        m_one_alpha = _mm_subs_pu16((__m64)0x00FF00FF00FF00FFULL, m_alpha);
-
 
829
 
-
 
830
        while( height-- )
-
 
831
        {
-
 
832
           int w = width;
-
 
833
           color_t *tmp_src = src_addr;
-
 
834
           color_t *tmp_dst = dst_addr;
-
 
835
 
-
 
836
           src_addr += src_pixmap->pitch/4;
-
 
837
           dst_addr += dst_pixmap->pitch/4;
-
 
838
 
-
 
839
           while( w-- )
-
 
840
           {
-
 
841
              __asm__ __volatile__ (
-
 
842
              "movd (%0), %%mm0               \n\t"
-
 
843
              "pxor    %%mm1, %%mm1           \n\t"
-
 
844
              "punpcklbw  %%mm1, %%mm0        \n\t"
-
 
845
              "pmullw  %[clr_key], %%mm0       \n\t"
-
 
846
       //       "paddw   %[m_0080], %%mm0       \n\t"
-
 
847
 
-
 
848
              "movd (%1), %%mm2               \n\t"
-
 
849
              "punpcklbw  %%mm1, %%mm2        \n\t"
-
 
850
              "pmullw  %[m_one_alpha], %%mm2  \n\t"
-
 
851
       //       "paddw   %[m_0080], %%mm2       \n\t"
-
 
852
 
-
 
853
              "paddw   %%mm2, %%mm0           \n\t"
-
 
854
              "psrlw   $8, %%mm0              \n\t"
-
 
855
              "packuswb %%mm0, %%mm0          \n\t"
-
 
856
              "movd    %%mm0, (%1)"
-
 
857
              :: "r" (tmp_src),
-
 
858
                 "r" (tmp_dst),
-
 
859
              [clr_key] "y" (m_alpha),
-
 
860
              [m_one_alpha] "y" (m_one_alpha)
-
 
861
              :"memory","mm0", "mm1", "mm2");
-
 
862
 
-
 
863
              tmp_src++;
-
 
864
              tmp_dst++;
-
 
865
           };
-
 
866
//           if( w && (*tmp_src != alpha) )
-
 
867
//              *tmp_dst = *tmp_src;
-
 
868
        };
-
 
869
     };
-
 
870
     return ERR_OK;