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"=>"" });
# output for the patch.
sub run_diff
{
+ #print "run_diff(" . join(" ", @_) . ")\n";
my ($fh, $c) = $repo->command_output_pipe(@_);
our @patch=();
while(<$fh>)
}
$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;
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);
return $filesref;
}
-
sub calc_patch_coverage_percentage
{
my $filesref = shift;
foreach my $file (keys(%$filesref))
{
+ my ($name, $path, $suffix) = fileparse($file, qr{\.[^.]*$});
+ next if($path !~ /^dali/);
+
my $covered_lines = 0;
my $uncovered_lines = 0;
my $percent = 0;
if($total_exec > 0) { $percent = 100 * $total_covered_lines / $total_exec; }
- return $percent;
+ return [ $total_exec, $percent ];
}
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 ##
################################################################################
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);
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 );
// 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 );
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 );
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 );
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 =
{
{ 22u, 6u },
{ 22u, 6u },
- 36.f,
+ 34.f,
15.f,
-5.f,
0.f,
{
{ 38u, 12u },
{ 38u, 12u },
- 80.f,
+ 79.f,
15.f,
-5.f,
- 4.f,
+ 3.f,
0.f,
false,
false
"Hello world demo שלום עולם.\n"
"שלום עולם hello world demo.",
textArea,
- 4u,
+ 5u,
fontDescriptionRuns.Begin(),
layoutSize,
55u,
// 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 );
// 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;
// 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;
// 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;
// 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];
// 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;
// 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 );
// 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;
// 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;
// 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;
// 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;
// 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 );
// 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 );
// 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 );
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 },
{
{ 22u, 6u },
{ 22u, 6u },
- 36.f,
+ 34.f,
15.f,
-5.f,
0.f,
92.f,
15.f,
-5.f,
- 5.f,
+ 4.f,
0.f,
false,
false
{
{ 74u, 12u },
{ 74u, 12u },
- 80.f,
+ 79.f,
15.f,
-5.f,
- 4.f,
+ 3.f,
0.f,
false,
false
{
{ 92u, 12u },
{ 92u, 12u },
- 79.f,
+ 78.f,
15.f,
-5.f,
- 5.f,
+ 4.f,
0.f,
false,
false
{
{ 128u, 12u },
{ 128u, 12u },
- 82.f,
+ 81.f,
15.f,
-5.f,
- 4.f,
+ 3.f,
0.f,
false,
false
{
{ 140u, 10u },
{ 140u, 10u },
- 77.f,
+ 76.f,
15.f,
-5.f,
4.f,
{
{ 150u, 6u },
{ 150u, 6u },
- 36.f,
+ 34.f,
15.f,
-5.f,
0.f,
{
{ 166u, 12u },
{ 166u, 12u },
- 80.f,
+ 79.f,
15.f,
-5.f,
4.f,
"Hello world demo שלום עולם.\n"
"שלום עולם hello world مرحبا بالعالم\n",
textArea,
- 15u,
+ 17u,
fontDescriptionRuns.Begin(),
layoutSize,
192u,
// 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 );
// 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;
// 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;
// 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;
// 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];
// 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;
// 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 );
// 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;
// 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;
// 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;
// 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;
// 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 );
// 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 );
// 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 );
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 },
{
{ 22u, 6u },
{ 22u, 6u },
- 36.f,
+ 34.f,
15.f,
-5.f,
0.f,
92.f,
15.f,
-5.f,
- 5.f,
+ 4.f,
0.f,
false,
false
{
{ 74u, 12u },
{ 74u, 12u },
- 80.f,
+ 79.f,
15.f,
-5.f,
- 4.f,
+ 3.f,
0.f,
false,
false
{
{ 92u, 12u },
{ 92u, 12u },
- 79.f,
+ 78.f,
15.f,
-5.f,
- 5.f,
+ 4.f,
0.f,
false,
false
{
{ 128u, 12u },
{ 128u, 12u },
- 82.f,
+ 81.f,
15.f,
-5.f,
- 4.f,
+ 3.f,
0.f,
false,
false
{
{ 140u, 10u },
{ 140u, 10u },
- 77.f,
+ 76.f,
15.f,
-5.f,
4.f,
{
{ 150u, 6u },
{ 150u, 6u },
- 36.f,
+ 34.f,
15.f,
-5.f,
0.f,
{
{ 166u, 12u },
{ 166u, 12u },
- 80.f,
+ 79.f,
15.f,
-5.f,
4.f,
"Hello world demo שלום עולם.\n"
"שלום עולם hello world مرحبا بالعالم\n",
textArea,
- 15u,
+ 17u,
fontDescriptionRuns.Begin(),
layoutSize,
192u,
// 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 );
// 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;
// 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;
// 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;
// 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];
// 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;
// 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 );
// 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;
// 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;
// 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;
// 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;
// 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 );
// 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 );
// 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 );
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 },
{
{ 22u, 6u },
{ 22u, 6u },
- 36.f,
+ 34.f,
15.f,
-5.f,
0.f,
92.f,
15.f,
-5.f,
- 5.f,
+ 4.f,
0.f,
false,
false
{
{ 74u, 12u },
{ 74u, 12u },
- 80.f,
+ 79.f,
15.f,
-5.f,
- 4.f,
+ 3.f,
0.f,
false,
false
{
{ 92u, 12u },
{ 92u, 12u },
- 79.f,
+ 78.f,
15.f,
-5.f,
- 5.f,
+ 4.f,
0.f,
false,
false
{
{ 128u, 12u },
{ 128u, 12u },
- 82.f,
+ 81.f,
15.f,
-5.f,
- 4.f,
+ 3.f,
0.f,
false,
false
{
{ 140u, 10u },
{ 140u, 10u },
- 77.f,
+ 76.f,
15.f,
-5.f,
4.f,
{
{ 150u, 6u },
{ 150u, 6u },
- 36.f,
+ 34.f,
15.f,
-5.f,
0.f,
{
{ 166u, 12u },
{ 166u, 12u },
- 80.f,
+ 79.f,
15.f,
-5.f,
4.f,
false,
false
};
-
Vector<LineRun> lines;
lines.PushBack( line01 );
lines.PushBack( line02 );
"Hello world demo שלום עולם.\n"
"שלום עולם hello world مرحبا بالعالم\n",
textArea,
- 15u,
+ 17u,
fontDescriptionRuns.Begin(),
layoutSize,
192u,
// 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,
// 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 );
};
//////////////////////////////////////////////////////////
+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() )
{
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;
}
// 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;
multilanguageSupport.ValidateFonts( utf32,
scripts,
data.fontDescriptionRuns,
- defaultFontId,
+ defaultFontDescription,
+ defaultPointSize,
0u,
numberOfCharacters,
fontRuns );
multilanguageSupport.ValidateFonts( utf32,
scripts,
data.fontDescriptionRuns,
- defaultFontId,
+ defaultFontDescription,
+ defaultPointSize,
data.index,
data.numberOfCharacters,
fontRuns );
},
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,
},
NULL,
0u,
- TextAbstraction::FontWeight::NORMAL,
- TextAbstraction::FontWidth::NORMAL,
+ TextAbstraction::FontWeight::NONE,
+ TextAbstraction::FontWidth::NONE,
TextAbstraction::FontSlant::ITALIC,
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
false,
NULL,
0u,
TextAbstraction::FontWeight::BOLD,
- TextAbstraction::FontWidth::NORMAL,
- TextAbstraction::FontSlant::NORMAL,
+ TextAbstraction::FontWidth::NONE,
+ TextAbstraction::FontSlant::NONE,
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
false,
true,
},
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,
},
NULL,
0u,
- TextAbstraction::FontWeight::NORMAL,
+ TextAbstraction::FontWeight::NONE,
TextAbstraction::FontWidth::EXPANDED,
- TextAbstraction::FontSlant::NORMAL,
+ TextAbstraction::FontSlant::NONE,
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
false,
false,
{
{
0u,
- 16u,
+ 15u,
},
TextAbstraction::LATIN
};
{
{
0u,
- 16u,
+ 15u,
},
TextAbstraction::LATIN
};
{
{
0u,
- 16u,
+ 15u,
},
TextAbstraction::LATIN
};
},
{
"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,
},
{
virtual void SetThreadSynchronization( ThreadSynchronizationInterface& threadSynchronization ) {}
+ virtual RenderSurface::Type GetSurfaceType() { return RenderSurface::ECORE_RENDER_SURFACE; }
};
namespace Internal
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;}
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 )
/*
- * 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.
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
{
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);
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;
// 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 );
// 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 );
// 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 );
// 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 );
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
/*
- * 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.
// 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 );
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);
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 );
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 );
#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>
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 );
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;
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 );
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 );
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 );
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 );
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 );
//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 );
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;
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 )
{
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.
# *.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.
/*
- * 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.
AccessibilityManager::AccessibilityManager()
: mCurrentFocusActor(FocusIDPair(0, 0)),
- mFocusIndicatorActor(Actor()),
+ mFocusIndicatorActor(),
mRecursiveFocusMoveCounter(0),
mIsWrapped(false),
mIsFocusWithinGroup(false),
void AccessibilityManager::Initialise()
{
- CreateDefaultFocusIndicatorActor();
-
AccessibilityAdaptor adaptor = AccessibilityAdaptor::Get();
adaptor.SetActionHandler(*this);
adaptor.SetGestureHandler(*this);
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
void AccessibilityManager::ClearFocus()
{
Actor actor = GetCurrentFocusActor();
- if(actor)
+ if( actor && mFocusIndicatorActor )
{
- actor.Remove(mFocusIndicatorActor);
+ actor.Remove( mFocusIndicatorActor );
}
mCurrentFocusActor = FocusIDPair(0, 0);
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;
}
}
}
-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();
Actor actor = GetCurrentFocusActor();
if(actor)
{
- if(mFocusIndicatorActor)
- {
- actor.Add(mFocusIndicatorActor);
- }
+ actor.Add( GetFocusIndicatorActor() );
}
mIsFocusIndicatorEnabled = true;
{
// Hide indicator when tts turned off
Actor actor = GetCurrentFocusActor();
- if(actor)
+ if( actor && mFocusIndicatorActor )
{
- actor.Remove(mFocusIndicatorActor);
+ actor.Remove( mFocusIndicatorActor );
}
mIsFocusIndicatorEnabled = false;
#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.
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
#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
{
RemoveFilters();
Actor self = Self();
- Property::Map visualMap;
- visualMap.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE );
switch( 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;
}
const float VALUE_POPUP_MARGIN = 10.0f;
const float VALUE_POPUP_HEIGHT = 81.0f;
const float VALUE_POPUP_MIN_WIDTH = 54.0f;
-const Vector2 VALUE_POPUP_ARROW_SIZE( 18.0f, 18.0f );
const float DEFAULT_LOWER_BOUND = 0.0f;
const float DEFAULT_UPPER_BOUND = 1.0f;
void Slider::OnSizeSet( const Vector3& size )
{
- // Factor in handle overshoot into size of track
+}
+
+void Slider::OnRelayout( const Vector2& size, RelayoutContainer& container )
+{
SetHitRegion( Vector2( size.x, GetHitRegion().y ) );
+ // Factor in handle overshoot into size of backing
SetTrackRegion( Vector2( size.x - GetHandleSize().x, GetTrackRegion().y ) );
+ Control::OnRelayout( size, container );
}
bool Slider::OnTouch(Actor actor, const TouchData& touch)
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 );
if( raiseSignals )
{
Toolkit::Slider self = Toolkit::Slider::DownCast( Self() );
- mValueChangedSignal.Emit( self, clampledValue );
+ mValueChangedSignal.Emit( self, clampedValue );
int markIndex;
if( MarkReached( percent, markIndex ) )
{
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() );
+ }
}
}
Toolkit::ImageView Slider::CreateTrack()
{
Toolkit::ImageView track = Toolkit::ImageView::New();
+ track.SetName("SliderTrack");
track.SetParentOrigin( ParentOrigin::CENTER );
track.SetAnchorPoint( AnchorPoint::CENTER );
-
return track;
}
Toolkit::ImageView Slider::CreateProgress()
{
Toolkit::ImageView progress = Toolkit::ImageView::New();
+ progress.SetName("SliderProgress");
progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
Toolkit::ImageView Slider::CreateHandle()
{
Toolkit::ImageView handle = Toolkit::ImageView::New();
+ handle.SetName("SliderHandle");
handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
handle.SetAnchorPoint( AnchorPoint::CENTER );
Toolkit::ImageView Slider::CreatePopupArrow()
{
Toolkit::ImageView arrow = Toolkit::ImageView::New();
+ arrow.SetStyleName("SliderPopupArrow");
+ arrow.SetName("SliderPopupArrow");
arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
Toolkit::TextLabel Slider::CreatePopupText()
{
Toolkit::TextLabel textLabel = Toolkit::TextLabel::New();
+ textLabel.SetName( "SliderPopupTextLabel" );
+ textLabel.SetStyleName( "SliderPopupTextLabel" );
textLabel.SetParentOrigin( ParentOrigin::CENTER );
textLabel.SetAnchorPoint( AnchorPoint::CENTER );
textLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
Toolkit::ImageView Slider::CreatePopup()
{
Toolkit::ImageView popup = Toolkit::ImageView::New();
+ popup.SetName( "SliderPopup" );
popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
popup.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::WIDTH );
if( mHandle && !mHandleValueTextLabel )
{
mHandleValueTextLabel = Toolkit::TextLabel::New();
+ mHandleValueTextLabel.SetName("SliderHandleTextLabel");
+ mHandleValueTextLabel.SetStyleName("SliderHandleTextLabel");
mHandleValueTextLabel.SetParentOrigin( ParentOrigin::CENTER );
mHandleValueTextLabel.SetAnchorPoint( AnchorPoint::CENTER );
mHandleValueTextLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
*/
virtual void OnSizeSet( const Vector3& size );
+ /**
+ * @copydoc CustomActorImpl::OnRelayout
+ */
+ virtual void OnRelayout( const Vector2& size, RelayoutContainer& container );
+
+
private:
/**
// 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
{
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 );
/*
- * 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.
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);
{
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() )
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)
Actor actor = GetCurrentFocusActor();
if(actor)
{
- if(mFocusIndicatorActor)
- {
- actor.Add(mFocusIndicatorActor);
- }
+ actor.Add( GetFocusIndicatorActor() );
}
mIsFocusIndicatorEnabled = true;
}
{
// Hide indicator when keyboard focus turned off
Actor actor = GetCurrentFocusActor();
- if(actor)
+ if( actor && mFocusIndicatorActor )
{
- actor.Remove(mFocusIndicatorActor);
+ actor.Remove( mFocusIndicatorActor );
}
mIsFocusIndicatorEnabled = false;
}
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);
- }
}
}
#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.
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.
#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.
{
InputStyle()
: textColor( Color::BLACK ),
- fontStyle(),
familyName(),
weight( TextAbstraction::FontWeight::NORMAL ),
width( TextAbstraction::FontWidth::NORMAL ),
{};
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.
{
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;
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;
}
}
}
{
/**
- * @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.
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()
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 )
// 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;
// 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;
FontId cachedDefaultFontId = 0u;
if( NULL != defaultFonts )
{
- cachedDefaultFontId = defaultFonts->FindFont( fontClient, currentPointSize );
+ cachedDefaultFontId = defaultFonts->FindFont( fontClient,
+ currentFontDescription,
+ currentFontPointSize );
}
// Whether the cached default font is valid.
if( isCommonScript )
{
if( isValidCachedDefaultFont &&
- ( isDefault || ( currentFontId == previousFontId ) ) &&
+ ( isDefaultFont || ( currentFontId == previousFontId ) ) &&
!isEmojiScript )
{
// At this point the character common for all scripts has no font assigned.
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 )
{
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.
*( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript;
}
}
- defaultFontsPerScript->mFonts.PushBack( fontId );
+ defaultFontsPerScript->Cache( currentFontDescription, fontId );
}
} // !isValidFont (3)
} // !isValidFont (2)
*/
struct DefaultFonts
{
+ struct CacheItem
+ {
+ TextAbstraction::FontDescription description;
+ FontId fontId ;
+ };
+
/**
* Default constructor.
*/
* @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;
};
/**
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 );
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 )
GetImplementation( *this ).ValidateFonts( text,
scripts,
fontDescriptions,
- defaultFontId,
+ defaultFontDescription,
+ defaultFontPointSize,
startIndex,
numberOfCharacters,
fonts );
*
* @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.
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 );
// 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 );
#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.
{
FontDefaults()
: mFontDescription(),
- mFontStyle(),
mDefaultPointSize( 0.f ),
mFontId( 0u ),
familyDefined( false ),
}
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.
/*
- * 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.
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();
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 )
mImpl->RequestRelayout();
}
+bool Controller::IsDefaultFontWeightDefined() const
+{
+ return mImpl->mFontDefaults->weightDefined;
+}
+
FontWeight Controller::GetDefaultFontWeight() const
{
if( NULL != mImpl->mFontDefaults )
mImpl->RequestRelayout();
}
+bool Controller::IsDefaultFontWidthDefined() const
+{
+ return mImpl->mFontDefaults->widthDefined;
+}
+
FontWidth Controller::GetDefaultFontWidth() const
{
if( NULL != mImpl->mFontDefaults )
mImpl->RequestRelayout();
}
+bool Controller::IsDefaultFontSlantDefined() const
+{
+ return mImpl->mFontDefaults->slantDefined;
+}
+
FontSlant Controller::GetDefaultFontSlant() const
{
if( NULL != mImpl->mFontDefaults )
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 )
}
}
+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 )
}
}
+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 )
}
}
+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 )
#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.
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.
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.
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.
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.
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.
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.
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.
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.
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 );
/// 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 )
{
/// 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 )
{
/// 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 )
{
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 );
}
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;
}
}
}
} //unnamed namespace
-BatchImageVisual::BatchImageVisual( VisualFactoryCache& factoryCache, ImageAtlasManager& atlasManager )
+BatchImageVisual::BatchImageVisual( VisualFactoryCache& factoryCache )
: Visual::Base( factoryCache ),
- mAtlasManager( atlasManager ),
mDesiredSize()
{
}
{
if( !mImpl->mRenderer )
{
- TextureSet textureSet = mAtlasManager.Add(
+ TextureSet textureSet = mFactoryCache.GetAtlasManager()->Add(
mAtlasRect,
imageUrl,
mDesiredSize );
mImpl->mRenderer.Reset();
if( mFactoryCache.CleanRendererCache( url ) )
{
- mAtlasManager.Remove( textureSet, mAtlasRect );
+ mFactoryCache.GetAtlasManager()->Remove( textureSet, mAtlasRect );
}
}
* @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().
private:
- ImageAtlasManager& mAtlasManager;
Vector4 mAtlasRect;
std::string mImageUrl;
Dali::ImageDimensions mDesiredSize;
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" );
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);
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
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
}\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;
} //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 )
{
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 );
}
}
}
-void ImageVisual::SetSize( const Vector2& size )
-{
- Visual::Base::SetSize( size );
-}
-
void ImageVisual::GetNaturalSize( Vector2& naturalSize ) const
{
if(mImage)
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;
{
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 );
}
}
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
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 );
}
}
TextureSet textureSet = TextureSet::New();
Renderer renderer = Renderer::New( geometry, shader );
renderer.SetTextures( textureSet );
-
return renderer;
}
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 );
{
// 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();
}
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();
}
}
+ if( !(mImpl->mFlags & Impl::IS_ATLASING_APPLIED) )
+ {
+ Sampler sampler = Sampler::New();
+ sampler.SetWrapMode( mWrapModeU, mWrapModeV );
+ textureSet.SetSampler( 0u, sampler );
+ }
+
return textureSet;
}
( 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() );
InitializeRenderer( mImage );
}
+ if( mPixelArea != FULL_TEXTURE_RECT )
+ {
+ mImpl->mRenderer.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, mPixelArea );
+ }
}
void ImageVisual::DoSetOffStage( Actor& actor )
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;
}
mImpl->mRenderer.SetTextures( textureSet );
}
TextureSetImage( textureSet, 0u, image );
+ Sampler sampler = Sampler::New();
+ sampler.SetWrapMode( mWrapModeU, mWrapModeV );
+ textureSet.SetSampler( 0u, sampler );
}
}
{
if( image.GetLoadingState() == Dali::ResourceLoadingFailed )
{
- Image brokenImage = VisualFactory::GetBrokenVisualImage();
+ Image brokenImage = VisualFactoryCache::GetBrokenVisualImage();
if( mImpl->mRenderer )
{
ApplyImageToSampler( brokenImage );
mImpl->mRenderer.Reset();
if( mFactoryCache.CleanRendererCache( url ) && index != Property::INVALID_INDEX )
{
- mAtlasManager.Remove( textureSet, atlasRect );
+ mFactoryCache.GetAtlasManager()->Remove( textureSet, atlasRect );
}
}
}
else
{
- mNativeFragmentShaderCode += FRAGMENT_SHADER;
+ mNativeFragmentShaderCode += FRAGMENT_SHADER_NO_ATLAS;
}
if( customSamplerTypename )
// 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>
* @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().
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;
/**
* 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
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;
void NPatchVisual::InitializeFromBrokenImage()
{
- mCroppedImage = VisualFactory::GetBrokenVisualImage();
+ mCroppedImage = VisualFactoryCache::GetBrokenVisualImage();
mImageSize = ImageDimensions( mCroppedImage.GetWidth(), mCroppedImage.GetHeight() );
mStretchPixelsX.Clear();
// ToDo: renderer responds to the size change
}
+void PrimitiveVisual::GetNaturalSize( Vector2& naturalSize ) const
+{
+ naturalSize.x = mObjectDimensions.x;
+ naturalSize.y = mObjectDimensions.y;
+}
+
void PrimitiveVisual::SetClipRect( const Rect<int>& clipRect )
{
Visual::Base::SetClipRect( clipRect );
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 );
#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>
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
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 )
{
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 )
}
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 )
{
// INTERNAL INCLUDES
#include <dali-toolkit/internal/visuals/visual-base-impl.h>
-#include <dali-toolkit/internal/visuals/image-atlas-manager.h>
struct NSVGimage;
*
* @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().
private:
Vector4 mAtlasRect;
- ImageAtlasManager& mAtlasManager;
std::string mImageUrl;
NSVGimage* mParsedImage;
{
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
// 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
{
return geometry;
}
+ImageAtlasManagerPtr VisualFactoryCache::GetAtlasManager()
+{
+ if( !mAtlasManager )
+ {
+ mAtlasManager = new ImageAtlasManager();
+ mAtlasManager->SetBrokenImage( BROKEN_VISUAL_IMAGE_URL );
+ }
+
+ return mAtlasManager;
+}
+
SvgRasterizeThread* VisualFactoryCache::GetSVGRasterizationThread()
{
if( !mSvgRasterizeThread )
return geometry;
}
+Image VisualFactoryCache::GetBrokenVisualImage()
+{
+ return ResourceImage::New( BROKEN_VISUAL_IMAGE_URL );
+}
+
} // namespace Internal
} // namespace Toolkit
namespace Internal
{
+class ImageAtlasManager;
+typedef IntrusivePtr<ImageAtlasManager> ImageAtlasManagerPtr;
+
/**
* Caches shaders and geometries. Owned by VisualFactory.
*/
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
*/
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:
/**
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.
*/
Renderer mDebugRenderer;
+ ImageAtlasManagerPtr mAtlasManager;
SvgRasterizeThread* mSvgRasterizeThread;
};
#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
{
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 );
batchingEnabledValue->Get( batchingEnabled );
if( batchingEnabled )
{
- CreateAtlasManager();
- visualPtr = new BatchImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
+ visualPtr = new BatchImageVisual( *( mFactoryCache.Get() ) );
break;
}
}
{
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;
}
}
else
{
- CreateAtlasManager();
- ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
+ ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ) );
Actor actor;
visualPtr->SetImage( actor, 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 );
}
}
-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
class VisualFactoryCache;
typedef IntrusivePtr<VisualFactoryCache> VisualFactoryCachePtr;
-class ImageAtlasManager;
-typedef IntrusivePtr<ImageAtlasManager> ImageAtlasManagerPtr;
-
/**
* @copydoc Toolkit::VisualFactory
*/
*/
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:
private:
/**
- * Prepare the atlas manager
- */
- void CreateAtlasManager();
-
- /**
* Undefined copy constructor.
*/
VisualFactory(const VisualFactory&);
private:
VisualFactoryCachePtr mFactoryCache;
- ImageAtlasManagerPtr mAtlasManager;
bool mDebugEnabled;
};
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL Alignment( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL Button( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_0.0
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL CheckBoxButton( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL PushButton( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL RadioButton( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
{
Actor self( Self() );
mImpl->mBackgroundVisual.RemoveAndReset( self );
+ mImpl->mBackgroundColor = Color::TRANSPARENT;
}
void Control::EnableGestureDetection(Gesture::Type type)
{
GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
}
+ RelayoutRequest();
}
void Control::OnPinch(const PinchGesture& pinch)
*/
bool IsKeyboardFocusGroup();
+ /// @cond internal
/**
* @brief Called by the AccessibilityManager to activate the Control.
* @SINCE_1_0.0
* @SINCE_1_0.0
*/
DALI_INTERNAL void KeyboardEnter();
+ /// @endcond
// Signals
*/
Toolkit::Control::KeyInputFocusSignalType& KeyInputFocusLostSignal();
+ /// @cond internal
/**
* @brief Called by the KeyInputFocusManager to emit key event signals.
*
* @return True if the event was consumed.
*/
DALI_INTERNAL bool EmitKeyEventSignal( const KeyEvent& event );
+ /// @endcond
protected: // For derived classes to call
private:
+ /// @cond internal
// Undefined
DALI_INTERNAL Control( const Control& );
DALI_INTERNAL Control& operator=( const Control& );
class Impl;
Impl* mImpl;
+ /// @endcond
};
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_1.35
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL FlexContainer( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public:
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_0.0
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL GaussianBlurView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL ImageView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL Model3dView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_0.0
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL PageTurnLandscapeView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
} // namespace Toolkit
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_1.4
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL PageTurnPortraitView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
} // namespace Toolkit
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_1.4
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL PageTurnView(Dali::Internal::CustomActor* internal);
+ /// @endcond
};
} // namespace Toolkit
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_0.0
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL ScrollBar( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL ItemView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief This constructor is used by Dali New() methods.
*
* @param [in] impl A pointer to a newly allocated Dali resource
*/
explicit DALI_INTERNAL ScrollViewEffect(Internal::ScrollViewEffect *impl);
+ /// @endcond
};
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
};
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL ScrollView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL Scrollable( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
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
*/
/**
* @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
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
* @SINCE_1_0.0
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL TableView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL TextEditor( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
explicit DALI_INTERNAL TextLabel( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
/**
public: // Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a handle using the Toolkit::Internal implementation.
*
* @param[in] internal A pointer to the internal CustomActor.
*/
DALI_INTERNAL VideoView( Dali::Internal::CustomActor* internal );
+ /// @endcond
};
const unsigned int TOOLKIT_MAJOR_VERSION = 1;
const unsigned int TOOLKIT_MINOR_VERSION = 2;
-const unsigned int TOOLKIT_MICRO_VERSION = 0;
+const unsigned int TOOLKIT_MICRO_VERSION = 1;
const char * const TOOLKIT_BUILD_DATE = __DATE__ " " __TIME__;
#ifdef DEBUG_ENABLED
// Not intended for application developers
+ /// @cond internal
/**
* @brief Creates a new handle from the implementation.
*
* @param[in] impl A pointer to the object.
*/
explicit DALI_INTERNAL KeyboardFocusManager(Internal::KeyboardFocusManager *impl);
+ /// @endcond
}; // class KeyboardFocusManager
public:
+ /// @cond internal
/**
* @brief Allows the creation of a StyleManager handle from an internal pointer.
*
* @param[in] impl A pointer to the object.
*/
explicit DALI_INTERNAL StyleManager( Internal::StyleManager *impl );
+ /// @endcond
}; // class StyleManager
* @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
{
"pointSize":25
},
+ "radiobutton":
+ {
+ "unselectedStateImage":"{DALI_IMAGE_DIR}radio-button-unselected.png",
+ "selectedStateImage":"{DALI_IMAGE_DIR}radio-button-selected.png",
+ "disabledUnselectedStateImage":"{DALI_IMAGE_DIR}radio-button-unselected-disabled.png",
+ "disabledSelectedStateImage":"{DALI_IMAGE_DIR}radio-button-selected-disabled.png"
+ },
"textfield":
{
"confirmationpopup":
{
"popupBackgroundImage":"{DALI_IMAGE_DIR}00_popup_bg.9.png"
+ },
+ "slider":
+ {
+ "showPopup": true,
+ "showValue": true,
+ "valuePrecision": 0,
+ "trackVisual":{
+ "url":"{DALI_IMAGE_DIR}slider-skin.9.png",
+ "size":[27,27]
+ },
+ "progressVisual":{
+ "url":"{DALI_IMAGE_DIR}slider-skin-progress.9.png",
+ "size":[27,27]
+ },
+ "handleVisual":{
+ "url":"{DALI_IMAGE_DIR}slider-skin-handle.png",
+ "size":[72,72]
+ },
+ "popupVisual":"{DALI_IMAGE_DIR}slider-popup.9.png",
+ "popupArrowVisual":"{DALI_IMAGE_DIR}slider-popup-arrow.9.png",
+ "disableColor":[0.5, 0.5, 0.5, 1.0],
+ "popupTextColor":[0.5,0.5,0.5,1.0],
+ "hitRegion":[0, 72],
+ "marks":[],
+ "snapToMarks":false,
+ "markTolerance":0.05
+ },
+ "SliderHandleTextLabel":
+ {
+ "textColor":[0.8,0.8,1,1]
}
}
}
{
"pointSize":25
},
+ "radiobutton":
+ {
+ "unselectedStateImage":"{DALI_IMAGE_DIR}radio-button-unselected.png",
+ "selectedStateImage":"{DALI_IMAGE_DIR}radio-button-selected.png",
+ "disabledUnselectedStateImage":"{DALI_IMAGE_DIR}radio-button-unselected-disabled.png",
+ "disabledSelectedStateImage":"{DALI_IMAGE_DIR}radio-button-selected-disabled.png"
+ },
"textfield":
{
"grabHandleImage" : "{DALI_STYLE_IMAGE_DIR}cursor_handler_drop_center.png",
"selectionHandleImageLeft" : {"filename":"{DALI_STYLE_IMAGE_DIR}selection_handle_drop_left.png" },
"selectionHandleImageRight": {"filename":"{DALI_STYLE_IMAGE_DIR}selection_handle_drop_right.png" }
+ },
+ "popup":
+ {
+ "popupBackgroundImage":"{DALI_IMAGE_DIR}00_popup_bg.9.png"
+ },
+ "confirmationpopup":
+ {
+ "popupBackgroundImage":"{DALI_IMAGE_DIR}00_popup_bg.9.png"
+ },
+ "slider":
+ {
+ "showPopup": true,
+ "showValue": true,
+ "valuePrecision": 0,
+ "trackVisual":{
+ "url":"{DALI_IMAGE_DIR}slider-skin.9.png",
+ "size":[27,27]
+ },
+ "progressVisual":{
+ "url":"{DALI_IMAGE_DIR}slider-skin-progress.9.png",
+ "size":[27,27]
+ },
+ "handleVisual":{
+ "url":"{DALI_IMAGE_DIR}slider-skin-handle.png",
+ "size":[72,72]
+ },
+ "popupVisual":"{DALI_IMAGE_DIR}slider-popup.9.png",
+ "popupArrowVisual":"{DALI_IMAGE_DIR}slider-popup-arrow.9.png",
+ "disableColor":[0.5, 0.5, 0.5, 1.0],
+ "popupTextColor":[0.5,0.5,0.5,1.0],
+ "hitRegion":[0, 72],
+ "marks":[],
+ "snapToMarks":false,
+ "markTolerance":0.05
+ },
+ "SliderHandleTextLabel":
+ {
+ "textColor":[0.8,0.8,1,1]
}
}
}
Name: dali-addon
Summary: DALi module for Node.JS
-Version: 1.2.0
+Version: 1.2.1
Release: 1
Group: Development/Libraries
License: Apache License, Version 2.0
Name: dali-toolkit
Summary: The OpenGLES Canvas Core Library Toolkit
-Version: 1.2.0
+Version: 1.2.1
Release: 1
Group: System/Libraries
License: Apache-2.0 and BSD-2-Clause and MIT