Merge "Notify multiline hint to IMF context" into devel/master
authorsuhyung Eom <suhyung.eom@samsung.com>
Fri, 12 Aug 2016 08:50:13 +0000 (01:50 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Fri, 12 Aug 2016 08:50:13 +0000 (01:50 -0700)
71 files changed:
automated-tests/patch-coverage.pl
automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-model.cpp
automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp
automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-text-abstraction.cpp
automated-tests/src/dali-toolkit/utc-Dali-AccessibilityManager.cpp
automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp
automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp
automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp
automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp
automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp
build/tizen/docs/dali.doxy.in
dali-toolkit/internal/accessibility-manager/accessibility-manager-impl.cpp
dali-toolkit/internal/accessibility-manager/accessibility-manager-impl.h
dali-toolkit/internal/controls/effects-view/effects-view-impl.cpp
dali-toolkit/internal/controls/slider/slider-impl.cpp
dali-toolkit/internal/filters/emboss-filter.cpp
dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp
dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h
dali-toolkit/internal/text/input-style.h
dali-toolkit/internal/text/multi-language-helper-functions.cpp
dali-toolkit/internal/text/multi-language-helper-functions.h
dali-toolkit/internal/text/multi-language-support-impl.cpp
dali-toolkit/internal/text/multi-language-support-impl.h
dali-toolkit/internal/text/multi-language-support.cpp
dali-toolkit/internal/text/multi-language-support.h
dali-toolkit/internal/text/text-controller-impl.cpp
dali-toolkit/internal/text/text-controller-impl.h
dali-toolkit/internal/text/text-controller.cpp
dali-toolkit/internal/text/text-controller.h
dali-toolkit/internal/text/text-font-style.cpp
dali-toolkit/internal/visuals/image/batch-image-visual.cpp
dali-toolkit/internal/visuals/image/batch-image-visual.h
dali-toolkit/internal/visuals/image/image-visual.cpp
dali-toolkit/internal/visuals/image/image-visual.h
dali-toolkit/internal/visuals/npatch/npatch-visual.cpp
dali-toolkit/internal/visuals/svg/svg-visual.cpp
dali-toolkit/internal/visuals/svg/svg-visual.h
dali-toolkit/internal/visuals/visual-base-data-impl.h
dali-toolkit/internal/visuals/visual-factory-cache.cpp
dali-toolkit/internal/visuals/visual-factory-cache.h
dali-toolkit/internal/visuals/visual-factory-impl.cpp
dali-toolkit/internal/visuals/visual-factory-impl.h
dali-toolkit/public-api/controls/alignment/alignment.h
dali-toolkit/public-api/controls/buttons/button.h
dali-toolkit/public-api/controls/buttons/check-box-button.h
dali-toolkit/public-api/controls/buttons/push-button.h
dali-toolkit/public-api/controls/buttons/radio-button.h
dali-toolkit/public-api/controls/control-impl.cpp
dali-toolkit/public-api/controls/control-impl.h
dali-toolkit/public-api/controls/flex-container/flex-container.h
dali-toolkit/public-api/controls/gaussian-blur-view/gaussian-blur-view.h
dali-toolkit/public-api/controls/image-view/image-view.h
dali-toolkit/public-api/controls/model3d-view/model3d-view.h
dali-toolkit/public-api/controls/page-turn-view/page-turn-landscape-view.h
dali-toolkit/public-api/controls/page-turn-view/page-turn-portrait-view.h
dali-toolkit/public-api/controls/page-turn-view/page-turn-view.h
dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h
dali-toolkit/public-api/controls/scrollable/item-view/item-view.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-effect.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-page-path-effect.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h
dali-toolkit/public-api/controls/scrollable/scrollable.h
dali-toolkit/public-api/controls/slider/slider.h
dali-toolkit/public-api/controls/table-view/table-view.h
dali-toolkit/public-api/controls/text-controls/text-editor.h
dali-toolkit/public-api/controls/text-controls/text-label.h
dali-toolkit/public-api/controls/video-view/video-view.h
dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h
dali-toolkit/public-api/styling/style-manager.h
dali-toolkit/public-api/visuals/image-visual-properties.h

index 68754eb..c19953b 100755 (executable)
@@ -45,16 +45,14 @@ our $repo = Git->repository();
 our $debug=0;
 our $pd_debug=0;
 our $opt_cached;
-our $opt_head;
-#our $opt_workingtree;
-#our $opt_diff=1;
 our $opt_help;
-our $opt_verbose;
+our $opt_output;
 our $opt_quiet;
+our $opt_verbose;
 
 my %options = (
     "cached"       => { "optvar"=>\$opt_cached, "desc"=>"Use index" },
-    "head"         => { "optvar"=>\$opt_head, "desc"=>"Use git show" },
+    "output:s"     => { "optvar"=>\$opt_output, "desc"=>"Generate html output"},
     "help"         => { "optvar"=>\$opt_help, "desc"=>""},
     "quiet"        => { "optvar"=>\$opt_quiet, "desc"=>""},
     "verbose"      => { "optvar"=>\$opt_verbose, "desc"=>"" });
@@ -323,6 +321,7 @@ sub get_coverage
 # output for the patch.
 sub run_diff
 {
+    #print "run_diff(" . join(" ", @_) . ")\n";
     my ($fh, $c) = $repo->command_output_pipe(@_);
     our @patch=();
     while(<$fh>)
@@ -332,6 +331,8 @@ sub run_diff
     }
     $repo->command_close_pipe($fh, $c);
 
+    print "Patch size: " . scalar(@patch) . "\n" if $debug;
+
     # @patch has slurped diff for all files...
     my $filesref = parse_diff ( \@patch );
     show_patch_lines($filesref) if $debug;
@@ -344,6 +345,7 @@ sub run_diff
     for my $file (keys(%$filesref))
     {
         my ($name, $path, $suffix) = fileparse($file, qr{\.[^.]*$});
+        next if($path !~ /^dali/);
         if($suffix eq ".cpp" || $suffix eq ".c" || $suffix eq ".h")
         {
             get_coverage($file, $filesref);
@@ -353,7 +355,6 @@ sub run_diff
     return $filesref;
 }
 
-
 sub calc_patch_coverage_percentage
 {
     my $filesref = shift;
@@ -362,6 +363,9 @@ sub calc_patch_coverage_percentage
 
     foreach my $file (keys(%$filesref))
     {
+        my ($name, $path, $suffix) = fileparse($file, qr{\.[^.]*$});
+        next if($path !~ /^dali/);
+
         my $covered_lines = 0;
         my $uncovered_lines = 0;
 
@@ -401,7 +405,7 @@ sub calc_patch_coverage_percentage
     my $percent = 0;
     if($total_exec > 0) { $percent = 100 * $total_covered_lines / $total_exec; }
 
-    return $percent;
+    return [ $total_exec, $percent ];
 }
 
 sub patch_output
@@ -480,6 +484,117 @@ sub patch_output
 }
 
 
+sub patch_html_output
+{
+    my $filesref = shift;
+
+    open( my $filehandle, ">", $opt_output ) || die "Can't open $opt_output for writing:$!\n";
+
+    my $OUTPUT_FH = select;
+    select $filehandle;
+    print <<EOH;
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+"http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+<head>
+<title>Patch Coverage</title>
+</head>
+<body bgcolor="white">
+EOH
+
+    foreach my $file (keys(%$filesref))
+    {
+        my ($name, $path, $suffix) = fileparse($file, qr{\.[^.]*$});
+        next if($path !~ /^dali/);
+
+        my $patchref = $filesref->{$file}->{"patch"};
+        my $b_lines_ref = $filesref->{$file}->{"b_lines"};
+        my $coverage_ref = $filesref->{$file}->{"coverage"};
+        print "<h2>$file</h2>\n";
+
+        if($coverage_ref)
+        {
+            if( $coverage_ref->{"covered_lines"} > 0
+                ||
+                $coverage_ref->{"uncovered_lines"} > 0 )
+            {
+                print "<p style=\"color:green;\">Covered: " .
+                    $coverage_ref->{"covered_lines"} . "<p>" .
+                    "<p style=\"color:red;\">Uncovered: " .
+                    $coverage_ref->{"uncovered_lines"} . "</span></p>";
+            }
+        }
+        else
+        {
+            print "<p>";
+            my $span=0;
+            if($suffix eq ".cpp" || $suffix eq ".c" || $suffix eq ".h")
+            {
+                print "<span style=\"color:red;\">";
+                $span=1;
+            }
+            print "No coverage found";
+            print "</span>" if $span;
+        }
+        print "</p>";
+
+        for my $patch (@$patchref)
+        {
+            my $hunkstr="Hunk: " . $patch->[0];
+            if( $patch->[1] > 1 )
+            {
+                $hunkstr .= " - " . ($patch->[0]+$patch->[1]-1);
+            }
+            print "<p style=\"font-weight:bold;\">" . $hunkstr . "</p>";
+
+            print "<pre>";
+            for(my $i = 0; $i < $patch->[1]; $i++ )
+            {
+                my $line = $i + $patch->[0];
+                my $num_line_digits=log($line)/log(10);
+                for $i (0..(6-$num_line_digits-1))
+                {
+                    print " ";
+                }
+                print "$line  ";
+
+                if($coverage_ref)
+                {
+                    my $color;
+                    if($coverage_ref->{"covered"}->{$line})
+                    {
+                        print("<span style=\"color:green;\">");
+                    }
+                    elsif($coverage_ref->{"uncovered"}->{$line})
+                    {
+                        print("<span style=\"color:red;font-weight:bold;\">");
+                    }
+                    else
+                    {
+                        #print("<span style=\"color:black;font-weight:normal;\">");
+                    }
+                    my $src=$coverage_ref->{"src"}->{$line};
+                    chomp($src);
+                    #print $color, "$src\n", RESET;
+                    print "$src</span>\n";
+                }
+                else
+                {
+                    # We don't have coverage data, so print it from the patch instead.
+                    my $src = $b_lines_ref->{$line};
+                    print "$src\n";
+                }
+            }
+            print "<\pre>\n";
+        }
+    }
+
+    print $filehandle "<hr>\n</body>\n</html>\n";
+    close $filehandle;
+    select $OUTPUT_FH;
+}
+
+
 ################################################################################
 ##                                    MAIN                                    ##
 ################################################################################
@@ -492,30 +607,82 @@ chdir "build/tizen";
 my @cmd=('--no-pager','diff','--no-ext-diff','-U0','--no-color');
 
 my $status = $repo->command("status", "-s");
-if( $status eq "" )
+if( $status eq "" && !scalar(@ARGV))
 {
-    # There are no changes in the index or working tree. Use the last patch instead
+    # There are no changes in the index or working tree, and
+    # no diff arguments to append. Use the last patch instead.
     push @cmd, ('HEAD~1','HEAD');
 }
-elsif($opt_cached) # TODO: Remove this option. Instead, need full diff
+else
 {
-    push @cmd, "--cached";
+    # detect if there are only cached changes or only working tree changes
+    my $cached = 0;
+    my $working = 0;
+    for my $fstat ( split(/\n/, $status) )
+    {
+        if(substr( $fstat, 0, 1 ) ne " "){ $cached++; }
+        if(substr( $fstat, 1, 1 ) ne " "){ $working++; }
+    }
+    if($cached > 0 )
+    {
+        if($working == 0)
+        {
+            push @cmd, "--cached";
+        }
+        else
+        {
+            die "Both cached & working files - cannot get correct patch from git\n";
+            # Would have to diff from separate clone.
+        }
+    }
 }
 
 push @cmd, @ARGV;
 my $filesref = run_diff(@cmd);
 
-my $percent = calc_patch_coverage_percentage($filesref);
-if( ! $opt_quiet )
+chdir $cwd;
+
+# Check how many actual source files there are in the patch
+my $filecount = 0;
+foreach my $file (keys(%$filesref))
+{
+    my ($name, $path, $suffix) = fileparse($file, qr{\.[^.]*$});
+    next if($path !~ /^dali/);
+    next if($suffix ne ".cpp" && $suffix ne ".c" && $suffix ne ".h");
+    $filecount++;
+}
+if( $filecount == 0 )
+{
+    print "No source files found\n";
+    exit 0;    # Exit with no error.
+}
+
+my $percentref = calc_patch_coverage_percentage($filesref);
+if($percentref->[0] == 0)
+{
+    print "No coverable lines found\n";
+    exit 0;
+}
+my $percent = $percentref->[1];
+
+my $color=BOLD RED;
+if($opt_output)
+{
+    print "Outputing to $opt_output\n" if $debug;
+    patch_html_output($filesref);
+}
+elsif( ! $opt_quiet )
 {
     patch_output($filesref);
-    my $color=BOLD RED;
     if($percent>=90)
     {
         $color=GREEN;
     }
-    printf("Percentage of change covered: $color %5.2f%\n" . RESET, $percent);
+    print RESET;
 }
+
+printf("Percentage of change covered: %5.2f%\n", $percent);
+
 exit($percent<90);
 
 
index 21d9f42..104b3c8 100644 (file)
@@ -150,24 +150,19 @@ void CreateTextModel( const std::string& text,
   fontDescriptionRuns = fontDescriptions;
   Vector<FontRun>& validFonts = logicalModel->mFontRuns;
 
-  // The default font id.
-  FontDefaults fontDefaults;
-  fontDefaults.mFontDescription.family = "";
-  fontDefaults.familyDefined = true;
-  fontDefaults.mDefaultPointSize = 12.f;
-  fontDefaults.sizeDefined = true;
+  // The default font description.
+  TextAbstraction::FontDescription fontDescription;
 
   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
   fontClient.SetDpi( 96u, 96u );
 
-  const FontId defaultFontId = fontDefaults.GetFontId( fontClient );
-
   // Validates the fonts. If there is a character with no assigned font it sets a default one.
   // After this call, fonts are validated.
   multilanguageSupport.ValidateFonts( utf32Characters,
                                       scripts,
                                       fontDescriptionRuns,
-                                      defaultFontId,
+                                      fontDescription,
+                                      TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
                                       0u,
                                       numberOfCharacters,
                                       validFonts );
index 7164972..36ab916 100644 (file)
@@ -961,7 +961,7 @@ int UtcDaliTextLayoutMultilineText02(void)
   // Set a known font description
   FontDescriptionRun fontDescriptionRun2;
   fontDescriptionRun2.characterRun.characterIndex = 17u;
-  fontDescriptionRun2.characterRun.numberOfCharacters = 11u;
+  fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
   fontDescriptionRun2.familyLength = fontFamily2.size();
   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
   memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
@@ -971,12 +971,12 @@ int UtcDaliTextLayoutMultilineText02(void)
   fontDescriptionRun2.slantDefined = false;
   fontDescriptionRun2.sizeDefined = false;
 
-  const std::string fontFamily3( "TizenSansHebrew" );
+  const std::string fontFamily3( "TizenSans" );
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun3;
-  fontDescriptionRun3.characterRun.characterIndex = 28u;
-  fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun3.characterRun.characterIndex = 26u;
+  fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
   fontDescriptionRun3.familyLength = fontFamily3.size();
   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
   memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
@@ -986,12 +986,12 @@ int UtcDaliTextLayoutMultilineText02(void)
   fontDescriptionRun3.slantDefined = false;
   fontDescriptionRun3.sizeDefined = false;
 
-  const std::string fontFamily4( "TizenSans" );
+  const std::string fontFamily4( "TizenSansHebrew" );
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun4;
-  fontDescriptionRun4.characterRun.characterIndex = 38u;
-  fontDescriptionRun4.characterRun.numberOfCharacters = 17u;
+  fontDescriptionRun4.characterRun.characterIndex = 28u;
+  fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
   fontDescriptionRun4.familyLength = fontFamily4.size();
   fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
   memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
@@ -1001,20 +1001,36 @@ int UtcDaliTextLayoutMultilineText02(void)
   fontDescriptionRun4.slantDefined = false;
   fontDescriptionRun4.sizeDefined = false;
 
+  const std::string fontFamily5( "TizenSans" );
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun5;
+  fontDescriptionRun5.characterRun.characterIndex = 38u;
+  fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
+  fontDescriptionRun5.familyLength = fontFamily5.size();
+  fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
+  memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
+  fontDescriptionRun5.familyDefined = true;
+  fontDescriptionRun5.weightDefined = false;
+  fontDescriptionRun5.widthDefined = false;
+  fontDescriptionRun5.slantDefined = false;
+  fontDescriptionRun5.sizeDefined = false;
+
   Vector<FontDescriptionRun> fontDescriptionRuns;
   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
   fontDescriptionRuns.PushBack( fontDescriptionRun4 );
+  fontDescriptionRuns.PushBack( fontDescriptionRun5 );
   Size textArea(100.f, 300.f);
   Size layoutSize(81.f, 120.f);
   float positions[] =
   {
     1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f,  -9.f, 51.f,  -9.f, 61.f,  -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f,  -0.f,
-    1.f, -10.f,  9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
+    1.f, -10.f,  9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f,  -0.f,
-    1.f, -13.f, 10.f,  -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f,  -0.f, 39.f,  -9.f, 50.f,  -9.f, 60.f,  -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
+    1.f, -13.f, 10.f,  -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f,  -0.f, 38.f,  -9.f, 49.f,  -9.f, 59.f,  -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f,
   };
   struct LineRun line0 =
@@ -1045,7 +1061,7 @@ int UtcDaliTextLayoutMultilineText02(void)
   {
     { 22u, 6u },
     { 22u, 6u },
-    36.f,
+    34.f,
     15.f,
     -5.f,
     0.f,
@@ -1069,10 +1085,10 @@ int UtcDaliTextLayoutMultilineText02(void)
   {
     { 38u, 12u },
     { 38u, 12u },
-    80.f,
+    79.f,
     15.f,
     -5.f,
-    4.f,
+    3.f,
     0.f,
     false,
     false
@@ -1103,7 +1119,7 @@ int UtcDaliTextLayoutMultilineText02(void)
     "Hello world demo שלום עולם.\n"
     "שלום עולם hello world demo.",
     textArea,
-    4u,
+    5u,
     fontDescriptionRuns.Begin(),
     layoutSize,
     55u,
@@ -1454,7 +1470,7 @@ int UtcDaliTextUpdateLayout01(void)
   // Set a known font description
   FontDescriptionRun fontDescriptionRun02;
   fontDescriptionRun02.characterRun.characterIndex = 17u;
-  fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
+  fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
   fontDescriptionRun02.familyLength = fontHebrew.size();
   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
@@ -1466,11 +1482,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun03;
-  fontDescriptionRun03.characterRun.characterIndex = 28u;
-  fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun03.familyLength = fontArabic.size();
+  fontDescriptionRun03.characterRun.characterIndex = 26u;
+  fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
+  fontDescriptionRun03.familyLength = fontLatin.size();
   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
-  memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
+  memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
   fontDescriptionRun03.familyDefined = true;
   fontDescriptionRun03.weightDefined = false;
   fontDescriptionRun03.widthDefined = false;
@@ -1479,11 +1495,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun04;
-  fontDescriptionRun04.characterRun.characterIndex = 42u;
-  fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
-  fontDescriptionRun04.familyLength = fontLatin.size();
+  fontDescriptionRun04.characterRun.characterIndex = 28u;
+  fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun04.familyLength = fontArabic.size();
   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
-  memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
+  memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
   fontDescriptionRun04.familyDefined = true;
   fontDescriptionRun04.weightDefined = false;
   fontDescriptionRun04.widthDefined = false;
@@ -1492,11 +1508,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun05;
-  fontDescriptionRun05.characterRun.characterIndex = 54u;
-  fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun05.familyLength = fontHebrew.size();
+  fontDescriptionRun05.characterRun.characterIndex = 42u;
+  fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun05.familyLength = fontLatin.size();
   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
-  memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
+  memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
   fontDescriptionRun05.familyDefined = true;
   fontDescriptionRun05.weightDefined = false;
   fontDescriptionRun05.widthDefined = false;
@@ -1505,7 +1521,7 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun06;
-  fontDescriptionRun06.characterRun.characterIndex = 64u;
+  fontDescriptionRun06.characterRun.characterIndex = 54u;
   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
   fontDescriptionRun06.familyLength = fontHebrew.size();
   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
@@ -1518,11 +1534,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun07;
-  fontDescriptionRun07.characterRun.characterIndex = 74u;
-  fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
-  fontDescriptionRun07.familyLength = fontLatin.size();
+  fontDescriptionRun07.characterRun.characterIndex = 64u;
+  fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun07.familyLength = fontHebrew.size();
   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
-  memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
+  memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
   fontDescriptionRun07.familyDefined = true;
   fontDescriptionRun07.weightDefined = false;
   fontDescriptionRun07.widthDefined = false;
@@ -1531,8 +1547,8 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun08;
-  fontDescriptionRun08.characterRun.characterIndex = 92u;
-  fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun08.characterRun.characterIndex = 74u;
+  fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
   fontDescriptionRun08.familyLength = fontLatin.size();
   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
@@ -1544,11 +1560,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun09;
-  fontDescriptionRun09.characterRun.characterIndex = 104u;
-  fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun09.familyLength = fontArabic.size();
+  fontDescriptionRun09.characterRun.characterIndex = 92u;
+  fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun09.familyLength = fontLatin.size();
   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
-  memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
+  memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
   fontDescriptionRun09.familyDefined = true;
   fontDescriptionRun09.weightDefined = false;
   fontDescriptionRun09.widthDefined = false;
@@ -1557,11 +1573,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun10;
-  fontDescriptionRun10.characterRun.characterIndex = 118u;
-  fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun10.familyLength = fontHebrew.size();
+  fontDescriptionRun10.characterRun.characterIndex = 104u;
+  fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun10.familyLength = fontArabic.size();
   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
-  memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
+  memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
   fontDescriptionRun10.familyDefined = true;
   fontDescriptionRun10.weightDefined = false;
   fontDescriptionRun10.widthDefined = false;
@@ -1570,11 +1586,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun11;
-  fontDescriptionRun11.characterRun.characterIndex = 128u;
-  fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
-  fontDescriptionRun11.familyLength = fontLatin.size();
+  fontDescriptionRun11.characterRun.characterIndex = 118u;
+  fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun11.familyLength = fontHebrew.size();
   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
-  memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
+  memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
   fontDescriptionRun11.familyDefined = true;
   fontDescriptionRun11.weightDefined = false;
   fontDescriptionRun11.widthDefined = false;
@@ -1583,11 +1599,11 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun12;
-  fontDescriptionRun12.characterRun.characterIndex = 145u;
-  fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
-  fontDescriptionRun12.familyLength = fontHebrew.size();
+  fontDescriptionRun12.characterRun.characterIndex = 128u;
+  fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
+  fontDescriptionRun12.familyLength = fontLatin.size();
   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
-  memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
+  memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
   fontDescriptionRun12.familyDefined = true;
   fontDescriptionRun12.weightDefined = false;
   fontDescriptionRun12.widthDefined = false;
@@ -1596,8 +1612,8 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun13;
-  fontDescriptionRun13.characterRun.characterIndex = 156u;
-  fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun13.characterRun.characterIndex = 145u;
+  fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
   fontDescriptionRun13.familyLength = fontHebrew.size();
   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
@@ -1609,8 +1625,8 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun14;
-  fontDescriptionRun14.characterRun.characterIndex = 166u;
-  fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun14.characterRun.characterIndex = 154u;
+  fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
   fontDescriptionRun14.familyLength = fontLatin.size();
   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
@@ -1622,17 +1638,43 @@ int UtcDaliTextUpdateLayout01(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun15;
-  fontDescriptionRun15.characterRun.characterIndex = 178u;
-  fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun15.familyLength = fontArabic.size();
+  fontDescriptionRun15.characterRun.characterIndex = 156u;
+  fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun15.familyLength = fontHebrew.size();
   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
-  memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
+  memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
   fontDescriptionRun15.familyDefined = true;
   fontDescriptionRun15.weightDefined = false;
   fontDescriptionRun15.widthDefined = false;
   fontDescriptionRun15.slantDefined = false;
   fontDescriptionRun15.sizeDefined = false;
 
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun16;
+  fontDescriptionRun16.characterRun.characterIndex = 166u;
+  fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun16.familyLength = fontLatin.size();
+  fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
+  memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
+  fontDescriptionRun16.familyDefined = true;
+  fontDescriptionRun16.weightDefined = false;
+  fontDescriptionRun16.widthDefined = false;
+  fontDescriptionRun16.slantDefined = false;
+  fontDescriptionRun16.sizeDefined = false;
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun17;
+  fontDescriptionRun17.characterRun.characterIndex = 178u;
+  fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun17.familyLength = fontArabic.size();
+  fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
+  memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
+  fontDescriptionRun17.familyDefined = true;
+  fontDescriptionRun17.weightDefined = false;
+  fontDescriptionRun17.widthDefined = false;
+  fontDescriptionRun17.slantDefined = false;
+  fontDescriptionRun17.sizeDefined = false;
+
   Vector<FontDescriptionRun> fontDescriptionRuns;
   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
@@ -1649,29 +1691,32 @@ int UtcDaliTextUpdateLayout01(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
+  fontDescriptionRuns.PushBack( fontDescriptionRun16 );
+  fontDescriptionRuns.PushBack( fontDescriptionRun17 );
   Size textArea(100.f, 300.f);
   Size layoutSize(92.f, 380.f);
   float positions[] =
   {
     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
+    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -11.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
+    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
+    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
+    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
+    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
   };
+
   struct LineRun line01 =
   {
     { 0u, 12u },
@@ -1700,7 +1745,7 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 22u, 6u },
     { 22u, 6u },
-    36.f,
+    34.f,
     15.f,
     -5.f,
     0.f,
@@ -1715,7 +1760,7 @@ int UtcDaliTextUpdateLayout01(void)
     92.f,
     15.f,
     -5.f,
-    5.f,
+    4.f,
     0.f,
     false,
     false
@@ -1760,10 +1805,10 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 74u, 12u },
     { 74u, 12u },
-    80.f,
+    79.f,
     15.f,
     -5.f,
-    4.f,
+    3.f,
     0.f,
     false,
     false
@@ -1784,10 +1829,10 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 92u, 12u },
     { 92u, 12u },
-    79.f,
+    78.f,
     15.f,
     -5.f,
-    5.f,
+    4.f,
     0.f,
     false,
     false
@@ -1820,10 +1865,10 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 128u, 12u },
     { 128u, 12u },
-    82.f,
+    81.f,
     15.f,
     -5.f,
-    4.f,
+    3.f,
     0.f,
     false,
     false
@@ -1832,7 +1877,7 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 140u, 10u },
     { 140u, 10u },
-    77.f,
+    76.f,
     15.f,
     -5.f,
     4.f,
@@ -1844,7 +1889,7 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 150u, 6u },
     { 150u, 6u },
-    36.f,
+    34.f,
     15.f,
     -5.f,
     0.f,
@@ -1868,7 +1913,7 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 166u, 12u },
     { 166u, 12u },
-    80.f,
+    79.f,
     15.f,
     -5.f,
     4.f,
@@ -1931,7 +1976,7 @@ int UtcDaliTextUpdateLayout01(void)
     "Hello world demo שלום עולם.\n"
     "שלום עולם hello world مرحبا بالعالم\n",
     textArea,
-    15u,
+    17u,
     fontDescriptionRuns.Begin(),
     layoutSize,
     192u,
@@ -1981,7 +2026,7 @@ int UtcDaliTextUpdateLayout02(void)
   // Set a known font description
   FontDescriptionRun fontDescriptionRun02;
   fontDescriptionRun02.characterRun.characterIndex = 17u;
-  fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
+  fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
   fontDescriptionRun02.familyLength = fontHebrew.size();
   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
@@ -1993,11 +2038,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun03;
-  fontDescriptionRun03.characterRun.characterIndex = 28u;
-  fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun03.familyLength = fontArabic.size();
+  fontDescriptionRun03.characterRun.characterIndex = 26u;
+  fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
+  fontDescriptionRun03.familyLength = fontLatin.size();
   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
-  memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
+  memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
   fontDescriptionRun03.familyDefined = true;
   fontDescriptionRun03.weightDefined = false;
   fontDescriptionRun03.widthDefined = false;
@@ -2006,11 +2051,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun04;
-  fontDescriptionRun04.characterRun.characterIndex = 42u;
-  fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
-  fontDescriptionRun04.familyLength = fontLatin.size();
+  fontDescriptionRun04.characterRun.characterIndex = 28u;
+  fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun04.familyLength = fontArabic.size();
   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
-  memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
+  memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
   fontDescriptionRun04.familyDefined = true;
   fontDescriptionRun04.weightDefined = false;
   fontDescriptionRun04.widthDefined = false;
@@ -2019,11 +2064,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun05;
-  fontDescriptionRun05.characterRun.characterIndex = 54u;
-  fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun05.familyLength = fontHebrew.size();
+  fontDescriptionRun05.characterRun.characterIndex = 42u;
+  fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun05.familyLength = fontLatin.size();
   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
-  memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
+  memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
   fontDescriptionRun05.familyDefined = true;
   fontDescriptionRun05.weightDefined = false;
   fontDescriptionRun05.widthDefined = false;
@@ -2032,7 +2077,7 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun06;
-  fontDescriptionRun06.characterRun.characterIndex = 64u;
+  fontDescriptionRun06.characterRun.characterIndex = 54u;
   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
   fontDescriptionRun06.familyLength = fontHebrew.size();
   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
@@ -2045,11 +2090,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun07;
-  fontDescriptionRun07.characterRun.characterIndex = 74u;
-  fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
-  fontDescriptionRun07.familyLength = fontLatin.size();
+  fontDescriptionRun07.characterRun.characterIndex = 64u;
+  fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun07.familyLength = fontHebrew.size();
   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
-  memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
+  memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
   fontDescriptionRun07.familyDefined = true;
   fontDescriptionRun07.weightDefined = false;
   fontDescriptionRun07.widthDefined = false;
@@ -2058,8 +2103,8 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun08;
-  fontDescriptionRun08.characterRun.characterIndex = 92u;
-  fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun08.characterRun.characterIndex = 74u;
+  fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
   fontDescriptionRun08.familyLength = fontLatin.size();
   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
@@ -2071,11 +2116,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun09;
-  fontDescriptionRun09.characterRun.characterIndex = 104u;
-  fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun09.familyLength = fontArabic.size();
+  fontDescriptionRun09.characterRun.characterIndex = 92u;
+  fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun09.familyLength = fontLatin.size();
   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
-  memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
+  memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
   fontDescriptionRun09.familyDefined = true;
   fontDescriptionRun09.weightDefined = false;
   fontDescriptionRun09.widthDefined = false;
@@ -2084,11 +2129,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun10;
-  fontDescriptionRun10.characterRun.characterIndex = 118u;
-  fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun10.familyLength = fontHebrew.size();
+  fontDescriptionRun10.characterRun.characterIndex = 104u;
+  fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun10.familyLength = fontArabic.size();
   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
-  memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
+  memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
   fontDescriptionRun10.familyDefined = true;
   fontDescriptionRun10.weightDefined = false;
   fontDescriptionRun10.widthDefined = false;
@@ -2097,11 +2142,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun11;
-  fontDescriptionRun11.characterRun.characterIndex = 128u;
-  fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
-  fontDescriptionRun11.familyLength = fontLatin.size();
+  fontDescriptionRun11.characterRun.characterIndex = 118u;
+  fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun11.familyLength = fontHebrew.size();
   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
-  memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
+  memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
   fontDescriptionRun11.familyDefined = true;
   fontDescriptionRun11.weightDefined = false;
   fontDescriptionRun11.widthDefined = false;
@@ -2110,11 +2155,11 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun12;
-  fontDescriptionRun12.characterRun.characterIndex = 145u;
-  fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
-  fontDescriptionRun12.familyLength = fontHebrew.size();
+  fontDescriptionRun12.characterRun.characterIndex = 128u;
+  fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
+  fontDescriptionRun12.familyLength = fontLatin.size();
   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
-  memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
+  memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
   fontDescriptionRun12.familyDefined = true;
   fontDescriptionRun12.weightDefined = false;
   fontDescriptionRun12.widthDefined = false;
@@ -2123,8 +2168,8 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun13;
-  fontDescriptionRun13.characterRun.characterIndex = 156u;
-  fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun13.characterRun.characterIndex = 145u;
+  fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
   fontDescriptionRun13.familyLength = fontHebrew.size();
   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
@@ -2136,8 +2181,8 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun14;
-  fontDescriptionRun14.characterRun.characterIndex = 166u;
-  fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun14.characterRun.characterIndex = 154u;
+  fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
   fontDescriptionRun14.familyLength = fontLatin.size();
   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
@@ -2149,17 +2194,43 @@ int UtcDaliTextUpdateLayout02(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun15;
-  fontDescriptionRun15.characterRun.characterIndex = 178u;
-  fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun15.familyLength = fontArabic.size();
+  fontDescriptionRun15.characterRun.characterIndex = 156u;
+  fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun15.familyLength = fontHebrew.size();
   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
-  memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
+  memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
   fontDescriptionRun15.familyDefined = true;
   fontDescriptionRun15.weightDefined = false;
   fontDescriptionRun15.widthDefined = false;
   fontDescriptionRun15.slantDefined = false;
   fontDescriptionRun15.sizeDefined = false;
 
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun16;
+  fontDescriptionRun16.characterRun.characterIndex = 166u;
+  fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun16.familyLength = fontLatin.size();
+  fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
+  memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
+  fontDescriptionRun16.familyDefined = true;
+  fontDescriptionRun16.weightDefined = false;
+  fontDescriptionRun16.widthDefined = false;
+  fontDescriptionRun16.slantDefined = false;
+  fontDescriptionRun16.sizeDefined = false;
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun17;
+  fontDescriptionRun17.characterRun.characterIndex = 178u;
+  fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun17.familyLength = fontArabic.size();
+  fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
+  memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
+  fontDescriptionRun17.familyDefined = true;
+  fontDescriptionRun17.weightDefined = false;
+  fontDescriptionRun17.widthDefined = false;
+  fontDescriptionRun17.slantDefined = false;
+  fontDescriptionRun17.sizeDefined = false;
+
   Vector<FontDescriptionRun> fontDescriptionRuns;
   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
@@ -2176,29 +2247,32 @@ int UtcDaliTextUpdateLayout02(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
+  fontDescriptionRuns.PushBack( fontDescriptionRun16 );
+  fontDescriptionRuns.PushBack( fontDescriptionRun17 );
   Size textArea(100.f, 300.f);
   Size layoutSize(92.f, 380.f);
   float positions[] =
   {
     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
+    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -11.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
+    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
+    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
+    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
+    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
   };
+
   struct LineRun line01 =
   {
     { 0u, 12u },
@@ -2227,7 +2301,7 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 22u, 6u },
     { 22u, 6u },
-    36.f,
+    34.f,
     15.f,
     -5.f,
     0.f,
@@ -2242,7 +2316,7 @@ int UtcDaliTextUpdateLayout02(void)
     92.f,
     15.f,
     -5.f,
-    5.f,
+    4.f,
     0.f,
     false,
     false
@@ -2287,10 +2361,10 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 74u, 12u },
     { 74u, 12u },
-    80.f,
+    79.f,
     15.f,
     -5.f,
-    4.f,
+    3.f,
     0.f,
     false,
     false
@@ -2311,10 +2385,10 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 92u, 12u },
     { 92u, 12u },
-    79.f,
+    78.f,
     15.f,
     -5.f,
-    5.f,
+    4.f,
     0.f,
     false,
     false
@@ -2347,10 +2421,10 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 128u, 12u },
     { 128u, 12u },
