sli is possible- but not optimal.
authorCarsten Haitzler <raster@rasterman.com>
Wed, 15 Nov 2006 16:44:34 +0000 (16:44 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Wed, 15 Nov 2006 16:44:34 +0000 (16:44 +0000)
SVN revision: 27129

14 files changed:
legacy/evas/src/lib/engines/common/evas_draw_main.c
legacy/evas/src/lib/engines/common/evas_font_draw.c
legacy/evas/src/lib/engines/common/evas_gradient_main.c
legacy/evas/src/lib/engines/common/evas_line_main.c
legacy/evas/src/lib/engines/common/evas_pipe.c
legacy/evas/src/lib/engines/common/evas_polygon_main.c
legacy/evas/src/lib/engines/common/evas_rectangle_main.c
legacy/evas/src/lib/engines/common/evas_scale_sample.c
legacy/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx.c
legacy/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c
legacy/evas/src/lib/engines/common/evas_scale_smooth_scaler_downy.c
legacy/evas/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c
legacy/evas/src/lib/engines/common/evas_scale_smooth_scaler_up.c
legacy/evas/src/lib/include/evas_common.h

index 0516d61..e67ddd0 100644 (file)
@@ -36,6 +36,7 @@ evas_common_draw_context_new(void)
    RGBA_Draw_Context *dc;
 
    dc = calloc(1, sizeof(RGBA_Draw_Context));
+   dc->sli.h = 1;
    return dc;
 }
 
@@ -543,3 +544,10 @@ evas_common_draw_context_set_render_op(RGBA_Draw_Context *dc , int op)
 {
    dc->render_op = op;
 }
+
+EAPI void
+evas_common_draw_context_set_sli(RGBA_Draw_Context *dc, int y, int h)
+{
+   dc->sli.y = y;
+   dc->sli.h = h;
+}
index aae41df..be3bb49 100644 (file)
@@ -259,22 +259,27 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int
                                      in_w = 0;
                                      dx = chr_x;
                                      dy = y - (chr_y - i - y);
-                                     if ((dx < (ext_x + ext_w)) &&
-                                         (dy >= (ext_y)) &&
-                                         (dy < (ext_y + ext_h)))
+#ifdef EVAS_SLI
+                                     if (((dy) % dc->sli.h) == dc->sli.y)
+#endif
                                        {
-                                          if (dx + w > (ext_x + ext_w))
-                                            in_w += (dx + w) - (ext_x + ext_w);
-                                          if (dx < ext_x)
+                                          if ((dx < (ext_x + ext_w)) &&
+                                              (dy >= (ext_y)) &&
+                                              (dy < (ext_y + ext_h)))
                                             {
-                                               in_w += ext_x - dx;
-                                               in_x = ext_x - dx;
-                                               dx = ext_x;
-                                            }
-                                          if (in_w < w)
-                                            {
-                                               func(NULL, data + (i * j) + in_x, dc->col.col,
-                                                    im + (dy * im_w) + dx, w - in_w);
+                                               if (dx + w > (ext_x + ext_w))
+                                                 in_w += (dx + w) - (ext_x + ext_w);
+                                               if (dx < ext_x)
+                                                 {
+                                                    in_w += ext_x - dx;
+                                                    in_x = ext_x - dx;
+                                                    dx = ext_x;
+                                                 }
+                                               if (in_w < w)
+                                                 {
+                                                    func(NULL, data + (i * j) + in_x, dc->col.col,
+                                                         im + (dy * im_w) + dx, w - in_w);
+                                                 }
                                             }
                                        }
                                   }
@@ -295,36 +300,41 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int
                                      in_w = 0;
                                      dx = chr_x;
                                      dy = y - (chr_y - i - y);
-                                     tp = tmpbuf;
-                                     dp = data + (i * fg->glyph_out->bitmap.pitch);
-                                     for (bi = 0; bi < w; bi += 8)
-                                       {
-                                          bits = *dp;
-                                          if ((w - bi) < 8) end = w - bi;
-                                          else end = 8;
-                                          for (bj = 0; bj < end; bj++)
-                                            {
-                                               *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
-                                               tp++;
-                                            }
-                                          dp++;
-                                       }
-                                     if ((dx < (ext_x + ext_w)) &&
-                                         (dy >= (ext_y)) &&
-                                         (dy < (ext_y + ext_h)))
+#ifdef EVAS_SLI
+                                     if (((dy) % dc->sli.h) == dc->sli.y)
+#endif
                                        {
-                                          if (dx + w > (ext_x + ext_w))
-                                            in_w += (dx + w) - (ext_x + ext_w);
-                                          if (dx < ext_x)
+                                          tp = tmpbuf;
+                                          dp = data + (i * fg->glyph_out->bitmap.pitch);
+                                          for (bi = 0; bi < w; bi += 8)
                                             {
-                                               in_w += ext_x - dx;
-                                               in_x = ext_x - dx;
-                                               dx = ext_x;
+                                               bits = *dp;
+                                               if ((w - bi) < 8) end = w - bi;
+                                               else end = 8;
+                                               for (bj = 0; bj < end; bj++)
+                                                 {
+                                                    *tp = bitrepl[(bits >> (7 - bj)) & 0x1];
+                                                    tp++;
+                                                 }
+                                               dp++;
                                             }
-                                          if (in_w < w)
+                                          if ((dx < (ext_x + ext_w)) &&
+                                              (dy >= (ext_y)) &&
+                                              (dy < (ext_y + ext_h)))
                                             {
-                                               func(NULL, tmpbuf + in_x, dc->col.col,
-                                                    im + (dy * im_w) + dx, w - in_w);
+                                               if (dx + w > (ext_x + ext_w))
+                                                 in_w += (dx + w) - (ext_x + ext_w);
+                                               if (dx < ext_x)
+                                                 {
+                                                    in_w += ext_x - dx;
+                                                    in_x = ext_x - dx;
+                                                    dx = ext_x;
+                                                 }
+                                               if (in_w < w)
+                                                 {
+                                                    func(NULL, tmpbuf + in_x, dc->col.col,
+                                                         im + (dy * im_w) + dx, w - in_w);
+                                                 }
                                             }
                                        }
                                   }
