freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] gsoc-anurag-2023 f5bc9da6e 1/2: Optimize SIMD, add new line


From: Werner Lemberg
Subject: [freetype2] gsoc-anurag-2023 f5bc9da6e 1/2: Optimize SIMD, add new line drawing function
Date: Fri, 6 Oct 2023 19:36:04 -0400 (EDT)

branch: gsoc-anurag-2023
commit f5bc9da6e8bed8e23c0248d7b9bcced9c0f7c453
Author: Anurag Thakur <anurag105csec21@bpitindia.edu.in>
Commit: Anurag Thakur <anurag105csec21@bpitindia.edu.in>

    Optimize SIMD, add new line drawing function
---
 src/base/ftobjs.c   |  2 +-
 src/dense/ftdense.c | 53 ++++++++++++++++++++++++++++++-----------------------
 src/dense/ftdense.h |  2 +-
 3 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 1c8e6e13f..82113e30e 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -3154,7 +3154,7 @@ int conic_to2(FT_GlyphSlot* slot, FT_Vector *control, 
FT_Vector *from, FT_Vector
       face->garray = (FT_GlyphSlot*)malloc(
           face->driver->clazz->slot_object_size * face->num_glyphs );
       //error           = FT_Set_Char_Size( face, 0, 160 * 64, 300, 300 );
-      error           = FT_Set_Pixel_Sizes( face, 0, 100);
+      error           = FT_Set_Pixel_Sizes( face, 0, 500);
       // int glyph_index = FT_Get_Char_Index( face, 'A' );
       // error           = FT_Load_Glyph( face, glyph_index, 
FT_LOAD_NO_HINTING );
 
diff --git a/src/dense/ftdense.c b/src/dense/ftdense.c
index 54d27837c..e36dc080e 100644
--- a/src/dense/ftdense.c
+++ b/src/dense/ftdense.c
@@ -80,25 +80,35 @@ dense_move_to( const FT_Vector* to, dense_worker* worker )
 static int
 dense_line_to( const FT_Vector* to, dense_worker* worker )
 {
-  dense_render_line( worker, UPSCALE( to->x ), UPSCALE( to->y ) );
+  dense_render_line( worker, worker->prev_x, worker->prev_y, UPSCALE( to->x ), 
UPSCALE( to->y ) );
   dense_move_to( to, worker );
   return 0;
 }
 
 void
-dense_render_line( dense_worker* worker, FT_Pos tox, FT_Pos toy )
+dense_render_line( dense_worker* worker, FT_Pos fromx, FT_Pos fromy, FT_Pos 
tox, FT_Pos toy )
+{
+  return;
+}
+
+
+void
+dense_render_line2( dense_worker* worker, FT_PreLine pl )
 {
   //printf("Line from %d, %d to %d, %d\n", worker->prev_x, worker->prev_y, 
tox, toy);
 
-  FT26D6 fx = worker->prev_x>>2;
-  FT26D6 fy = worker->prev_y>>2;
+  // FT26D6 fx = worker->prev_x>>2;
+  // FT26D6 fy = worker->prev_y>>2;
+
+  FT26D6 fx = UPSCALE(pl->x1)>>2;
+  FT26D6 fy = UPSCALE(pl->y1)>>2;
 
   FT26D6 from_x = fx;
   FT26D6 from_y = fy;
 
 
-  FT26D6 tx = tox>>2;
-  FT26D6 ty = toy>>2;
+  FT26D6 tx = UPSCALE(pl->x2)>>2;
+  FT26D6 ty = UPSCALE(pl->y2)>>2;
 
   if ( fy == ty )
     return;