-    82.f,
+    81.f,
     15.f,
     -5.f,
-    4.f,
+    3.f,
     0.f,
     false,
     false
@@ -2359,7 +2433,7 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 140u, 10u },
     { 140u, 10u },
-    77.f,
+    76.f,
     15.f,
     -5.f,
     4.f,
@@ -2371,7 +2445,7 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 150u, 6u },
     { 150u, 6u },
-    36.f,
+    34.f,
     15.f,
     -5.f,
     0.f,
@@ -2395,7 +2469,7 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 166u, 12u },
     { 166u, 12u },
-    80.f,
+    79.f,
     15.f,
     -5.f,
     4.f,
@@ -2458,7 +2532,7 @@ int UtcDaliTextUpdateLayout02(void)
     "Hello world demo שלום עולם.\n"
     "שלום עולם hello world مرحبا بالعالم\n",
     textArea,
-    15u,
+    17u,
     fontDescriptionRuns.Begin(),
     layoutSize,
     192u,
@@ -2508,7 +2582,7 @@ int UtcDaliTextUpdateLayout03(void)
   // Set a known font description
   FontDescriptionRun fontDescriptionRun02;
   fontDescriptionRun02.characterRun.characterIndex = 17u;
-  fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
+  fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
   fontDescriptionRun02.familyLength = fontHebrew.size();
   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
@@ -2520,11 +2594,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun03;
-  fontDescriptionRun03.characterRun.characterIndex = 28u;
-  fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun03.familyLength = fontArabic.size();
+  fontDescriptionRun03.characterRun.characterIndex = 26u;
+  fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
+  fontDescriptionRun03.familyLength = fontLatin.size();
   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
-  memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
+  memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
   fontDescriptionRun03.familyDefined = true;
   fontDescriptionRun03.weightDefined = false;
   fontDescriptionRun03.widthDefined = false;
@@ -2533,11 +2607,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun04;
-  fontDescriptionRun04.characterRun.characterIndex = 42u;
-  fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
-  fontDescriptionRun04.familyLength = fontLatin.size();
+  fontDescriptionRun04.characterRun.characterIndex = 28u;
+  fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun04.familyLength = fontArabic.size();
   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
-  memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
+  memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
   fontDescriptionRun04.familyDefined = true;
   fontDescriptionRun04.weightDefined = false;
   fontDescriptionRun04.widthDefined = false;
@@ -2546,11 +2620,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun05;
-  fontDescriptionRun05.characterRun.characterIndex = 54u;
-  fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun05.familyLength = fontHebrew.size();
+  fontDescriptionRun05.characterRun.characterIndex = 42u;
+  fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun05.familyLength = fontLatin.size();
   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
-  memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
+  memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
   fontDescriptionRun05.familyDefined = true;
   fontDescriptionRun05.weightDefined = false;
   fontDescriptionRun05.widthDefined = false;
@@ -2559,7 +2633,7 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun06;
-  fontDescriptionRun06.characterRun.characterIndex = 64u;
+  fontDescriptionRun06.characterRun.characterIndex = 54u;
   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
   fontDescriptionRun06.familyLength = fontHebrew.size();
   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
@@ -2572,11 +2646,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun07;
-  fontDescriptionRun07.characterRun.characterIndex = 74u;
-  fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
-  fontDescriptionRun07.familyLength = fontLatin.size();
+  fontDescriptionRun07.characterRun.characterIndex = 64u;
+  fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun07.familyLength = fontHebrew.size();
   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
-  memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
+  memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
   fontDescriptionRun07.familyDefined = true;
   fontDescriptionRun07.weightDefined = false;
   fontDescriptionRun07.widthDefined = false;
@@ -2585,8 +2659,8 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun08;
-  fontDescriptionRun08.characterRun.characterIndex = 92u;
-  fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun08.characterRun.characterIndex = 74u;
+  fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
   fontDescriptionRun08.familyLength = fontLatin.size();
   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
@@ -2598,11 +2672,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun09;
-  fontDescriptionRun09.characterRun.characterIndex = 104u;
-  fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun09.familyLength = fontArabic.size();
+  fontDescriptionRun09.characterRun.characterIndex = 92u;
+  fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun09.familyLength = fontLatin.size();
   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
-  memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
+  memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
   fontDescriptionRun09.familyDefined = true;
   fontDescriptionRun09.weightDefined = false;
   fontDescriptionRun09.widthDefined = false;
@@ -2611,11 +2685,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun10;
-  fontDescriptionRun10.characterRun.characterIndex = 118u;
-  fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun10.familyLength = fontHebrew.size();
+  fontDescriptionRun10.characterRun.characterIndex = 104u;
+  fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun10.familyLength = fontArabic.size();
   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
-  memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
+  memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
   fontDescriptionRun10.familyDefined = true;
   fontDescriptionRun10.weightDefined = false;
   fontDescriptionRun10.widthDefined = false;
@@ -2624,11 +2698,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun11;
-  fontDescriptionRun11.characterRun.characterIndex = 128u;
-  fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
-  fontDescriptionRun11.familyLength = fontLatin.size();
+  fontDescriptionRun11.characterRun.characterIndex = 118u;
+  fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun11.familyLength = fontHebrew.size();
   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
-  memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
+  memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
   fontDescriptionRun11.familyDefined = true;
   fontDescriptionRun11.weightDefined = false;
   fontDescriptionRun11.widthDefined = false;
@@ -2637,11 +2711,11 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun12;
-  fontDescriptionRun12.characterRun.characterIndex = 145u;
-  fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
-  fontDescriptionRun12.familyLength = fontHebrew.size();
+  fontDescriptionRun12.characterRun.characterIndex = 128u;
+  fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
+  fontDescriptionRun12.familyLength = fontLatin.size();
   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
-  memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
+  memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
   fontDescriptionRun12.familyDefined = true;
   fontDescriptionRun12.weightDefined = false;
   fontDescriptionRun12.widthDefined = false;
@@ -2650,8 +2724,8 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun13;
-  fontDescriptionRun13.characterRun.characterIndex = 156u;
-  fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun13.characterRun.characterIndex = 145u;
+  fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
   fontDescriptionRun13.familyLength = fontHebrew.size();
   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
@@ -2663,8 +2737,8 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun14;
-  fontDescriptionRun14.characterRun.characterIndex = 166u;
-  fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun14.characterRun.characterIndex = 154u;
+  fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
   fontDescriptionRun14.familyLength = fontLatin.size();
   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
@@ -2676,17 +2750,43 @@ int UtcDaliTextUpdateLayout03(void)
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun15;
-  fontDescriptionRun15.characterRun.characterIndex = 178u;
-  fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun15.familyLength = fontArabic.size();
+  fontDescriptionRun15.characterRun.characterIndex = 156u;
+  fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun15.familyLength = fontHebrew.size();
   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
-  memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
+  memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
   fontDescriptionRun15.familyDefined = true;
   fontDescriptionRun15.weightDefined = false;
   fontDescriptionRun15.widthDefined = false;
   fontDescriptionRun15.slantDefined = false;
   fontDescriptionRun15.sizeDefined = false;
 
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun16;
+  fontDescriptionRun16.characterRun.characterIndex = 166u;
+  fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun16.familyLength = fontLatin.size();
+  fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
+  memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
+  fontDescriptionRun16.familyDefined = true;
+  fontDescriptionRun16.weightDefined = false;
+  fontDescriptionRun16.widthDefined = false;
+  fontDescriptionRun16.slantDefined = false;
+  fontDescriptionRun16.sizeDefined = false;
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun17;
+  fontDescriptionRun17.characterRun.characterIndex = 178u;
+  fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
+  fontDescriptionRun17.familyLength = fontArabic.size();
+  fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
+  memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
+  fontDescriptionRun17.familyDefined = true;
+  fontDescriptionRun17.weightDefined = false;
+  fontDescriptionRun17.widthDefined = false;
+  fontDescriptionRun17.slantDefined = false;
+  fontDescriptionRun17.sizeDefined = false;
+
   Vector<FontDescriptionRun> fontDescriptionRuns;
   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
@@ -2703,29 +2803,32 @@ int UtcDaliTextUpdateLayout03(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
+  fontDescriptionRuns.PushBack( fontDescriptionRun16 );
+  fontDescriptionRuns.PushBack( fontDescriptionRun17 );
   Size textArea(100.f, 300.f);
   Size layoutSize(92.f, 380.f);
   float positions[] =
   {
     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
+    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -11.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
+    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
+    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
+    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
+    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
+    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
   };
+
   struct LineRun line01 =
   {
     { 0u, 12u },
@@ -2754,7 +2857,7 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 22u, 6u },
     { 22u, 6u },
-    36.f,
+    34.f,
     15.f,
     -5.f,
     0.f,
@@ -2769,7 +2872,7 @@ int UtcDaliTextUpdateLayout03(void)
     92.f,
     15.f,
     -5.f,
-    5.f,
+    4.f,
     0.f,
     false,
     false
@@ -2814,10 +2917,10 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 74u, 12u },
     { 74u, 12u },
-    80.f,
+    79.f,
     15.f,
     -5.f,
-    4.f,
+    3.f,
     0.f,
     false,
     false
@@ -2838,10 +2941,10 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 92u, 12u },
     { 92u, 12u },
-    79.f,
+    78.f,
     15.f,
     -5.f,
-    5.f,
+    4.f,
     0.f,
     false,
     false
@@ -2874,10 +2977,10 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 128u, 12u },
     { 128u, 12u },
-    82.f,
+    81.f,
     15.f,
     -5.f,
-    4.f,
+    3.f,
     0.f,
     false,
     false
@@ -2886,7 +2989,7 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 140u, 10u },
     { 140u, 10u },
-    77.f,
+    76.f,
     15.f,
     -5.f,
     4.f,
@@ -2898,7 +3001,7 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 150u, 6u },
     { 150u, 6u },
-    36.f,
+    34.f,
     15.f,
     -5.f,
     0.f,
@@ -2922,7 +3025,7 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 166u, 12u },
     { 166u, 12u },
-    80.f,
+    79.f,
     15.f,
     -5.f,
     4.f,
@@ -2954,7 +3057,6 @@ int UtcDaliTextUpdateLayout03(void)
     false,
     false
   };