index 0f0c517..8b0704c 100644 (file)
@@ -526,10 +526,15 @@ evas_common_gradient_draw(RGBA_Image *dst, RGBA_Draw_Context *dc,
        buf = pdst;
    while (pdst < dst_end)
      {
-       gfunc(map, len, buf, mask, w, xoff, yoff, axx, axy, ayx, ayy, gdata);
-       if (!direct_copy)
-           bfunc(buf, mask, 0, pdst, w);
-       evas_common_cpu_end_opt();
+#ifdef EVAS_SLI
+       if (((yoff + y) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            gfunc(map, len, buf, mask, w, xoff, yoff, axx, axy, ayx, ayy, gdata);
+            if (!direct_copy)
+              bfunc(buf, mask, 0, pdst, w);
+            evas_common_cpu_end_opt();
+         }
        buf += buf_step;
        pdst += dst->image->w;
        yoff++;
index c69d021..5026bbd 100644 (file)
@@ -152,24 +152,29 @@ _evas_draw_simple_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, i
 
    if (dy == 0)
      {
-       if ((y0 >= ty) && (y0 <= by))
+#ifdef EVAS_SLI
+       if (((y0) % dc->sli.h) == dc->sli.y)
+#endif
          {
-            if (dx < 0)
+            if ((y0 >= ty) && (y0 <= by))
               {
-                 int  tmp = x1;
+                 if (dx < 0)
+                   {
+                      int  tmp = x1;
+                      
+                      x1 = x0;
+                      x0 = tmp;
+                   }
                  
-                 x1 = x0;
-                 x0 = tmp;
+                 if (x0 < lx) x0 = lx;
+                 if (x1 > rx) x1 = rx;
+                 
+                 len = x1 - x0 + 1;
+                 p = dst->image->data + (dstw * y0) + x0;
+                 sfunc = evas_common_gfx_func_composite_color_span_get(color, dst, len, dc->render_op);
+                 if (sfunc)
+                   sfunc(NULL, NULL, color, p, len);
               }
-            
-            if (x0 < lx) x0 = lx;
-            if (x1 > rx) x1 = rx;
-            
-            len = x1 - x0 + 1;
-            p = dst->image->data + (dstw * y0) + x0;
-            sfunc = evas_common_gfx_func_composite_color_span_get(color, dst, len, dc->render_op);
-            if (sfunc)
-              sfunc(NULL, NULL, color, p, len);
          }
        return;
      }
@@ -188,7 +193,12 @@ _evas_draw_simple_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, i
             p = dst->image->data + (dstw * y0) + x0;
             while (len--)
               {
-                 pfunc(0, 255, color, p);
+#ifdef EVAS_SLI
+                 if (((y1 + 1 - len) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      pfunc(0, 255, color, p);
+                   }
                  p += dstw;
               }
          }
@@ -273,7 +283,12 @@ _evas_draw_simple_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, i
 
        while (len--)
          {
-           pfunc(0, 255, color, p);
+#ifdef EVAS_SLI
+            if (((y1 + 1 - len) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 pfunc(0, 255, color, p);
+              }
            p += dstw;
          }
      }
@@ -486,8 +501,13 @@ _evas_draw_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1,
                if ((py < 0) && (dely < 0)) return;
                if ((py > by) && (dely > 0)) return;
              }
-           if (IN_RANGE(px, py, clw, clh))
-               pfunc(0, 255, color, p);
+#ifdef EVAS_SLI
+            if (((py) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 if (IN_RANGE(px, py, clw, clh))
+                   pfunc(0, 255, color, p);
+              }
            yy += dyy;
            px++;
            p++;
@@ -514,8 +534,13 @@ _evas_draw_line(RGBA_Image *dst, RGBA_Draw_Context *dc, int x0, int y0, int x1,
            if ((px < 0) && (delx < 0)) return;
            if ((px > rx) && (delx > 0)) return;
          }
-       if (IN_RANGE(px, py, clw, clh))
-           pfunc(0, 255, color, p);
+#ifdef EVAS_SLI
+       if (((py) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            if (IN_RANGE(px, py, clw, clh))
+              pfunc(0, 255, color, p);
+         }
        xx += dxx;
        py++;
        p += dstw;
index 88eecb7..37e31dc 100644 (file)
@@ -62,13 +62,6 @@ evas_common_pipe_op_free(RGBA_Pipe_Op *op)
 }
 
 /* main api calls */
-EAPI void
-evas_common_pipe_begin(RGBA_Image *im)
-{
-   /* FIXME: PTHREAD start any processing threads and lock - otherwise do
-    * nothing */
-}
-
 #ifdef BUILD_PTHREAD
 typedef struct _Thinfo
 {
@@ -118,6 +111,77 @@ evas_common_pipe_thread(void *data)
 }
 #endif
 
+#ifdef BUILD_PTHREAD
+static int               thread_num = 0;
+static Thinfo            thinfo[TH_MAX];
+static pthread_barrier_t thbarrier[2];
+#endif
+
+EAPI void
+evas_common_pipe_begin(RGBA_Image *im)
+{
+#ifdef BUILD_PTHREAD
+   int i, y, h;
+   
+   if (thread_num == 0)
+     {
+       int cpunum;
+       
+       cpunum = evas_common_cpu_count();
+       thread_num = cpunum;
+       pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1);
+       for (i = 0; i < thread_num; i++)
+         {
+            pthread_attr_t attr;
+            cpu_set_t cpu;
+            
+            pthread_attr_init(&attr);
+            CPU_ZERO(&cpu);
+            CPU_SET(i % cpunum, &cpu);
+            pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu);
+            thinfo[i].thread_num = i;
+            thinfo[i].info = NULL;
+            thinfo[i].barrier = thbarrier;
+            /* setup initial locks */
+            pthread_create(&(thinfo[i].thread_id), &attr, 
+                           evas_common_pipe_thread, &(thinfo[i]));
+         }
+     }
+   y = 0;
+   h = im->image->h / thread_num;
+   if (h < 1) h = 1;
+   for (i = 0; i < thread_num; i++)
+     {
+       RGBA_Pipe_Thread_Info *info;
+            
+//          if (y >= im->image->h) break;
+       info = calloc(1, sizeof(RGBA_Pipe_Thread_Info));
+       info->im = im;
+#ifdef EVAS_SLI
+       info->x = 0;
+       info->w = im->image->w;
+       info->y = i;
+       info->h = thread_num;
+#else       
+       info->x = 0;
+       info->y = y;
+       info->w = im->image->w;
+       if (i == (thread_num - 1))
+         info->h = im->image->h - y;
+       else
+         info->h = h;
+       y += info->h;
+#endif      
+       thinfo[i].info = info;
+            /* send startsignal */
+//          printf("START %i\n", i);
+     }
+   pthread_barrier_init(&(thbarrier[1]), NULL, thread_num + 1);
+   pthread_barrier_wait(&(thbarrier[0]));
+   pthread_barrier_destroy(&(thbarrier[0]));
+#endif   
+}
+
 EAPI void
 evas_common_pipe_flush(RGBA_Image *im)
 {
@@ -130,60 +194,9 @@ evas_common_pipe_flush(RGBA_Image *im)
    /* FIXME: PTHREAD join all threads here (if not finished) or begin then join
     * otherwise just process pipe */
      {
-       static int thread_num = 0;
-       static Thinfo thinfo[TH_MAX];
-       static pthread_barrier_t barrier[2];
-       
-       if (thread_num == 0)
-         {
-            thread_num = evas_common_cpu_count();
-            pthread_barrier_init(&(barrier[0]), NULL, thread_num + 1);
-            for (i = 0; i < thread_num; i++)
-              {
-                 pthread_attr_t attr;
-                 cpu_set_t cpu;
-                 
-                 pthread_attr_init(&attr);
-                 CPU_ZERO(&cpu);
-                 CPU_SET(i, &cpu);
-                 pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu);
-                 thinfo[i].thread_num = i;
-                 thinfo[i].info = NULL;
-                 thinfo[i].barrier = barrier;
-                 /* setup initial locks */
-                 pthread_create(&(thinfo[i].thread_id), &attr, 
-                                evas_common_pipe_thread, &(thinfo[i]));
-              }
-         }
-       y = 0;
-       h = im->image->h / thread_num;
-       if (h < 1) h = 1;
-       for (i = 0; i < thread_num; i++)
-         {
-            RGBA_Pipe_Thread_Info *info;
-            
-//          if (y >= im->image->h) break;
-            info = calloc(1, sizeof(RGBA_Pipe_Thread_Info));
-            info->im = im;
-            info->x = 0;
-            info->y = y;
-            info->w = im->image->w;
-            if (i == (thread_num - 1))
-              info->h = im->image->h - y;
-            else
-              info->h = h;
-            y += info->h;
-            thinfo[i].info = info;
-            /* send startsignal */
-//          printf("START %i\n", i);
-         }
-       pthread_barrier_init(&(barrier[1]), NULL, thread_num + 1);
-       pthread_barrier_wait(&(barrier[0]));
-       pthread_barrier_destroy(&(barrier[0]));
-       
-       pthread_barrier_init(&(barrier[0]), NULL, thread_num + 1);
-       pthread_barrier_wait(&(barrier[1]));
-       pthread_barrier_destroy(&(barrier[1]));
+       pthread_barrier_init(&(thbarrier[0]), NULL, thread_num + 1);
+       pthread_barrier_wait(&(thbarrier[1]));
+       pthread_barrier_destroy(&(thbarrier[1]));
 //     printf("DONE\n");
      }
    
@@ -238,7 +251,11 @@ evas_common_pipe_rectangle_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_
        RGBA_Draw_Context context;
        
        memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else  
        evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif 
        evas_common_rectangle_draw(dst, &(context), 
                                   op->op.rect.x, op->op.rect.y,
                                   op->op.rect.w, op->op.rect.h);
@@ -276,7 +293,11 @@ evas_common_pipe_line_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Threa
        RGBA_Draw_Context context;
        
        memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else  
        evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif 
        evas_common_line_draw(dst, &(context), 
                              op->op.line.x0, op->op.line.y0,
                              op->op.line.x1, op->op.line.y1);
@@ -327,7 +348,11 @@ evas_common_pipe_poly_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Threa
        RGBA_Draw_Context context;
        
        memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else  
        evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif 
        evas_common_polygon_draw(dst, &(context),
                                 op->op.poly.points);
      }
@@ -379,7 +404,11 @@ evas_common_pipe_grad_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Threa
        RGBA_Draw_Context context;
        
        memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else  
        evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif 
        evas_common_gradient_draw(dst, &(context),
                                  op->op.grad.x, op->op.grad.y,
                                  op->op.grad.w, op->op.grad.h,
@@ -429,7 +458,11 @@ evas_common_pipe_text_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Threa
        RGBA_Draw_Context context;
        
        memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else  
        evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif 
        evas_common_font_draw(dst, &(context),
                              op->op.text.font, op->op.text.x, op->op.text.y,
                              op->op.text.text);
@@ -476,7 +509,11 @@ evas_common_pipe_image_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Thre
        RGBA_Draw_Context context;
        
        memcpy(&(context), &(op->context), sizeof(RGBA_Draw_Context));
+#ifdef EVAS_SLI
+       evas_common_draw_context_set_sli(&(context), info->y, info->h);
+#else  
        evas_common_draw_context_clip_clip(&(context), info->x, info->y, info->w, info->h);
+#endif 
        if (op->op.image.smooth)
          evas_common_scale_rgba_in_to_out_clip_smooth(op->op.image.src, 
                                                       dst, &(context),
index 28ed324..88903fb 100644 (file)
@@ -276,8 +276,13 @@ evas_common_polygon_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Polygon_Po
             DATA32 *ptr;
 
             span = (RGBA_Span *)l;
-            ptr = dst->image->data + (span->y * (dst->image->w)) + span->x;
-            func(NULL, NULL, dc->col.col, ptr, span->w);
+#ifdef EVAS_SLI
+            if (((span->y) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 ptr = dst->image->data + (span->y * (dst->image->w)) + span->x;
+                 func(NULL, NULL, dc->col.col, ptr, span->w);
+              }
          }
        while (spans)
          {
index 455648c..f9fae5a 100644 (file)
@@ -67,7 +67,12 @@ rectangle_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, int x, int y, in
    ptr = dst->image->data + (y * dst->image->w) + x;
    for (yy = 0; yy < h; yy++)
      {
-       func(NULL, NULL, dc->col.col, ptr, w);
+#ifdef EVAS_SLI
+       if (((yy + y) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            func(NULL, NULL, dc->col.col, ptr, w);
+         }
        ptr += dst->image->w;
      }
 }
index c864e5d..54d255f 100644 (file)
@@ -247,7 +247,12 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst,
        for (y = 0; y < dst_clip_h; y++)
          {
            /* * blend here [clip_w *] ptr -> dst_ptr * */
-           func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w);
+#ifdef EVAS_SLI
+            if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w);
+              }
            ptr += src_w;
            dst_ptr += dst_w;
          }
