libavcodec/rectangle.h
626464fb
 /*
  * rectangle filling function
  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /**
ba87f080
  * @file
626464fb
  * useful rectangle filling function
  * @author Michael Niedermayer <michaelni@gmx.at>
  */
 
98790382
 #ifndef AVCODEC_RECTANGLE_H
 #define AVCODEC_RECTANGLE_H
626464fb
 
175da7da
 #include "config.h"
245976da
 #include "libavutil/common.h"
3422e7c3
 #include "libavutil/avassert.h"
626464fb
 
 /**
  * fill a rectangle.
  * @param h height of the rectangle, should be a constant
  * @param w width of the rectangle, should be a constant
3393bff1
  * @param size the size of val (1, 2 or 4), should be a constant
626464fb
  */
 static av_always_inline void fill_rectangle(void *vp, int w, int h, int stride, uint32_t val, int size){
     uint8_t *p= (uint8_t*)vp;
3422e7c3
     av_assert2(size==1 || size==2 || size==4);
     av_assert2(w<=4);
626464fb
 
     w      *= size;
     stride *= size;
 
8bbb487e
     av_assert2((((long)vp)&(FFMIN(w, 8<<(HAVE_NEON|ARCH_PPC|HAVE_MMX))-1)) == 0);
3422e7c3
     av_assert2((stride&(w-1))==0);
626464fb
     if(w==2){
         const uint16_t v= size==4 ? val : val*0x0101;
         *(uint16_t*)(p + 0*stride)= v;
         if(h==1) return;
         *(uint16_t*)(p + 1*stride)= v;
         if(h==2) return;
         *(uint16_t*)(p + 2*stride)= v;
         *(uint16_t*)(p + 3*stride)= v;
     }else if(w==4){
f3ea29bf
         const uint32_t v= size==4 ? val : size==2 ? val*0x00010001 : val*0x01010101;
626464fb
         *(uint32_t*)(p + 0*stride)= v;
         if(h==1) return;
         *(uint32_t*)(p + 1*stride)= v;
         if(h==2) return;
         *(uint32_t*)(p + 2*stride)= v;
         *(uint32_t*)(p + 3*stride)= v;
     }else if(w==8){
     //gcc can't optimize 64bit math on x86_32
b250f9c6
 #if HAVE_FAST_64BIT
f3ea29bf
         const uint64_t v=  size==2 ? val*0x0001000100010001ULL : val*0x0100000001ULL;
626464fb
         *(uint64_t*)(p + 0*stride)= v;
         if(h==1) return;
         *(uint64_t*)(p + 1*stride)= v;
         if(h==2) return;
         *(uint64_t*)(p + 2*stride)= v;
         *(uint64_t*)(p + 3*stride)= v;
     }else if(w==16){
         const uint64_t v= val*0x0100000001ULL;
         *(uint64_t*)(p + 0+0*stride)= v;
         *(uint64_t*)(p + 8+0*stride)= v;
         *(uint64_t*)(p + 0+1*stride)= v;
         *(uint64_t*)(p + 8+1*stride)= v;
         if(h==2) return;
         *(uint64_t*)(p + 0+2*stride)= v;
         *(uint64_t*)(p + 8+2*stride)= v;
         *(uint64_t*)(p + 0+3*stride)= v;
         *(uint64_t*)(p + 8+3*stride)= v;
 #else
09ef1ace
         const uint32_t v= size==2 ? val*0x00010001 : val;
f3ea29bf
         *(uint32_t*)(p + 0+0*stride)= v;
         *(uint32_t*)(p + 4+0*stride)= v;
626464fb
         if(h==1) return;
f3ea29bf
         *(uint32_t*)(p + 0+1*stride)= v;
         *(uint32_t*)(p + 4+1*stride)= v;
626464fb
         if(h==2) return;
f3ea29bf
         *(uint32_t*)(p + 0+2*stride)= v;
         *(uint32_t*)(p + 4+2*stride)= v;
         *(uint32_t*)(p + 0+3*stride)= v;
         *(uint32_t*)(p + 4+3*stride)= v;
626464fb
     }else if(w==16){
377fc38d
         *(uint32_t*)(p + 0+0*stride)= val;
         *(uint32_t*)(p + 4+0*stride)= val;
         *(uint32_t*)(p + 8+0*stride)= val;
         *(uint32_t*)(p +12+0*stride)= val;
         *(uint32_t*)(p + 0+1*stride)= val;
         *(uint32_t*)(p + 4+1*stride)= val;
         *(uint32_t*)(p + 8+1*stride)= val;
         *(uint32_t*)(p +12+1*stride)= val;
626464fb
         if(h==2) return;
377fc38d
         *(uint32_t*)(p + 0+2*stride)= val;
         *(uint32_t*)(p + 4+2*stride)= val;
         *(uint32_t*)(p + 8+2*stride)= val;
         *(uint32_t*)(p +12+2*stride)= val;
         *(uint32_t*)(p + 0+3*stride)= val;
         *(uint32_t*)(p + 4+3*stride)= val;
         *(uint32_t*)(p + 8+3*stride)= val;
         *(uint32_t*)(p +12+3*stride)= val;
626464fb
 #endif
     }else
3422e7c3
         av_assert2(0);
     av_assert2(h==4);
626464fb
 }
 
98790382
 #endif /* AVCODEC_RECTANGLE_H */