-
   Vector<LineRun> lines;
   lines.PushBack( line01 );
   lines.PushBack( line02 );
@@ -2986,7 +3088,7 @@ int UtcDaliTextUpdateLayout03(void)
     "Hello world demo שלום עולם.\n"
     "שלום עולם hello world مرحبا بالعالم\n",
     textArea,
-    15u,
+    17u,
     fontDescriptionRuns.Begin(),
     layoutSize,
     192u,
index db59db3..3be899f 100644 (file)
@@ -36,12 +36,12 @@ using namespace Text;
 // Tests the following functions with different scripts.
 //
 // void MergeFontDescriptions( const Vector<FontDescriptionRun>& fontDescriptions,
-//                             Vector<FontId>& fontIds,
-//                             Vector<bool>& isDefaultFont,
 //                             const TextAbstraction::FontDescription& defaultFontDescription,
 //                             TextAbstraction::PointSize26Dot6 defaultPointSize,
-//                             CharacterIndex startIndex,
-//                             Length numberOfCharacters );
+//                             CharacterIndex characterIndex,
+//                             TextAbstraction::FontDescription& fontDescription,
+//                             TextAbstraction::PointSize26Dot6& fontPointSize,
+//                             bool& isDefaultFont );
 //
 // Script GetScript( Length index,
 //                   Vector<ScriptRun>::ConstIterator& scriptRunIt,
@@ -57,7 +57,8 @@ using namespace Text;
 // void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
 //                                           const Vector<ScriptRun>& scripts,
 //                                           const Vector<FontDescriptionRun>& fontDescriptions,
-//                                           FontId defaultFontId,
+//                                           const TextAbstraction::FontDescription& defaultFontDescription,
+//                                           TextAbstraction::PointSize26Dot6 defaultFontPointSize,
 //                                           CharacterIndex startIndex,
 //                                           Length numberOfCharacters,
 //                                           Vector<FontRun>& fonts );
@@ -105,21 +106,50 @@ struct ValidateFontsData
 };
 
 //////////////////////////////////////////////////////////
+void PrintFontDescription( FontId id )
+{
+  TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
+
+  TextAbstraction::FontDescription description;
+  fontClient.GetDescription( id, description );
+
+  const TextAbstraction::PointSize26Dot6 pointSize = fontClient.GetPointSize( id );
+
+  std::cout << std::endl << "  font description for font id : " << id << std::endl;
+  std::cout << "  font family : [" << description.family << "]" << std::endl;
+  std::cout << "   font width : [" << TextAbstraction::FontWidth::Name[description.width] << "]" << std::endl;
+  std::cout << "  font weight : [" << TextAbstraction::FontWeight::Name[description.weight] << "]" << std::endl;
+  std::cout << "   font slant : [" << TextAbstraction::FontSlant::Name[description.slant] << "]" << std::endl;
+  std::cout << "    font size : " << pointSize << std::endl;
+}
 
 bool MergeFontDescriptionsTest( const MergeFontDescriptionsData& data )
 {
+  TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
+
   Vector<FontId> fontIds;
   fontIds.Resize( data.startIndex + data.numberOfCharacters, 0u );
   Vector<bool> isDefaultFont;
   isDefaultFont.Resize( data.startIndex + data.numberOfCharacters, true );
 
-  MergeFontDescriptions( data.fontDescriptionRuns,
-                         fontIds,
-                         isDefaultFont,
-                         data.defaultFontDescription,
-                         data.defaultPointSize,
-                         data.startIndex,
-                         data.numberOfCharacters );
+  for( unsigned int index = data.startIndex; index < data.startIndex + data.numberOfCharacters; ++index )
+  {
+    TextAbstraction::FontDescription fontDescription;
+    TextAbstraction::PointSize26Dot6 fontPointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
+
+    MergeFontDescriptions( data.fontDescriptionRuns,
+                           data.defaultFontDescription,
+                           data.defaultPointSize,
+                           index,
+                           fontDescription,
+                           fontPointSize,
+                           isDefaultFont[index] );
+
+    if( !isDefaultFont[index] )
+    {
+      fontIds[index] = fontClient.GetFontId( fontDescription, fontPointSize );
+    }
+  }
 
   if( fontIds.Count() != data.expectedFontIds.Count() )
   {
@@ -197,6 +227,12 @@ bool ScriptsTest( const ScriptsData& data )
   if( scripts.Count() != data.scriptRuns.Count() )
   {
     tet_printf("ScriptsTest FAIL: different number of scripts. %d, should be %d\n", scripts.Count(), data.scriptRuns.Count() );
+    for( Vector<ScriptRun>::ConstIterator it = scripts.Begin(); it != scripts.End(); ++it)
+    {
+      const ScriptRun& run = *it;
+
+      std::cout << "  index : " << run.characterRun.characterIndex << ", num chars : " << run.characterRun.numberOfCharacters << ", script : [" << TextAbstraction::ScriptName[run.script] << "]" << std::endl;
+    }
     return false;
   }
 
@@ -255,6 +291,10 @@ bool ValidateFontTest( const ValidateFontsData& data )
   // Get the default font id.
   const FontId defaultFontId = fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + data.defaultFont,
                                                      data.defaultFontSize );
+  TextAbstraction::FontDescription defaultFontDescription;
+  fontClient.GetDescription( defaultFontId, defaultFontDescription );
+
+  const TextAbstraction::PointSize26Dot6 defaultPointSize = fontClient.GetPointSize( defaultFontId );
 
   Vector<FontRun> fontRuns;
 
@@ -262,7 +302,8 @@ bool ValidateFontTest( const ValidateFontsData& data )
   multilanguageSupport.ValidateFonts( utf32,
                                       scripts,
                                       data.fontDescriptionRuns,
-                                      defaultFontId,
+                                      defaultFontDescription,
+                                      defaultPointSize,
                                       0u,
                                       numberOfCharacters,
                                       fontRuns );
@@ -278,7 +319,8 @@ bool ValidateFontTest( const ValidateFontsData& data )
     multilanguageSupport.ValidateFonts( utf32,
                                         scripts,
                                         data.fontDescriptionRuns,
-                                        defaultFontId,
+                                        defaultFontDescription,
+                                        defaultPointSize,
                                         data.index,
                                         data.numberOfCharacters,
                                         fontRuns );
@@ -447,9 +489,9 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     const_cast<char*>( "DejaVu Sans" ),
     11u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontWeight::NONE,
+    TextAbstraction::FontWidth::NONE,
+    TextAbstraction::FontSlant::NONE,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     true,
     false,
@@ -465,8 +507,8 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     NULL,
     0u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
+    TextAbstraction::FontWeight::NONE,
+    TextAbstraction::FontWidth::NONE,
     TextAbstraction::FontSlant::ITALIC,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     false,
@@ -484,8 +526,8 @@ int UtcDaliTextMergeFontDescriptions(void)
     NULL,
     0u,
     TextAbstraction::FontWeight::BOLD,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontWidth::NONE,
+    TextAbstraction::FontSlant::NONE,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     false,
     true,
@@ -501,9 +543,9 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     NULL,
     0u,
-    TextAbstraction::FontWeight::NORMAL,
-    TextAbstraction::FontWidth::NORMAL,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontWeight::NONE,
+    TextAbstraction::FontWidth::NONE,
+    TextAbstraction::FontSlant::NONE,
     NON_DEFAULT_FONT_SIZE,
     false,
     false,
@@ -519,9 +561,9 @@ int UtcDaliTextMergeFontDescriptions(void)
     },
     NULL,
     0u,
-    TextAbstraction::FontWeight::NORMAL,
+    TextAbstraction::FontWeight::NONE,
     TextAbstraction::FontWidth::EXPANDED,
-    TextAbstraction::FontSlant::NORMAL,
+    TextAbstraction::FontSlant::NONE,
     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
     false,
     false,
@@ -695,7 +737,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
   {
     {
       0u,
-      16u,
+      15u,
     },
     TextAbstraction::LATIN
   };
@@ -707,7 +749,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
   {
     {
       0u,
-      16u,
+      15u,
     },
     TextAbstraction::LATIN
   };
@@ -719,7 +761,7 @@ int UtcDaliTextMultiLanguageSetScripts(void)
   {
     {
       0u,
-      16u,
+      15u,
     },
     TextAbstraction::LATIN
   };
@@ -1120,23 +1162,23 @@ int UtcDaliTextMultiLanguageSetScripts(void)
     },
     {
       "White spaces. At the beginning of the text.",
-      "    Hello world.",
+      "    Hello world",
       0u,
-      16u,
+      15u,
       scriptRuns04,
     },
     {
       "White spaces. At the end of the text.",
-      "Hello world.    ",
+      "Hello world    ",
       0u,
-      16u,
+      15u,
       scriptRuns05,
     },
     {
       "White spaces. At the middle of the text.",
-      "Hello     world.",
+      "Hello     world",
       0u,
-      16u,
+      15u,
       scriptRuns06,
     },
     {
index 33a8744..d06ba71 100644 (file)
@@ -142,7 +142,7 @@ public:
   void GetDescription( FontId id, FontDescription& fontDescription ){}
   PointSize26Dot6 GetPointSize( FontId id ){return 9;}
   FontId FindDefaultFont( Character charcode, PointSize26Dot6 pointSize, bool preferColor ){return 0;}
-  FontId FindFallbackFont( FontId preferredFont, Character charcode, PointSize26Dot6 pointSize, bool preferColor ){return 0;}
+  FontId FindFallbackFont( Character charcode, const FontDescription& fontDescription, PointSize26Dot6 pointSize, bool preferColor ){return 0;}
   FontId GetFontId( const FontPath& path, PointSize26Dot6 pointSize, FaceIndex faceIndex ){return 0;}
   FontId GetFontId( const FontDescription& fontDescription,PointSize26Dot6 pointSize, FaceIndex faceIndex ){return 0;}
   bool IsScalable( const FontPath& path ){return true;}
@@ -407,9 +407,9 @@ FontId FontClient::FindDefaultFont( Character charcode, PointSize26Dot6 pointSiz
   return GetImplementation(*this).FindDefaultFont( charcode, pointSize, preferColor );
 }
 
-FontId FontClient::FindFallbackFont( FontId preferredFont, Character charcode, PointSize26Dot6 pointSize, bool preferColor )
+FontId FontClient::FindFallbackFont( Character charcode, const FontDescription& fontDescription, PointSize26Dot6 pointSize, bool preferColor )
 {
-  return GetImplementation(*this).FindFallbackFont( preferredFont, charcode, pointSize, preferColor );
+  return GetImplementation(*this).FindFallbackFont( charcode, fontDescription, pointSize, preferColor );
 }
 
 FontId FontClient::GetFontId( const FontPath& path, PointSize26Dot6 pointSize, FaceIndex faceIndex )
index 6cdb503..5d90be3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -42,13 +42,6 @@ void utc_dali_toolkit_accessibility_manager_cleanup(void)
 namespace
 {
 
-static bool gObjectCreatedCallBackCalled;
-
-static void TestCallback(BaseHandle handle)
-{
-  gObjectCreatedCallBackCalled = true;
-}
-
 // Functors to test whether focus changed signal is emitted when the focus is changed
 class FocusChangedCallback : public Dali::ConnectionTracker
 {
@@ -137,19 +130,8 @@ int UtcDaliAccessibilityManagerGet(void)
 
   tet_infoline(" UtcDaliAccessibilityManagerGet");
 
-  AccessibilityManager manager;
-
-  //Ensure object is created by checking if it's registered
-  ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
-  DALI_TEST_CHECK(registry);
-
-  gObjectCreatedCallBackCalled = false;
-  registry.ObjectCreatedSignal().Connect( &TestCallback );
-  {
-    manager = AccessibilityManager::Get();
-    DALI_TEST_CHECK(manager);
-  }
-  DALI_TEST_CHECK( gObjectCreatedCallBackCalled );
+  AccessibilityManager manager = AccessibilityManager::Get();
+  DALI_TEST_CHECK(manager);
 
   AccessibilityManager newManager = AccessibilityManager::Get();
   DALI_TEST_CHECK(newManager);
@@ -991,6 +973,51 @@ int UtcDaliAccessibilityManagerSetAndGetFocusIndicator(void)
   END_TEST;
 }
 
+int UtcDaliAccessibilityManagerSetAndGetFocusIndicatorWithFocusedActor(void)
+{
+  ToolkitTestApplication application;
+
+  tet_infoline(" UtcDaliAccessibilityManagerSetAndGetFocusIndicatorWithFocusedActor");
+
+  AccessibilityManager manager = AccessibilityManager::Get();
+  DALI_TEST_CHECK(manager);
+
+  Dali::AccessibilityAdaptor accAdaptor = Dali::AccessibilityAdaptor::Get();
+  Test::AccessibilityAdaptor::SetEnabled( accAdaptor, true );
+  accAdaptor.HandleActionEnableEvent();
+
+  Actor defaultFocusIndicatorActor = manager.GetFocusIndicatorActor();
+  DALI_TEST_CHECK(defaultFocusIndicatorActor);
+
+  Actor focusedActor = Actor::New();
+  Stage::GetCurrent().Add( focusedActor );
+
+  application.SendNotification();
+  application.Render();
+
+  DALI_TEST_EQUALS( focusedActor.GetChildCount(), 0u, TEST_LOCATION );
+
+  manager.SetFocusOrder( focusedActor, 1 );
+  manager.SetCurrentFocusActor( focusedActor );
+
+  DALI_TEST_EQUALS( focusedActor.GetChildCount(), 1u, TEST_LOCATION );
+  DALI_TEST_CHECK( focusedActor.GetChildAt(0) == defaultFocusIndicatorActor );
+
+  Actor newFocusIndicatorActor = Actor::New();
+  manager.SetFocusIndicatorActor( newFocusIndicatorActor );
+  DALI_TEST_CHECK(manager.GetFocusIndicatorActor() == newFocusIndicatorActor);
+  DALI_TEST_EQUALS( focusedActor.GetChildCount(), 1u, TEST_LOCATION );
+  DALI_TEST_CHECK( focusedActor.GetChildAt(0) == newFocusIndicatorActor );
+
+  // Disable Accessibility
+  Test::AccessibilityAdaptor::SetEnabled( accAdaptor, false );
+  accAdaptor.HandleActionEnableEvent();
+
+  DALI_TEST_EQUALS( focusedActor.GetChildCount(), 0u, TEST_LOCATION );
+
+  END_TEST;
+}
+
 int UtcDaliAccessibilityManagerSignalFocusChanged(void)
 {
   ToolkitTestApplication application;
index 2300b50..dfc5c86 100644 (file)
@@ -314,11 +314,19 @@ int UtcDaliTextEditorSetPropertyP(void)
   // Check font properties.
   editor.SetProperty( TextEditor::Property::FONT_FAMILY, "Setting font family" );
   DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION );
-  editor.SetProperty( TextEditor::Property::FONT_STYLE, "Setting font style" );
-  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION );
+  editor.SetProperty( TextEditor::Property::FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::FONT_STYLE ), std::string("{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}"), TEST_LOCATION );
   editor.SetProperty( TextEditor::Property::POINT_SIZE, 10.f );
   DALI_TEST_EQUALS( editor.GetProperty<float>( TextEditor::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
 
+  // Reset font style.
+  editor.SetProperty( TextEditor::Property::FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION );
+  editor.SetProperty( TextEditor::Property::FONT_STYLE, "{\"slant\":\"roman\"}" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION );
+  editor.SetProperty( TextEditor::Property::FONT_STYLE, "" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::FONT_STYLE ), std::string(""), TEST_LOCATION );
+
   // Check that the Alignment properties can be correctly set
   editor.SetProperty( TextEditor::Property::HORIZONTAL_ALIGNMENT, "END" );
   DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::HORIZONTAL_ALIGNMENT ), "END", TEST_LOCATION );
@@ -379,11 +387,19 @@ int UtcDaliTextEditorSetPropertyP(void)
   // Check input font properties.
   editor.SetProperty( TextEditor::Property::INPUT_FONT_FAMILY, "Setting input font family" );
   DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::INPUT_FONT_FAMILY ), "Setting input font family", TEST_LOCATION );
-  editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "Setting input font style" );
-  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::INPUT_FONT_STYLE ), "Setting input font style", TEST_LOCATION );
+  editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::INPUT_FONT_STYLE ), "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}", TEST_LOCATION );
   editor.SetProperty( TextEditor::Property::INPUT_POINT_SIZE, 12.f );
   DALI_TEST_EQUALS( editor.GetProperty<float>( TextEditor::Property::INPUT_POINT_SIZE ), 12.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
 
+  // Reset input font style.
+  editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::INPUT_FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION );
+  editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "{\"slant\":\"roman\"}" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::INPUT_FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION );
+  editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "" );
+  DALI_TEST_EQUALS( editor.GetProperty<std::string>( TextEditor::Property::INPUT_FONT_STYLE ), std::string(""), TEST_LOCATION );
+
   // Check the line spacing property
   DALI_TEST_EQUALS( editor.GetProperty<float>( TextEditor::Property::LINE_SPACING ), 0.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
   editor.SetProperty( TextEditor::Property::LINE_SPACING, 10.f );
index 911a06e..cd3985a 100644 (file)
@@ -456,11 +456,19 @@ int UtcDaliTextFieldSetPropertyP(void)
   // Check font properties.
   field.SetProperty( TextField::Property::FONT_FAMILY, "Setting font family" );
   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION );
-  field.SetProperty( TextField::Property::FONT_STYLE, "Setting font style" );
-  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION );
+  field.SetProperty( TextField::Property::FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string("{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}"), TEST_LOCATION );
   field.SetProperty( TextField::Property::POINT_SIZE, 10.f );
   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
 
+  // Reset font style.
+  field.SetProperty( TextField::Property::FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION );
+  field.SetProperty( TextField::Property::FONT_STYLE, "{\"slant\":\"roman\"}" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION );
+  field.SetProperty( TextField::Property::FONT_STYLE, "" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::FONT_STYLE ), std::string(""), TEST_LOCATION );
+
   // Check that the MAX_LENGTH property can be correctly set
   const int maxNumberOfCharacters = 20;
   field.SetProperty( TextField::Property::MAX_LENGTH, maxNumberOfCharacters );
@@ -545,11 +553,19 @@ int UtcDaliTextFieldSetPropertyP(void)
   // Check input font properties.
   field.SetProperty( TextField::Property::INPUT_FONT_FAMILY, "Setting input font family" );
   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_FAMILY ), "Setting input font family", TEST_LOCATION );
-  field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "Setting input font style" );
-  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_STYLE ), "Setting input font style", TEST_LOCATION );
+  field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_STYLE ), "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}", TEST_LOCATION );
   field.SetProperty( TextField::Property::INPUT_POINT_SIZE, 12.f );
   DALI_TEST_EQUALS( field.GetProperty<float>( TextField::Property::INPUT_POINT_SIZE ), 12.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
 
+  // Reset input font style.
+  field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION );
+  field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "{\"slant\":\"roman\"}" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION );
+  field.SetProperty( TextField::Property::INPUT_FONT_STYLE, "" );
+  DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::INPUT_FONT_STYLE ), std::string(""), TEST_LOCATION );
+
   // Check the underline property
   field.SetProperty( TextField::Property::UNDERLINE, "Underline properties" );
   DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::UNDERLINE ), std::string("Underline properties"), TEST_LOCATION );
@@ -1269,10 +1285,10 @@ int utcDaliTextFieldEvent08(void)
   END_TEST;
 }
 
-int utcDaliTextFieldStyleWhilstSelected09(void)
+int utcDaliTextFieldStyleWhilstSelected(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" utcDaliTextFieldEvent09");
+  tet_infoline(" utcDaliTextFieldStyleWhilstSelected");
 
   // Change font and styles whilst text is selected whilst word selected
 