@@ -342,7 +352,7 @@ dense_render_cubic( dense_worker* worker,
 
   if ( devsq < 0.333f )
   {
-    dense_render_line( worker, aP3.x, aP3.y );
+    dense_render_line( worker, worker->prev_x, worker->prev_y, aP3.x, aP3.y );
     return;
   }
 
@@ -357,7 +367,7 @@ dense_render_cubic( dense_worker* worker,
     FT_Vector a    = Lerp( t, Lerp( t, aP0, aP1 ), Lerp( t, aP1, aP2 ) );
     FT_Vector b    = Lerp( t, Lerp( t, aP1, aP2 ), Lerp( t, aP2, aP3 ) );
     FT_Vector next = Lerp( t, a, b );
-    dense_render_line( worker, next.x, next.y );
+    dense_render_line( worker, worker->prev_x, worker->prev_y, next.x, next.y 
);
     worker->prev_x = next.x;
     worker->prev_y = next.y;
     p              = next;
@@ -423,22 +433,17 @@ dense_render_glyph( dense_worker* worker, const 
FT_Bitmap* target, FT_PreLine pl
 {
  // FT_Error error = FT_Outline_Decompose( &( worker->outline ),
  //                                        &dense_decompose_funcs, worker );
-  FT_Vector point1 = {pl->x1, pl->y1};
-  FT_Vector point2 = {100, 100};
+  // FT_Vector point1 = {pl->x1, pl->y1};
 
-  FT_Error error = dense_move_to(&point1, worker);
+  FT_Error error = 0;
   while (pl!=NULL)
   {
-    point1.x = pl->x1;
-    point1.y = pl->y1;
-    point2.x = pl->x2;
-    point2.y = pl->y2;
+    dense_render_line2(worker, pl);
 
-    if(pl->ismove){
-      dense_move_to(&point2, worker);
-    }else{
-    dense_line_to(&point2, worker);
-    }
+
+    // worker->prev_x = UPSCALE(pl->x2);
+    // worker->prev_y = UPSCALE(pl->y2);
+    //dense_line_to(&point2, worker);
     pl= pl->next;
   }
   // point.x = 100;
@@ -493,7 +498,8 @@ __m128i offset = _mm_setzero_si128();
 
     // cap max value to 1
     //y = _mm_min_epi32( _mm_srli_epi32( y, 4 ), _mm_set1_epi32( 255 ) );
-    __m128i y = _mm_abs_epi32(_mm_srai_epi32(  x , 4 ));
+    //__m128i y = _mm_abs_epi32(_mm_srai_epi32(  x , 4 ));
+    __m128i y = _mm_srli_epi32( _mm_abs_epi32( x) , 4 );
 
     // reduce to 255
     // y = 
@@ -505,7 +511,8 @@ __m128i offset = _mm_setzero_si128();
     //__m128i z = _mm_packus_epi16(_mm_packs_epi32(z, nzero), nzero);
 
     // int* ptr = (int*)&dest[i];
-    *(int*)&dest[i] =  *(int*)&y;
+    _mm_storeu_si32(&dest[i], y);
+    //*(int*)&dest[i] =  *(int*)&y;
     //*(int*)&dest[i] =  _mm_extract_epi32(y, 0);
 
     //_mm_store_ss( (float*)&dest[i], _mm_castsi128_ps(y) );
@@ -527,7 +534,7 @@ __m128i offset = _mm_setzero_si128();
     value += *source++;
 
     if(value > 0){
-      int n = value >>4;
+      int n = value >>4;_Pos fromx, FT_Pos fromy, FT_Pos tox, FT_Pos toy
 
       if(n>255)n=255;
       *dest = (unsigned char)n;
diff --git a/src/dense/ftdense.h b/src/dense/ftdense.h
index e3f8f1997..1f75bc553 100644
--- a/src/dense/ftdense.h
+++ b/src/dense/ftdense.h
@@ -43,7 +43,7 @@ extern "C"
     FT_Outline outline;
   } dense_worker;
 
-  void dense_render_line( dense_worker* worker, FT_Pos to_x, FT_Pos to_y );
+  void dense_render_line( dense_worker* worker, FT_Pos from_x, FT_Pos from_y, 
FT_Pos to_x, FT_Pos to_y );
   void dense_render_quadratic( dense_worker* worker,
                                FT_Vector* control,
                                FT_Vector* to );



reply via email to

[Prev in Thread] Current Thread [Next in Thread]