@@ -269,13 +274,18 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst,
          {
            for (y = 0; y < dst_clip_h; y++)
              {
-                dst_ptr = dptr;
-                for (x = 0; x < dst_clip_w; x++)
-                   {
-                       ptr = row_ptr[y] + lin_ptr[x];
-                       *dst_ptr = *ptr;
-                       dst_ptr++;
-                   }
+#ifdef EVAS_SLI
+                if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
+#endif
+                  {
+                     dst_ptr = dptr;
+                     for (x = 0; x < dst_clip_w; x++)
+                       {
+                          ptr = row_ptr[y] + lin_ptr[x];
+                          *dst_ptr = *ptr;
+                          dst_ptr++;
+                       }
+                  }
                 dptr += dst_w;
              }
          }
@@ -288,15 +298,20 @@ scale_rgba_in_to_out_clip_sample_internal(RGBA_Image *src, RGBA_Image *dst,
 
            for (y = 0; y < dst_clip_h; y++)
              {
-               dst_ptr = buf;
-               for (x = 0; x < dst_clip_w; x++)
-                 {
-                   ptr = row_ptr[y] + lin_ptr[x];
-                   *dst_ptr = *ptr;
-                   dst_ptr++;
-                 }
-               /* * blend here [clip_w *] buf -> dptr * */
-               func(buf, NULL, dc->mul.col, dptr, dst_clip_w);
+#ifdef EVAS_SLI
+                if (((y + dst_clip_y) % dc->sli.h) == dc->sli.y)
+#endif
+                  {
+                     dst_ptr = buf;
+                     for (x = 0; x < dst_clip_w; x++)
+                       {
+                          ptr = row_ptr[y] + lin_ptr[x];
+                          *dst_ptr = *ptr;
+                          dst_ptr++;
+                       }
+                     /* * blend here [clip_w *] buf -> dptr * */
+                     func(buf, NULL, dc->mul.col, dptr, dst_clip_w);
+                  }
                dptr += dst_w;
              }
          }