index 2f71832..39778f7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -193,11 +193,19 @@ int UtcDaliToolkitTextLabelSetPropertyP(void)
   // Check font properties.
   label.SetProperty( TextLabel::Property::FONT_FAMILY, "Setting font family" );
   DALI_TEST_EQUALS( label.GetProperty<std::string>( TextLabel::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION );
-  label.SetProperty( TextLabel::Property::FONT_STYLE, "Setting font style" );
-  DALI_TEST_EQUALS( label.GetProperty<std::string>( TextLabel::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION );
+  label.SetProperty( TextLabel::Property::FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" );
+  DALI_TEST_EQUALS( label.GetProperty<std::string>( TextLabel::Property::FONT_STYLE ), std::string("{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}"), TEST_LOCATION );
   label.SetProperty( TextLabel::Property::POINT_SIZE, 10.f );
   DALI_TEST_EQUALS( label.GetProperty<float>( TextLabel::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
 
+  // Reset font style.
+  label.SetProperty( TextLabel::Property::FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" );
+  DALI_TEST_EQUALS( label.GetProperty<std::string>( TextLabel::Property::FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION );
+  label.SetProperty( TextLabel::Property::FONT_STYLE, "{\"slant\":\"roman\"}" );
+  DALI_TEST_EQUALS( label.GetProperty<std::string>( TextLabel::Property::FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION );
+  label.SetProperty( TextLabel::Property::FONT_STYLE, "" );
+  DALI_TEST_EQUALS( label.GetProperty<std::string>( TextLabel::Property::FONT_STYLE ), std::string(""), TEST_LOCATION );
+
   // Toggle multi-line
   label.SetProperty( TextLabel::Property::MULTI_LINE, true );
   DALI_TEST_EQUALS( label.GetProperty<bool>( TextLabel::Property::MULTI_LINE ), true, TEST_LOCATION );
index ef9dab8..f3667bc 100644 (file)
@@ -512,6 +512,9 @@ int UtcDaliVisualGetPropertyMap5(void)
   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
   propertyMap.Insert( ImageVisual::Property::FITTING_MODE,   FittingMode::FIT_HEIGHT );
   propertyMap.Insert( ImageVisual::Property::SAMPLING_MODE,   SamplingMode::BOX_THEN_NEAREST );
+  propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, Vector4( 0.25f, 0.25f, 0.5f, 0.5f ) );
+  propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT );
+  propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::MIRRORED_REPEAT );
   propertyMap.Insert( "synchronousLoading",   true );
 
   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
@@ -545,6 +548,18 @@ int UtcDaliVisualGetPropertyMap5(void)
   DALI_TEST_CHECK( value );
   DALI_TEST_CHECK( value->Get<int>() == 30 );
 
+  value = resultMap.Find( ImageVisual::Property::PIXEL_AREA, Property::VECTOR4 );
+  DALI_TEST_CHECK( value );
+  DALI_TEST_EQUALS( value->Get<Vector4>(), Vector4( 0.25f, 0.25f, 0.5f, 0.5f ), Math::MACHINE_EPSILON_100, TEST_LOCATION );
+
+  value = resultMap.Find( ImageVisual::Property::WRAP_MODE_U, Property::INTEGER );
+  DALI_TEST_CHECK( value );
+  DALI_TEST_CHECK(  value->Get<int>() == WrapMode::REPEAT);
+
+  value = resultMap.Find( ImageVisual::Property::WRAP_MODE_V, Property::INTEGER );
+  DALI_TEST_CHECK( value );
+  DALI_TEST_CHECK(  value->Get<int>() == WrapMode::MIRRORED_REPEAT);
+
   value = resultMap.Find( "synchronousLoading",   Property::BOOLEAN );
   DALI_TEST_CHECK( value );
   DALI_TEST_CHECK( value->Get<bool>() == true );
@@ -578,6 +593,18 @@ int UtcDaliVisualGetPropertyMap5(void)
   DALI_TEST_CHECK( value );
   DALI_TEST_CHECK( value->Get<int>() == 200 );
 
+  value = resultMap.Find( ImageVisual::Property::PIXEL_AREA, Property::VECTOR4 );
+  DALI_TEST_CHECK( value );
+  DALI_TEST_EQUALS( value->Get<Vector4>(), Vector4( 0.f, 0.f, 1.f, 1.f ), Math::MACHINE_EPSILON_100, TEST_LOCATION );
+
+  value = resultMap.Find( ImageVisual::Property::WRAP_MODE_U, Property::INTEGER );
+  DALI_TEST_CHECK( value );
+  DALI_TEST_CHECK(  value->Get<int>() == WrapMode::DEFAULT);
+
+  value = resultMap.Find( ImageVisual::Property::WRAP_MODE_V, Property::INTEGER );
+  DALI_TEST_CHECK( value );
+  DALI_TEST_CHECK(  value->Get<int>() == WrapMode::DEFAULT);
+
   value = resultMap.Find( "synchronousLoading",   Property::BOOLEAN );
   DALI_TEST_CHECK( value );
   DALI_TEST_CHECK( value->Get<bool>() == false );
index 76d6aac..79b2f69 100644 (file)
@@ -17,6 +17,7 @@
 #include <iostream>
 #include <stdlib.h>
 #include <dali-toolkit-test-suite-utils.h>
+#include <toolkit-bitmap-loader.h>
 #include <toolkit-event-thread-callback.h>
 #include <dali/public-api/rendering/renderer.h>
 #include <dali/public-api/rendering/texture-set.h>
@@ -33,13 +34,17 @@ typedef NinePatchImage::StretchRanges StretchRanges;
 
 const char* TEST_IMAGE_FILE_NAME =  "gallery_image_01.jpg";
 const char* TEST_NPATCH_FILE_NAME =  "gallery_image_01.9.png";
-
 const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg";
 const char* TEST_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube.obj";
 const char* TEST_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal.mtl";
 const char* TEST_SIMPLE_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube-Points-Only.obj";
 const char* TEST_SIMPLE_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal-Simple.mtl";
 
+// resolution: 34*34, pixel format: RGBA8888
+static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png";
+// resolution: 600*600, pixel format: RGB888
+static const char* gImage_600_RGB = TEST_RESOURCE_DIR "/test-image-600.jpg";
+
 Integration::Bitmap* CreateBitmap( unsigned int imageWidth, unsigned int imageHeight, unsigned int initialColor, Pixel::Format pixelFormat )
 {
   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
@@ -251,7 +256,7 @@ int UtcDaliVisualFactoryGet(void)
   VisualFactory newFactory = VisualFactory::Get();
   DALI_TEST_CHECK( newFactory );
 
-  // Check that renderer factory is a singleton
+  // Check that visual factory is a singleton
   DALI_TEST_CHECK(factory == newFactory);
 
   END_TEST;
@@ -572,7 +577,7 @@ int UtcDaliVisualFactoryDefaultOffsetsGradientVisual(void)
 int UtcDaliVisualFactoryGetImageVisual1(void)
 {
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualFactoryGetImageVisual1: Request image renderer with a Property::Map" );
+  tet_infoline( "UtcDaliVisualFactoryGetImageVisual1: Request image visual with a Property::Map" );
 
   VisualFactory factory = VisualFactory::Get();
   DALI_TEST_CHECK( factory );
@@ -612,7 +617,7 @@ int UtcDaliVisualFactoryGetImageVisual1(void)
 int UtcDaliVisualFactoryGetImageVisual2(void)
 {
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualFactoryGetImageVisual2: Request image renderer with an image handle" );
+  tet_infoline( "UtcDaliVisualFactoryGetImageVisual2: Request image visual with an image handle" );
 
   VisualFactory factory = VisualFactory::Get();
   DALI_TEST_CHECK( factory );
@@ -643,10 +648,170 @@ int UtcDaliVisualFactoryGetImageVisual2(void)
   END_TEST;
 }
 
+int UtcDaliVisualFactoryGetImageVisual3(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliVisualFactoryGetImageVisual3: Request image visual with a Property::Map, test custom wrap mode and pixel area with atlasing" );
+
+  VisualFactory factory = VisualFactory::Get();
+  DALI_TEST_CHECK( factory );
+
+  // Test wrap mode with atlasing. Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
+  const int width=34;
+  const int height=34;
+  const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
+
+  Property::Map propertyMap;
+  propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
+  propertyMap.Insert( ImageVisual::Property::URL,  gImage_34_RGBA );
+  propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
+  propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
+  propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
+  propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
+  propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
+  propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
+
+  Visual::Base visual = factory.CreateVisual( propertyMap );
+  DALI_TEST_CHECK( visual );
+
+  Actor actor = Actor::New();
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  TraceCallStack& textureTrace = gl.GetTextureTrace();
+  textureTrace.Enable(true);
+  TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
+  texParameterTrace.Enable( true );
+
+  actor.SetSize( 200.f, 200.f );
+  Stage::GetCurrent().Add( actor );
+  visual.SetOnStage( actor );
+
+  // loading started
+  application.SendNotification();
+  application.Render();
+  application.Render();
+  application.SendNotification();
+  BitmapLoader loader = BitmapLoader::GetLatestCreated();
+  DALI_TEST_CHECK( loader );
+  loader.WaitForLoading();// waiting until the image to be loaded
+  DALI_TEST_CHECK( loader.IsLoaded() );
+
+  DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
+
+  DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
+
+  // WITH atlasing, the wrapping is handled manually in shader, so the following gl function should not be called
+  std::stringstream out;
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
+  DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
+  DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
+
+  // test the uniforms which used to handle the wrap mode
+  Renderer renderer = actor.GetRendererAt( 0u );
+  DALI_TEST_CHECK( renderer );
+
+  Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
+  DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
+  Vector4 pixelAreaUniform;
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
+  DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
+
+  Property::Value wrapModeValue = renderer.GetProperty( renderer.GetPropertyIndex( "wrapMode" ) );
+  Vector2 wrapMode( WrapMode::MIRRORED_REPEAT-1, WrapMode::REPEAT-1 );
+  DALI_TEST_EQUALS( wrapModeValue.Get<Vector2>(), wrapMode, TEST_LOCATION );
+  Vector2 wrapModeUniform;
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector2>( "wrapMode", wrapModeUniform ) );
+  DALI_TEST_EQUALS( wrapMode, wrapModeUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
+
+  visual.SetOffStage( actor );
+  DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
+
+  END_TEST;
+}
+
+int UtcDaliVisualFactoryGetImageVisual4(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliVisualFactoryGetImageVisual4: Request image visual with a Property::Map, test custom wrap mode and pixel area without atlasing" );
+
+  VisualFactory factory = VisualFactory::Get();
+  DALI_TEST_CHECK( factory );
+
+  // Test wrap mode without atlasing. Image with a size bigger than 512*512 will NOT be uploaded as a part of the atlas.
+  const int width=600;
+  const int height=600;
+  const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
+
+  Property::Map propertyMap;
+  propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
+  propertyMap.Insert( ImageVisual::Property::URL,  gImage_600_RGB );
+  propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
+  propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
+  propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
+  propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
+  propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
+  propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
+
+  Visual::Base visual = factory.CreateVisual( propertyMap );
+  DALI_TEST_CHECK( visual );
+
+  Actor actor = Actor::New();
+  TestGlAbstraction& gl = application.GetGlAbstraction();
+  TraceCallStack& textureTrace = gl.GetTextureTrace();
+  textureTrace.Enable(true);
+  TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
+  texParameterTrace.Enable( true );
+
+  actor.SetSize( 200.f, 200.f );
+  Stage::GetCurrent().Add( actor );
+  visual.SetOnStage( actor );
+
+  // loading started
+  application.SendNotification();
+  application.Render();
+  application.Render();
+  application.SendNotification();
+  BitmapLoader loader = BitmapLoader::GetLatestCreated();
+  DALI_TEST_CHECK( loader );
+  loader.WaitForLoading();// waiting until the image to be loaded
+  DALI_TEST_CHECK( loader.IsLoaded() );
+
+  DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
+
+  DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
+
+  // WITHOUT atlasing, the wrapping is handled by setting gl texture parameters
+  std::stringstream out;
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
+  DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
+  out.str("");
+  out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
+  DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
+
+  // test the uniforms which used to handle the wrap mode
+  Renderer renderer = actor.GetRendererAt( 0u );
+  DALI_TEST_CHECK( renderer );
+
+  Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
+  DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
+  Vector4 pixelAreaUniform;
+  DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
+  DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
+
+  Property::Index wrapModeIndex = renderer.GetPropertyIndex( "wrapMode" );
+  DALI_TEST_CHECK(wrapModeIndex == Property::INVALID_INDEX);
+
+  visual.SetOffStage( actor );
+  DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
+
+  END_TEST;
+}
+
 int UtcDaliVisualFactoryGetNPatchVisual1(void)
 {
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual1: Request 9-patch renderer with a Property::Map" );
+  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual1: Request 9-patch visual with a Property::Map" );
 
   VisualFactory factory = VisualFactory::Get();
   DALI_TEST_CHECK( factory );
@@ -705,7 +870,7 @@ int UtcDaliVisualFactoryGetNPatchVisual1(void)
 int UtcDaliVisualFactoryGetNPatchVisual2(void)
 {
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual2: Request n-patch renderer with a Property::Map" );
+  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual2: Request n-patch visual with a Property::Map" );
 
   VisualFactory factory = VisualFactory::Get();
   DALI_TEST_CHECK( factory );
@@ -773,7 +938,7 @@ int UtcDaliVisualFactoryGetNPatchVisual2(void)
 int UtcDaliVisualFactoryGetNPatchVisual3(void)
 {
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual3: Request 9-patch renderer with an image url" );
+  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisual3: Request 9-patch visual with an image url" );
 
   VisualFactory factory = VisualFactory::Get();
   DALI_TEST_CHECK( factory );
@@ -880,13 +1045,13 @@ int UtcDaliVisualFactoryGetNPatchVisualN2(void)
   //This should still load but display an error image
 
   ToolkitTestApplication application;
-  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisualN: Request n-patch visual with an invalid Property::Map" );
+  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisualN: Request n-patch visual with an invalid URL" );
 
   VisualFactory factory = VisualFactory::Get();
   DALI_TEST_CHECK( factory );
 
   Property::Map propertyMap;
-  propertyMap.Insert( Visual::Property::TYPE,  111 );
+  propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
   propertyMap.Insert( ImageVisual::Property::URL,  "ERROR.9.jpg" );
 
   Visual::Base visual = factory.CreateVisual( propertyMap );
@@ -911,6 +1076,26 @@ int UtcDaliVisualFactoryGetNPatchVisualN2(void)
   END_TEST;
 }
 
+int UtcDaliVisualFactoryGetNPatchVisualN3(void)
+{
+  // Passing in an invalid visual type so we should not get a visual
+
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliVisualFactoryGetNPatchVisualN: Request n-patch visual with an invalid visual type" );
+
+  VisualFactory factory = VisualFactory::Get();
+  DALI_TEST_CHECK( factory );
+
+  Property::Map propertyMap;
+  propertyMap.Insert( Visual::Property::TYPE,  111 );
+  propertyMap.Insert( ImageVisual::Property::URL,  "ERROR.9.jpg" );
+
+  Visual::Base visual = factory.CreateVisual( propertyMap );
+  DALI_TEST_CHECK( !visual );
+
+  END_TEST;
+}
+
 int UtcDaliVisualFactoryGetSvgVisual(void)
 {
   ToolkitTestApplication application;
@@ -951,7 +1136,7 @@ int UtcDaliVisualFactoryGetSvgVisual(void)
   END_TEST;
 }
 
-//Creates a mesh renderer from the given propertyMap and tries to load it on stage in the given application.
+//Creates a mesh visual from the given propertyMap and tries to load it on stage in the given application.
 //This is expected to succeed, which will then pass the test.
 void MeshVisualLoadsCorrectlyTest( Property::Map& propertyMap, ToolkitTestApplication& application )
 {
@@ -1494,7 +1679,7 @@ int UtcDaliVisualFactoryGetPrimitiveVisual8(void)
   END_TEST;
 }
 
-//Test if primitive shape renderer handles the case of not being passed a specific shape to use.
+//Test if primitive shape visual handles the case of not being passed a specific shape to use.
 int UtcDaliVisualFactoryGetPrimitiveVisualN1(void)
 {
   //Set up test application first, so everything else can be handled.
index 3653af7..791c8dd 100644 (file)
@@ -918,38 +918,9 @@ INPUT_ENCODING         = UTF-8
 # *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
 # *.qsf, *.as and *.js.
 
-FILE_PATTERNS          = *.c \
-                         *.cc \
-                         *.cxx \
-                         *.cpp \
-                         *.c++ \
-                         *.d \
-                         *.java \
-                         *.ii \
-                         *.ixx \
-                         *.ipp \
-                         *.i++ \
-                         *.inl \
+FILE_PATTERNS          = \
                          *.h \
-                         *.hh \
-                         *.hxx \
-                         *.hpp \
-                         *.h++ \
-                         *.idl \
-                         *.odl \
-                         *.cs \
-                         *.php \
-                         *.php3 \
-                         *.inc \
-                         *.m \
-                         *.md \
-                         *.mm \
-                         *.dox \
-                         *.py \
-                         *.f90 \
-                         *.f \
-                         *.vhd \
-                         *.vhdl
+                         *.md
 
 # The RECURSIVE tag can be used to specify whether or not subdirectories should
 # be searched for input files as well.
index 6562a45..eb452c0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -108,7 +108,7 @@ bool IsActorFocusableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType
 
 AccessibilityManager::AccessibilityManager()
 : mCurrentFocusActor(FocusIDPair(0, 0)),
-  mFocusIndicatorActor(Actor()),
+  mFocusIndicatorActor(),
   mRecursiveFocusMoveCounter(0),
   mIsWrapped(false),
   mIsFocusWithinGroup(false),
@@ -127,8 +127,6 @@ AccessibilityManager::~AccessibilityManager()
 
 void AccessibilityManager::Initialise()
 {
-  CreateDefaultFocusIndicatorActor();
-
   AccessibilityAdaptor adaptor = AccessibilityAdaptor::Get();
   adaptor.SetActionHandler(*this);
   adaptor.SetGestureHandler(*this);
@@ -341,9 +339,9 @@ bool AccessibilityManager::DoSetCurrentFocusActor(const unsigned int actorID)
     if(actorVisible && actorFocusable && actorOpaque)
     {
       // Draw the focus indicator upon the focused actor
-      if(mIsFocusIndicatorEnabled && mFocusIndicatorActor)
+      if( mIsFocusIndicatorEnabled )
       {
-        actor.Add(mFocusIndicatorActor);
+        actor.Add( GetFocusIndicatorActor() );
       }
 
       // Send notification for the change of focus actor
@@ -479,9 +477,9 @@ void AccessibilityManager::DoActivate(Actor actor)
 void AccessibilityManager::ClearFocus()
 {
   Actor actor = GetCurrentFocusActor();
-  if(actor)
+  if( actor && mFocusIndicatorActor )
   {
-    actor.Remove(mFocusIndicatorActor);
+    actor.Remove( mFocusIndicatorActor );
   }
 
   mCurrentFocusActor = FocusIDPair(0, 0);
@@ -569,11 +567,40 @@ bool AccessibilityManager::GetWrapMode() const
 
 void AccessibilityManager::SetFocusIndicatorActor(Actor indicator)
 {
-  mFocusIndicatorActor = indicator;
+  if( mFocusIndicatorActor != indicator )
+  {
+    Actor currentFocusActor = GetCurrentFocusActor();
+    if( currentFocusActor )
+    {
+      // The new focus indicator should be added to the current focused actor immediately
+      if( mFocusIndicatorActor )
+      {
+        currentFocusActor.Remove( mFocusIndicatorActor );
+      }
+
+      if( indicator )
+      {
+        currentFocusActor.Add( indicator );
+      }
+    }
+
+    mFocusIndicatorActor = indicator;
+  }
 }
 
 Actor AccessibilityManager::GetFocusIndicatorActor()
 {
+  if( ! mFocusIndicatorActor )
+  {
+    // Create the default if it hasn't been set and one that's shared by all the keyboard focusable actors
+    mFocusIndicatorActor = Toolkit::ImageView::New( FOCUS_BORDER_IMAGE_PATH );
+    mFocusIndicatorActor.SetParentOrigin( ParentOrigin::CENTER );
+    mFocusIndicatorActor.SetZ( 1.0f );
+
+    // Apply size constraint to the focus indicator
+    mFocusIndicatorActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
+  }
+
   return mFocusIndicatorActor;
 }
 
@@ -660,19 +687,6 @@ void AccessibilityManager::SetFocusable(Actor actor, bool focusable)
   }
 }
 
-void AccessibilityManager::CreateDefaultFocusIndicatorActor()
-{
-  // Create a focus indicator actor shared by all the focusable actors
-  Toolkit::ImageView focusIndicator = Toolkit::ImageView::New(FOCUS_BORDER_IMAGE_PATH);
-  focusIndicator.SetParentOrigin( ParentOrigin::CENTER );
-  focusIndicator.SetPosition(Vector3(0.0f, 0.0f, 1.0f));
-
-  // Apply size constraint to the focus indicator
-  focusIndicator.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
-
-  SetFocusIndicatorActor(focusIndicator);
-}
-
 bool AccessibilityManager::ChangeAccessibilityStatus()
 {
   AccessibilityAdaptor adaptor = AccessibilityAdaptor::Get();
@@ -685,10 +699,7 @@ bool AccessibilityManager::ChangeAccessibilityStatus()
     Actor actor = GetCurrentFocusActor();
     if(actor)
     {
-      if(mFocusIndicatorActor)
-      {
-        actor.Add(mFocusIndicatorActor);
-      }
+      actor.Add( GetFocusIndicatorActor() );
     }
     mIsFocusIndicatorEnabled = true;
 
@@ -701,9 +712,9 @@ bool AccessibilityManager::ChangeAccessibilityStatus()
   {
     // Hide indicator when tts turned off
     Actor actor = GetCurrentFocusActor();
-    if(actor)
+    if( actor && mFocusIndicatorActor )
     {
-      actor.Remove(mFocusIndicatorActor);
+      actor.Remove( mFocusIndicatorActor );
     }
     mIsFocusIndicatorEnabled = false;
 
index bb2b275..23da644 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H__
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -486,11 +486,6 @@ private:
   void DoActivate(Actor actor);
 
   /**
-   * Create the default indicator actor to highlight the focused actor.
-   */
-  void CreateDefaultFocusIndicatorActor();
-
-  /**
    * Set whether the actor is focusable or not. A focusable property will be registered for
    * the actor if not yet.
    * @param actor The actor to be focused
index 70dbd3f..ed94ff8 100644 (file)
@@ -36,6 +36,7 @@
 #include <dali-toolkit/internal/filters/blur-two-pass-filter.h>
 #include <dali-toolkit/internal/filters/emboss-filter.h>
 #include <dali-toolkit/internal/filters/spread-filter.h>
+#include <dali-toolkit/internal/visuals/visual-base-impl.h>
 
 namespace Dali
 {
@@ -161,8 +162,6 @@ void EffectsView::SetType( Toolkit::EffectsView::EffectType type )
     RemoveFilters();
 
     Actor self = Self();
-    Property::Map visualMap;
-    visualMap.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE );
 
     switch( type )
     {
@@ -185,11 +184,12 @@ void EffectsView::SetType( Toolkit::EffectsView::EffectType type )
       }
     }
 
+    Image dummyImage; // Dummy image, force creation of an image visual
+    InitializeVisual( self, mVisualPostFilter, dummyImage );
     Property::Map customShader;
     customShader[ Toolkit::Visual::Shader::Property::VERTEX_SHADER ] = EFFECTS_VIEW_VERTEX_SOURCE;
     customShader[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = EFFECTS_VIEW_FRAGMENT_SOURCE;
-    visualMap[ Toolkit::Visual::Property::SHADER ] = customShader;
-    InitializeVisual( self, mVisualPostFilter, visualMap );
+    Toolkit::GetImplementation( mVisualPostFilter ).SetCustomShader( customShader );
 
     mEffectType = type;
   }
index de7e5c6..03883d2 100755 (executable)
@@ -317,9 +317,9 @@ Slider::Domain Slider::CalcDomain( const Vector2& currentSize )
 
 void Slider::DisplayValue( float value, bool raiseSignals )
 {
-  float clampledValue = Clamp( value, GetLowerBound(), GetUpperBound() );
+  float clampedValue = Clamp( value, GetLowerBound(), GetUpperBound() );
 
-  float percent = MapValuePercentage( clampledValue );
+  float percent = MapValuePercentage( clampedValue );
 
   float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
 
@@ -335,7 +335,7 @@ void Slider::DisplayValue( float value, bool raiseSignals )
   if( raiseSignals )
   {
     Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
-    mValueChangedSignal.Emit( self, clampledValue );
+    mValueChangedSignal.Emit( self, clampedValue );
 
     int markIndex;
     if( MarkReached( percent, markIndex ) )
@@ -348,9 +348,13 @@ void Slider::DisplayValue( float value, bool raiseSignals )
   {
     std::stringstream ss;
     ss.precision( GetValuePrecision() );
-    ss << std::fixed << clampledValue;
+    ss << std::fixed << clampedValue;
 
-    mHandleValueTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, ss.str() );
+    std::string label = mHandleValueTextLabel.GetProperty<std::string>( Toolkit::TextLabel::Property::TEXT );
+    if( label.compare(ss.str()) )
+    {
+      mHandleValueTextLabel.SetProperty( Toolkit::TextLabel::Property::TEXT, ss.str() );
+    }
   }
 }
 
index c10d122..4bb7c30 100644 (file)
@@ -30,6 +30,7 @@
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/visuals/visual-properties.h>
 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
+#include <dali-toolkit/internal/visuals/visual-base-impl.h>
 
 namespace Dali
 {
@@ -123,13 +124,16 @@ void EmbossFilter::Enable()
   mActorForComposite.SetColor( Color::BLACK );
 
   customShader[ Toolkit::Visual::Shader::Property::FRAGMENT_SHADER ] = COMPOSITE_FRAGMENT_SOURCE;
-  visualMap[ Toolkit::Visual::Property::SHADER ] = customShader;
-  visualMap[ Toolkit::Visual::Property::TYPE ] = Toolkit::Visual::IMAGE;
 
   mRootActor.Add( mActorForComposite );
 
-  InitializeVisual( mActorForComposite, mVisualForEmboss1, visualMap );
-  InitializeVisual( mActorForComposite, mVisualForEmboss2, visualMap );
+  Image dummyImage; // Dummy image, force creation of an image visual
+
+  InitializeVisual( mActorForComposite, mVisualForEmboss1, dummyImage );
+  Toolkit::GetImplementation( mVisualForEmboss1 ).SetCustomShader( customShader );
+
+  InitializeVisual( mActorForComposite, mVisualForEmboss2, dummyImage );
+  Toolkit::GetImplementation( mVisualForEmboss2 ).SetCustomShader( customShader );
 
   TextureSet textureSet1 = TextureSet::New();
   TextureSetImage( textureSet1, 0, mImageForEmboss1 );
index d503638..3f9a81d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -109,15 +109,13 @@ Toolkit::KeyboardFocusManager KeyboardFocusManager::Get()
 
 KeyboardFocusManager::KeyboardFocusManager()
 : mCurrentFocusActor(0),
-  mFocusIndicatorActor(Actor()),
+  mFocusIndicatorActor(),
   mFocusGroupLoopEnabled(false),
   mIsKeyboardFocusEnabled(false),
   mIsFocusIndicatorEnabled(false),
   mIsWaitingKeyboardFocusChangeCommit(false),
   mSlotDelegate(this)
 {
-  CreateDefaultFocusIndicatorActor();
-
   OnPhysicalKeyboardStatusChanged(PhysicalKeyboard::Get());
 
   Toolkit::KeyInputFocusManager::Get().UnhandledKeyEventSignal().Connect(mSlotDelegate, &KeyboardFocusManager::OnKeyEvent);
@@ -152,10 +150,7 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor( const unsigned int actorID )
   {
     mIsFocusIndicatorEnabled = true;
     // Draw the focus indicator upon the focused actor
-    if( mFocusIndicatorActor )
-    {
-      actor.Add( mFocusIndicatorActor );
-    }
+    actor.Add( GetFocusIndicatorActor() );
 
     // Send notification for the change of focus actor
     if( !mFocusChangedSignal.Empty() )
@@ -453,19 +448,17 @@ void KeyboardFocusManager::SetFocusIndicatorActor(Actor indicator)
 
 Actor KeyboardFocusManager::GetFocusIndicatorActor()
 {
-  return mFocusIndicatorActor;
-}
-
-void KeyboardFocusManager::CreateDefaultFocusIndicatorActor()
-{
-  // Create a focus indicator actor shared by all the keyboard focusable actors
-  Toolkit::ImageView focusIndicator = Toolkit::ImageView::New(FOCUS_BORDER_IMAGE_PATH);
-  focusIndicator.SetParentOrigin( ParentOrigin::CENTER );
+  if( ! mFocusIndicatorActor )
+  {
+    // Create the default if it hasn't been set and one that's shared by all the keyboard focusable actors
+    mFocusIndicatorActor = Toolkit::ImageView::New( FOCUS_BORDER_IMAGE_PATH );
+    mFocusIndicatorActor.SetParentOrigin( ParentOrigin::CENTER );
 
-  // Apply size constraint to the focus indicator
-  focusIndicator.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
+    // Apply size constraint to the focus indicator
+    mFocusIndicatorActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
+  }
 
-  SetFocusIndicatorActor(focusIndicator);
+  return mFocusIndicatorActor;
 }
 
 void KeyboardFocusManager::OnPhysicalKeyboardStatusChanged(PhysicalKeyboard keyboard)
@@ -478,10 +471,7 @@ void KeyboardFocusManager::OnPhysicalKeyboardStatusChanged(PhysicalKeyboard keyb
     Actor actor = GetCurrentFocusActor();
     if(actor)
     {
-      if(mFocusIndicatorActor)
-      {
-        actor.Add(mFocusIndicatorActor);
-      }
+      actor.Add( GetFocusIndicatorActor() );
     }
     mIsFocusIndicatorEnabled = true;
   }
@@ -489,9 +479,9 @@ void KeyboardFocusManager::OnPhysicalKeyboardStatusChanged(PhysicalKeyboard keyb
   {
     // Hide indicator when keyboard focus turned off
     Actor actor = GetCurrentFocusActor();
-    if(actor)
+    if( actor && mFocusIndicatorActor )
     {
-      actor.Remove(mFocusIndicatorActor);
+      actor.Remove( mFocusIndicatorActor );
     }
     mIsFocusIndicatorEnabled = false;
   }
@@ -668,17 +658,17 @@ void KeyboardFocusManager::OnKeyEvent(const KeyEvent& event)
   if(isFocusStartableKey && mIsFocusIndicatorEnabled && !isAccessibilityEnabled)
   {
     Actor actor = GetCurrentFocusActor();
-    if( !actor )
+    if( actor )
+    {
+      // Make sure the focused actor is highlighted
+      actor.Add( GetFocusIndicatorActor() );
+    }
+    else
     {
       // No actor is focused but keyboard focus is activated by the key press
       // Let's try to move the initial focus
       MoveFocus(Toolkit::Control::KeyboardFocus::RIGHT);
     }
-    else if(mFocusIndicatorActor)
-    {
-      // Make sure the focused actor is highlighted
-      actor.Add(mFocusIndicatorActor);
-    }
   }
 }
 
index f615731..4eba5d3 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_TOOLKIT_INTERNAL_KEYBOARD_FOCUS_MANAGER_H__
 
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -190,11 +190,6 @@ private:
   void DoKeyboardEnter( Actor actor );
 
   /**
-   * Create the default indicator actor to highlight the focused actor.
-   */
-  void CreateDefaultFocusIndicatorActor();
-
-  /**
    * Check whether the actor is a layout control that supports two dimensional keyboard navigation.
    * The layout control needs to internally set the focus order for the child actor and be able to
    * tell KeyboardFocusmanager the next focusable actor in the given direction.
index 30ce38c..63add2d 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_TOOLKIT_TEXT_INPUT_STYLE_H__
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -40,7 +40,6 @@ struct InputStyle
 {
   InputStyle()
   : textColor( Color::BLACK ),
-    fontStyle(),
     familyName(),
     weight( TextAbstraction::FontWeight::NORMAL ),
     width( TextAbstraction::FontWidth::NORMAL ),
@@ -64,7 +63,6 @@ struct InputStyle
   {};
 
   Vector4     textColor;           ///< The text's color.
-  std::string fontStyle;           ///< The font's style string.
   std::string familyName;          ///< The font's family name.
   FontWeight  weight;              ///< The font's weight.
   FontWidth   width;               ///< The font's width.
index 731b89d..3fad598 100644 (file)
@@ -31,25 +31,23 @@ namespace Text
 {
 
 void MergeFontDescriptions( const Vector<FontDescriptionRun>& fontDescriptions,
-                            Vector<FontId>& fontIds,
-                            Vector<bool>& isDefaultFont,
                             const TextAbstraction::FontDescription& defaultFontDescription,
                             TextAbstraction::PointSize26Dot6 defaultPointSize,
-                            CharacterIndex startIndex,
-                            Length numberOfCharacters )
+                            CharacterIndex characterIndex,
+                            TextAbstraction::FontDescription& fontDescription,
+                            TextAbstraction::PointSize26Dot6& fontPointSize,
+                            bool& isDefaultFont )
 {
-  // Get the handle to the font client.
-  TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
+  // Initialize with the default font's point size.
+  fontPointSize = defaultPointSize;
 
-  // Pointer to the font id buffer.
-  FontId* fontIdsBuffer = fontIds.Begin();
+  // Initialize with the style parameters of the default font's style.
+  fontDescription = defaultFontDescription;
 
-  // Pointer to the 'is default' font buffer.
-  bool* isDefaultFontBuffer = isDefaultFont.Begin();
+  // Initialize as a default font.
+  isDefaultFont = true;
 
-  // Used to temporarily store the style per character.
-  TextAbstraction::FontDescription fontDescription;
-  TextAbstraction::PointSize26Dot6 fontSize;
+  Length runIndex = 0u;
 
   Length familyIndex = 0u;
   Length weightIndex = 0u;
@@ -57,119 +55,88 @@ void MergeFontDescriptions( const Vector<FontDescriptionRun>& fontDescriptions,
   Length slantIndex = 0u;
   Length sizeIndex = 0u;
 
-  // Traverse all the characters.
-  const CharacterIndex lastCharacterPlusOne = startIndex + numberOfCharacters;
-  for( CharacterIndex index = startIndex; index < lastCharacterPlusOne; ++index )
+  bool familyOverriden = false;
+  bool weightOverriden = false;
+  bool widthOverriden = false;
+  bool slantOverriden = false;
+  bool sizeOverriden = false;
+
+  // Traverse all the font descriptions.
+  const FontDescriptionRun* const fontDescriptionsBuffer = fontDescriptions.Begin();
+  for( Vector<FontDescriptionRun>::ConstIterator it = fontDescriptionsBuffer,
+         endIt = fontDescriptions.End();
+       it != endIt;
+       ++it, ++runIndex )
   {
-    bool& defaultFont = *(isDefaultFontBuffer + index - startIndex );
-
-    Length runIndex = 0u;
-
-    bool familyOverriden = false;
-    bool weightOverriden = false;
-    bool widthOverriden = false;
-    bool slantOverriden = false;
-    bool sizeOverriden = false;
-
-    // Traverse all the font descriptions.
-    const FontDescriptionRun* const fontDescriptionsBuffer = fontDescriptions.Begin();
-    for( Vector<FontDescriptionRun>::ConstIterator it = fontDescriptionsBuffer,
-           endIt = fontDescriptions.End();
-         it != endIt;
-         ++it, ++runIndex )
+    // Check whether the character's font is modified by the current font description.
+    const FontDescriptionRun& fontRun = *it;
+    if( ( characterIndex >= fontRun.characterRun.characterIndex ) &&
+        ( characterIndex < fontRun.characterRun.characterIndex + fontRun.characterRun.numberOfCharacters ) )
     {
-      // Check whether the character's font is modified by the current font description.
-      const FontDescriptionRun& fontRun = *it;
-      if( ( index >= fontRun.characterRun.characterIndex ) &&
-          ( index < fontRun.characterRun.characterIndex + fontRun.characterRun.numberOfCharacters ) )
+      if( fontRun.familyDefined )
       {
-        if( fontRun.familyDefined )
-        {
-          defaultFont = false;
-          familyOverriden = true;
-          familyIndex = runIndex;
-        }
-        if( fontRun.weightDefined )
-        {
-          defaultFont = false;
-          weightOverriden = true;
-          weightIndex = runIndex;
-        }
-        if( fontRun.widthDefined )
-        {
-          defaultFont = false;
-          widthOverriden = true;
-          widthIndex = runIndex;
-        }
-        if( fontRun.slantDefined )
-        {
-          defaultFont = false;
-          slantOverriden = true;
-          slantIndex = runIndex;
-        }
-        if( fontRun.sizeDefined )
-        {
-          defaultFont = false;
-          sizeOverriden = true;
-          sizeIndex = runIndex;
-        }
+        isDefaultFont = false;
+        familyOverriden = true;
+        familyIndex = runIndex;
       }
-    }
-
-    // Get the font id if is not the default font.
-    if( !defaultFont )
-    {
-      if( familyOverriden )
+      if( fontRun.weightDefined )
       {
-        const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + familyIndex );
-        fontDescription.family = std::string( fontRun.familyName, fontRun.familyLength ); // TODO Could use move constructor when switch to c++11.
+        isDefaultFont = false;
+        weightOverriden = true;
+        weightIndex = runIndex;
       }
-      else
+      if( fontRun.widthDefined )
       {
-        fontDescription.family = defaultFontDescription.family;
+        isDefaultFont = false;
+        widthOverriden = true;
+        widthIndex = runIndex;
       }
-
-      if( weightOverriden )
+      if( fontRun.slantDefined )
       {
-        const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + weightIndex );
-        fontDescription.weight = fontRun.weight;
+        isDefaultFont = false;
+        slantOverriden = true;
+        slantIndex = runIndex;
       }
-      else
+      if( fontRun.sizeDefined )
       {
-        fontDescription.weight = defaultFontDescription.weight;
+        isDefaultFont = false;
+        sizeOverriden = true;
+        sizeIndex = runIndex;
       }
+    }
+  }
 
-      if( widthOverriden )
-      {
-        const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + widthIndex );
-        fontDescription.width = fontRun.width;
-      }
-      else
-      {
-        fontDescription.width = defaultFontDescription.width;
-      }
+  // Get the font's description if is not the default font.
+  if( !isDefaultFont )
+  {
+    if( familyOverriden )
+    {
+      const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + familyIndex );
+      fontDescription.family = std::string( fontRun.familyName, fontRun.familyLength );
+    }
 
-      if( slantOverriden )
-      {
-        const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + slantIndex );
-        fontDescription.slant = fontRun.slant;
-      }
-      else
-      {
-        fontDescription.slant = defaultFontDescription.slant;
-      }
+    if( weightOverriden )
+    {
+      const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + weightIndex );
+      fontDescription.weight = fontRun.weight;
+    }
 
-      if( sizeOverriden )
-      {
-        const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + sizeIndex );
-        fontSize = fontRun.size;
-      }
-      else
-      {
-        fontSize = defaultPointSize;
-      }
+    if( widthOverriden )
+    {
+      const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + widthIndex );
+      fontDescription.width = fontRun.width;
+    }
 
-      *( fontIdsBuffer + index - startIndex ) = fontClient.GetFontId( fontDescription, fontSize );
+    if( slantOverriden )
+    {
+      const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + slantIndex );
+      fontDescription.slant = fontRun.slant;
+    }
+
+    if( sizeOverriden )
+    {
+      const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + sizeIndex );
+      fontPointSize = fontRun.size;
     }
   }
 }
index 8052638..14dee1b 100644 (file)
@@ -35,23 +35,23 @@ namespace Text
 {
 
 /**
- * @brief Merges the font descriptions to retrieve the font Id for each character.
+ * @brief Merges font's descriptions to retrieve the combined font's description for a given character.
  *
- * @param[in] fontDescriptions The font descriptions.
- * @param[out] fontIds The font id for each character.
+ * @param[in] fontDescriptions The font's descriptions for the whole text.
+ * @param[in] defaultFontDescription The default font's description.
+ * @param[in] defaultPointSize The default font's point size.
+ * @param[in] characterIndex Index to the character to retrieve its font's description.
+ * @param[out] fontDescription The font's description for the character.
+ * @param[out] fontPointSize The font's point size for the character.
  * @param[out] isDefaultFont Whether the font is a default one.
- * @param[in] defaultFontDescription The default font description.
- * @param[in] defaultPointSize The default font size.
- * @param[in] startIndex The character from where the fonts are merged.
- * @param[in] numberOfCharacters The number of characters to set the font.
  */
 void MergeFontDescriptions( const Vector<FontDescriptionRun>& fontDescriptions,
-                            Vector<FontId>& fontIds,
-                            Vector<bool>& isDefaultFont,
                             const TextAbstraction::FontDescription& defaultFontDescription,
                             TextAbstraction::PointSize26Dot6 defaultPointSize,
-                            CharacterIndex startIndex,
-                            Length numberOfCharacters );
+                            CharacterIndex characterIndex,
+                            TextAbstraction::FontDescription& fontDescription,
+                            TextAbstraction::PointSize26Dot6& fontPointSize,
+                            bool& isDefaultFont );
 
 /**
  * @brief Retrieves the script Id from the script run for a given character's @p index.
index 8b491b0..ae9a68b 100644 (file)
@@ -63,23 +63,38 @@ bool ValidateFontsPerScript::IsValidFont( FontId fontId ) const
   return false;
 }
 
-FontId DefaultFonts::FindFont( TextAbstraction::FontClient& fontClient, PointSize26Dot6 size ) const
+FontId DefaultFonts::FindFont( TextAbstraction::FontClient& fontClient,
+                               const TextAbstraction::FontDescription& description,
+                               PointSize26Dot6 size ) const
 {
-  for( Vector<FontId>::ConstIterator it = mFonts.Begin(),
-         endIt = mFonts.End();
+  for( std::vector<CacheItem>::const_iterator it = mFonts.begin(),
+         endIt = mFonts.end();
        it != endIt;
        ++it )
   {
-    const FontId fontId = *it;
-    if( size == fontClient.GetPointSize( fontId ) )
+    const CacheItem& item = *it;
+
+    if( ( ( TextAbstraction::FontWeight::NONE == description.weight ) || ( description.weight == item.description.weight ) ) &&
+        ( ( TextAbstraction::FontWidth::NONE == description.width )   || ( description.width == item.description.width ) ) &&
+        ( ( TextAbstraction::FontSlant::NONE == description.slant )   || ( description.slant == item.description.slant ) ) &&
+        ( size == fontClient.GetPointSize( item.fontId ) ) &&
+        ( description.family.empty() || ( description.family == item.description.family ) ) )
     {
-      return fontId;
+      return item.fontId;
     }
   }
 
   return 0u;
 }
 
+void DefaultFonts::Cache( const TextAbstraction::FontDescription& description, FontId fontId )
+{
+  CacheItem item;
+  item.description = description;
+  item.fontId = fontId;
+  mFonts.push_back( item );
+}
+
 MultilanguageSupport::MultilanguageSupport()
 : mDefaultFontPerScriptCache(),
   mValidFontsPerScriptCache()
@@ -374,7 +389,8 @@ void MultilanguageSupport::SetScripts( const Vector<Character>& text,
 void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
                                           const Vector<ScriptRun>& scripts,
                                           const Vector<FontDescriptionRun>& fontDescriptions,
-                                          FontId defaultFontId,
+                                          const TextAbstraction::FontDescription& defaultFontDescription,
+                                          TextAbstraction::PointSize26Dot6 defaultFontPointSize,
                                           CharacterIndex startIndex,
                                           Length numberOfCharacters,
                                           Vector<FontRun>& fonts )
@@ -424,36 +440,13 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
   // Get the font client.
   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
 
-  // Get the default font description and default size.
-  TextAbstraction::FontDescription defaultFontDescription;
-  TextAbstraction::PointSize26Dot6 defaultPointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
-  if( defaultFontId > 0u )
-  {
-    fontClient.GetDescription( defaultFontId, defaultFontDescription );
-    defaultPointSize = fontClient.GetPointSize( defaultFontId );
-  }
-
-  // Merge font descriptions
-  Vector<FontId> fontIds;
-  fontIds.Resize( numberOfCharacters, defaultFontId );
-  Vector<bool> isDefaultFont;
-  isDefaultFont.Resize( numberOfCharacters, true );
-  MergeFontDescriptions( fontDescriptions,
-                         fontIds,
-                         isDefaultFont,
-                         defaultFontDescription,
-                         defaultPointSize,
-                         startIndex,
-                         numberOfCharacters );
-
   const Character* const textBuffer = text.Begin();
-  const FontId* const fontIdsBuffer = fontIds.Begin();
-  const bool* const isDefaultFontBuffer = isDefaultFont.Begin();
+
+  // Iterators of the script runs.
   Vector<ScriptRun>::ConstIterator scriptRunIt = scripts.Begin();
   Vector<ScriptRun>::ConstIterator scriptRunEndIt = scripts.End();
   bool isNewParagraphCharacter = false;
 
-  PointSize26Dot6 currentPointSize = defaultPointSize;
   FontId currentFontId = 0u;
   FontId previousFontId = 0u;
   bool isPreviousEmojiScript = false;
@@ -468,24 +461,26 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
     // Get the current character.
     const Character character = *( textBuffer + index );
 
-    // Get the font for the current character.
-    FontId fontId = *( fontIdsBuffer + index - startIndex );
+    TextAbstraction::FontDescription currentFontDescription;
+    TextAbstraction::PointSize26Dot6 currentFontPointSize = defaultFontPointSize;
+    bool isDefaultFont = true;
+    MergeFontDescriptions( fontDescriptions,
+                           defaultFontDescription,
+                           defaultFontPointSize,
+                           index,
+                           currentFontDescription,
+                           currentFontPointSize,
+                           isDefaultFont );
 
-    // Whether the font being validated for the current character is a default one not set by the user.
-    const bool isDefault = *( isDefaultFontBuffer + index - startIndex );
+    // Get the font for the current character.
+    FontId fontId = fontClient.GetFontId( currentFontDescription, currentFontPointSize );
+    currentFontId = fontId;
 
     // Get the script for the current character.
     const Script script = GetScript( index,
                                      scriptRunIt,
                                      scriptRunEndIt );
 
-    // Get the current point size.
-    if( currentFontId != fontId )
-    {
-      currentPointSize = fontClient.GetPointSize( fontId );
-      currentFontId = fontId;
-    }
-
 #ifdef DEBUG_ENABLED
     {
       Dali::TextAbstraction::FontDescription description;
@@ -509,7 +504,9 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
     FontId cachedDefaultFontId = 0u;
     if( NULL != defaultFonts )
     {
-      cachedDefaultFontId = defaultFonts->FindFont( fontClient, currentPointSize );
+      cachedDefaultFontId = defaultFonts->FindFont( fontClient,
+                                                    currentFontDescription,
+                                                    currentFontPointSize );
     }
 
     // Whether the cached default font is valid.
@@ -562,7 +559,7 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
       if( isCommonScript )
       {
         if( isValidCachedDefaultFont &&
-            ( isDefault || ( currentFontId == previousFontId ) ) &&
+            ( isDefaultFont || ( currentFontId == previousFontId ) ) &&
             !isEmojiScript )
         {
           // At this point the character common for all scripts has no font assigned.
@@ -631,7 +628,10 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
               const bool preferColor = ( TextAbstraction::EMOJI == script );
 
               // Find a fallback-font.
-              fontId = fontClient.FindFallbackFont( currentFontId, character, currentPointSize, preferColor );
+              fontId = fontClient.FindFallbackFont( character,
+                                                    currentFontDescription,
+                                                    currentFontPointSize,
+                                                    preferColor );
 
               if( 0u == fontId )
               {
@@ -639,13 +639,15 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
                 defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + TextAbstraction::LATIN );
                 if( NULL != defaultFontsPerScript )
                 {
-                  fontId = defaultFontsPerScript->FindFont( fontClient, currentPointSize );
+                  fontId = defaultFontsPerScript->FindFont( fontClient,
+                                                            currentFontDescription,
+                                                            currentFontPointSize );
                 }
               }
 
               if( 0u == fontId )
               {
-                fontId = fontClient.FindDefaultFont( UTF32_A, currentPointSize );
+                fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize );
               }
 
               // Cache the font.
@@ -659,7 +661,7 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
                   *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript;
                 }
               }
-              defaultFontsPerScript->mFonts.PushBack( fontId );
+              defaultFontsPerScript->Cache( currentFontDescription, fontId );
             }
           } // !isValidFont (3)
         } // !isValidFont (2)
index ff5e94d..afbeb23 100644 (file)
@@ -77,6 +77,12 @@ struct ValidateFontsPerScript
  */
 struct DefaultFonts
 {
+  struct CacheItem
+  {
+    TextAbstraction::FontDescription description;
+    FontId fontId ;
+  };
+
   /**
    * Default constructor.
    */
@@ -94,13 +100,18 @@ struct DefaultFonts
    * @brief Finds a default font for the given @p size.
    *
    * @param[in] fontClient The font client.
+   * @param[in] description The font's description.
    * @param[in] size The given size.
    *
    * @return The font id of a default font for the given @p size. If there isn't any font cached it returns 0.
    */
-  FontId FindFont( TextAbstraction::FontClient& fontClient, PointSize26Dot6 size ) const;
+  FontId FindFont( TextAbstraction::FontClient& fontClient,
+                   const TextAbstraction::FontDescription& description,
+                   PointSize26Dot6 size ) const;
+
+  void Cache( const TextAbstraction::FontDescription& description, FontId fontId );
 
-  Vector<FontId> mFonts;
+  std::vector<CacheItem> mFonts;
 };
 
 /**
@@ -141,7 +152,8 @@ public:
   void ValidateFonts( const Vector<Character>& text,
                       const Vector<ScriptRun>& scripts,
                       const Vector<FontDescriptionRun>& fontDescriptions,
-                      FontId defaultFontId,
+                      const TextAbstraction::FontDescription& defaultFontDescription,
+                      TextAbstraction::PointSize26Dot6 defaultFontPointSize,
                       CharacterIndex startIndex,
                       Length numberOfCharacters,
                       Vector<FontRun>& fonts );
index e612054..795e7ae 100644 (file)
@@ -62,7 +62,8 @@ void MultilanguageSupport::SetScripts( const Vector<Character>& text,
 void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
                                           const Vector<ScriptRun>& scripts,
                                           const Vector<FontDescriptionRun>& fontDescriptions,
-                                          FontId defaultFontId,
+                                          const TextAbstraction::FontDescription& defaultFontDescription,
+                                          TextAbstraction::PointSize26Dot6 defaultFontPointSize,
                                           CharacterIndex startIndex,
                                           Length numberOfCharacters,
                                           Vector<FontRun>& fonts )
@@ -70,7 +71,8 @@ void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
   GetImplementation( *this ).ValidateFonts( text,
                                             scripts,
                                             fontDescriptions,
-                                            defaultFontId,
+                                            defaultFontDescription,
+                                            defaultFontPointSize,
                                             startIndex,
                                             numberOfCharacters,
                                             fonts );
index d4fd1c7..718ecdb 100644 (file)
@@ -112,8 +112,9 @@ public:
    *
    * @param[in] text Vector of UTF-32 characters.
    * @param[in] scripts Vector containing the script runs for the whole text.
-   * @param[in] fontDescriptions The fonts set by the application developers.
-   * @param[in] defaultFontId The default font's id.
+   * @param[in] fontDescriptions The fonts set through the mark-up string or the input style set through the property system.
+   * @param[in] defaultFontDescription The default font's description set through the property system.
+   * @param[in] defaultFontPointSize The default font's point size set through the property system.
    * @param[in] startIndex The character from where the font info is set.
    * @param[in] numberOfCharacters The number of characters to set the font.
    * @param[out] fonts The validated fonts.
@@ -121,7 +122,8 @@ public:
   void ValidateFonts( const Vector<Character>& text,
                       const Vector<ScriptRun>& scripts,
                       const Vector<FontDescriptionRun>& fontDescriptions,
-                      FontId defaultFontId,
+                      const TextAbstraction::FontDescription& defaultFontDescription,
+                      TextAbstraction::PointSize26Dot6 defaultFontPointSize,
                       CharacterIndex startIndex,
                       Length numberOfCharacters,
                       Vector<FontRun>& fonts );
index 0fb2171..849eb26 100644 (file)
@@ -833,15 +833,22 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired )
       // Validate the fonts set through the mark-up string.
       Vector<FontDescriptionRun>& fontDescriptionRuns = mLogicalModel->mFontDescriptionRuns;
 
-      // Get the default font id.
-      const FontId defaultFontId = ( NULL == mFontDefaults ) ? 0u : mFontDefaults->GetFontId( mFontClient );
+      // Get the default font's description.
+      TextAbstraction::FontDescription defaultFontDescription;
+      TextAbstraction::PointSize26Dot6 defaultPointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
+      if( NULL != mFontDefaults )
+      {
+        defaultFontDescription = mFontDefaults->mFontDescription;
+        defaultPointSize = mFontDefaults->mDefaultPointSize * 64u;
+      }
 
       // Validates the fonts. If there is a character with no assigned font it sets a default one.
       // After this call, fonts are validated.
       multilanguageSupport.ValidateFonts( utf32Characters,
                                           scripts,
                                           fontDescriptionRuns,
-                                          defaultFontId,
+                                          defaultFontDescription,
+                                          defaultPointSize,
                                           startIndex,
                                           requestedNumberOfCharacters,
                                           validFonts );
index b97a419..f47fd54 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_TOOLKIT_TEXT_CONTROLLER_IMPL_H__
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -166,7 +166,6 @@ struct FontDefaults
 {
   FontDefaults()
   : mFontDescription(),
-    mFontStyle(),
     mDefaultPointSize( 0.f ),
     mFontId( 0u ),
     familyDefined( false ),
@@ -192,7 +191,6 @@ struct FontDefaults
   }
 
   TextAbstraction::FontDescription mFontDescription;  ///< The default font's description.
-  std::string                      mFontStyle;        ///< The font's style string set through the property system.
   float                            mDefaultPointSize; ///< The default font's point size.
   FontId                           mFontId;           ///< The font's id of the default font.
   bool familyDefined:1; ///< Whether the default font's family name is defined.
index c0f6d68..0b0b77d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -428,7 +428,7 @@ void Controller::SetDefaultFontFamily( const std::string& defaultFontFamily )
 
   mImpl->mFontDefaults->mFontDescription.family = defaultFontFamily;
   DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetDefaultFontFamily %s\n", defaultFontFamily.c_str());
-  mImpl->mFontDefaults->familyDefined = true;
+  mImpl->mFontDefaults->familyDefined = !defaultFontFamily.empty();
 
   // Clear the font-specific data
   ClearFontData();
@@ -446,26 +446,6 @@ const std::string& Controller::GetDefaultFontFamily() const
   return EMPTY_STRING;
 }
 
-void Controller::SetDefaultFontStyle( const std::string& style )
-{
-  if( NULL == mImpl->mFontDefaults )
-  {
-    mImpl->mFontDefaults = new FontDefaults();
-  }
-
-  mImpl->mFontDefaults->mFontStyle = style;
-}
-
-const std::string& Controller::GetDefaultFontStyle() const
-{
-  if( NULL != mImpl->mFontDefaults )
-  {
-    return mImpl->mFontDefaults->mFontStyle;
-  }
-
-  return EMPTY_STRING;
-}
-
 void Controller::SetDefaultFontWeight( FontWeight weight )
 {
   if( NULL == mImpl->mFontDefaults )
@@ -482,6 +462,11 @@ void Controller::SetDefaultFontWeight( FontWeight weight )
   mImpl->RequestRelayout();
 }
 
+bool Controller::IsDefaultFontWeightDefined() const
+{
+  return mImpl->mFontDefaults->weightDefined;
+}
+
 FontWeight Controller::GetDefaultFontWeight() const
 {
   if( NULL != mImpl->mFontDefaults )
@@ -508,6 +493,11 @@ void Controller::SetDefaultFontWidth( FontWidth width )
   mImpl->RequestRelayout();
 }
 
+bool Controller::IsDefaultFontWidthDefined() const
+{
+  return mImpl->mFontDefaults->widthDefined;
+}
+
 FontWidth Controller::GetDefaultFontWidth() const
 {
   if( NULL != mImpl->mFontDefaults )
@@ -534,6 +524,11 @@ void Controller::SetDefaultFontSlant( FontSlant slant )
   mImpl->RequestRelayout();
 }
 
+bool Controller::IsDefaultFontSlantDefined() const
+{
+  return mImpl->mFontDefaults->slantDefined;
+}
+
 FontSlant Controller::GetDefaultFontSlant() const
 {
   if( NULL != mImpl->mFontDefaults )
@@ -955,25 +950,6 @@ const std::string& Controller::GetInputFontFamily() const
   return GetDefaultFontFamily();
 }
 
-void Controller::SetInputFontStyle( const std::string& fontStyle )
-{
-  if( NULL != mImpl->mEventData )
-  {
-    mImpl->mEventData->mInputStyle.fontStyle = fontStyle;
-  }
-}
-
-const std::string& Controller::GetInputFontStyle() const
-{
-  if( NULL != mImpl->mEventData )
-  {
-    return mImpl->mEventData->mInputStyle.fontStyle;
-  }
-
-  // Return the default font's style if there is no EventData.
-  return GetDefaultFontStyle();
-}
-
 void Controller::SetInputFontWeight( FontWeight weight )
 {
   if( NULL != mImpl->mEventData )
@@ -1018,6 +994,18 @@ void Controller::SetInputFontWeight( FontWeight weight )
   }
 }
 
+bool Controller::IsInputFontWeightDefined() const
+{
+  bool defined = false;
+
+  if( NULL != mImpl->mEventData )
+  {
+    defined = mImpl->mEventData->mInputStyle.weightDefined;
+  }
+
+  return defined;
+}
+
 FontWeight Controller::GetInputFontWeight() const
 {
   if( NULL != mImpl->mEventData )
@@ -1072,6 +1060,18 @@ void Controller::SetInputFontWidth( FontWidth width )
   }
 }
 
+bool Controller::IsInputFontWidthDefined() const
+{
+  bool defined = false;
+
+  if( NULL != mImpl->mEventData )
+  {
+    defined = mImpl->mEventData->mInputStyle.widthDefined;
+  }
+
+  return defined;
+}
+
 FontWidth Controller::GetInputFontWidth() const
 {
   if( NULL != mImpl->mEventData )
@@ -1126,6 +1126,18 @@ void Controller::SetInputFontSlant( FontSlant slant )
   }
 }
 
+bool Controller::IsInputFontSlantDefined() const
+{
+  bool defined = false;
+
+  if( NULL != mImpl->mEventData )
+  {
+    defined = mImpl->mEventData->mInputStyle.slantDefined;
+  }
+
+  return defined;
+}
+
 FontSlant Controller::GetInputFontSlant() const
 {
   if( NULL != mImpl->mEventData )
index ad5c09a..7b1e2ba 100644 (file)
@@ -2,7 +2,7 @@
 #define __DALI_TOOLKIT_TEXT_CONTROLLER_H__
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -305,22 +305,6 @@ public:
   const std::string& GetDefaultFontFamily() const;
 
   /**
-   * @brief Sets the font's style string.
-   *
-   * @note The style set may be changed by the underlying font system. The string is stored to be recovered.
-   *
-   * @param[in] style The font's style string.
-   */
-  void SetDefaultFontStyle( const std::string& style );
-
-  /**
-   * @brief Retrieves the font's style.
-   *
-   * @return The font's style.
-   */
-  const std::string& GetDefaultFontStyle() const;
-
-  /**
    * @brief Sets the default font weight.
    *
    * @param[in] weight The font weight.
@@ -328,6 +312,11 @@ public:
   void SetDefaultFontWeight( FontWeight weight );
 
   /**
+   * @brief Whether the font's weight has been defined.
+   */
+  bool IsDefaultFontWeightDefined() const;
+
+  /**
    * @brief Retrieves the default font weight.
    *
    * @return The default font weight.
@@ -342,6 +331,11 @@ public:
   void SetDefaultFontWidth( FontWidth width );
 
   /**
+   * @brief Whether the font's width has been defined.
+   */
+  bool IsDefaultFontWidthDefined() const;
+
+  /**
    * @brief Retrieves the default font width.
    *
    * @return The default font width.
@@ -356,6 +350,11 @@ public:
   void SetDefaultFontSlant( FontSlant slant );
 
   /**
+   * @brief Whether the font's slant has been defined.
+   */
+  bool IsDefaultFontSlantDefined() const;
+
+  /**
    * @brief Retrieves the default font slant.
    *
    * @return The default font slant.
@@ -587,20 +586,6 @@ public:
   const std::string& GetInputFontFamily() const;
 
   /**
-   * @brief Sets the input text's font style.
-   *
-   * @param[in] fontStyle The input text's font style.
-   */
-  void SetInputFontStyle( const std::string& fontStyle );
-
-  /**
-   * @brief Retrieves the input text's font style.
-   *
-   * @return The input text's font style.
-   */
-  const std::string& GetInputFontStyle() const;
-
-  /**
    * @brief Sets the input font's weight.
    *
    * @param[in] weight The input font's weight.
@@ -608,6 +593,11 @@ public:
   void SetInputFontWeight( FontWeight weight );
 
   /**
+   * @return Whether the font's weight has been defined.
+   */
+  bool IsInputFontWeightDefined() const;
+
+  /**
    * @brief Retrieves the input font's weight.
    *
    * @return The input font's weight.
@@ -622,6 +612,11 @@ public:
   void SetInputFontWidth( FontWidth width );
 
   /**
+   * @return Whether the font's width has been defined.
+   */
+  bool IsInputFontWidthDefined() const;
+
+  /**
    * @brief Retrieves the input font's width.
    *
    * @return The input font's width.
@@ -636,6 +631,11 @@ public:
   void SetInputFontSlant( FontSlant slant );
 
   /**
+   * @return Whether the font's slant has been defined.
+   */
+  bool IsInputFontSlantDefined() const;
+
+  /**
    * @brief Retrieves the input font's slant.
    *
    * @return The input font's slant.
index b31decb..6fff87e 100644 (file)
@@ -53,22 +53,6 @@ void SetFontStyleProperty( ControllerPtr controller, const Property::Value& valu
     const std::string style = value.Get< std::string >();
     DALI_LOG_INFO( gLogFilter, Debug::General, "Text Control %p FONT_STYLE %s\n", controller.Get(), style.c_str() );
 
-    switch( type )
-    {
-      case FontStyle::DEFAULT:
-      {
-        // Stores the default font's style string to be recovered by the GetFontStyleProperty() function.
-        controller->SetDefaultFontStyle( style );
-        break;
-      }
-      case FontStyle::INPUT:
-      {
-        // Stores the input font's style string to be recovered by the GetFontStyleProperty() function.
-        controller->SetInputFontStyle( style );
-        break;
-      }
-    }
-
     // Parses and applies the style.
     Property::Map map;
     ParsePropertyString( style, map );
@@ -78,7 +62,7 @@ void SetFontStyleProperty( ControllerPtr controller, const Property::Value& valu
       /// Weight key
       Property::Value* weightValue = map.Find( WEIGHT_KEY );
 
-      FontWeight weight = TextAbstraction::FontWeight::NORMAL;
+      FontWeight weight = TextAbstraction::FontWeight::NONE;
       const bool weightDefined = weightValue != NULL;
       if( weightDefined )
       {
@@ -93,7 +77,7 @@ void SetFontStyleProperty( ControllerPtr controller, const Property::Value& valu
       /// Width key
       Property::Value* widthValue = map.Find( WIDTH_KEY );
 
-      FontWidth width = TextAbstraction::FontWidth::NORMAL;
+      FontWidth width = TextAbstraction::FontWidth::NONE;
       const bool widthDefined = widthValue != NULL;
       if( widthDefined )
       {
@@ -108,7 +92,7 @@ void SetFontStyleProperty( ControllerPtr controller, const Property::Value& valu
       /// Slant key
       Property::Value* slantValue = map.Find( SLANT_KEY );
 
-      FontSlant slant = TextAbstraction::FontSlant::NORMAL;
+      FontSlant slant = TextAbstraction::FontSlant::NONE;
       const bool slantDefined = slantValue != NULL;
       if( slantDefined )
       {
@@ -125,17 +109,20 @@ void SetFontStyleProperty( ControllerPtr controller, const Property::Value& valu
         case FontStyle::DEFAULT:
         {
           // Sets the default font's style values.
-          if( weightDefined && ( controller->GetDefaultFontWeight() != weight ) )
+          if( !weightDefined ||
+              ( weightDefined && ( controller->GetDefaultFontWeight() != weight ) ) )
           {
             controller->SetDefaultFontWeight( weight );
           }
 
-          if( widthDefined && ( controller->GetDefaultFontWidth() != width ) )
+          if( !widthDefined ||
+              ( widthDefined && ( controller->GetDefaultFontWidth() != width ) ) )
           {
             controller->SetDefaultFontWidth( width );
           }
 
-          if( slantDefined && ( controller->GetDefaultFontSlant() != slant ) )
+          if( !slantDefined ||
+              ( slantDefined && ( controller->GetDefaultFontSlant() != slant ) ) )
           {
             controller->SetDefaultFontSlant( slant );
           }
@@ -144,43 +131,175 @@ void SetFontStyleProperty( ControllerPtr controller, const Property::Value& valu
         case FontStyle::INPUT:
         {
           // Sets the input font's style values.
-          if( weightDefined && ( controller->GetInputFontWeight() != weight ) )
+          if( !weightDefined ||
+              ( weightDefined && ( controller->GetInputFontWeight() != weight ) ) )
           {
             controller->SetInputFontWeight( weight );
           }
 
-          if( widthDefined && ( controller->GetInputFontWidth() != width ) )
+          if( !widthDefined ||
+              ( widthDefined && ( controller->GetInputFontWidth() != width ) ) )
           {
             controller->SetInputFontWidth( width );
           }
 
-          if( slantDefined && ( controller->GetInputFontSlant() != slant ) )
+          if( !slantDefined ||
+              ( slantDefined && ( controller->GetInputFontSlant() != slant ) ) )
           {
             controller->SetInputFontSlant( slant );
           }
           break;
         }
-      }
-    }
-  }
+      } // switch
+    } // map not empty
+    else
+    {
+      switch( type )
+      {
+        case FontStyle::DEFAULT:
+        {
+          controller->SetDefaultFontWeight( TextAbstraction::FontWeight::NONE );
+          controller->SetDefaultFontWidth( TextAbstraction::FontWidth::NONE );
+          controller->SetDefaultFontSlant( TextAbstraction::FontSlant::NONE );
+          break;
+        }
+        case FontStyle::INPUT:
+        {
+          controller->SetInputFontWeight( TextAbstraction::FontWeight::NONE );
+          controller->SetInputFontWidth( TextAbstraction::FontWidth::NONE );
+          controller->SetInputFontSlant( TextAbstraction::FontSlant::NONE );
+          break;
+        }
+      } // switch
+    } // map.Empty()
+  } // controller
 }
 
 void GetFontStyleProperty( ControllerPtr controller, Property::Value& value, FontStyle::Type type )
 {
   if( controller )
   {
-    switch( type )
+    const bool isDefaultStyle = FontStyle::DEFAULT == type;
+
+    bool weightDefined = false;
+    bool widthDefined = false;
+    bool slantDefined = false;
+    FontWeight weight = TextAbstraction::FontWeight::NONE;
+    FontWidth width = TextAbstraction::FontWidth::NONE;
+    FontSlant slant = TextAbstraction::FontSlant::NONE;
+
+    if( isDefaultStyle )
+    {
+      weightDefined = controller->IsDefaultFontWeightDefined();
+      widthDefined = controller->IsDefaultFontWidthDefined();
+      slantDefined = controller->IsDefaultFontSlantDefined();
+
+      if( weightDefined )
+      {
+        weight = controller->GetDefaultFontWeight();
+      }
+
+      if( widthDefined )
+      {
+        width = controller->GetDefaultFontWidth();
+      }
+
+      if( slantDefined )
+      {
+        slant = controller->GetDefaultFontSlant();
+      }
+    }
+    else
+    {
+      weightDefined = controller->IsInputFontWeightDefined();
+      widthDefined = controller->IsInputFontWidthDefined();
+      slantDefined = controller->IsInputFontSlantDefined();
+
+      if( weightDefined )
+      {
+        weight = controller->GetInputFontWeight();
+      }
+
+      if( widthDefined )
+      {
+        width = controller->GetInputFontWidth();
+      }
+
+      if( slantDefined )
+      {
+        slant = controller->GetInputFontSlant();
+      }
+    }
+
+    if( weightDefined || widthDefined || slantDefined )
     {
-      case FontStyle::DEFAULT:
+      std::string styleString("{");
+      if( weightDefined )
+      {
+        if( TextAbstraction::FontWeight::NONE != weight )
+        {
+          const std::string weightStr( GetEnumerationName( weight,
+                                                           FONT_WEIGHT_STRING_TABLE,
+                                                           FONT_WEIGHT_STRING_TABLE_COUNT ) );
+
+          styleString += "\"weight\":\"" + weightStr + "\"";
+        }
+        else
+        {
+          weightDefined = false;
+        }
+      }
+
+      if( widthDefined )
+      {
+        if( TextAbstraction::FontWidth::NONE != width )
+        {
+          const std::string widthStr( GetEnumerationName( width,
+                                                          FONT_WIDTH_STRING_TABLE,
+                                                          FONT_WIDTH_STRING_TABLE_COUNT ) );
+
+          if( weightDefined )
+          {
+            styleString += ",";
+          }
+          styleString += "\"width\":\"" + widthStr + "\"";
+        }
+        else
+        {
+          widthDefined = false;
+        }
+      }
+
+      if( slantDefined )
       {
-        value = controller->GetDefaultFontStyle();
-        break;
+        if( TextAbstraction::FontSlant::NONE != slant )
+        {
+          const std::string slantStr( GetEnumerationName( slant,
+                                                          FONT_SLANT_STRING_TABLE,
+                                                          FONT_SLANT_STRING_TABLE_COUNT ) );
+
+          if( weightDefined || widthDefined )
+          {
+            styleString += ",";
+          }
+          styleString += "\"slant\":\"" + slantStr + "\"";
+        }
+        else
+        {
+          slantDefined = false;
+        }
       }
-      case FontStyle::INPUT:
+
+      if( weightDefined || widthDefined || slantDefined )
       {
-        value = controller->GetInputFontStyle();
-        break;
+        styleString += "}";
       }
+      else
+      {
+        styleString.clear();
+      }
+
+      value = styleString;
     }
   }
 }
index 12bfdad..5e24418 100644 (file)
@@ -88,9 +88,8 @@ const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
 
 } //unnamed namespace
 
-BatchImageVisual::BatchImageVisual( VisualFactoryCache& factoryCache, ImageAtlasManager& atlasManager )
+BatchImageVisual::BatchImageVisual( VisualFactoryCache& factoryCache )
   : Visual::Base( factoryCache ),
-    mAtlasManager( atlasManager ),
     mDesiredSize()
 {
 }
@@ -191,7 +190,7 @@ void BatchImageVisual::InitializeRenderer( const std::string& imageUrl )
   {
     if( !mImpl->mRenderer )
     {
-      TextureSet textureSet = mAtlasManager.Add(
+      TextureSet textureSet = mFactoryCache.GetAtlasManager()->Add(
             mAtlasRect,
             imageUrl,
             mDesiredSize );
@@ -281,7 +280,7 @@ void BatchImageVisual::CleanCache(const std::string& url)
   mImpl->mRenderer.Reset();
   if( mFactoryCache.CleanRendererCache( url ) )
   {
-    mAtlasManager.Remove( textureSet, mAtlasRect );
+    mFactoryCache.GetAtlasManager()->Remove( textureSet, mAtlasRect );
   }
 }
 
index 750e28f..71f85f9 100644 (file)
@@ -40,9 +40,8 @@ public:
    * @brief Constructor.
    *
    * @param[in] factoryCache The VisualFactoryCache object
-   * @param[in] atlasManager The atlasManager object
    */
-  BatchImageVisual( VisualFactoryCache& factoryCache, ImageAtlasManager& atlasManager );
+  BatchImageVisual( VisualFactoryCache& factoryCache );
 
   /**
    * @brief A reference counted object may only be deleted by calling Unreference().
@@ -110,7 +109,6 @@ private:
 
 private:
 
-  ImageAtlasManager&      mAtlasManager;
   Vector4                 mAtlasRect;
   std::string             mImageUrl;
   Dali::ImageDimensions   mDesiredSize;
index e430c7b..6d980f6 100644 (file)
@@ -57,6 +57,8 @@ const char * const IMAGE_FITTING_MODE( "fittingMode" );
 const char * const IMAGE_SAMPLING_MODE( "samplingMode" );
 const char * const IMAGE_DESIRED_WIDTH( "desiredWidth" );
 const char * const IMAGE_DESIRED_HEIGHT( "desiredHeight" );
+const char * const IMAGE_WRAP_MODE_U("wrapModeU");
+const char * const IMAGE_WRAP_MODE_V("wrapModeV");
 const char * const SYNCHRONOUS_LOADING( "synchronousLoading" );
 const char * const BATCHING_ENABLED( "batchingEnabled" );
 
@@ -80,7 +82,16 @@ DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::SamplingMode, NO_FILTER )
 DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::SamplingMode, DONT_CARE )
 DALI_ENUM_TO_STRING_TABLE_END( SAMPLING_MODE )
 
+// wrap modes
+DALI_ENUM_TO_STRING_TABLE_BEGIN( WRAP_MODE )
+DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::WrapMode, DEFAULT )
+DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::WrapMode, CLAMP_TO_EDGE )
+DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::WrapMode, REPEAT )
+DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::WrapMode, MIRRORED_REPEAT )
+DALI_ENUM_TO_STRING_TABLE_END( WRAP_MODE )
+
 const std::string PIXEL_AREA_UNIFORM_NAME = "pixelArea";
+const std::string WRAP_MODE_UNIFORM_NAME = "wrapMode";
 
 const Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f);
 
@@ -90,7 +101,6 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
   attribute mediump vec2 aPosition;\n
   uniform mediump mat4 uMvpMatrix;\n
   uniform mediump vec3 uSize;\n
-  uniform mediump vec4 uAtlasRect;\n
   uniform mediump vec4 pixelArea;
   varying mediump vec2 vTexCoord;\n
   \n
@@ -100,12 +110,12 @@ const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
     vertexPosition.xyz *= uSize;\n
     vertexPosition = uMvpMatrix * vertexPosition;\n
     \n
-    vTexCoord = mix( uAtlasRect.xy, uAtlasRect.zw, pixelArea.xy+pixelArea.zw*(aPosition + vec2(0.5) ) );\n
+    vTexCoord = pixelArea.xy+pixelArea.zw*(aPosition + vec2(0.5) );\n
     gl_Position = vertexPosition;\n
   }\n
 );
 
-const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
+const char* FRAGMENT_SHADER_NO_ATLAS = DALI_COMPOSE_SHADER(
   varying mediump vec2 vTexCoord;\n
   uniform sampler2D sTexture;\n
   uniform lowp vec4 uColor;\n
@@ -116,6 +126,42 @@ const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
   }\n
 );
 
+const char* FRAGMENT_SHADER_ATLAS_CLAMP = DALI_COMPOSE_SHADER(
+    varying mediump vec2 vTexCoord;\n
+    uniform sampler2D sTexture;\n
+    uniform mediump vec4 uAtlasRect;\n
+    uniform lowp vec4 uColor;\n
+    \n
+    void main()\n
+    {\n
+      mediump vec2 texCoord = mix( uAtlasRect.xy, uAtlasRect.zw, clamp( vTexCoord, 0.0, 1.0 ) );\n
+      gl_FragColor = texture2D( sTexture, texCoord ) * uColor;\n
+    }\n
+);
+
+const char* FRAGMENT_SHADER_ATLAS_VARIOUS_WRAP = DALI_COMPOSE_SHADER(
+    varying mediump vec2 vTexCoord;\n
+    uniform sampler2D sTexture;\n
+    uniform mediump vec4 uAtlasRect;\n
+    // WrapMode -- 0: CLAMP; 1: REPEAT; 2: REFLECT;
+    uniform lowp vec2 wrapMode;\n
+    uniform lowp vec4 uColor;\n
+    \n
+    mediump float wrapCoordinate( mediump float coordinate, lowp float wrap )\n
+    {\n
+      if( abs(wrap-2.0) < 0.5 )\n // REFLECT
+        return 1.0-abs(fract(coordinate*0.5)*2.0 - 1.0);\n
+      else \n// warp == 0 or 1
+        return mix( clamp( coordinate, 0.0, 1.0 ), fract( coordinate ), wrap);\n
+    }\n
+    void main()\n
+    {\n
+      mediump vec2 texCoord = mix( uAtlasRect.xy, uAtlasRect.zw,
+                              vec2( wrapCoordinate( vTexCoord.x, wrapMode.x ), wrapCoordinate( vTexCoord.y, wrapMode.y ) ) );\n
+      gl_FragColor = texture2D( sTexture, texCoord ) * uColor;\n
+    }\n
+);
+
 Geometry CreateGeometry( VisualFactoryCache& factoryCache, ImageDimensions gridSize )
 {
   Geometry geometry;
@@ -139,12 +185,14 @@ Geometry CreateGeometry( VisualFactoryCache& factoryCache, ImageDimensions gridS
 
 } //unnamed namespace
 
-ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, ImageAtlasManager& atlasManager )
+ImageVisual::ImageVisual( VisualFactoryCache& factoryCache )
 : Visual::Base( factoryCache ),
-  mAtlasManager( atlasManager ),
+  mPixelArea( FULL_TEXTURE_RECT ),
   mDesiredSize(),
   mFittingMode( FittingMode::DEFAULT ),
   mSamplingMode( SamplingMode::DEFAULT ),
+  mWrapModeU( WrapMode::DEFAULT ),
+  mWrapModeV( WrapMode::DEFAULT ),
   mNativeFragmentShaderCode( ),
   mNativeImageFlag( false )
 {
@@ -193,6 +241,24 @@ void ImageVisual::DoInitialize( Actor& actor, const Property::Map& propertyMap )
       desiredHeightValue->Get( desiredHeight );
     }
 
+    Property::Value* pixelAreaValue = propertyMap.Find( Toolkit::ImageVisual::Property::PIXEL_AREA, PIXEL_AREA_UNIFORM_NAME );
+    if( pixelAreaValue )
+    {
+      pixelAreaValue->Get( mPixelArea );
+    }
+
+    Property::Value* wrapModeValueU = propertyMap.Find( Toolkit::ImageVisual::Property::WRAP_MODE_U, IMAGE_WRAP_MODE_U );
+    if( wrapModeValueU )
+    {
+      Scripting::GetEnumerationProperty( *wrapModeValueU, WRAP_MODE_TABLE, WRAP_MODE_TABLE_COUNT, mWrapModeU );
+    }
+
+    Property::Value* wrapModeValueV = propertyMap.Find( Toolkit::ImageVisual::Property::WRAP_MODE_V, IMAGE_WRAP_MODE_V );
+    if( wrapModeValueV )
+    {
+      Scripting::GetEnumerationProperty( *wrapModeValueV, WRAP_MODE_TABLE, WRAP_MODE_TABLE_COUNT, mWrapModeV );
+    }
+
     mDesiredSize = ImageDimensions( desiredWidth, desiredHeight );
   }
 
@@ -245,11 +311,6 @@ void ImageVisual::DoInitialize( Actor& actor, const Property::Map& propertyMap )
   }
 }
 
-void ImageVisual::SetSize( const Vector2& size )
-{
-  Visual::Base::SetSize( size );
-}
-
 void ImageVisual::GetNaturalSize( Vector2& naturalSize ) const
 {
   if(mImage)
@@ -275,15 +336,6 @@ void ImageVisual::GetNaturalSize( Vector2& naturalSize ) const
   naturalSize = Vector2::ZERO;
 }
 
-void ImageVisual::SetClipRect( const Rect<int>& clipRect )
-{
-  Visual::Base::SetClipRect( clipRect );
-}
-
-void ImageVisual::SetOffset( const Vector2& offset )
-{
-}
-
 Renderer ImageVisual::CreateRenderer() const
 {
   Geometry geometry;
@@ -300,23 +352,24 @@ Renderer ImageVisual::CreateRenderer() const
   {
     geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) );
 
-    shader = GetImageShader(mFactoryCache);
+    shader = GetImageShader( mFactoryCache,
+                             mImpl->mFlags & Impl::IS_ATLASING_APPLIED,
+                             mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE );
   }
   else
   {
     geometry = CreateGeometry( mFactoryCache, mImpl->mCustomShader->mGridSize );
     if( mImpl->mCustomShader->mVertexShader.empty() && mImpl->mCustomShader->mFragmentShader.empty() )
     {
-      shader = GetImageShader(mFactoryCache);
+      shader = GetImageShader(mFactoryCache, false, true);
     }
     else
     {
       shader  = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? VERTEX_SHADER : mImpl->mCustomShader->mVertexShader,
-                             mImpl->mCustomShader->mFragmentShader.empty() ? FRAGMENT_SHADER : mImpl->mCustomShader->mFragmentShader,
+                             mImpl->mCustomShader->mFragmentShader.empty() ? FRAGMENT_SHADER_NO_ATLAS : mImpl->mCustomShader->mFragmentShader,
                              mImpl->mCustomShader->mHints );
       if( mImpl->mCustomShader->mVertexShader.empty() )
       {
-        shader.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT );
         shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT );
       }
     }
@@ -337,7 +390,6 @@ Renderer ImageVisual::CreateNativeImageRenderer() const
     geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) );
 
     shader  = Shader::New( VERTEX_SHADER, mNativeFragmentShaderCode );
-    shader.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT );
     shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT );
   }
   else
@@ -348,7 +400,6 @@ Renderer ImageVisual::CreateNativeImageRenderer() const
                            mImpl->mCustomShader->mHints );
     if( mImpl->mCustomShader->mVertexShader.empty() )
     {
-      shader.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT );
       shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT );
     }
   }
@@ -356,7 +407,6 @@ Renderer ImageVisual::CreateNativeImageRenderer() const
   TextureSet textureSet = TextureSet::New();
   Renderer renderer = Renderer::New( geometry, shader );
   renderer.SetTextures( textureSet );
-
   return renderer;
 }
 
@@ -383,7 +433,7 @@ Image ImageVisual::LoadImage( const std::string& url, bool synchronousLoading )
     if( !mPixels )
     {
       // use broken image
-      return VisualFactory::GetBrokenVisualImage();
+      return VisualFactoryCache::GetBrokenVisualImage();
     }
     Atlas image = Atlas::New( mPixels.GetWidth(), mPixels.GetHeight(), mPixels.GetPixelFormat() );
     image.Upload( mPixels, 0, 0 );
@@ -407,13 +457,15 @@ TextureSet ImageVisual::CreateTextureSet( Vector4& textureRect, const std::strin
     {
       // use broken image
       textureSet = TextureSet::New();
-      TextureSetImage( textureSet, 0u, VisualFactory::GetBrokenVisualImage() );
+      TextureSetImage( textureSet, 0u, VisualFactoryCache::GetBrokenVisualImage() );
     }
     else
     {
-      textureSet = mAtlasManager.Add(textureRect, mPixels );
+      textureSet = mFactoryCache.GetAtlasManager()->Add(textureRect, mPixels );
+      mImpl->mFlags |= Impl::IS_ATLASING_APPLIED;
       if( !textureSet ) // big image, no atlasing
       {
+        mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED;
         Atlas image = Atlas::New( mPixels.GetWidth(), mPixels.GetHeight(), mPixels.GetPixelFormat() );
         image.Upload( mPixels, 0, 0 );
         textureSet = TextureSet::New();
@@ -423,9 +475,11 @@ TextureSet ImageVisual::CreateTextureSet( Vector4& textureRect, const std::strin
   }
   else
   {
-    textureSet = mAtlasManager.Add(textureRect, url, mDesiredSize, mFittingMode, mSamplingMode );
+    textureSet = mFactoryCache.GetAtlasManager()->Add(textureRect, url, mDesiredSize, mFittingMode, mSamplingMode );
+    mImpl->mFlags |= Impl::IS_ATLASING_APPLIED;
     if( !textureSet ) // big image, no atlasing
     {
+      mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED;
       ResourceImage resourceImage = Dali::ResourceImage::New( url, mDesiredSize, mFittingMode, mSamplingMode );
       resourceImage.LoadingFinishedSignal().Connect( this, &ImageVisual::OnImageLoaded );
       textureSet = TextureSet::New();
@@ -433,6 +487,13 @@ TextureSet ImageVisual::CreateTextureSet( Vector4& textureRect, const std::strin
     }
   }
 
+  if( !(mImpl->mFlags & Impl::IS_ATLASING_APPLIED) )
+  {
+    Sampler sampler = Sampler::New();
+    sampler.SetWrapMode(  mWrapModeU, mWrapModeV  );
+    textureSet.SetSampler( 0u, sampler );
+  }
+
   return textureSet;
 }
 
@@ -450,28 +511,46 @@ void ImageVisual::InitializeRenderer( const std::string& imageUrl )
       ( strncasecmp( imageUrl.c_str(), HTTP_URL,  sizeof(HTTP_URL)  -1 ) != 0 ) && // ignore remote images
       ( strncasecmp( imageUrl.c_str(), HTTPS_URL, sizeof(HTTPS_URL) -1 ) != 0 ) )
   {
-    mImpl->mRenderer = mFactoryCache.GetRenderer( imageUrl );
-    if( !mImpl->mRenderer )
+    bool defaultWrapMode = mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE;
+    bool cacheable =  defaultWrapMode &&  mPixelArea == FULL_TEXTURE_RECT;
+
+    mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
+    if( cacheable ) // fetch the renderer from cache if exist
+    {
+      mImpl->mRenderer = mFactoryCache.GetRenderer( imageUrl );
+      mImpl->mFlags |= Impl::IS_FROM_CACHE;
+    }
+
+    if( !mImpl->mRenderer ) // new renderer is needed
     {
       Vector4 atlasRect;
       TextureSet textureSet = CreateTextureSet(atlasRect, imageUrl, IsSynchronousResourceLoading() );
       Geometry geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) );
-      Shader shader( GetImageShader(mFactoryCache) );
+      Shader shader( GetImageShader(mFactoryCache, mImpl->mFlags & Impl::IS_ATLASING_APPLIED, defaultWrapMode) );
       mImpl->mRenderer = Renderer::New( geometry, shader );
       mImpl->mRenderer.SetTextures( textureSet );
-      if( atlasRect != FULL_TEXTURE_RECT )
+
+      if( mImpl->mFlags & Impl::IS_ATLASING_APPLIED ) // the texture is packed inside atlas
       {
         mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect );
+        if( !defaultWrapMode ) // custom wrap mode, renderer is not cached.
+        {
+          Vector2 wrapMode(mWrapModeU-WrapMode::CLAMP_TO_EDGE, mWrapModeV-WrapMode::CLAMP_TO_EDGE);
+          wrapMode.Clamp( Vector2::ZERO, Vector2( 2.f, 2.f ) );
+          mImpl->mRenderer.RegisterProperty( WRAP_MODE_UNIFORM_NAME, wrapMode );
+        }
       }
-      mFactoryCache.SaveRenderer( imageUrl, mImpl->mRenderer );
-    }
 
-    mImpl->mFlags |= Impl::IS_FROM_CACHE;
+      // save the renderer to cache only when default wrap mode and default pixel area is used
+      if( cacheable )
+      {
+        mFactoryCache.SaveRenderer( imageUrl, mImpl->mRenderer );
+      }
+    }
   }
   else
   {
     // for custom shader or remote image, renderer is not cached and atlas is not applied
-
     mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
     mImpl->mRenderer = CreateRenderer();
     Image image = LoadImage( imageUrl, IsSynchronousResourceLoading() );
@@ -501,6 +580,11 @@ void ImageVisual::DoSetOnStage( Actor& actor )
   {
     InitializeRenderer( mImage );
   }
+
+  if( mPixelArea != FULL_TEXTURE_RECT )
+  {
+    mImpl->mRenderer.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, mPixelArea );
+  }
 }
 
 void ImageVisual::DoSetOffStage( Actor& actor )
@@ -546,18 +630,46 @@ void ImageVisual::DoCreatePropertyMap( Property::Map& map ) const
 
   map.Insert( Toolkit::ImageVisual::Property::FITTING_MODE, mFittingMode );
   map.Insert( Toolkit::ImageVisual::Property::SAMPLING_MODE, mSamplingMode );
+
+  map.Insert( Toolkit::ImageVisual::Property::PIXEL_AREA, mPixelArea );
+  map.Insert( Toolkit::ImageVisual::Property::WRAP_MODE_U, mWrapModeU );
+  map.Insert( Toolkit::ImageVisual::Property::WRAP_MODE_V, mWrapModeV );
 }
 
-Shader ImageVisual::GetImageShader( VisualFactoryCache& factoryCache )
+Shader ImageVisual::GetImageShader( VisualFactoryCache& factoryCache, bool atlasing, bool defaultTextureWrapping )
 {
-  Shader shader = factoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER );
-  if( !shader )
+  Shader shader;
+  if( atlasing )
   {
-    shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
-    factoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER, shader );
-    shader.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT );
-    shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT );
+    if( defaultTextureWrapping )
+    {
+      shader = factoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP );
+      if( !shader )
+      {
+        shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_CLAMP );
+        factoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP, shader );
+      }
+    }
+    else
+    {
+      shader = factoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_CUSTOM_WRAP );
+      if( !shader )
+      {
+        shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_VARIOUS_WRAP );
+        factoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_CUSTOM_WRAP, shader );
+      }
+    }
+  }
+  else
+  {
+    shader = factoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER );
+    if( !shader )
+    {
+      shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_NO_ATLAS );
+      factoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER, shader );
+    }
   }
+  shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT );
   return shader;
 }
 
@@ -697,6 +809,9 @@ void ImageVisual::ApplyImageToSampler( const Image& image )
       mImpl->mRenderer.SetTextures( textureSet );
     }
     TextureSetImage( textureSet, 0u, image );
+    Sampler sampler = Sampler::New();
+    sampler.SetWrapMode(  mWrapModeU, mWrapModeV  );
+    textureSet.SetSampler( 0u, sampler );
   }
 }
 
@@ -704,7 +819,7 @@ void ImageVisual::OnImageLoaded( ResourceImage image )
 {
   if( image.GetLoadingState() == Dali::ResourceLoadingFailed )
   {
-    Image brokenImage = VisualFactory::GetBrokenVisualImage();
+    Image brokenImage = VisualFactoryCache::GetBrokenVisualImage();
     if( mImpl->mRenderer )
     {
       ApplyImageToSampler( brokenImage );
@@ -727,7 +842,7 @@ void ImageVisual::CleanCache(const std::string& url)
   mImpl->mRenderer.Reset();
   if( mFactoryCache.CleanRendererCache( url ) && index != Property::INVALID_INDEX )
   {
-    mAtlasManager.Remove( textureSet, atlasRect );
+    mFactoryCache.GetAtlasManager()->Remove( textureSet, atlasRect );
   }
 }
 
@@ -748,7 +863,7 @@ void ImageVisual::SetNativeFragmentShaderCode( Dali::NativeImage& nativeImage )
   }
   else
   {
-    mNativeFragmentShaderCode += FRAGMENT_SHADER;
+    mNativeFragmentShaderCode += FRAGMENT_SHADER_NO_ATLAS;
   }
 
   if( customSamplerTypename )
index baad92f..64b3f4b 100644 (file)
@@ -20,7 +20,6 @@
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
-#include <dali-toolkit/internal/visuals/image-atlas-manager.h>
 
 // EXTERNAL INCLUDES
 #include <dali/public-api/images/image.h>
@@ -81,9 +80,8 @@ public:
    * @brief Constructor.
    *
    * @param[in] factoryCache The VisualFactoryCache object
-   * @param[in] atlasManager The atlasManager object
    */
-  ImageVisual( VisualFactoryCache& factoryCache, ImageAtlasManager& atlasManager );
+  ImageVisual( VisualFactoryCache& factoryCache );
 
   /**
    * @brief A reference counted object may only be deleted by calling Unreference().
@@ -93,26 +91,11 @@ public:
 public:  // from Visual
 
   /**
-   * @copydoc Visual::SetSize
-   */
-  virtual void SetSize( const Vector2& size );
-
-  /**
    * @copydoc Visual::GetNaturalSize
    */
   virtual void GetNaturalSize( Vector2& naturalSize ) const;
 
   /**
-   * @copydoc Visual::SetClipRect
-   */
-  virtual void SetClipRect( const Rect<int>& clipRect );
-
-  /**
-   * @copydoc Visual::SetOffset
-   */
-  virtual void SetOffset( const Vector2& offset );
-
-  /**
    * @copydoc Visual::CreatePropertyMap
    */
   virtual void DoCreatePropertyMap( Property::Map& map ) const;
@@ -138,8 +121,10 @@ public:
   /**
    * Get the standard image rendering shader.
    * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
+   * @param[in] atlasing Whether texture atlasing is applied.
+   * @param[in] defaultTextureWrapping Whether the default texture wrap mode is applied.
    */
-  static Shader GetImageShader( VisualFactoryCache& factoryCache );
+  static Shader GetImageShader( VisualFactoryCache& factoryCache, bool atlasing, bool defaultTextureWrapping );
 
   /**
    * @brief Sets the image of this visual to the resource at imageUrl
@@ -252,13 +237,15 @@ private:
 
 private:
   Image mImage;
-  ImageAtlasManager& mAtlasManager;
   PixelData mPixels;
+  Vector4 mPixelArea;
 
   std::string mImageUrl;
   Dali::ImageDimensions mDesiredSize;
   Dali::FittingMode::Type mFittingMode;
   Dali::SamplingMode::Type mSamplingMode;
+  Dali::WrapMode::Type mWrapModeU;
+  Dali::WrapMode::Type mWrapModeV;
 
   std::string mNativeFragmentShaderCode;
   bool mNativeImageFlag;
index fb13383..7ef3a6e 100644 (file)
@@ -522,7 +522,7 @@ void NPatchVisual::InitializeFromImage( NinePatchImage nPatch )
 
 void NPatchVisual::InitializeFromBrokenImage()
 {
-  mCroppedImage = VisualFactory::GetBrokenVisualImage();
+  mCroppedImage = VisualFactoryCache::GetBrokenVisualImage();
   mImageSize = ImageDimensions( mCroppedImage.GetWidth(), mCroppedImage.GetHeight() );
 
   mStretchPixelsX.Clear();
index f73df9f..4179d4d 100644 (file)
@@ -31,6 +31,7 @@
 #include <dali-toolkit/third-party/nanosvg/nanosvg.h>
 #include <dali-toolkit/internal/visuals/svg/svg-rasterize-thread.h>
 #include <dali-toolkit/internal/visuals/image/image-visual.h>
+#include <dali-toolkit/internal/visuals/image-atlas-manager.h>
 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
@@ -52,10 +53,9 @@ namespace Toolkit
 namespace Internal
 {
 
-SvgVisual::SvgVisual( VisualFactoryCache& factoryCache, ImageAtlasManager& atlasManager )
+SvgVisual::SvgVisual( VisualFactoryCache& factoryCache )
 : Visual::Base( factoryCache ),
   mAtlasRect( FULL_TEXTURE_RECT ),
-  mAtlasManager( atlasManager ),
   mParsedImage( NULL )
 {
   // the rasterized image is with pre-multiplied alpha format
@@ -94,7 +94,7 @@ void SvgVisual::DoInitialize( Actor& actor, const Property::Map& propertyMap )
 
 void SvgVisual::DoSetOnStage( Actor& actor )
 {
-  Shader shader = ImageVisual::GetImageShader( mFactoryCache );
+  Shader shader = ImageVisual::GetImageShader( mFactoryCache, true, true );
   Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY );
   if( !geometry )
   {
@@ -198,11 +198,11 @@ void SvgVisual::ApplyRasterizedImage( PixelData rasterizedPixelData )
     TextureSet currentTextureSet = mImpl->mRenderer.GetTextures();
     if( mAtlasRect != FULL_TEXTURE_RECT )
     {
-      mAtlasManager.Remove( currentTextureSet, mAtlasRect );
+      mFactoryCache.GetAtlasManager()->Remove( currentTextureSet, mAtlasRect );
     }
 
     Vector4 atlasRect;
-    TextureSet textureSet = mAtlasManager.Add(atlasRect, rasterizedPixelData );
+    TextureSet textureSet = mFactoryCache.GetAtlasManager()->Add(atlasRect, rasterizedPixelData );
     if( textureSet ) // atlasing
     {
       if( textureSet != currentTextureSet )
@@ -211,11 +211,13 @@ void SvgVisual::ApplyRasterizedImage( PixelData rasterizedPixelData )
       }
       mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect );
       mAtlasRect = atlasRect;
+      mImpl->mFlags |= Impl::IS_ATLASING_APPLIED;
     }
     else // no atlasing
     {
       Atlas texture = Atlas::New( rasterizedPixelData.GetWidth(), rasterizedPixelData.GetHeight() );
       texture.Upload( rasterizedPixelData, 0, 0 );
+      mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED;
 
       if( mAtlasRect == FULL_TEXTURE_RECT )
       {
index e4e97da..d841621 100644 (file)
@@ -20,7 +20,6 @@
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
-#include <dali-toolkit/internal/visuals/image-atlas-manager.h>
 
 struct NSVGimage;
 
@@ -52,7 +51,7 @@ public:
    *
    * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
    */
-  SvgVisual( VisualFactoryCache& factoryCache, ImageAtlasManager& atlasManager );
+  SvgVisual( VisualFactoryCache& factoryCache );
 
   /**
    * @brief A reference counted object may only be deleted by calling Unreference().
@@ -136,7 +135,6 @@ private:
 
 private:
   Vector4              mAtlasRect;
-  ImageAtlasManager&   mAtlasManager;
   std::string          mImageUrl;
   NSVGimage*           mParsedImage;
 
index 3ffdafb..fb8ae32 100644 (file)
@@ -43,8 +43,9 @@ struct Base::Impl
   {
     IS_ON_STAGE = 1,
     IS_FROM_CACHE = 1 << 1,
-    IS_PREMULTIPLIED_ALPHA = 1 << 2,
-    IS_SYNCHRONOUS_RESOURCE_LOADING = 1 << 3
+    IS_ATLASING_APPLIED = 1<<2,
+    IS_PREMULTIPLIED_ALPHA = 1 << 3,
+    IS_SYNCHRONOUS_RESOURCE_LOADING = 1 << 4
   };
 
   struct CustomShader
index 404f2ec..da86201 100644 (file)
 
 // EXTERNAL HEADER
 #include <dali/devel-api/common/hash.h>
+#include <dali/public-api/images/resource-image.h>
 
 // INTERNAL HEADER
 #include <dali-toolkit/internal/visuals/color/color-visual.h>
 #include <dali-toolkit/internal/visuals/svg/svg-visual.h>
+#include <dali-toolkit/internal/visuals/image-atlas-manager.h>
+
+namespace
+{
+const char * const BROKEN_VISUAL_IMAGE_URL( DALI_IMAGE_DIR "broken.png");
+}
 
 namespace Dali
 {
@@ -179,6 +186,17 @@ Geometry VisualFactoryCache::CreateQuadGeometry()
   return geometry;
 }
 
+ImageAtlasManagerPtr VisualFactoryCache::GetAtlasManager()
+{
+  if( !mAtlasManager )
+  {
+    mAtlasManager = new ImageAtlasManager();
+    mAtlasManager->SetBrokenImage( BROKEN_VISUAL_IMAGE_URL );
+  }
+
+  return mAtlasManager;
+}
+
 SvgRasterizeThread* VisualFactoryCache::GetSVGRasterizationThread()
 {
   if( !mSvgRasterizeThread )
@@ -309,6 +327,11 @@ Geometry VisualFactoryCache::CreateBatchQuadGeometry( Vector4 texCoords )
   return geometry;
 }
 
+Image VisualFactoryCache::GetBrokenVisualImage()
+{
+  return ResourceImage::New( BROKEN_VISUAL_IMAGE_URL );
+}
+
 } // namespace Internal
 
 } // namespace Toolkit
index 2c2210a..6f67a66 100644 (file)
@@ -39,6 +39,9 @@ namespace Toolkit
 namespace Internal
 {
 
+class ImageAtlasManager;
+typedef IntrusivePtr<ImageAtlasManager> ImageAtlasManagerPtr;
+
 /**
  * Caches shaders and geometries. Owned by VisualFactory.
  */
@@ -60,6 +63,8 @@ public:
     GRADIENT_SHADER_RADIAL_BOUNDING_BOX,
     IMAGE_SHADER,
     BATCH_IMAGE_SHADER,
+    IMAGE_SHADER_ATLAS_DEFAULT_WRAP,
+    IMAGE_SHADER_ATLAS_CUSTOM_WRAP,
     NINE_PATCH_SHADER,
     SVG_SHADER,
     SHADER_TYPE_MAX = SVG_SHADER
@@ -130,6 +135,12 @@ public:
    */
   static Geometry CreateBatchQuadGeometry( Vector4 texCoords );
 
+  /**
+   * @brief Returns an image to be used when a visual has failed to correctly render
+   * @return The broken image handle.
+   */
+  static Image GetBrokenVisualImage();
+
 public:
 
   /**
@@ -170,6 +181,12 @@ public:
   Renderer GetDebugRenderer();
 
   /**
+   * Get the image atlas manager.
+   * @return A pointer pointing to the atlas manager
+   */
+  ImageAtlasManagerPtr GetAtlasManager();
+
+  /**
    * Get the SVG rasterization thread.
    * @return A pointer pointing to the SVG rasterization thread.
    */
@@ -230,6 +247,7 @@ private:
 
   Renderer mDebugRenderer;
 
+  ImageAtlasManagerPtr mAtlasManager;
   SvgRasterizeThread*  mSvgRasterizeThread;
 };
 
index 530feb9..80f4420 100644 (file)
 #include <dali-toolkit/internal/visuals/primitive/primitive-visual.h>
 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
-#include <dali-toolkit/internal/visuals/image-atlas-manager.h>
 #include <dali-toolkit/internal/visuals/image/batch-image-visual.h>
 
-namespace
-{
-const char * const BROKEN_VISUAL_IMAGE_URL( DALI_IMAGE_DIR "broken.png");
-}
-
 namespace Dali
 {
 
@@ -136,7 +130,6 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
       break;
     }
 
-    default: // Default to Image type if unknown (check if there is a URL)
     case Toolkit::Visual::IMAGE:
     {
       Property::Value* imageURLValue = propertyMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME );
@@ -150,8 +143,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
           batchingEnabledValue->Get( batchingEnabled );
           if( batchingEnabled )
           {
-            CreateAtlasManager();
-            visualPtr = new BatchImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
+            visualPtr = new BatchImageVisual( *( mFactoryCache.Get() ) );
             break;
           }
         }
@@ -159,27 +151,16 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property
         {
           visualPtr = new NPatchVisual( *( mFactoryCache.Get() ) );
         }
+        else if( SvgVisual::IsSvgUrl( imageUrl ) )
+        {
+          visualPtr = new SvgVisual( *( mFactoryCache.Get() ) );
+        }
         else
         {
-          CreateAtlasManager();
-
-          if( SvgVisual::IsSvgUrl( imageUrl ) )
-          {
-            visualPtr = new SvgVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
-          }
-          else
-          {
-            visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
-          }
+          visualPtr = new ImageVisual( *( mFactoryCache.Get() ) );
         }
       }
-      else if( propertyMap.Find( Toolkit::Visual::Property::SHADER, CUSTOM_SHADER ) )
-      {
-        // Create Image Visual if it has a shader
-        // TODO: This is required because of EffectsView which should be fixed
-        CreateAtlasManager();
-        visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
-      }
+
       break;
     }
 
@@ -238,8 +219,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Image& image )
   }
   else
   {
-    CreateAtlasManager();
-    ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
+    ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ) );
     Actor actor;
     visualPtr->SetImage( actor, image );
 
@@ -268,15 +248,13 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const std::string& url, Image
   }
   else if( SvgVisual::IsSvgUrl( url ) )
   {
-    CreateAtlasManager();
-    SvgVisual* visualPtr = new SvgVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
+    SvgVisual* visualPtr = new SvgVisual( *( mFactoryCache.Get() ) );
     visualPtr->SetImage( url, size );
     return Toolkit::Visual::Base( visualPtr );
   }
   else
   {
-    CreateAtlasManager();
-    ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
+    ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ));
     Actor actor;
     visualPtr->SetImage( actor, url, size );
 
@@ -284,21 +262,6 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const std::string& url, Image
   }
 }
 
-Image VisualFactory::GetBrokenVisualImage()
-{
-  return ResourceImage::New( BROKEN_VISUAL_IMAGE_URL );
-}
-
-void VisualFactory::CreateAtlasManager()
-{
-  if( !mAtlasManager )
-  {
-    Shader shader = ImageVisual::GetImageShader( *( mFactoryCache.Get() ) );
-    mAtlasManager = new ImageAtlasManager();
-    mAtlasManager->SetBrokenImage( BROKEN_VISUAL_IMAGE_URL );
-  }
-}
-
 } // namespace Internal
 
 } // namespace Toolkit
index f6e8d9c..484a688 100644 (file)
@@ -36,9 +36,6 @@ namespace Internal
 class VisualFactoryCache;
 typedef IntrusivePtr<VisualFactoryCache> VisualFactoryCachePtr;
 
-class ImageAtlasManager;
-typedef IntrusivePtr<ImageAtlasManager> ImageAtlasManagerPtr;
-
 /**
  * @copydoc Toolkit::VisualFactory
  */
@@ -68,11 +65,6 @@ public:
    */
   Toolkit::Visual::Base CreateVisual( const std::string& image, ImageDimensions size );
 
-public:
-  /**
-   * @brief Returns an image to be used when a visual has failed to correctly render
-   */
-  static Image GetBrokenVisualImage();
 
 protected:
 
@@ -84,11 +76,6 @@ protected:
 private:
 
   /**
-   * Prepare the atlas manager
-   */
-  void CreateAtlasManager();
-
-  /**
    * Undefined copy constructor.
    */
   VisualFactory(const VisualFactory&);
@@ -101,7 +88,6 @@ private:
 private:
 
   VisualFactoryCachePtr   mFactoryCache;
-  ImageAtlasManagerPtr    mAtlasManager;
   bool                    mDebugEnabled;
 };
 
index a5360d7..b290856 100644 (file)
@@ -236,6 +236,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -251,6 +252,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL Alignment( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 8893d88..cd142c5 100644 (file)
@@ -520,6 +520,7 @@ public: //Signals
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -535,6 +536,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   DALI_INTERNAL Button( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index fb8e5e8..91f0157 100644 (file)
@@ -105,6 +105,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_0.0
@@ -118,6 +119,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   DALI_INTERNAL CheckBoxButton( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 0b03907..4beab96 100644 (file)
@@ -219,6 +219,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -234,6 +235,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   DALI_INTERNAL PushButton( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 110a6a6..3dcd111 100644 (file)
@@ -147,6 +147,7 @@ class DALI_IMPORT_API RadioButton: public Button
 
  public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -162,6 +163,7 @@ class DALI_IMPORT_API RadioButton: public Button
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   DALI_INTERNAL RadioButton( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 8c5eb2a..253f3a2 100644 (file)
@@ -511,6 +511,7 @@ void Control::ClearBackground()
 {
   Actor self( Self() );
   mImpl->mBackgroundVisual.RemoveAndReset( self );
+  mImpl->mBackgroundColor = Color::TRANSPARENT;
 }
 
 void Control::EnableGestureDetection(Gesture::Type type)
index 8b24a6f..7cd1dcd 100644 (file)
@@ -251,6 +251,7 @@ public:
    */
   bool IsKeyboardFocusGroup();
 
+  /// @cond internal
   /**
    * @brief Called by the AccessibilityManager to activate the Control.
    * @SINCE_1_0.0
@@ -262,6 +263,7 @@ public:
    * @SINCE_1_0.0
    */
   DALI_INTERNAL void KeyboardEnter();
+  /// @endcond
 
   // Signals
 
@@ -280,6 +282,7 @@ public:
    */
   Toolkit::Control::KeyInputFocusSignalType& KeyInputFocusLostSignal();
 
+  /// @cond internal
   /**
    * @brief Called by the KeyInputFocusManager to emit key event signals.
    *
@@ -288,6 +291,7 @@ public:
    * @return True if the event was consumed.
    */
   DALI_INTERNAL bool EmitKeyEventSignal( const KeyEvent& event );
+  /// @endcond
 
 protected: // For derived classes to call
 
@@ -685,12 +689,14 @@ public: // API for derived classes to override
 
 private:
 
+  /// @cond internal
   // Undefined
   DALI_INTERNAL Control( const Control& );
   DALI_INTERNAL Control& operator=( const Control& );
 
   class Impl;
   Impl* mImpl;
+  /// @endcond
 
 };
 
index 856c83a..d3cd972 100644 (file)
@@ -271,6 +271,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_1.35
@@ -286,6 +287,7 @@ public: // Not intended for application developers
    * @param[in] internal A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL FlexContainer( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 524943d..5364217 100644 (file)
@@ -298,6 +298,7 @@ public: // Signals
 
 public:
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_0.0
@@ -311,6 +312,7 @@ public:
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   DALI_INTERNAL GaussianBlurView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 
 };
 
index bc401f1..51489c9 100644 (file)
@@ -242,6 +242,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -257,6 +258,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   DALI_INTERNAL ImageView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 
 };
 
index 85b8aa8..97932f9 100644 (file)
@@ -143,6 +143,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -158,6 +159,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   DALI_INTERNAL Model3dView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 
 };
 
index da8a4cd..d8503bf 100644 (file)
@@ -87,6 +87,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_0.0
@@ -100,6 +101,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL PageTurnLandscapeView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 } // namespace Toolkit
index deab41e..7a95bc0 100644 (file)
@@ -88,6 +88,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_1.4
@@ -101,6 +102,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL PageTurnPortraitView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 } // namespace Toolkit
index 42c8b48..ef4821b 100644 (file)
@@ -182,6 +182,7 @@ public: //Signal
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_1.4
@@ -195,6 +196,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL PageTurnView(Dali::Internal::CustomActor* internal);
+  /// @endcond
 };
 
 } // namespace Toolkit