index 464ea17..58570ba 100644 (file)
@@ -5,6 +5,9 @@
    int *xp, xap, yap, pos;
    int dyy, dxx;
    int w = dst_clip_w;
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
    
    dptr = dst_ptr;
    pos = (src_region_y * src_w) + src_region_x;
      {
        while (dst_clip_h--)
          {
-            while (dst_clip_w--)
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
               {
-                 Cx = *xapp >> 16;
-                 xap = *xapp & 0xffff;
-                 pix = *yp + *xp + pos;
-
-                 a = (A_VAL(pix) * xap) >> 10;
-                 r = (R_VAL(pix) * xap) >> 10;
-                 g = (G_VAL(pix) * xap) >> 10;
-                 b = (B_VAL(pix) * xap) >> 10;
-                 for (j = (1 << 14) - xap; j > Cx; j -= Cx)
-                   {
-                      pix++;
-                      a += (A_VAL(pix) * Cx) >> 10;
-                      r += (R_VAL(pix) * Cx) >> 10;
-                      g += (G_VAL(pix) * Cx) >> 10;
-                      b += (B_VAL(pix) * Cx) >> 10;
-                   }
-                 if (j > 0)
-                   {
-                      pix++;
-                      a += (A_VAL(pix) * j) >> 10;
-                      r += (R_VAL(pix) * j) >> 10;
-                      g += (G_VAL(pix) * j) >> 10;
-                      b += (B_VAL(pix) * j) >> 10;
-                   }
-                 if ((yap = *yapp) > 0)
-                   {
-                      pix = *yp + *xp + src_w + pos;
-                      aa = (A_VAL(pix) * xap) >> 10;
-                      rr = (R_VAL(pix) * xap) >> 10;
-                      gg = (G_VAL(pix) * xap) >> 10;
-                      bb = (B_VAL(pix) * xap) >> 10;
-                      for (j = (1 << 14) - xap; j > Cx; j -= Cx)
-                        {
-                           pix++;
-                           aa += (A_VAL(pix) * Cx) >> 10;
-                           rr += (R_VAL(pix) * Cx) >> 10;
-                           gg += (G_VAL(pix) * Cx) >> 10;
-                           bb += (B_VAL(pix) * Cx) >> 10;
-                             }
-                      if (j > 0)
-                        {
-                           pix++;
-                           aa += (A_VAL(pix) * j) >> 10;
-                           rr += (R_VAL(pix) * j) >> 10;
-                           gg += (G_VAL(pix) * j) >> 10;
-                           bb += (B_VAL(pix) * j) >> 10;
-                        }
-                      a += ((aa - a) * yap) >> 8;
-                      r += ((rr - r) * yap) >> 8;
-                      g += ((gg - g) * yap) >> 8;
-                      b += ((bb - b) * yap) >> 8;
-                   }
-                 *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4);
-                 xp++;  xapp++;
-              }
-
-            func(buf, NULL, dc->mul.col, dptr, w);
-
-            pbuf = buf;
-            dptr += dst_w;  dst_clip_w = w;
-            yp++;  yapp++;
-            xp = xpoints + dxx;
-            xapp = xapoints + dxx;
-         }
-     }
-   else
-     {
-#ifdef DIRECT_SCALE
-        if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) &&
-           (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) &&
-           (!dc->mul.use))
-         {
-            while (dst_clip_h--)
-              {
-                  pbuf = dptr;
                  while (dst_clip_w--)
                    {
                       Cx = *xapp >> 16;
                       xap = *xapp & 0xffff;
                       pix = *yp + *xp + pos;
                       
+                      a = (A_VAL(pix) * xap) >> 10;
                       r = (R_VAL(pix) * xap) >> 10;
                       g = (G_VAL(pix) * xap) >> 10;
                       b = (B_VAL(pix) * xap) >> 10;
                       for (j = (1 << 14) - xap; j > Cx; j -= Cx)
                         {
                            pix++;
+                           a += (A_VAL(pix) * Cx) >> 10;
                            r += (R_VAL(pix) * Cx) >> 10;
                            g += (G_VAL(pix) * Cx) >> 10;
                            b += (B_VAL(pix) * Cx) >> 10;
                       if (j > 0)
                         {
                            pix++;
+                           a += (A_VAL(pix) * j) >> 10;
                            r += (R_VAL(pix) * j) >> 10;
                            g += (G_VAL(pix) * j) >> 10;
                            b += (B_VAL(pix) * j) >> 10;
                       if ((yap = *yapp) > 0)
                         {
                            pix = *yp + *xp + src_w + pos;
+                           aa = (A_VAL(pix) * xap) >> 10;
                            rr = (R_VAL(pix) * xap) >> 10;
                            gg = (G_VAL(pix) * xap) >> 10;
                            bb = (B_VAL(pix) * xap) >> 10;
                            for (j = (1 << 14) - xap; j > Cx; j -= Cx)
                              {
                                 pix++;
+                                aa += (A_VAL(pix) * Cx) >> 10;
                                 rr += (R_VAL(pix) * Cx) >> 10;
                                 gg += (G_VAL(pix) * Cx) >> 10;
                                 bb += (B_VAL(pix) * Cx) >> 10;
                            if (j > 0)
                              {
                                 pix++;
+                                aa += (A_VAL(pix) * j) >> 10;
                                 rr += (R_VAL(pix) * j) >> 10;
                                 gg += (G_VAL(pix) * j) >> 10;
                                 bb += (B_VAL(pix) * j) >> 10;
                              }
+                           a += ((aa - a) * yap) >> 8;
                            r += ((rr - r) * yap) >> 8;
                            g += ((gg - g) * yap) >> 8;
                            b += ((bb - b) * yap) >> 8;
                         }
-                      *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                      *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4);
                       xp++;  xapp++;
                    }
                  
+                 func(buf, NULL, dc->mul.col, dptr, w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pbuf = buf;
+            dptr += dst_w;  dst_clip_w = w;
+            yp++;  yapp++;
+            xp = xpoints + dxx;
+            xapp = xapoints + dxx;
+         }
+     }
+   else
+     {
+#ifdef DIRECT_SCALE
+        if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) &&
+           (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) &&
+           (!dc->mul.use))
+         {
+            while (dst_clip_h--)
+              {
+                  pbuf = dptr;
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      while (dst_clip_w--)
+                        {
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           pix = *yp + *xp + pos;
+                           
+                           r = (R_VAL(pix) * xap) >> 10;
+                           g = (G_VAL(pix) * xap) >> 10;
+                           b = (B_VAL(pix) * xap) >> 10;
+                           for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                             {
+                                pix++;
+                                r += (R_VAL(pix) * Cx) >> 10;
+                                g += (G_VAL(pix) * Cx) >> 10;
+                                b += (B_VAL(pix) * Cx) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix++;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
+                             }
+                           if ((yap = *yapp) > 0)
+                             {
+                                pix = *yp + *xp + src_w + pos;
+                                rr = (R_VAL(pix) * xap) >> 10;
+                                gg = (G_VAL(pix) * xap) >> 10;
+                                bb = (B_VAL(pix) * xap) >> 10;
+                                for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * Cx) >> 10;
+                                     gg += (G_VAL(pix) * Cx) >> 10;
+                                     bb += (B_VAL(pix) * Cx) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * yap) >> 8;
+                                g += ((gg - g) * yap) >> 8;
+                                b += ((bb - b) * yap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
+                        }
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+                 
                  dptr += dst_w;  dst_clip_w = w;
                  yp++;  yapp++;
                  xp = xpoints + dxx;
          {
             while (dst_clip_h--)
               {
-                 while (dst_clip_w--)
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
                    {
-                      Cx = *xapp >> 16;
-                      xap = *xapp & 0xffff;
-                      pix = *yp + *xp + pos;
-                      
-                      r = (R_VAL(pix) * xap) >> 10;
-                      g = (G_VAL(pix) * xap) >> 10;
-                      b = (B_VAL(pix) * xap) >> 10;
-                      for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                      while (dst_clip_w--)
                         {
-                           pix++;
-                           r += (R_VAL(pix) * Cx) >> 10;
-                           g += (G_VAL(pix) * Cx) >> 10;
-                           b += (B_VAL(pix) * Cx) >> 10;
-                        }
-                      if (j > 0)
-                        {
-                           pix++;
-                           r += (R_VAL(pix) * j) >> 10;
-                           g += (G_VAL(pix) * j) >> 10;
-                           b += (B_VAL(pix) * j) >> 10;
-                        }
-                      if ((yap = *yapp) > 0)
-                        {
-                           pix = *yp + *xp + src_w + pos;
-                           rr = (R_VAL(pix) * xap) >> 10;
-                           gg = (G_VAL(pix) * xap) >> 10;
-                           bb = (B_VAL(pix) * xap) >> 10;
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           pix = *yp + *xp + pos;
+                           
+                           r = (R_VAL(pix) * xap) >> 10;
+                           g = (G_VAL(pix) * xap) >> 10;
+                           b = (B_VAL(pix) * xap) >> 10;
                            for (j = (1 << 14) - xap; j > Cx; j -= Cx)
                              {
                                 pix++;
-                                rr += (R_VAL(pix) * Cx) >> 10;
-                                gg += (G_VAL(pix) * Cx) >> 10;
-                                bb += (B_VAL(pix) * Cx) >> 10;
+                                r += (R_VAL(pix) * Cx) >> 10;
+                                g += (G_VAL(pix) * Cx) >> 10;
+                                b += (B_VAL(pix) * Cx) >> 10;
                              }
                            if (j > 0)
                              {
                                 pix++;
-                                rr += (R_VAL(pix) * j) >> 10;
-                                gg += (G_VAL(pix) * j) >> 10;
-                                bb += (B_VAL(pix) * j) >> 10;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
                              }
-                           r += ((rr - r) * yap) >> 8;
-                           g += ((gg - g) * yap) >> 8;
-                           b += ((bb - b) * yap) >> 8;
+                           if ((yap = *yapp) > 0)
+                             {
+                                pix = *yp + *xp + src_w + pos;
+                                rr = (R_VAL(pix) * xap) >> 10;
+                                gg = (G_VAL(pix) * xap) >> 10;
+                                bb = (B_VAL(pix) * xap) >> 10;
+                                for (j = (1 << 14) - xap; j > Cx; j -= Cx)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * Cx) >> 10;
+                                     gg += (G_VAL(pix) * Cx) >> 10;
+                                     bb += (B_VAL(pix) * Cx) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix++;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * yap) >> 8;
+                                g += ((gg - g) * yap) >> 8;
+                                b += ((bb - b) * yap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
                         }
-                      *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
-                      xp++;  xapp++;
+                      
+                      func(buf, NULL, dc->mul.col, dptr, w);
                    }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
                  
-                 func(buf, NULL, dc->mul.col, dptr, w);
-            
                  pbuf = buf;
                  dptr += dst_w;  dst_clip_w = w;
                  yp++;  yapp++;
index d31c9a4..5686917 100644 (file)
@@ -4,6 +4,9 @@
    int a, r, g, b, rx, gx, bx, ax;
    int xap, yap, pos;
    int dyy, dxx;
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
    
    DATA32  **yp; 
    int *xp;
      {
        while (dst_clip_h--)
          {
-            Cy = *yapp >> 16;
-            yap = *yapp & 0xffff;
-
-            while (dst_clip_w--)
-              {
-                 Cx = *xapp >> 16;
-                 xap = *xapp & 0xffff;
-
-                 sptr = *yp + *xp + pos;
-                 pix = sptr;
-                 sptr += src_w;
-
-                 ax = (A_VAL(pix) * xap) >> 9;
-                 rx = (R_VAL(pix) * xap) >> 9;
-                 gx = (G_VAL(pix) * xap) >> 9;
-                 bx = (B_VAL(pix) * xap) >> 9;
-                 pix++;
-                 for (i = (1 << 14) - xap; i > Cx; i -= Cx)
-                   {
-                      ax += (A_VAL(pix) * Cx) >> 9;
-                      rx += (R_VAL(pix) * Cx) >> 9;
-                      gx += (G_VAL(pix) * Cx) >> 9;
-                      bx += (B_VAL(pix) * Cx) >> 9;
-                      pix++;
-                   }
-                 if (i > 0)
-                   {
-                      ax += (A_VAL(pix) * i) >> 9;
-                      rx += (R_VAL(pix) * i) >> 9;
-                      gx += (G_VAL(pix) * i) >> 9;
-                      bx += (B_VAL(pix) * i) >> 9;
-                   }
-
-                 a = (ax * yap) >> 14;
-                 r = (rx * yap) >> 14;
-                 g = (gx * yap) >> 14;
-                 b = (bx * yap) >> 14;
-
-                 for (j = (1 << 14) - yap; j > Cy; j -= Cy)
-                   {
-                      pix = sptr;
-                      sptr += src_w;
-                      ax = (A_VAL(pix) * xap) >> 9;
-                      rx = (R_VAL(pix) * xap) >> 9;
-                      gx = (G_VAL(pix) * xap) >> 9;
-                      bx = (B_VAL(pix) * xap) >> 9;
-                      pix++;
-                      for (i = (1 << 14) - xap; i > Cx; i -= Cx)
-                        {
-                           ax += (A_VAL(pix) * Cx) >> 9;
-                           rx += (R_VAL(pix) * Cx) >> 9;
-                           gx += (G_VAL(pix) * Cx) >> 9;
-                           bx += (B_VAL(pix) * Cx) >> 9;
-                           pix++;
-                        }
-                      if (i > 0)
-                        {
-                           ax += (A_VAL(pix) * i) >> 9;
-                           rx += (R_VAL(pix) * i) >> 9;
-                           gx += (G_VAL(pix) * i) >> 9;
-                           bx += (B_VAL(pix) * i) >> 9;
-                        }
-
-                      a += (ax * Cy) >> 14;
-                      r += (rx * Cy) >> 14;
-                      g += (gx * Cy) >> 14;
-                      b += (bx * Cy) >> 14;
-                   }
-                 if (j > 0)
-                   {
-                      pix = sptr;
-                      sptr += src_w;
-                      ax = (A_VAL(pix) * xap) >> 9;
-                      rx = (R_VAL(pix) * xap) >> 9;
-                      gx = (G_VAL(pix) * xap) >> 9;
-                      bx = (B_VAL(pix) * xap) >> 9;
-                      pix++;
-                      for (i = (1 << 14) - xap; i > Cx; i -= Cx)
-                        {
-                           ax += (A_VAL(pix) * Cx) >> 9;
-                           rx += (R_VAL(pix) * Cx) >> 9;
-                           gx += (G_VAL(pix) * Cx) >> 9;
-                           bx += (B_VAL(pix) * Cx) >> 9;
-                           pix++;
-                        }
-                      if (i > 0)
-                        {
-                           ax += (A_VAL(pix) * i) >> 9;
-                           rx += (R_VAL(pix) * i) >> 9;
-                           gx += (G_VAL(pix) * i) >> 9;
-                           bx += (B_VAL(pix) * i) >> 9;
-                        }
-
-                      a += (ax * j) >> 14;
-                      r += (rx * j) >> 14;
-                      g += (gx * j) >> 14;
-                      b += (bx * j) >> 14;
-                   }
-                 *pbuf++ = ARGB_JOIN(a >> 5, r >> 5, g >> 5, b >> 5);
-                 xp++;  xapp++;
-              }
-
-            func(buf, NULL, dc->mul.col, dptr, w);
-
-            pbuf = buf;
-            dptr += dst_w;   dst_clip_w = w;
-            xp = xpoints + dxx;
-            xapp = xapoints + dxx;
-            yp++;  yapp++;
-         }
-     }
-   else
-     {
-#ifdef DIRECT_SCALE
-        if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) &&
-           (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) &&
-           (!dc->mul.use))
-         {
-            while (dst_clip_h--)
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
               {
                  Cy = *yapp >> 16;
                  yap = *yapp & 0xffff;
                  
-                 pbuf = dptr;
                  while (dst_clip_w--)
                    {
                       Cx = *xapp >> 16;
                       pix = sptr;
                       sptr += src_w;
                       
+                      ax = (A_VAL(pix) * xap) >> 9;
                       rx = (R_VAL(pix) * xap) >> 9;
                       gx = (G_VAL(pix) * xap) >> 9;
                       bx = (B_VAL(pix) * xap) >> 9;
                       pix++;
                       for (i = (1 << 14) - xap; i > Cx; i -= Cx)
                         {
+                           ax += (A_VAL(pix) * Cx) >> 9;
                            rx += (R_VAL(pix) * Cx) >> 9;
                            gx += (G_VAL(pix) * Cx) >> 9;
                            bx += (B_VAL(pix) * Cx) >> 9;
                         }
                       if (i > 0)
                         {
+                           ax += (A_VAL(pix) * i) >> 9;
                            rx += (R_VAL(pix) * i) >> 9;
                            gx += (G_VAL(pix) * i) >> 9;
                            bx += (B_VAL(pix) * i) >> 9;
                         }
                       
+                      a = (ax * yap) >> 14;
                       r = (rx * yap) >> 14;
                       g = (gx * yap) >> 14;
                       b = (bx * yap) >> 14;
                         {
                            pix = sptr;
                            sptr += src_w;
+                           ax = (A_VAL(pix) * xap) >> 9;
                            rx = (R_VAL(pix) * xap) >> 9;
                            gx = (G_VAL(pix) * xap) >> 9;
                            bx = (B_VAL(pix) * xap) >> 9;
                            pix++;
                            for (i = (1 << 14) - xap; i > Cx; i -= Cx)
                              {
+                                ax += (A_VAL(pix) * Cx) >> 9;
                                 rx += (R_VAL(pix) * Cx) >> 9;
                                 gx += (G_VAL(pix) * Cx) >> 9;
                                 bx += (B_VAL(pix) * Cx) >> 9;
                              }
                            if (i > 0)
                              {
+                                ax += (A_VAL(pix) * i) >> 9;
                                 rx += (R_VAL(pix) * i) >> 9;
                                 gx += (G_VAL(pix) * i) >> 9;
                                 bx += (B_VAL(pix) * i) >> 9;
                              }
                            
+                           a += (ax * Cy) >> 14;
                            r += (rx * Cy) >> 14;
                            g += (gx * Cy) >> 14;
                            b += (bx * Cy) >> 14;
                         {
                            pix = sptr;
                            sptr += src_w;
+                           ax = (A_VAL(pix) * xap) >> 9;
                            rx = (R_VAL(pix) * xap) >> 9;
                            gx = (G_VAL(pix) * xap) >> 9;
                            bx = (B_VAL(pix) * xap) >> 9;
                            pix++;
                            for (i = (1 << 14) - xap; i > Cx; i -= Cx)
                              {
+                                ax += (A_VAL(pix) * Cx) >> 9;
                                 rx += (R_VAL(pix) * Cx) >> 9;
                                 gx += (G_VAL(pix) * Cx) >> 9;
                                 bx += (B_VAL(pix) * Cx) >> 9;
                              }
                            if (i > 0)
                              {
+                                ax += (A_VAL(pix) * i) >> 9;
                                 rx += (R_VAL(pix) * i) >> 9;
                                 gx += (G_VAL(pix) * i) >> 9;
                                 bx += (B_VAL(pix) * i) >> 9;
                              }
                            
+                           a += (ax * j) >> 14;
                            r += (rx * j) >> 14;
                            g += (gx * j) >> 14;
                            b += (bx * j) >> 14;
                         }
-                      *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
+                      *pbuf++ = ARGB_JOIN(a >> 5, r >> 5, g >> 5, b >> 5);
                       xp++;  xapp++;
                    }
-                 dptr += dst_w;   dst_clip_w = w;
-                 xp = xpoints + dxx;
-                 xapp = xapoints + dxx;
-                 yp++;  yapp++;
+                 
+                 func(buf, NULL, dc->mul.col, dptr, w);
               }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pbuf = buf;
+            dptr += dst_w;   dst_clip_w = w;
+            xp = xpoints + dxx;
+            xapp = xapoints + dxx;
+            yp++;  yapp++;
          }
-       else
-#endif   
+     }
+   else
+     {
+#ifdef DIRECT_SCALE
+        if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) &&
+           (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) &&
+           (!dc->mul.use))
          {
             while (dst_clip_h--)
               {
-                 Cy = *yapp >> 16;
-                 yap = *yapp & 0xffff;
-                 
-                 while (dst_clip_w--)
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
                    {
-                      Cx = *xapp >> 16;
-                      xap = *xapp & 0xffff;
-                      
-                      sptr = *yp + *xp + pos;
-                      pix = sptr;
-                      sptr += src_w;
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
                       
-                      rx = (R_VAL(pix) * xap) >> 9;
-                      gx = (G_VAL(pix) * xap) >> 9;
-                      bx = (B_VAL(pix) * xap) >> 9;
-                      pix++;
-                      for (i = (1 << 14) - xap; i > Cx; i -= Cx)
-                        {
-                           rx += (R_VAL(pix) * Cx) >> 9;
-                           gx += (G_VAL(pix) * Cx) >> 9;
-                           bx += (B_VAL(pix) * Cx) >> 9;
-                           pix++;
-                        }
-                      if (i > 0)
-                        {
-                           rx += (R_VAL(pix) * i) >> 9;
-                           gx += (G_VAL(pix) * i) >> 9;
-                           bx += (B_VAL(pix) * i) >> 9;
-                        }
-                      
-                      r = (rx * yap) >> 14;
-                      g = (gx * yap) >> 14;
-                      b = (bx * yap) >> 14;
-                      
-                      for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                      pbuf = dptr;
+                      while (dst_clip_w--)
                         {
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           
+                           sptr = *yp + *xp + pos;
                            pix = sptr;
                            sptr += src_w;
+                           
                            rx = (R_VAL(pix) * xap) >> 9;
                            gx = (G_VAL(pix) * xap) >> 9;
                            bx = (B_VAL(pix) * xap) >> 9;
                                 bx += (B_VAL(pix) * i) >> 9;
                              }
                            
-                           r += (rx * Cy) >> 14;
-                           g += (gx * Cy) >> 14;
-                           b += (bx * Cy) >> 14;
+                           r = (rx * yap) >> 14;
+                           g = (gx * yap) >> 14;
+                           b = (bx * yap) >> 14;
+                           
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * Cy) >> 14;
+                                g += (gx * Cy) >> 14;
+                                b += (bx * Cy) >> 14;
+                             }
+                           if (j > 0)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * j) >> 14;
+                                g += (gx * j) >> 14;
+                                b += (bx * j) >> 14;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
+                           xp++;  xapp++;
                         }
-                      if (j > 0)
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
+                 dptr += dst_w;   dst_clip_w = w;
+                 xp = xpoints + dxx;
+                 xapp = xapoints + dxx;
+                 yp++;  yapp++;
+              }
+         }
+       else
+#endif   
+         {
+            while (dst_clip_h--)
+              {
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
+                      
+                      while (dst_clip_w--)
                         {
+                           Cx = *xapp >> 16;
+                           xap = *xapp & 0xffff;
+                           
+                           sptr = *yp + *xp + pos;
                            pix = sptr;
                            sptr += src_w;
+                           
                            rx = (R_VAL(pix) * xap) >> 9;
                            gx = (G_VAL(pix) * xap) >> 9;
                            bx = (B_VAL(pix) * xap) >> 9;
                                 bx += (B_VAL(pix) * i) >> 9;
                              }
                            
-                           r += (rx * j) >> 14;
-                           g += (gx * j) >> 14;
-                           b += (bx * j) >> 14;
+                           r = (rx * yap) >> 14;
+                           g = (gx * yap) >> 14;
+                           b = (bx * yap) >> 14;
+                           
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * Cy) >> 14;
+                                g += (gx * Cy) >> 14;
+                                b += (bx * Cy) >> 14;
+                             }
+                           if (j > 0)
+                             {
+                                pix = sptr;
+                                sptr += src_w;
+                                rx = (R_VAL(pix) * xap) >> 9;
+                                gx = (G_VAL(pix) * xap) >> 9;
+                                bx = (B_VAL(pix) * xap) >> 9;
+                                pix++;
+                                for (i = (1 << 14) - xap; i > Cx; i -= Cx)
+                                  {
+                                     rx += (R_VAL(pix) * Cx) >> 9;
+                                     gx += (G_VAL(pix) * Cx) >> 9;
+                                     bx += (B_VAL(pix) * Cx) >> 9;
+                                     pix++;
+                                  }
+                                if (i > 0)
+                                  {
+                                     rx += (R_VAL(pix) * i) >> 9;
+                                     gx += (G_VAL(pix) * i) >> 9;
+                                     bx += (B_VAL(pix) * i) >> 9;
+                                  }
+                                
+                                r += (rx * j) >> 14;
+                                g += (gx * j) >> 14;
+                                b += (bx * j) >> 14;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
+                           xp++;  xapp++;
                         }
-                      *pbuf++ = ARGB_JOIN(0xff, r >> 5, g >> 5, b >> 5);
-                      xp++;  xapp++;
+                      
+                      func(buf, NULL, dc->mul.col, dptr, w);
                    }