index f8cbfea..0639dd5 100755 (executable)
@@ -397,6 +397,7 @@ public: // Signals
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_0.0
@@ -410,6 +411,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL ScrollBar( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index e1907c5..92fe4bd 100644 (file)
@@ -514,6 +514,7 @@ public: // Signals
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -529,6 +530,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL ItemView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 72758a3..d6bcc30 100644 (file)
@@ -70,6 +70,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief This constructor is used by Dali New() methods.
    *
@@ -77,6 +78,7 @@ public: // Not intended for application developers
    * @param [in] impl A pointer to a newly allocated Dali resource
    */
   explicit DALI_INTERNAL ScrollViewEffect(Internal::ScrollViewEffect *impl);
+  /// @endcond
 
 };
 
index 5ffd551..951298d 100644 (file)
@@ -107,12 +107,14 @@ public:
 
 protected:
 
+  /// @cond internal
   /**
    * @brief This constructor is used by Dali New() methods.
    * @SINCE_1_0.0
    * @param [in] impl A pointer to a newly allocated Dali resource
    */
   explicit DALI_INTERNAL ScrollViewPagePathEffect( Internal::ScrollViewPagePathEffect *impl );
+  /// @endcond
 
 };
 
index 69fbd94..a4545a8 100644 (file)
@@ -1234,6 +1234,7 @@ public: // Signals
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -1249,6 +1250,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL ScrollView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 0df8a58..c86c6c7 100644 (file)
@@ -239,6 +239,7 @@ public: // Signals
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -254,6 +255,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL Scrollable( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 8ba6139..d1cffec 100644 (file)
@@ -266,8 +266,10 @@ public:  // Signals
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
+   *
    * @SINCE_1_1.39
    * @param[in]  implementation  The Control implementation
    */
@@ -275,10 +277,12 @@ public: // Not intended for application developers
 
   /**
    * @brief Allows the creation of this Control from an Internal::CustomActor pointer.
+   *
    * @SINCE_1_1.39
    * @param[in]  internal  A pointer to the internal CustomActor
    */
   explicit DALI_INTERNAL Slider( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 3f199a5..b043d40 100644 (file)
@@ -499,6 +499,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    * @SINCE_1_0.0
@@ -512,6 +513,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL TableView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 1de3730..fc7b701 100644 (file)
@@ -172,6 +172,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -185,6 +186,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL TextEditor( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index 105690a..c9322aa 100644 (file)
@@ -317,6 +317,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -332,6 +333,7 @@ public: // Not intended for application developers
    * @param[in]  internal  A pointer to the internal CustomActor.
    */
   explicit DALI_INTERNAL TextLabel( Dali::Internal::CustomActor* internal );
+  /// @endcond
 };
 
 /**
index e519db1..71b9a45 100644 (file)
@@ -209,6 +209,7 @@ public:
 
 public: // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a handle using the Toolkit::Internal implementation.
    *
@@ -224,6 +225,7 @@ public: // Not intended for application developers
    * @param[in] internal A pointer to the internal CustomActor.
    */
   DALI_INTERNAL VideoView( Dali::Internal::CustomActor* internal );
+  /// @endcond
 
 };
 
index 18f0dbb..96bbed0 100644 (file)
@@ -287,6 +287,7 @@ public: // Signals
 
   // Not intended for application developers
 
+  /// @cond internal
   /**
    * @brief Creates a new handle from the implementation.
    *
@@ -294,6 +295,7 @@ public: // Signals
    * @param[in] impl A pointer to the object.
    */
   explicit DALI_INTERNAL KeyboardFocusManager(Internal::KeyboardFocusManager *impl);
+  /// @endcond
 
 }; // class KeyboardFocusManager
 
index 54191e4..7b8efbb 100644 (file)
@@ -172,6 +172,7 @@ public: // Signals
 
 public:
 
+  /// @cond internal
   /**
    * @brief Allows the creation of a StyleManager handle from an internal pointer.
    *
@@ -180,6 +181,7 @@ public:
    * @param[in] impl A pointer to the object.
    */
   explicit DALI_INTERNAL StyleManager( Internal::StyleManager *impl );
+  /// @endcond
 
 }; // class StyleManager
 
index 7d46ac7..882f932 100644 (file)
@@ -103,9 +103,41 @@ enum
    * @brief This enables Image visuals to automatically be converted to Batch-Image visuals.
    * @details Name "batchingEnabled", type Property::BOOLEAN.
    * @SINCE_1_2.0
-   * @note Optional. For Image visuals only. Not to be used with NPatch or SVG images.
+   * @note Optional. If not specified, the default is false.
+   * @note For Image visuals only. Not to be used with NPatch or SVG images.
    */
   BATCHING_ENABLED,
+
+  /**
+   * @brief The image area to be displayed.
+   * @details Name "pixelArea", type Property::VECTOR4.
+   *          It is a rectangular area.
+   *          The first two elements indicate the top-left position of the area, and the last two elements are the area width and height respectively.
+   * @SINCE_1_2.1
+   * @note Optional. If not specified, the default value is [0.0, 0.0, 1.0, 1.0], i.e. the entire area of the image.
+   * @note For Normal Quad images only.
+   */
+  PIXEL_AREA,
+
+  /**
+   * @brief The wrap mode for u coordinate.
+   * @details Name "wrapModeU", type Dali::WrapMode::Type (Property::INTEGER) or Property::STRING
+   *          It decides how the texture should be sampled when the u coordinate exceeds the range of 0.0 to 1.0.
+   * @SINCE_1_2.1
+   * @note Optional. If not specified, the default is CLAMP.
+   * @note For Normal QUAD image only.
+   */
+  WRAP_MODE_U,
+
+  /**
+   * @brief The wrap mode for v coordinate.
+   * @details Name "wrapModeV", type Dali::WrapMode::Type (Property::INTEGER) or Property::STRING
+   *          it decides how the texture should be sampled when the v coordinate exceeds the range of 0.0 to 1.0.
+   * @SINCE_1_2.1
+   * @note Optional. If not specified, the default is CLAMP.
+   * @note For Normal QUAD image only.
+   */
+  WRAP_MODE_V,
 };
 
 } // namespace Property