-
-                 func(buf, NULL, dc->mul.col, dptr, w);
-                 
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
                  pbuf = buf;
                  dptr += dst_w;   dst_clip_w = w;
                  xp = xpoints + dxx;
index 007df66..b16f902 100644 (file)
@@ -5,7 +5,10 @@
    int *xp, xap, yap, pos;
    int dyy, dxx;
    int w = dst_clip_w;
-
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
+   
    dptr = dst_ptr;
    pos = (src_region_y * src_w) + src_region_x;
    dyy = dst_clip_y - dst_region_y;
      {
        while (dst_clip_h--)
          {
-            Cy = *yapp >> 16;
-            yap = *yapp & 0xffff;
-
-            while (dst_clip_w--)
-              {
-                 pix = *yp + *xp + pos;
-
-                 a = (A_VAL(pix) * yap) >> 10;
-                 r = (R_VAL(pix) * yap) >> 10;
-                 g = (G_VAL(pix) * yap) >> 10;
-                 b = (B_VAL(pix) * yap) >> 10;
-                 for (j = (1 << 14) - yap; j > Cy; j -= Cy)
-                   {
-                      pix += src_w;
-                      a += (A_VAL(pix) * Cy) >> 10;
-                      r += (R_VAL(pix) * Cy) >> 10;
-                      g += (G_VAL(pix) * Cy) >> 10;
-                      b += (B_VAL(pix) * Cy) >> 10;
-                   }
-                 if (j > 0)
-                   {
-                      pix += src_w;
-                      a += (A_VAL(pix) * j) >> 10;
-                      r += (R_VAL(pix) * j) >> 10;
-                      g += (G_VAL(pix) * j) >> 10;
-                      b += (B_VAL(pix) * j) >> 10;
-                   }
-                 if ((xap = *xapp) > 0)
-                   {
-                      pix = *yp + *xp + 1 + pos;
-                      aa = (A_VAL(pix) * yap) >> 10;
-                      rr = (R_VAL(pix) * yap) >> 10;
-                      gg = (G_VAL(pix) * yap) >> 10;
-                      bb = (B_VAL(pix) * yap) >> 10;
-                      for (j = (1 << 14) - yap; j > Cy; j -= Cy)
-                        {
-                           pix += src_w;
-                           aa += (A_VAL(pix) * Cy) >> 10;
-                           rr += (R_VAL(pix) * Cy) >> 10;
-                           gg += (G_VAL(pix) * Cy) >> 10;
-                           bb += (B_VAL(pix) * Cy) >> 10;
-                        }
-                      if (j > 0)
-                        {
-                           pix += src_w;
-                           aa += (A_VAL(pix) * j) >> 10;
-                           rr += (R_VAL(pix) * j) >> 10;
-                           gg += (G_VAL(pix) * j) >> 10;
-                           bb += (B_VAL(pix) * j) >> 10;
-                        }
-                      a += ((aa - a) * xap) >> 8;
-                      r += ((rr - r) * xap) >> 8;
-                      g += ((gg - g) * xap) >> 8;
-                      b += ((bb - b) * xap) >> 8;
-                   }
-                 *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4);
-                 xp++;  xapp++;
-              }
-
-            func(buf, NULL, dc->mul.col, dptr, w);
-
-            pbuf = buf;
-            dptr += dst_w;  dst_clip_w = w;
-            yp++;  yapp++;
-            xp = xpoints + dxx;
-            xapp = xapoints + dxx;
-         }
-     }
-   else
-     {
-#ifdef DIRECT_SCALE
-        if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) &&
-           (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) &&
-           (!dc->mul.use))
-         {
-            while (dst_clip_h--)
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
               {
                  Cy = *yapp >> 16;
                  yap = *yapp & 0xffff;
                  
-                  pbuf = dptr;
                  while (dst_clip_w--)
                    {
                       pix = *yp + *xp + pos;
                       
+                      a = (A_VAL(pix) * yap) >> 10;
                       r = (R_VAL(pix) * yap) >> 10;
                       g = (G_VAL(pix) * yap) >> 10;
                       b = (B_VAL(pix) * yap) >> 10;
                       for (j = (1 << 14) - yap; j > Cy; j -= Cy)
                         {
                            pix += src_w;
+                           a += (A_VAL(pix) * Cy) >> 10;
                            r += (R_VAL(pix) * Cy) >> 10;
                            g += (G_VAL(pix) * Cy) >> 10;
                            b += (B_VAL(pix) * Cy) >> 10;
                       if (j > 0)
                         {
                            pix += src_w;
+                           a += (A_VAL(pix) * j) >> 10;
                            r += (R_VAL(pix) * j) >> 10;
                            g += (G_VAL(pix) * j) >> 10;
                            b += (B_VAL(pix) * j) >> 10;
                       if ((xap = *xapp) > 0)
                         {
                            pix = *yp + *xp + 1 + pos;
+                           aa = (A_VAL(pix) * yap) >> 10;
                            rr = (R_VAL(pix) * yap) >> 10;
                            gg = (G_VAL(pix) * yap) >> 10;
                            bb = (B_VAL(pix) * yap) >> 10;
                            for (j = (1 << 14) - yap; j > Cy; j -= Cy)
                              {
                                 pix += src_w;
+                                aa += (A_VAL(pix) * Cy) >> 10;
                                 rr += (R_VAL(pix) * Cy) >> 10;
                                 gg += (G_VAL(pix) * Cy) >> 10;
                                 bb += (B_VAL(pix) * Cy) >> 10;
                            if (j > 0)
                              {
                                 pix += src_w;
+                                aa += (A_VAL(pix) * j) >> 10;
                                 rr += (R_VAL(pix) * j) >> 10;
                                 gg += (G_VAL(pix) * j) >> 10;
                                 bb += (B_VAL(pix) * j) >> 10;
                              }
+                           a += ((aa - a) * xap) >> 8;
                            r += ((rr - r) * xap) >> 8;
                            g += ((gg - g) * xap) >> 8;
                            b += ((bb - b) * xap) >> 8;
                         }
-                      *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                      *pbuf++ = ARGB_JOIN(a >> 4, r >> 4, g >> 4, b >> 4);
                       xp++;  xapp++;
                    }
+                 
+                 func(buf, NULL, dc->mul.col, dptr, w);
+               }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pbuf = buf;
+            dptr += dst_w;  dst_clip_w = w;
+            yp++;  yapp++;
+            xp = xpoints + dxx;
+            xapp = xapoints + dxx;
+         }
+     }
+   else
+     {
+#ifdef DIRECT_SCALE
+        if ((!(src->flags & RGBA_IMAGE_HAS_ALPHA)) &&
+           (!(dst->flags & RGBA_IMAGE_HAS_ALPHA)) &&
+           (!dc->mul.use))
+         {
+            while (dst_clip_h--)
+              {
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+                   {
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
+                      
+                      pbuf = dptr;
+                      while (dst_clip_w--)
+                        {
+                           pix = *yp + *xp + pos;
+                           
+                           r = (R_VAL(pix) * yap) >> 10;
+                           g = (G_VAL(pix) * yap) >> 10;
+                           b = (B_VAL(pix) * yap) >> 10;
+                           for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                             {
+                                pix += src_w;
+                                r += (R_VAL(pix) * Cy) >> 10;
+                                g += (G_VAL(pix) * Cy) >> 10;
+                                b += (B_VAL(pix) * Cy) >> 10;
+                             }
+                           if (j > 0)
+                             {
+                                pix += src_w;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
+                             }
+                           if ((xap = *xapp) > 0)
+                             {
+                                pix = *yp + *xp + 1 + pos;
+                                rr = (R_VAL(pix) * yap) >> 10;
+                                gg = (G_VAL(pix) * yap) >> 10;
+                                bb = (B_VAL(pix) * yap) >> 10;
+                                for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * Cy) >> 10;
+                                     gg += (G_VAL(pix) * Cy) >> 10;
+                                     bb += (B_VAL(pix) * Cy) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * xap) >> 8;
+                                g += ((gg - g) * xap) >> 8;
+                                b += ((bb - b) * xap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
+                        }
+                   }
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
                  dptr += dst_w;  dst_clip_w = w;
                  yp++;  yapp++;
                  xp = xpoints + dxx;
          {
             while (dst_clip_h--)
               {
-                 Cy = *yapp >> 16;
-                 yap = *yapp & 0xffff;
-                 
-                 while (dst_clip_w--)
+#ifdef EVAS_SLI
+                 if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
                    {
-                      pix = *yp + *xp + pos;
+                      Cy = *yapp >> 16;
+                      yap = *yapp & 0xffff;
                       
-                      r = (R_VAL(pix) * yap) >> 10;
-                      g = (G_VAL(pix) * yap) >> 10;
-                      b = (B_VAL(pix) * yap) >> 10;
-                      for (j = (1 << 14) - yap; j > Cy; j -= Cy)
-                        {
-                           pix += src_w;
-                           r += (R_VAL(pix) * Cy) >> 10;
-                           g += (G_VAL(pix) * Cy) >> 10;
-                           b += (B_VAL(pix) * Cy) >> 10;
-                        }
-                      if (j > 0)
-                        {
-                           pix += src_w;
-                           r += (R_VAL(pix) * j) >> 10;
-                           g += (G_VAL(pix) * j) >> 10;
-                           b += (B_VAL(pix) * j) >> 10;
-                        }
-                      if ((xap = *xapp) > 0)
+                      while (dst_clip_w--)
                         {
-                           pix = *yp + *xp + 1 + pos;
-                           rr = (R_VAL(pix) * yap) >> 10;
-                           gg = (G_VAL(pix) * yap) >> 10;
-                           bb = (B_VAL(pix) * yap) >> 10;
+                           pix = *yp + *xp + pos;
+                           
+                           r = (R_VAL(pix) * yap) >> 10;
+                           g = (G_VAL(pix) * yap) >> 10;
+                           b = (B_VAL(pix) * yap) >> 10;
                            for (j = (1 << 14) - yap; j > Cy; j -= Cy)
                              {
                                 pix += src_w;
-                                rr += (R_VAL(pix) * Cy) >> 10;
-                                gg += (G_VAL(pix) * Cy) >> 10;
-                                bb += (B_VAL(pix) * Cy) >> 10;
+                                r += (R_VAL(pix) * Cy) >> 10;
+                                g += (G_VAL(pix) * Cy) >> 10;
+                                b += (B_VAL(pix) * Cy) >> 10;
                              }
                            if (j > 0)
                              {
                                 pix += src_w;
-                                rr += (R_VAL(pix) * j) >> 10;
-                                gg += (G_VAL(pix) * j) >> 10;
-                                bb += (B_VAL(pix) * j) >> 10;
+                                r += (R_VAL(pix) * j) >> 10;
+                                g += (G_VAL(pix) * j) >> 10;
+                                b += (B_VAL(pix) * j) >> 10;
                              }
-                           r += ((rr - r) * xap) >> 8;
-                           g += ((gg - g) * xap) >> 8;
-                           b += ((bb - b) * xap) >> 8;
+                           if ((xap = *xapp) > 0)
+                             {
+                                pix = *yp + *xp + 1 + pos;
+                                rr = (R_VAL(pix) * yap) >> 10;
+                                gg = (G_VAL(pix) * yap) >> 10;
+                                bb = (B_VAL(pix) * yap) >> 10;
+                                for (j = (1 << 14) - yap; j > Cy; j -= Cy)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * Cy) >> 10;
+                                     gg += (G_VAL(pix) * Cy) >> 10;
+                                     bb += (B_VAL(pix) * Cy) >> 10;
+                                  }
+                                if (j > 0)
+                                  {
+                                     pix += src_w;
+                                     rr += (R_VAL(pix) * j) >> 10;
+                                     gg += (G_VAL(pix) * j) >> 10;
+                                     bb += (B_VAL(pix) * j) >> 10;
+                                  }
+                                r += ((rr - r) * xap) >> 8;
+                                g += ((gg - g) * xap) >> 8;
+                                b += ((bb - b) * xap) >> 8;
+                             }
+                           *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
+                           xp++;  xapp++;
                         }
-                      *pbuf++ = ARGB_JOIN(0xff, r >> 4, g >> 4, b >> 4);
-                      xp++;  xapp++;
+                      
+                      func(buf, NULL, dc->mul.col, dptr, w);
                    }
-                 
-                 func(buf, NULL, dc->mul.col, dptr, w);
-                 
+#ifdef EVAS_SLI
+                 ysli++;
+#endif
                  pbuf = buf;
                  dptr += dst_w;  dst_clip_w = w;
                  yp++;  yapp++;
index 5ef020d..01ca8f9 100644 (file)
@@ -1,7 +1,10 @@
 {
    DATA32 *ptr;
    RGBA_Gfx_Func func;
-
+#ifdef EVAS_SLI
+   int ysli = dst_clip_y;
+#endif
+   
    ptr = src->image->data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x;
    if (dc->mul.use)
        func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, dst_clip_w, dc->render_op);
@@ -9,7 +12,15 @@
        func = evas_common_gfx_func_composite_pixel_span_get(src, dst, dst_clip_w, dc->render_op);
    while (dst_clip_h--)
      {
-       func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w);
+#ifdef EVAS_SLI
+       if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+         {
+            func(ptr, NULL, dc->mul.col, dst_ptr, dst_clip_w);
+         }
+#ifdef EVAS_SLI
+       ysli++;
+#endif 
        ptr += src_w;
        dst_ptr += dst_w;
      }
index 8688af6..ac40ceb 100644 (file)
    if (drh == srh)
      {
        int  sxx0 = sxx;
-
+#ifdef EVAS_SLI
+       int ysli = dst_clip_y;
+#endif
        psrc = src->image->data + (src_w * (sry + cy)) + srx;
        while (pdst < pdst_end)
          {
-           pbuf = buf;  pbuf_end = buf + dst_clip_w;
-           sxx = sxx0;
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 pbuf = buf;  pbuf_end = buf + dst_clip_w;
+                 sxx = sxx0;
 #ifdef SCALE_USING_MMX
-           pxor_r2r(mm0, mm0);
-           MOV_A2R(ALPHA_255, mm5)
+                 pxor_r2r(mm0, mm0);
+                 MOV_A2R(ALPHA_255, mm5)
 #endif
-           while (pbuf < pbuf_end)
-             {
-               DATA32   p0, p1;
-               int      ax;
-
-               sx = (sxx >> 16);
-               ax = 1 + ((sxx - (sx << 16)) >> 8);
-               p0 = p1 = *(psrc + sx);
-               if ((sx + 1) < srw)
-                   p1 = *(psrc + sx + 1);
+                   while (pbuf < pbuf_end)
+                     {
+                        DATA32   p0, p1;
+                        int      ax;
+                        
+                        sx = (sxx >> 16);
+                        ax = 1 + ((sxx - (sx << 16)) >> 8);
+                        p0 = p1 = *(psrc + sx);
+                        if ((sx + 1) < srw)
+                          p1 = *(psrc + sx + 1);
 #ifdef SCALE_USING_MMX
-               MOV_P2R(p0, mm1, mm0)
-               if (p0 | p1)
-                 {
-                   MOV_A2R(ax, mm3)
-                   MOV_P2R(p1, mm2, mm0)
-                   INTERP_256_R2R(mm3, mm2, mm1, mm5)
-                 }
-               MOV_R2P(mm1, *pbuf, mm0)
-               pbuf++;
+                        MOV_P2R(p0, mm1, mm0)
+                          if (p0 | p1)
+                            {
+                               MOV_A2R(ax, mm3)
+                                 MOV_P2R(p1, mm2, mm0)
+                                   INTERP_256_R2R(mm3, mm2, mm1, mm5)
+                            }
+                        MOV_R2P(mm1, *pbuf, mm0)
+                          pbuf++;
 #else
-               if (p0 | p1)
-                   p0 = INTERP_256(ax, p1, p0);
-               *pbuf++ = p0;
+                        if (p0 | p1)
+                          p0 = INTERP_256(ax, p1, p0);
+                        *pbuf++ = p0;
 #endif
-               sxx += dsxx;
-             }
-               /* * blend here [clip_w *] buf -> dptr * */
-           if (!direct_scale)
-               func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
-           pdst += dst_w;
-           psrc += src_w;
-           buf += buf_step;
+                        sxx += dsxx;
+                     }
+                 /* * blend here [clip_w *] buf -> dptr * */
+                 if (!direct_scale)
+                   func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif      
+            pdst += dst_w;
+            psrc += src_w;
+            buf += buf_step;
          }
 
        goto done_scale_up;
    else if (drw == srw)
      {
        DATA32  *ps = src->image->data + (src_w * sry) + srx + cx;
+#ifdef EVAS_SLI
+       int ysli = dst_clip_y;
+#endif
 
        while (pdst < pdst_end)
          {
-           int        ay;
-
-           sy = syy >> 16;
-           psrc = ps + (sy * src_w);
-           ay = 1 + ((syy - (sy << 16)) >> 8);
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 int        ay;
+                 
+                 sy = syy >> 16;
+                 psrc = ps + (sy * src_w);
+                 ay = 1 + ((syy - (sy << 16)) >> 8);
 #ifdef SCALE_USING_MMX
-           pxor_r2r(mm0, mm0);
-           MOV_A2R(ALPHA_255, mm5)
-           MOV_A2R(ay, mm4)
+                 pxor_r2r(mm0, mm0);
+                 MOV_A2R(ALPHA_255, mm5)
+                   MOV_A2R(ay, mm4)
 #endif
-           pbuf = buf;  pbuf_end = buf + dst_clip_w;
-           while (pbuf < pbuf_end)
-             {
-               DATA32  p0 = *psrc, p2 = p0;
-
-               if ((sy + 1) < srh)
-                  p2 = *(psrc + src_w);
+                     pbuf = buf;  pbuf_end = buf + dst_clip_w;
+                 while (pbuf < pbuf_end)
+                   {
+                      DATA32  p0 = *psrc, p2 = p0;
+                      
+                      if ((sy + 1) < srh)
+                        p2 = *(psrc + src_w);
 #ifdef SCALE_USING_MMX
-               MOV_P2R(p0, mm1, mm0)
-               if (p0 | p2)
-                 {
-                   MOV_P2R(p2, mm2, mm0)
-                   INTERP_256_R2R(mm4, mm2, mm1, mm5)
-                 }
-               MOV_R2P(mm1, *pbuf, mm0)
-               pbuf++;
+                      MOV_P2R(p0, mm1, mm0)
+                        if (p0 | p2)
+                          {
+                             MOV_P2R(p2, mm2, mm0)
+                               INTERP_256_R2R(mm4, mm2, mm1, mm5)
+                          }
+                      MOV_R2P(mm1, *pbuf, mm0)
+                        pbuf++;
 #else
-               if (p0 | p2)
-                  p0 = INTERP_256(ay, p2, p0);
-               *pbuf++ = p0;
+                      if (p0 | p2)
+                        p0 = INTERP_256(ay, p2, p0);
+                      *pbuf++ = p0;
 #endif
-               psrc++;
-             }
-               /* * blend here [clip_w *] buf -> dptr * */
-           if (!direct_scale)
-              func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
+                      psrc++;
+                   }
+                 /* * blend here [clip_w *] buf -> dptr * */
+                 if (!direct_scale)
+                   func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif      
            pdst += dst_w;
            syy += dsyy;
            buf += buf_step;
      {
        DATA32  *ps = src->image->data + (src_w * sry) + srx;
        int     sxx0 = sxx;
+#ifdef EVAS_SLI
+       int ysli = dst_clip_y;
+#endif
 
        while (pdst < pdst_end)
          {
-           int   ay;
-
-           sy = syy >> 16;
-           psrc = ps + (sy * src_w);
-           ay = 1 + ((syy - (sy << 16)) >> 8);
+#ifdef EVAS_SLI
+            if (((ysli) % dc->sli.h) == dc->sli.y)
+#endif
+              {
+                 int   ay;
+                 
+                 sy = syy >> 16;
+                 psrc = ps + (sy * src_w);
+                 ay = 1 + ((syy - (sy << 16)) >> 8);
 #ifdef SCALE_USING_MMX
-           MOV_A2R(ay, mm4)
-           pxor_r2r(mm0, mm0);
-           MOV_A2R(ALPHA_255, mm5)
+                 MOV_A2R(ay, mm4)
+                   pxor_r2r(mm0, mm0);
+                 MOV_A2R(ALPHA_255, mm5)
 #endif
-           pbuf = buf;  pbuf_end = buf + dst_clip_w;
-           sxx = sxx0;
-           while (pbuf < pbuf_end)
-             {
-               int     ax;
-               DATA32  *p, *q;
-               DATA32  p0, p1, p2, p3;
-
-               sx = sxx >> 16;
-               ax = 1 + ((sxx - (sx << 16)) >> 8);
-               p = psrc + sx;  q = p + src_w;
-               p0 = p1 = p2 = p3 = *p;
-               if ((sx + 1) < srw)
-                  p1 = *(p + 1);
-               if ((sy + 1) < srh)
-                 {
-                   p2 = *q;  p3 = p2;
-                   if ((sx + 1) < srw)
-                      p3 = *(q + 1);
-                 }
+                   pbuf = buf;  pbuf_end = buf + dst_clip_w;
+                 sxx = sxx0;
+                 while (pbuf < pbuf_end)
+                   {
+                      int     ax;
+                      DATA32  *p, *q;
+                      DATA32  p0, p1, p2, p3;
+                      
+                      sx = sxx >> 16;
+                      ax = 1 + ((sxx - (sx << 16)) >> 8);
+                      p = psrc + sx;  q = p + src_w;
+                      p0 = p1 = p2 = p3 = *p;
+                      if ((sx + 1) < srw)
+                        p1 = *(p + 1);
+                      if ((sy + 1) < srh)
+                        {
+                           p2 = *q;  p3 = p2;
+                           if ((sx + 1) < srw)
+                             p3 = *(q + 1);
+                        }
 #ifdef SCALE_USING_MMX
-               MOV_A2R(ax, mm6)
-               MOV_P2R(p0, mm1, mm0)
-               if (p0 | p1)
-                 {
-                   MOV_P2R(p1, mm2, mm0)
-                   INTERP_256_R2R(mm6, mm2, mm1, mm5)
-                 }
-               MOV_P2R(p2, mm2, mm0)
-               if (p2 | p3)
-                 {
-                   MOV_P2R(p3, mm3, mm0)
-                   INTERP_256_R2R(mm6, mm3, mm2, mm5)
-                 }
-               INTERP_256_R2R(mm4, mm2, mm1, mm5)
-               MOV_R2P(mm1, *pbuf, mm0)
-               pbuf++;
+                      MOV_A2R(ax, mm6)
+                        MOV_P2R(p0, mm1, mm0)
+                          if (p0 | p1)
+                            {
+                               MOV_P2R(p1, mm2, mm0)
+                                 INTERP_256_R2R(mm6, mm2, mm1, mm5)
+                            }
+                      MOV_P2R(p2, mm2, mm0)
+                        if (p2 | p3)
+                          {
+                             MOV_P2R(p3, mm3, mm0)
+                               INTERP_256_R2R(mm6, mm3, mm2, mm5)
+                          }
+                      INTERP_256_R2R(mm4, mm2, mm1, mm5)
+                        MOV_R2P(mm1, *pbuf, mm0)
+                          pbuf++;
 #else
-               if (p0 | p1)
-                  p0 = INTERP_256(ax, p1, p0);
-               if (p2 | p3)
-                  p2 = INTERP_256(ax, p3, p2);
-               if (p0 | p2)
-                  p0 = INTERP_256(ay, p2, p0);
-               *pbuf++ = p0;
+                      if (p0 | p1)
+                        p0 = INTERP_256(ax, p1, p0);
+                      if (p2 | p3)
+                        p2 = INTERP_256(ax, p3, p2);
+                      if (p0 | p2)
+                        p0 = INTERP_256(ay, p2, p0);
+                      *pbuf++ = p0;
 #endif
-               sxx += dsxx;
-             }
-            /* * blend here [clip_w *] buf -> dptr * */
-           if (!direct_scale)
-              func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
-           pdst += dst_w;
-           syy += dsyy;
-           buf += buf_step;
+                      sxx += dsxx;
+                   }
+                 /* * blend here [clip_w *] buf -> dptr * */
+                 if (!direct_scale)
+                   func(buf, NULL, dc->mul.col, pdst, dst_clip_w);
+              }
+#ifdef EVAS_SLI
+            ysli++;
+#endif
+            pdst += dst_w;
+            syy += dsyy;
+            buf += buf_step;
          }
      }
    done_scale_up:
index bea7276..89a1627 100644 (file)
 # define LKU(x) pthread_mutex_unlock(&(x));
 # define TH(x)  pthread_t x
 # define THI(x) int x
-# define TH_MAX 4
+# define TH_MAX 8
+
+// even though in theory having every Nth rendered line done by a different
+// thread might even out load across threads - it actually slows things down.
+//#define EVAS_SLI 1
+
 #else
 # define LK(x)  
 # define LKI(x) 
@@ -255,8 +260,11 @@ struct _RGBA_Draw_Context
    struct {
       int color_space;
    } interpolation;
-   unsigned char  anti_alias : 1;
+   struct {
+      int y, h;
+   } sli;
    int            render_op;
+   unsigned char  anti_alias : 1;
 };
 
 struct _RGBA_Surface
@@ -978,9 +986,10 @@ EAPI Cutout_Rect       *evas_common_draw_context_cutouts_split     (Cutout_Rect
 EAPI Cutout_Rect       *evas_common_draw_context_cutout_split      (Cutout_Rect *in, Cutout_Rect *split);
 EAPI Cutout_Rect       *evas_common_draw_context_cutout_merge      (Cutout_Rect *in, Cutout_Rect *merge);
 EAPI void               evas_common_draw_context_set_anti_alias    (RGBA_Draw_Context *dc, unsigned char aa);
-EAPI void               evas_common_draw_context_set_color_interpolation    (RGBA_Draw_Context *dc, int color_space);
+EAPI void               evas_common_draw_context_set_color_interpolation(RGBA_Draw_Context *dc, int color_space);
 EAPI void               evas_common_draw_context_set_render_op     (RGBA_Draw_Context *dc, int op);
-
+EAPI void               evas_common_draw_context_set_sli           (RGBA_Draw_Context *dc, int y, int h);
+       
 /****/
 /* image rendering pipelines... new optional system - non-immediate and
  * threadable